diff options
-rw-r--r-- | gtk2_ardour/port_matrix.cc | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/route.h | 3 | ||||
-rw-r--r-- | libs/ardour/route.cc | 36 |
3 files changed, 40 insertions, 1 deletions
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index 0df5d2214d..60f86ae888 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -733,7 +733,7 @@ PortMatrix::remove_channel (ARDOUR::BundleChannel b) int const r = io->remove_port (p, this); if (r == -1) { ArdourDialog d (_("Port removal not allowed")); - Label l (_("This port cannot be removed, as the first plugin in the track or buss cannot accept the new number of inputs.")); + Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs.")); d.get_vbox()->pack_start (l); d.add_button (Stock::OK, RESPONSE_ACCEPT); d.set_modal (true); diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 2e44d00984..23f24cb275 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -530,6 +530,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, void silence_unlocked (framecnt_t); ChanCount processor_max_streams; + ChanCount processor_out_streams; uint32_t pans_required() const; ChanCount n_process_buffers (); @@ -553,8 +554,10 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, void output_change_handler (IOChange, void *src); bool input_port_count_changing (ChanCount); + bool output_port_count_changing (ChanCount); bool _in_configure_processors; + bool _initial_io_setup; int configure_processors_unlocked (ProcessorStreams*); std::list<std::pair<ChanCount, ChanCount> > try_configure_processors (ChanCount, ProcessorStreams *); diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index b78217ff49..77e538cfe9 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -98,6 +98,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) , _default_type (default_type) , _remote_control_id (0) , _in_configure_processors (false) + , _initial_io_setup (false) , _custom_meter_position_noted (false) , _last_custom_meter_was_at_end (false) { @@ -136,6 +137,7 @@ Route::init () _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1)); _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); + _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1)); /* add amp processor */ @@ -1704,6 +1706,8 @@ Route::configure_processors_unlocked (ProcessorStreams* err) } ChanCount out; + bool seen_mains_out = false; + processor_out_streams = _input->n_ports(); list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin(); for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) { @@ -1716,8 +1720,21 @@ Route::configure_processors_unlocked (ProcessorStreams* err) processor_max_streams = ChanCount::max(processor_max_streams, c->first); processor_max_streams = ChanCount::max(processor_max_streams, c->second); out = c->second; + + if (boost::dynamic_pointer_cast<Delivery> (*p) + && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) { + /* main delivery will increase port count to match input. + * the Delivery::Main is usually the last processor - followed only by + * 'MeterOutput'. + */ + seen_mains_out = true; + } + if (!seen_mains_out) { + processor_out_streams = out; + } } + if (_meter) { _meter->reset_max_channels (processor_max_streams); } @@ -1995,6 +2012,7 @@ Route::set_state (const XMLNode& node, int version) } set_id (node); + _initial_io_setup = true; if ((prop = node.property (X_("flags"))) != 0) { _flags = Flag (string_2_enum (prop->value(), _flags)); @@ -2062,6 +2080,8 @@ Route::set_state (const XMLNode& node, int version) _meter_type = MeterType (string_2_enum (prop->value (), _meter_type)); } + _initial_io_setup = false; + set_processor_state (processor_state); // this looks up the internal instrument in processors @@ -2942,6 +2962,9 @@ void Route::output_change_handler (IOChange change, void * /*src*/) { bool need_to_queue_solo_change = true; + if (_initial_io_setup) { + return; + } if ((change.type & IOChange::ConfigurationChanged)) { /* This is called with the process lock held if change @@ -3754,6 +3777,19 @@ Route::input_port_count_changing (ChanCount to) return false; } +/** Called when there is a proposed change to the output port count */ +bool +Route::output_port_count_changing (ChanCount to) +{ + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + if (processor_out_streams.get(*t) > to.get(*t)) { + return true; + } + } + /* The change is ok */ + return false; +} + list<string> Route::unknown_processors () const { |