diff options
Diffstat (limited to 'libs/ardour/route.cc')
-rw-r--r-- | libs/ardour/route.cc | 115 |
1 files changed, 61 insertions, 54 deletions
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 575cad8e0b..a6af898f38 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -454,14 +454,26 @@ Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, } bufs.set_count (_input->n_ports()); - - for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + + if (is_control() && _session.listening()) { - BufferSet::iterator o = bufs.begin(*t); - PortSet& ports (_input->ports()); + /* control/monitor bus ignores input ports when something is + feeding the listen "stream". data will "arrive" into the + route from the intreturn processor element. + */ + + bufs.silence (nframes, 0); - for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) { - o->read_from (i->get_buffer(nframes), nframes); + } else { + + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { + + BufferSet::iterator o = bufs.begin(*t); + PortSet& ports (_input->ports()); + + for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) { + o->read_from (i->get_buffer(nframes), nframes); + } } } @@ -475,6 +487,32 @@ Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t n } void +Route::set_listen (bool yn, void* src) +{ + if (_control_outs) { + if (yn != _control_outs->active()) { + if (yn) { + _control_outs->activate (); + } else { + _control_outs->deactivate (); + } + + listen_changed (src); /* EMIT SIGNAL */ + } + } +} + +bool +Route::listening () const +{ + if (_control_outs) { + return _control_outs->active (); + } else { + return false; + } +} + +void Route::set_solo (bool yn, void *src) { if (_solo_safe || _solo_isolated) { @@ -506,33 +544,11 @@ Route::mod_solo_level (int32_t delta) _solo_level += delta; } - /* tell "special" delivery units what the solo situation is + /* tell main outs what the solo situation is */ - switch (Config->get_solo_model()) { - case SoloInPlace: - /* main outs are used for soloing */ - _main_outs->set_solo_level (_solo_level); - _main_outs->set_solo_isolated (_solo_isolated); - if (_control_outs) { - /* control outs just keep on playing */ - _control_outs->set_solo_level (0); - _control_outs->set_solo_isolated (true); - } - break; - - case SoloAFL: - case SoloPFL: - /* control outs are used for soloing */ - if (_control_outs) { - _control_outs->set_solo_level (_solo_level); - _control_outs->set_solo_isolated (_solo_isolated); - } - /* main outs just keep on playing */ - _main_outs->set_solo_level (0); - _main_outs->set_solo_isolated (true); - break; - } + _main_outs->set_solo_level (_solo_level); + _main_outs->set_solo_isolated (_solo_isolated); } void @@ -546,28 +562,11 @@ Route::set_solo_isolated (bool yn, void *src) if (yn != _solo_isolated) { _solo_isolated = yn; - /* tell "special" delivery units what the solo situation is + /* tell main outs what the solo situation is */ - switch (Config->get_solo_model()) { - case SoloInPlace: - _main_outs->set_solo_level (_solo_level); - _main_outs->set_solo_isolated (_solo_isolated); - if (_control_outs) { - _main_outs->set_solo_level (1); - _main_outs->set_solo_isolated (false); - } - break; - case SoloAFL: - case SoloPFL: - if (_control_outs) { - _control_outs->set_solo_level (_solo_level); - _control_outs->set_solo_isolated (_solo_isolated); - } - _main_outs->set_solo_level (1); - _main_outs->set_solo_isolated (false); - break; - } + _main_outs->set_solo_level (_solo_level); + _main_outs->set_solo_isolated (_solo_isolated); solo_isolated_changed (src); } @@ -711,7 +710,9 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite } // XXX: do we want to emit the signal here ? change call order. - processor->activate (); + if (!boost::dynamic_pointer_cast<InternalSend>(processor)) { + processor->activate (); + } processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false)); _output->set_user_latency (0); @@ -1862,7 +1863,8 @@ Route::get_return_buffer () const boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x); if (d) { - return d->get_buffers (); + BufferSet* bs = d->get_buffers (); + return bs; } } @@ -1884,7 +1886,7 @@ Route::release_return_buffer () const } int -Route::listen_via (boost::shared_ptr<Route> route, const string& listen_name) +Route::listen_via (boost::shared_ptr<Route> route, bool active) { vector<string> ports; vector<string>::const_iterator i; @@ -1893,6 +1895,7 @@ Route::listen_via (boost::shared_ptr<Route> route, const string& listen_name) Glib::RWLock::ReaderLock rm (_processor_lock); for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) { + boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x); if (d && d->target_route() == route) { @@ -1921,6 +1924,10 @@ Route::listen_via (boost::shared_ptr<Route> route, const string& listen_name) return -1; } + if (route == _session.control_out()) { + _control_outs = listener; + } + add_processor (listener, PreFader); return 0; |