diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc index aa1609a844..8399c0382a 100644 --- a/libs/ardour/monitor_processor.cc +++ b/libs/ardour/monitor_processor.cc @@ -268,6 +268,8 @@ MonitorProcessor::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*e } if (_mono) { + DEBUG_TRACE (DEBUG::Monitor, "mono-izing\n"); + /* chn is now the number of channels, use as a scaling factor when mixing */ gain_t scale = 1.0/chn; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 41bd1207b5..448e295c1a 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -88,17 +88,33 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type) add_processor (_meter, PostFader); + _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); + + add_processor (_main_outs, PostFader); + if (is_control()) { /* where we listen to tracks */ _intreturn.reset (new InternalReturn (_session)); add_processor (_intreturn, PreFader); + ProcessorList::iterator i; + + for (i = _processors.begin(); i != _processors.end(); ++i) { + if (*i == _intreturn) { + ++i; + break; + } + } + + /* the thing that provides proper control over a control/monitor/listen bus + (such as per-channel cut, dim, solo, invert, etc). + It always goes right after the internal return; + */ _monitor_control.reset (new MonitorProcessor (_session)); - add_processor (_monitor_control, PostFader); + add_processor (_monitor_control, i); } - _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main)); - add_processor (_main_outs, PostFader); + /* now that we have _meter, its safe to connect to this */ @@ -744,7 +760,7 @@ Route::add_processor (boost::shared_ptr processor, Placement placemen /** Add a processor to the route. - * If @a iter is not NULL, it must point to an iterator in _processors and the new + * @a iter must point to an iterator in _processors and the new * processor will be inserted immediately before this location. Otherwise, * @a position is used. */ @@ -2427,7 +2443,13 @@ Route::listen_via (boost::shared_ptr route, Placement placement, bool /*a _control_outs = listener; } - add_processor (listener, placement); + if (placement == PostFader) { + /* put it *really* at the end, not just after the panner (main outs) + */ + add_processor (listener, _processors.end()); + } else { + add_processor (listener, PreFader); + } return 0; } @@ -2803,7 +2825,6 @@ Route::put_control_outs_at (Placement p) { Glib::RWLock::WriterLock lm (_processor_lock); ProcessorList as_it_was (_processors); - // Move meter in the processors list ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs); _processors.erase(loc); @@ -2815,13 +2836,11 @@ Route::put_control_outs_at (Placement p) } break; case PostFader: - loc = find(_processors.begin(), _processors.end(), _amp); - assert (loc != _processors.end()); - loc++; + loc = _processors.end(); break; } - _processors.insert(loc, _control_outs); + _processors.insert (loc, _control_outs); if (configure_processors_unlocked (0)) { _processors = as_it_was; diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 037ae9b043..c664d67617 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -259,9 +259,10 @@ Send::display_to_user () const { /* we ignore Deliver::_display_to_user */ -// if (_role == Listen || _role == MainListen) { -// return false; -// } + if (_role == Listen) { + /* don't make the monitor/control/listen send visible */ + return false; + } return true; }