diff options
Diffstat (limited to 'libs/ardour/route.cc')
-rw-r--r-- | libs/ardour/route.cc | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index ccf95c5bf9..41bd1207b5 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -45,6 +45,7 @@ #include "ardour/ladspa_plugin.h" #include "ardour/meter.h" #include "ardour/mix.h" +#include "ardour/monitor_processor.h" #include "ardour/panner.h" #include "ardour/plugin_insert.h" #include "ardour/port.h" @@ -84,12 +85,16 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) _meter.reset (new PeakMeter (_session)); _meter->set_display_to_user (false); + add_processor (_meter, PostFader); - if (_flags & ControlOut) { + if (is_control()) { /* where we listen to tracks */ _intreturn.reset (new InternalReturn (_session)); add_processor (_intreturn, PreFader); + + _monitor_control.reset (new MonitorProcessor (_session)); + add_processor (_monitor_control, PostFader); } _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); @@ -485,7 +490,6 @@ Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, feeding the listen "stream". data will "arrive" into the route from the intreturn processor element. */ - bufs.silence (nframes, 0); } else { @@ -745,7 +749,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, Placement placemen * @a position is used. */ int -Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err) +Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed) { ChanCount old_pms = processor_max_streams; @@ -803,8 +807,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite } - if (_control_outs != processor) { - // XXX: do we want to emit the signal here ? change call order. + if (activation_allowed && (processor != _control_outs)) { processor->activate (); } @@ -861,6 +864,20 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter _meter->set_display_to_user (_meter_point == MeterCustom); processor = _meter; + } else if (prop->value() == "monitor") { + + if (_monitor_control) { + if (_monitor_control->set_state (node, Stateful::loading_state_version)) { + return false; + } else { + return true; + } + } + + _monitor_control.reset (new MonitorProcessor (_session)); + _monitor_control->set_state (node, Stateful::loading_state_version); + processor = _monitor_control; + } else if (prop->value() == "amp") { /* amp always exists */ @@ -875,10 +892,25 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter } else if (prop->value() == "intsend") { - processor.reset (new InternalSend (_session, _mute_master, node)); + InternalSend* isend = new InternalSend (_session, _mute_master, node); + + if (_session.control_out() && (isend->target_id() == _session.control_out()->id())) { + _control_outs.reset (isend); + if (_control_outs->active()) { + _control_outs->set_solo_level (1); + } else { + _control_outs->set_solo_level (0); + } + } + + processor.reset (isend); } else if (prop->value() == "intreturn") { + /* a route only has one internal return. If it exists already + just set its state, and return + */ + if (_intreturn) { if (_intreturn->set_state (node, Stateful::loading_state_version)) { return false; @@ -919,7 +951,7 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter iter = p; } - return (add_processor (processor, iter) == 0); + return (add_processor (processor, iter, 0, false) == 0); } else { error << _("Processor XML node has no type property") << endmsg; @@ -1979,10 +2011,13 @@ Route::_set_state_2X (const XMLNode& node, int version) _meter.reset (new PeakMeter (_session)); add_processor (_meter, PreFader); - if (_flags & ControlOut) { + if (is_control()) { /* where we listen to tracks */ _intreturn.reset (new InternalReturn (_session)); add_processor (_intreturn, PreFader); + + _monitor_control.reset (new MonitorProcessor (_session)); + add_processor (_monitor_control, PostFader); } _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); @@ -2351,6 +2386,11 @@ Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*a if (route == _session.control_out()) { _control_outs = boost::dynamic_pointer_cast<Delivery>(d); + if (_control_outs->active()) { + _control_outs->set_solo_level (1); + } else { + _control_outs->set_solo_level (0); + } } /* already listening via the specified IO: do nothing */ @@ -2385,11 +2425,8 @@ Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*a if (route == _session.control_out()) { _control_outs = listener; - /* send to control/listen/monitor bus is active by default */ - listener->activate (); } - add_processor (listener, placement); return 0; |