2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/unwind.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_track.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/boost_debug.h"
44 #include "ardour/buffer.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/capturing_processor.h"
47 #include "ardour/debug.h"
48 #include "ardour/delivery.h"
49 #include "ardour/gain_control.h"
50 #include "ardour/internal_return.h"
51 #include "ardour/internal_send.h"
52 #include "ardour/meter.h"
53 #include "ardour/delayline.h"
54 #include "ardour/midi_buffer.h"
55 #include "ardour/midi_port.h"
56 #include "ardour/monitor_processor.h"
57 #include "ardour/pannable.h"
58 #include "ardour/panner.h"
59 #include "ardour/panner_shell.h"
60 #include "ardour/parameter_descriptor.h"
61 #include "ardour/phase_control.h"
62 #include "ardour/plugin_insert.h"
63 #include "ardour/port.h"
64 #include "ardour/port_insert.h"
65 #include "ardour/processor.h"
66 #include "ardour/profile.h"
67 #include "ardour/route.h"
68 #include "ardour/route_group.h"
69 #include "ardour/send.h"
70 #include "ardour/session.h"
71 #include "ardour/solo_control.h"
72 #include "ardour/solo_isolate_control.h"
73 #include "ardour/unknown_processor.h"
74 #include "ardour/utils.h"
75 #include "ardour/vca.h"
80 using namespace ARDOUR;
83 PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
85 /** Base class for all routable/mixable objects (tracks and busses) */
86 Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType default_type)
87 : Stripable (sess, name, PresentationInfo (flag))
88 , GraphNode (sess._process_graph)
89 , Muteable (sess, name)
93 , _signal_latency_at_amp_position (0)
94 , _signal_latency_at_trim_position (0)
97 , _pending_process_reorder (0)
98 , _pending_signals (0)
99 , _pending_declick (true)
100 , _meter_point (MeterPostFader)
101 , _pending_meter_point (MeterPostFader)
102 , _meter_type (MeterPeak)
103 , _denormal_protection (false)
106 , _declickable (false)
107 , _have_internal_generator (false)
108 , _default_type (default_type)
110 , _in_configure_processors (false)
111 , _initial_io_setup (false)
112 , _in_sidechain_setup (false)
114 , _custom_meter_position_noted (false)
117 processor_max_streams.reset();
120 boost::weak_ptr<Route>
121 Route::weakroute () {
122 return boost::weak_ptr<Route> (shared_from_this ());
128 /* set default meter type */
130 _meter_type = Config->get_meter_type_master ();
132 else if (dynamic_cast<Track*>(this)) {
133 _meter_type = Config->get_meter_type_track ();
135 _meter_type = Config->get_meter_type_bus ();
138 /* add standard controls */
140 _gain_control.reset (new GainControl (_session, GainAutomation));
141 add_control (_gain_control);
143 _trim_control.reset (new GainControl (_session, TrimAutomation));
144 add_control (_trim_control);
146 _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
147 add_control (_solo_control);
148 _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
150 _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
151 add_control (_mute_control);
153 _phase_control.reset (new PhaseControl (_session, X_("phase")));
154 add_control (_phase_control);
156 _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
157 add_control (_solo_isolate_control);
159 _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
160 add_control (_solo_safe_control);
164 if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
165 _pannable.reset (new Pannable (_session));
168 /* input and output objects */
170 _input.reset (new IO (_session, _name, IO::Input, _default_type));
171 _output.reset (new IO (_session, _name, IO::Output, _default_type));
173 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
174 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
176 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
177 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
179 /* add the amp/fader processor.
180 * it should be the first processor to be added on every route.
183 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
184 add_processor (_amp, PostFader);
187 _amp->set_display_name (_("Monitor"));
190 #if 0 // not used - just yet
191 if (!is_master() && !is_monitor() && !is_auditioner()) {
192 _delayline.reset (new DelayLine (_session, _name));
193 add_processor (_delayline, PreFader);
199 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
200 _trim->set_display_to_user (false);
202 if (dynamic_cast<AudioTrack*>(this)) {
203 /* we can't do this in the AudioTrack's constructor
204 * because _trim does not exit then
208 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
213 /* create standard processors: meter, main outs, monitor out;
214 they will be added to _processors by setup_invisible_processors ()
217 _meter.reset (new PeakMeter (_session, _name));
218 _meter->set_owner (this);
219 _meter->set_display_to_user (false);
222 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
223 _main_outs->activate ();
226 /* where we listen to tracks */
227 _intreturn.reset (new InternalReturn (_session));
228 _intreturn->activate ();
230 /* the thing that provides proper control over a control/monitor/listen bus
231 (such as per-channel cut, dim, solo, invert, etc).
233 _monitor_control.reset (new MonitorProcessor (_session));
234 _monitor_control->activate ();
237 /* now that we have _meter, its safe to connect to this */
240 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
241 configure_processors (0);
249 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
251 /* do this early so that we don't get incoming signals as we are going through destruction
256 /* don't use clear_processors here, as it depends on the session which may
257 be half-destroyed by now
260 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
261 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
262 (*i)->drop_references ();
265 _processors.clear ();
269 Route::ensure_track_or_route_name(string name, Session &session)
271 string newname = name;
273 while (!session.io_name_is_legal (newname)) {
274 newname = bump_name_once (newname, ' ');
281 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
283 // TODO route group, see set_gain()
284 // _trim_control->route_set_value (val);
288 Route::maybe_declick (BufferSet&, framecnt_t, int)
290 /* this is the "bus" implementation and they never declick.
295 /** Process this route for one (sub) cycle (process thread)
297 * @param bufs Scratch buffers to use for the signal path
298 * @param start_frame Initial transport frame
299 * @param end_frame Final transport frame
300 * @param nframes Number of frames to output (to ports)
302 * Note that (end_frame - start_frame) may not be equal to nframes when the
303 * transport speed isn't 1.0 (eg varispeed).
306 Route::process_output_buffers (BufferSet& bufs,
307 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
308 int declick, bool gain_automation_ok)
310 /* Caller must hold process lock */
311 assert (!AudioEngine::instance()->process_lock().trylock());
313 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
315 // can this actually happen? functions calling process_output_buffers()
316 // already take a reader-lock.
317 bufs.silence (nframes, 0);
321 _mute_control->automation_run (start_frame, nframes);
323 /* figure out if we're going to use gain automation */
324 if (gain_automation_ok) {
325 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
326 _amp->setup_gain_automation (
327 start_frame + _signal_latency_at_amp_position,
328 end_frame + _signal_latency_at_amp_position,
331 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
332 _trim->setup_gain_automation (
333 start_frame + _signal_latency_at_trim_position,
334 end_frame + _signal_latency_at_trim_position,
337 _amp->apply_gain_automation (false);
338 _trim->apply_gain_automation (false);
341 /* Tell main outs what to do about monitoring. We do this so that
342 on a transition between monitoring states we get a de-clicking gain
343 change in the _main_outs delivery, if config.get_use_monitor_fades()
346 We override this in the case where we have an internal generator.
348 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
350 _main_outs->no_outs_cuz_we_no_monitor (silence);
352 /* -------------------------------------------------------------------------------------------
353 GLOBAL DECLICK (for transport changes etc.)
354 ----------------------------------------------------------------------------------------- */
356 maybe_declick (bufs, nframes, declick);
357 _pending_declick = 0;
359 /* -------------------------------------------------------------------------------------------
360 DENORMAL CONTROL/PHASE INVERT
361 ----------------------------------------------------------------------------------------- */
363 if (!_phase_control->none()) {
367 if (_denormal_protection || Config->get_denormal_protection()) {
369 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
370 Sample* const sp = i->data();
372 if (_phase_control->inverted (chn)) {
373 for (pframes_t nx = 0; nx < nframes; ++nx) {
378 for (pframes_t nx = 0; nx < nframes; ++nx) {
386 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
387 Sample* const sp = i->data();
389 if (_phase_control->inverted (chn)) {
390 for (pframes_t nx = 0; nx < nframes; ++nx) {
399 if (_denormal_protection || Config->get_denormal_protection()) {
401 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
402 Sample* const sp = i->data();
403 for (pframes_t nx = 0; nx < nframes; ++nx) {
411 /* -------------------------------------------------------------------------------------------
413 ----------------------------------------------------------------------------------------- */
415 /* set this to be true if the meter will already have been ::run() earlier */
416 bool const meter_already_run = metering_state() == MeteringInput;
418 framecnt_t latency = 0;
419 const double speed = _session.transport_speed ();
421 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
423 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
424 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
429 /* if it has any inputs, make sure they match */
430 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
431 if (bufs.count() != (*i)->input_streams()) {
433 DEBUG::Processors, string_compose (
434 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
435 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
442 /* should we NOT run plugins here if the route is inactive?
443 do we catch route != active somewhere higher?
446 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
447 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
449 if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
450 const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
451 boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
452 _initial_delay + latency, longest_session_latency - latency);
455 (*i)->run (bufs, start_frame - latency, end_frame - latency, speed, nframes, *i != _processors.back());
456 bufs.set_count ((*i)->output_streams());
458 if ((*i)->active ()) {
459 latency += (*i)->signal_latency ();
465 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
466 boost::shared_ptr<Processor> endpoint,
467 bool include_endpoint, bool for_export, bool for_freeze)
469 /* If no processing is required, there's no need to go any further. */
470 if (!endpoint && !include_endpoint) {
474 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
475 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
476 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
478 /* trim is always at the top, for bounce no latency compensation is needed */
479 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
480 _trim->setup_gain_automation (start, start + nframes, nframes);
483 const double speed = _session.transport_speed ();
484 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
486 if (!include_endpoint && (*i) == endpoint) {
490 /* if we're *not* exporting, stop processing if we come across a routing processor. */
491 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
494 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
498 /* special case the panner (export outputs)
499 * Ideally we'd only run the panner, not the delivery itself...
500 * but panners need separate input/output buffers and some context
501 * (panshell, panner type, etc). AFAICT there is no ill side effect
502 * of re-using the main delivery when freewheeling/exporting a region.
504 if ((*i) == _main_outs) {
505 assert ((*i)->does_routing());
506 (*i)->run (buffers, start - latency, start - latency + nframes, speed, nframes, true);
507 buffers.set_count ((*i)->output_streams());
510 /* don't run any processors that do routing.
511 * Also don't bother with metering.
513 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
514 (*i)->run (buffers, start - latency, start - latency + nframes, 1.0, nframes, true);
515 buffers.set_count ((*i)->output_streams());
516 latency += (*i)->signal_latency ();
519 if ((*i) == endpoint) {
526 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
527 bool include_endpoint, bool for_export, bool for_freeze) const
529 framecnt_t latency = 0;
530 if (!endpoint && !include_endpoint) {
534 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
535 if (!include_endpoint && (*i) == endpoint) {
538 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
541 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
544 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
545 latency += (*i)->signal_latency ();
547 if ((*i) == endpoint) {
555 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
556 bool include_endpoint, bool for_export, bool for_freeze) const
558 if (!endpoint && !include_endpoint) {
562 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
563 if (!include_endpoint && (*i) == endpoint) {
566 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
569 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
572 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
573 cc = (*i)->output_streams();
575 if ((*i) == endpoint) {
583 Route::n_process_buffers ()
585 return max (_input->n_ports(), processor_max_streams);
589 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
591 assert (is_monitor());
592 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
593 fill_buffers_with_input (bufs, _input, nframes);
594 passthru (bufs, start_frame, end_frame, nframes, declick);
598 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
602 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
604 /* control/monitor bus ignores input ports when something is
605 feeding the listen "stream". data will "arrive" into the
606 route from the intreturn processor element.
609 bufs.silence (nframes, 0);
612 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
613 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
617 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
619 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
621 bufs.set_count (_input->n_ports());
622 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
623 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
627 Route::set_listen (bool yn)
631 _monitor_send->activate ();
633 _monitor_send->deactivate ();
639 Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
641 /* nothing to do if we're not using AFL/PFL. But if we are, we need
642 to alter the active state of the monitor send.
645 if (Config->get_solo_control_is_listen_control ()) {
646 set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
651 Route::push_solo_isolate_upstream (int32_t delta)
653 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
655 boost::shared_ptr<RouteList> routes = _session.get_routes ();
656 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
658 if ((*i).get() == this || !(*i)->can_solo()) {
663 bool does_feed = feeds (*i, &sends_only);
665 if (does_feed && !sends_only) {
666 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
672 Route::push_solo_upstream (int delta)
674 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
675 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
679 boost::shared_ptr<Route> sr (i->r.lock());
681 sr->solo_control()->mod_solo_by_others_downstream (-delta);
688 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
690 cerr << name << " {" << endl;
691 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
692 p != procs.end(); ++p) {
693 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
699 /** Supposing that we want to insert a Processor at a given Placement, return
700 * the processor to add the new one before (or 0 to add at the end).
702 boost::shared_ptr<Processor>
703 Route::before_processor_for_placement (Placement p)
705 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
707 ProcessorList::iterator loc;
710 /* generic pre-fader: insert immediately before the amp */
711 loc = find (_processors.begin(), _processors.end(), _amp);
713 /* generic post-fader: insert right before the main outs */
714 loc = find (_processors.begin(), _processors.end(), _main_outs);
717 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
720 /** Supposing that we want to insert a Processor at a given index, return
721 * the processor to add the new one before (or 0 to add at the end).
723 boost::shared_ptr<Processor>
724 Route::before_processor_for_index (int index)
727 return boost::shared_ptr<Processor> ();
730 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
732 ProcessorList::iterator i = _processors.begin ();
734 while (i != _processors.end() && j < index) {
735 if ((*i)->display_to_user()) {
742 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
745 /** Add a processor either pre- or post-fader
746 * @return 0 on success, non-0 on failure.
749 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
751 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
755 /** Add a processor to a route such that it ends up with a given index into the visible processors.
756 * @param index Index to add the processor at, or -1 to add at the end of the list.
757 * @return 0 on success, non-0 on failure.
760 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
762 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
765 /** Add a processor to the route.
766 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
767 * @return 0 on success, non-0 on failure.
770 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
772 assert (processor != _meter);
773 assert (processor != _main_outs);
775 DEBUG_TRACE (DEBUG::Processors, string_compose (
776 "%1 adding processor %2\n", name(), processor->name()));
780 pl.push_back (processor);
781 int rv = add_processors (pl, before, err);
787 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
788 processor->activate ();
795 Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
797 /* We cannot destruct the processor here (usually RT-thread
798 * with various locks held - in case of sends also io_locks).
799 * Queue for deletion in low-priority thread.
801 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
802 selfdestruct_sequence.push_back (wp);
806 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
808 XMLProperty const * prop;
811 boost::shared_ptr<Processor> processor;
813 /* bit of a hack: get the `placement' property from the <Redirect> tag here
814 so that we can add the processor in the right place (pre/post-fader)
817 XMLNodeList const & children = node.children ();
818 XMLNodeList::const_iterator i = children.begin ();
820 while (i != children.end() && (*i)->name() != X_("Redirect")) {
824 Placement placement = PreFader;
826 if (i != children.end()) {
827 if ((prop = (*i)->property (X_("placement"))) != 0) {
828 placement = Placement (string_2_enum (prop->value(), placement));
832 if (node.name() == "Insert") {
834 if ((prop = node.property ("type")) != 0) {
836 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
837 prop->value() == "lv2" ||
838 prop->value() == "windows-vst" ||
839 prop->value() == "lxvst" ||
840 prop->value() == "audiounit") {
842 if (_session.get_disable_all_loaded_plugins ()) {
843 processor.reset (new UnknownProcessor (_session, node));
845 processor.reset (new PluginInsert (_session));
846 processor->set_owner (this);
851 processor.reset (new PortInsert (_session, _pannable, _mute_master));
856 } else if (node.name() == "Send") {
858 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
859 processor.reset (new Send (_session, sendpan, _mute_master));
863 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
867 if (processor->set_state (node, version)) {
871 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
872 if (i != children.end()) {
873 if ((prop = (*i)->property (X_("active"))) != 0) {
874 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
875 processor->activate();
877 processor->deactivate();
881 return (add_processor (processor, placement, 0, false) == 0);
884 catch (failed_constructor &err) {
885 warning << _("processor could not be created. Ignored.") << endmsg;
891 inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
892 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
895 inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
896 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
900 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
902 ProcessorList::iterator loc;
905 loc = find(_processors.begin(), _processors.end(), before);
906 if (loc == _processors.end ()) {
910 /* nothing specified - at end */
911 loc = _processors.end ();
914 if (!AudioEngine::instance()->connected()) {
918 if (others.empty()) {
922 ProcessorList to_skip;
924 // check if there's an instrument to replace or configure
925 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
926 boost::shared_ptr<PluginInsert> pi;
927 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
930 if (!pi->plugin ()->get_info ()->is_instrument ()) {
933 boost::shared_ptr<Processor> instrument = the_instrument ();
934 ChanCount in (DataType::MIDI, 1);
935 ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
937 PluginSetupOptions flags = None;
940 in = instrument->input_streams ();
941 out = instrument->output_streams ();
943 if (pi->has_output_presets (in, out)) {
947 pi->set_strict_io (_strict_io);
949 PluginSetupOptions mask = None;
950 if (Config->get_ask_replace_instrument ()) {
953 if (Config->get_ask_setup_instrument ()) {
960 boost::optional<int> rv = PluginSetup (shared_from_this (), pi, flags); /* EMIT SIGNAL */
961 switch (rv.get_value_or (0)) {
963 to_skip.push_back (*i); // don't add this one;
966 replace_processor (instrument, *i, err);
967 to_skip.push_back (*i);
976 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
977 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
978 ProcessorState pstate (this);
980 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
985 ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
986 if (check != to_skip.end()) {
990 boost::shared_ptr<PluginInsert> pi;
992 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
993 pi->set_strict_io (_strict_io);
997 /* Ensure that only one amp is in the list at any time */
998 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
999 if (check != _processors.end()) {
1000 if (before == _amp) {
1001 /* Already in position; all is well */
1004 _processors.erase (check);
1009 assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
1011 _processors.insert (loc, *i);
1012 (*i)->set_owner (this);
1015 if (configure_processors_unlocked (err, &lm)) {
1017 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
1022 if (pi && pi->has_sidechain ()) {
1023 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
1026 if ((*i)->active()) {
1027 // emit ActiveChanged() and latency_changed() if needed
1031 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1033 boost::shared_ptr<Send> send;
1034 if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
1035 send->SelfDestruct.connect_same_thread (*this,
1036 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
1040 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1041 boost::shared_ptr<PluginInsert> pi;
1043 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1044 if (pi->has_no_inputs ()) {
1045 _have_internal_generator = true;
1051 _output->set_user_latency (0);
1054 reset_instrument_info ();
1055 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1056 set_processor_positions ();
1062 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1064 if (p == PreFader) {
1065 start = _processors.begin();
1066 end = find(_processors.begin(), _processors.end(), _amp);
1068 start = find(_processors.begin(), _processors.end(), _amp);
1070 end = _processors.end();
1074 /** Turn off all processors with a given placement
1075 * @param p Placement of processors to disable
1078 Route::disable_processors (Placement p)
1080 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1082 ProcessorList::iterator start, end;
1083 placement_range(p, start, end);
1085 for (ProcessorList::iterator i = start; i != end; ++i) {
1086 (*i)->enable (false);
1089 _session.set_dirty ();
1092 /** Turn off all redirects
1095 Route::disable_processors ()
1097 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1099 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1100 (*i)->enable (false);
1103 _session.set_dirty ();
1106 /** Turn off all redirects with a given placement
1107 * @param p Placement of redirects to disable
1110 Route::disable_plugins (Placement p)
1112 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1114 ProcessorList::iterator start, end;
1115 placement_range(p, start, end);
1117 for (ProcessorList::iterator i = start; i != end; ++i) {
1118 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1119 (*i)->enable (false);
1123 _session.set_dirty ();
1126 /** Turn off all plugins
1129 Route::disable_plugins ()
1131 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1133 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1134 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1135 (*i)->enable (false);
1139 _session.set_dirty ();
1144 Route::ab_plugins (bool forward)
1146 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1150 /* forward = turn off all active redirects, and mark them so that the next time
1151 we go the other way, we will revert them
1154 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1155 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1159 if ((*i)->enabled ()) {
1160 (*i)->enable (false);
1161 (*i)->set_next_ab_is_active (true);
1163 (*i)->set_next_ab_is_active (false);
1169 /* backward = if the redirect was marked to go active on the next ab, do so */
1171 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1173 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1177 (*i)->enable ((*i)->get_next_ab_is_active ());
1181 _session.set_dirty ();
1185 /** Remove processors with a given placement.
1186 * @param p Placement of processors to remove.
1189 Route::clear_processors (Placement p)
1191 if (!_session.engine().connected()) {
1195 bool already_deleting = _session.deletion_in_progress();
1196 if (!already_deleting) {
1197 _session.set_deletion_in_progress();
1201 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1202 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1203 ProcessorList new_list;
1204 ProcessorStreams err;
1205 bool seen_amp = false;
1207 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1213 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1215 /* you can't remove these */
1217 new_list.push_back (*i);
1224 new_list.push_back (*i);
1227 (*i)->drop_references ();
1235 (*i)->drop_references ();
1238 new_list.push_back (*i);
1245 _processors = new_list;
1246 configure_processors_unlocked (&err, &lm); // this can't fail
1249 processor_max_streams.reset();
1250 _have_internal_generator = false;
1251 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1252 set_processor_positions ();
1254 reset_instrument_info ();
1256 if (!already_deleting) {
1257 _session.clear_deletion_in_progress();
1262 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1264 // TODO once the export point can be configured properly, do something smarter here
1265 if (processor == _capturing_processor) {
1266 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1267 if (need_process_lock) {
1271 _capturing_processor.reset();
1273 if (need_process_lock) {
1278 /* these can never be removed */
1280 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1284 if (!_session.engine().connected()) {
1288 processor_max_streams.reset();
1291 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1292 if (need_process_lock) {
1296 /* Caller must hold process lock */
1297 assert (!AudioEngine::instance()->process_lock().trylock());
1299 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1301 ProcessorState pstate (this);
1303 ProcessorList::iterator i;
1304 bool removed = false;
1306 for (i = _processors.begin(); i != _processors.end(); ) {
1307 if (*i == processor) {
1309 /* move along, see failure case for configure_processors()
1310 where we may need to reconfigure the processor.
1313 /* stop redirects that send signals to JACK ports
1314 from causing noise as a result of no longer being
1318 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1319 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
1323 iop = pi->sidechain();
1330 i = _processors.erase (i);
1338 _output->set_user_latency (0);
1346 if (configure_processors_unlocked (err, &lm)) {
1348 /* we know this will work, because it worked before :) */
1349 configure_processors_unlocked (0, &lm);
1353 _have_internal_generator = false;
1355 for (i = _processors.begin(); i != _processors.end(); ++i) {
1356 boost::shared_ptr<PluginInsert> pi;
1358 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1359 if (pi->has_no_inputs ()) {
1360 _have_internal_generator = true;
1365 if (need_process_lock) {
1370 reset_instrument_info ();
1371 processor->drop_references ();
1372 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1373 set_processor_positions ();
1379 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1381 /* these can never be removed */
1382 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1385 /* and can't be used as substitute, either */
1386 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1390 /* I/Os are out, too */
1391 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1395 /* this function cannot be used to swap/reorder processors */
1396 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1400 if (!AudioEngine::instance()->connected() || !old || !sub) {
1404 /* ensure that sub is not owned by another route */
1405 if (sub->owner ()) {
1410 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1411 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1412 ProcessorState pstate (this);
1414 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1416 ProcessorList::iterator i;
1417 bool replaced = false;
1418 bool enable = old->enabled ();
1420 for (i = _processors.begin(); i != _processors.end(); ) {
1422 i = _processors.erase (i);
1423 _processors.insert (i, sub);
1424 sub->set_owner (this);
1437 boost::shared_ptr<PluginInsert> pi;
1438 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1439 pi->set_strict_io (true);
1443 if (configure_processors_unlocked (err, &lm)) {
1445 configure_processors_unlocked (0, &lm);
1449 _have_internal_generator = false;
1451 for (i = _processors.begin(); i != _processors.end(); ++i) {
1452 boost::shared_ptr<PluginInsert> pi;
1453 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1454 if (pi->has_no_inputs ()) {
1455 _have_internal_generator = true;
1465 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1466 _output->set_user_latency (0);
1469 reset_instrument_info ();
1470 old->drop_references ();
1471 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1472 set_processor_positions ();
1477 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1479 ProcessorList deleted;
1481 if (!_session.engine().connected()) {
1485 processor_max_streams.reset();
1488 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1489 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1490 ProcessorState pstate (this);
1492 ProcessorList::iterator i;
1493 boost::shared_ptr<Processor> processor;
1495 for (i = _processors.begin(); i != _processors.end(); ) {
1499 /* these can never be removed */
1501 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1506 /* see if its in the list of processors to delete */
1508 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1513 /* stop IOProcessors that send to JACK ports
1514 from causing noise as a result of no longer being
1518 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
1519 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
1522 iop = pi->sidechain();
1529 deleted.push_back (processor);
1530 i = _processors.erase (i);
1533 if (deleted.empty()) {
1534 /* none of those in the requested list were found */
1538 _output->set_user_latency (0);
1540 if (configure_processors_unlocked (err, &lm)) {
1542 /* we know this will work, because it worked before :) */
1543 configure_processors_unlocked (0, &lm);
1548 _have_internal_generator = false;
1550 for (i = _processors.begin(); i != _processors.end(); ++i) {
1551 boost::shared_ptr<PluginInsert> pi;
1553 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1554 if (pi->has_no_inputs ()) {
1555 _have_internal_generator = true;
1562 /* now try to do what we need to so that those that were removed will be deleted */
1564 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1565 (*i)->drop_references ();
1568 reset_instrument_info ();
1569 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1570 set_processor_positions ();
1576 Route::reset_instrument_info ()
1578 boost::shared_ptr<Processor> instr = the_instrument();
1580 _instrument_info.set_internal_instrument (instr);
1584 /** Caller must hold process lock */
1586 Route::configure_processors (ProcessorStreams* err)
1588 #ifndef PLATFORM_WINDOWS
1589 assert (!AudioEngine::instance()->process_lock().trylock());
1592 if (!_in_configure_processors) {
1593 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1594 return configure_processors_unlocked (err, &lm);
1601 Route::input_streams () const
1603 return _input->n_ports ();
1606 list<pair<ChanCount, ChanCount> >
1607 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1609 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1611 return try_configure_processors_unlocked (in, err);
1614 list<pair<ChanCount, ChanCount> >
1615 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1617 // Check each processor in order to see if we can configure as requested
1619 list<pair<ChanCount, ChanCount> > configuration;
1622 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1623 DEBUG_TRACE (DEBUG::Processors, "{\n");
1625 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1627 if ((*p)->can_support_io_configuration(in, out)) {
1629 if (boost::dynamic_pointer_cast<Delivery> (*p)
1630 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
1632 && (is_monitor() || _strict_io || Profile->get_mixbus ())) {
1633 /* with strict I/O the panner + output are forced to
1634 * follow the last processor's output.
1636 * Delivery::can_support_io_configuration() will only add ports,
1637 * but not remove excess ports.
1639 * This works because the delivery only requires
1640 * as many outputs as there are inputs.
1641 * Delivery::configure_io() will do the actual removal
1642 * by calling _output->ensure_io()
1644 if (!is_master() && _session.master_out () && in.n_audio() > 0) {
1645 /* ..but at least as many as there are master-inputs, if
1646 * the delivery is dealing with audio */
1647 // XXX this may need special-casing for mixbus (master-outputs)
1648 // and should maybe be a preference anyway ?!
1649 out = ChanCount::max (in, _session.master_out ()->n_inputs ());
1655 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1656 configuration.push_back(make_pair(in, out));
1659 // restriction for Monitor Section Processors
1660 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
1661 /* do not allow to add/remove channels (for now)
1662 * The Monitor follows the master-bus and has no panner (unpan)
1663 * but do allow processors with midi-in to be added (e.g VSTs with control that
1664 * will remain unconnected)
1666 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration not allowed.\n");
1667 return list<pair<ChanCount, ChanCount> > ();
1669 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
1670 // internal sends make no sense, only feedback
1671 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1672 return list<pair<ChanCount, ChanCount> > ();
1674 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
1675 /* External Sends can be problematic. one can add/remove ports
1676 * there signal leaves the DAW to external monitors anyway, so there's
1677 * no real use for allowing them here anyway.
1679 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
1680 return list<pair<ChanCount, ChanCount> > ();
1682 if (boost::dynamic_pointer_cast<Send> (*p)) {
1684 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1685 return list<pair<ChanCount, ChanCount> > ();
1694 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1695 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1696 DEBUG_TRACE (DEBUG::Processors, "}\n");
1697 return list<pair<ChanCount, ChanCount> > ();
1701 DEBUG_TRACE (DEBUG::Processors, "}\n");
1703 return configuration;
1706 /** Set the input/output configuration of each processor in the processors list.
1707 * Caller must hold process lock.
1708 * Return 0 on success, otherwise configuration is impossible.
1711 Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
1713 #ifndef PLATFORM_WINDOWS
1714 assert (!AudioEngine::instance()->process_lock().trylock());
1717 if (_in_configure_processors) {
1721 /* put invisible processors where they should be */
1722 setup_invisible_processors ();
1724 _in_configure_processors = true;
1726 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1728 if (configuration.empty ()) {
1729 _in_configure_processors = false;
1734 bool seen_mains_out = false;
1735 processor_out_streams = _input->n_ports();
1736 processor_max_streams.reset();
1738 /* processor configure_io() may result in adding ports
1739 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
1741 * with jack2 adding ports results in a graph-order callback,
1742 * which calls Session::resort_routes() and eventually
1743 * Route::direct_feeds_according_to_reality()
1744 * which takes a ReaderLock (_processor_lock).
1746 * so we can't hold a WriterLock here until jack2 threading
1749 * NB. we still hold the process lock
1751 * (ardour's own engines do call graph-order from the
1752 * process-thread and hence do not have this issue; besides
1753 * merely adding ports won't trigger a graph-order, only
1754 * making connections does)
1758 // TODO check for a potential ReaderLock after ReaderLock ??
1759 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
1761 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1762 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1764 if (!(*p)->configure_io(c->first, c->second)) {
1765 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1766 _in_configure_processors = false;
1771 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1772 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1774 boost::shared_ptr<IOProcessor> iop;
1775 boost::shared_ptr<PluginInsert> pi;
1776 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1777 /* plugins connected via Split or Hide Match may have more channels.
1778 * route/scratch buffers are needed for all of them
1779 * The configuration may only be a subset (both input and output)
1781 processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
1783 else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
1784 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
1785 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
1789 if (boost::dynamic_pointer_cast<Delivery> (*p)
1790 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1791 /* main delivery will increase port count to match input.
1792 * the Delivery::Main is usually the last processor - followed only by
1795 seen_mains_out = true;
1797 if (!seen_mains_out) {
1798 processor_out_streams = out;
1807 _meter->set_max_channels (processor_max_streams);
1810 /* make sure we have sufficient scratch buffers to cope with the new processor
1813 _session.ensure_buffers (n_process_buffers ());
1815 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1817 _in_configure_processors = false;
1821 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1822 * @param state New active state for those processors.
1825 Route::all_visible_processors_active (bool state)
1827 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1829 if (_processors.empty()) {
1833 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1834 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1837 (*i)->enable (state);
1840 _session.set_dirty ();
1844 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1846 /* check if re-order requires re-configuration of any processors
1847 * -> compare channel configuration for all processors
1849 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1850 ChanCount c = input_streams ();
1852 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1854 if (c != (*j)->input_streams()) {
1857 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1860 if ((*i)->input_streams() != c) {
1863 c = (*i)->output_streams();
1875 __attribute__((annotate("realtime")))
1878 Route::apply_processor_order (const ProcessorList& new_order)
1880 /* need to hold processor_lock; either read or write lock
1881 * and the engine process_lock.
1882 * Due to r/w lock ambiguity we can only assert the latter
1884 assert (!AudioEngine::instance()->process_lock().trylock());
1887 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1888 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1889 * processors in the current actual processor list that are hidden. Any visible processors
1890 * in the current list but not in "new_order" will be assumed to be deleted.
1893 /* "as_it_will_be" and "_processors" are lists of shared pointers.
1894 * actual memory usage is small, but insert/erase is not actually rt-safe :(
1895 * (note though that ::processors_reorder_needs_configure() ensured that
1896 * this function will only ever be called from the rt-thread if no processor were removed)
1898 * either way, I can't proove it, but an x-run due to re-order here is less likley
1899 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
1902 ProcessorList as_it_will_be;
1903 ProcessorList::iterator oiter;
1904 ProcessorList::const_iterator niter;
1906 oiter = _processors.begin();
1907 niter = new_order.begin();
1909 while (niter != new_order.end()) {
1911 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1912 then append it to the temp list.
1914 Otherwise, see if the next processor in the old list is in the new list. if not,
1915 its been deleted. If its there, append it to the temp list.
1918 if (oiter == _processors.end()) {
1920 /* no more elements in the old list, so just stick the rest of
1921 the new order onto the temp list.
1924 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1925 while (niter != new_order.end()) {
1932 if (!(*oiter)->display_to_user()) {
1934 as_it_will_be.push_back (*oiter);
1938 /* visible processor: check that its in the new order */
1940 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1941 /* deleted: do nothing, shared_ptr<> will clean up */
1943 /* ignore this one, and add the next item from the new order instead */
1944 as_it_will_be.push_back (*niter);
1949 /* now remove from old order - its taken care of no matter what */
1950 oiter = _processors.erase (oiter);
1954 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1956 /* If the meter is in a custom position, find it and make a rough note of its position */
1957 maybe_note_meter_position ();
1961 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1963 // it a change is already queued, wait for it
1964 // (unless engine is stopped. apply immediately and proceed
1965 while (g_atomic_int_get (&_pending_process_reorder)) {
1966 if (!AudioEngine::instance()->running()) {
1967 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
1968 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1970 apply_processor_order(_pending_processor_order);
1971 setup_invisible_processors ();
1973 g_atomic_int_set (&_pending_process_reorder, 0);
1975 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1976 set_processor_positions ();
1978 // TODO rather use a semaphore or something.
1979 // but since ::reorder_processors() is called
1980 // from the GUI thread, this is fine..
1985 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
1987 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1988 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1989 ProcessorState pstate (this);
1991 apply_processor_order (new_order);
1993 if (configure_processors_unlocked (err, &lm)) {
2001 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2002 set_processor_positions ();
2005 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2006 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2008 // _pending_processor_order is protected by _processor_lock
2009 _pending_processor_order = new_order;
2010 g_atomic_int_set (&_pending_process_reorder, 1);
2017 Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
2019 boost::shared_ptr<PluginInsert> pi;
2020 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2024 if (pi->has_sidechain () == add) {
2025 return true; // ?? call failed, but result is as expected.
2029 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2030 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2031 if (i == _processors.end ()) {
2037 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
2038 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2039 PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
2041 lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
2043 if (!pi->add_sidechain ()) {
2047 if (!pi->del_sidechain ()) {
2053 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2058 pi->del_sidechain ();
2060 pi->add_sidechain ();
2061 // TODO restore side-chain's state.
2066 configure_processors_unlocked (0, &lm);
2069 if (pi->has_sidechain ()) {
2070 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2073 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2074 _session.set_dirty ();
2079 Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
2081 boost::shared_ptr<PluginInsert> pi;
2082 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2087 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2088 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2089 if (i == _processors.end ()) {
2095 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2096 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2098 const ChanCount& old (pi->preset_out ());
2099 if (!pi->set_preset_out (outs)) {
2100 return true; // no change, OK
2103 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2106 pi->set_preset_out (old);
2109 configure_processors_unlocked (0, &lm);
2112 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2113 _session.set_dirty ();
2118 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2121 return customize_plugin_insert (proc, 0, unused, unused);
2125 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
2127 boost::shared_ptr<PluginInsert> pi;
2128 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2133 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2134 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2135 if (i == _processors.end ()) {
2141 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2142 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2144 bool old_cust = pi->custom_cfg ();
2145 uint32_t old_cnt = pi->get_count ();
2146 ChanCount old_chan = pi->output_streams ();
2147 ChanCount old_sinks = pi->natural_input_streams ();
2150 pi->set_custom_cfg (false);
2152 pi->set_custom_cfg (true);
2153 pi->set_count (count);
2154 pi->set_outputs (outs);
2155 pi->set_sinks (sinks);
2158 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2162 pi->set_count (old_cnt);
2163 pi->set_sinks (old_sinks);
2164 pi->set_outputs (old_chan);
2165 pi->set_custom_cfg (old_cust);
2169 configure_processors_unlocked (0, &lm);
2172 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2173 _session.set_dirty ();
2178 Route::set_strict_io (const bool enable)
2180 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2182 if (_strict_io != enable) {
2183 _strict_io = enable;
2184 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2185 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2186 boost::shared_ptr<PluginInsert> pi;
2187 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2188 pi->set_strict_io (_strict_io);
2192 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2196 _strict_io = !enable; // restore old value
2197 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2198 boost::shared_ptr<PluginInsert> pi;
2199 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2200 pi->set_strict_io (_strict_io);
2207 configure_processors (0);
2210 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2211 _session.set_dirty ();
2223 Route::get_template()
2225 return state(false);
2229 Route::state(bool full_state)
2232 if (!_session._template_state_dir.empty()) {
2233 assert (!full_state); // only for templates
2234 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2237 XMLNode *node = new XMLNode("Route");
2238 ProcessorList::iterator i;
2241 id().print (buf, sizeof (buf));
2242 node->add_property("id", buf);
2243 node->add_property ("name", _name);
2244 node->add_property("default-type", _default_type.to_string());
2245 node->add_property ("strict-io", _strict_io);
2247 node->add_child_nocopy (_presentation_info.get_state());
2249 node->add_property("active", _active?"yes":"no");
2251 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2252 node->add_property("meter-point", enum_2_string (_meter_point));
2254 node->add_property("meter-type", enum_2_string (_meter_type));
2257 node->add_property("route-group", _route_group->name());
2260 node->add_child_nocopy (_solo_control->get_state ());
2261 node->add_child_nocopy (_solo_isolate_control->get_state ());
2262 node->add_child_nocopy (_solo_safe_control->get_state ());
2264 node->add_child_nocopy (_input->state (full_state));
2265 node->add_child_nocopy (_output->state (full_state));
2266 node->add_child_nocopy (_mute_master->get_state ());
2268 node->add_child_nocopy (_mute_control->get_state ());
2269 node->add_child_nocopy (_phase_control->get_state ());
2272 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2275 if (_comment.length()) {
2276 XMLNode *cmt = node->add_child ("Comment");
2277 cmt->add_content (_comment);
2281 node->add_child_nocopy (_pannable->state (full_state));
2285 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2286 for (i = _processors.begin(); i != _processors.end(); ++i) {
2288 /* template save: do not include internal sends functioning as
2289 aux sends because the chance of the target ID
2290 in the session where this template is used
2293 similarly, do not save listen sends which connect to
2294 the monitor section, because these will always be
2297 boost::shared_ptr<InternalSend> is;
2299 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2300 if (is->role() == Delivery::Listen) {
2305 node->add_child_nocopy((*i)->state (full_state));
2310 node->add_child_copy (*_extra_xml);
2313 if (_custom_meter_position_noted) {
2314 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2316 after->id().print (buf, sizeof (buf));
2317 node->add_property (X_("processor-after-last-custom-meter"), buf);
2321 if (!_session._template_state_dir.empty()) {
2322 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2325 node->add_child_copy (Slavable::get_state());
2331 Route::set_state (const XMLNode& node, int version)
2333 if (version < 3000) {
2334 return set_state_2X (node, version);
2338 XMLNodeConstIterator niter;
2340 XMLProperty const * prop;
2342 if (node.name() != "Route"){
2343 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2347 if ((prop = node.property (X_("name"))) != 0) {
2348 Route::set_name (prop->value());
2352 _initial_io_setup = true;
2354 Stripable::set_state (node, version);
2356 if ((prop = node.property (X_("strict-io"))) != 0) {
2357 _strict_io = string_is_affirmative (prop->value());
2361 /* monitor bus does not get a panner, but if (re)created
2362 via XML, it will already have one by the time we
2363 call ::set_state(). so ... remove it.
2368 /* add all processors (except amp, which is always present) */
2370 nlist = node.children();
2371 XMLNode processor_state (X_("processor_state"));
2373 Stateful::save_extra_xml (node);
2375 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2379 if (child->name() == IO::state_node_name) {
2380 if ((prop = child->property (X_("direction"))) == 0) {
2384 if (prop->value() == "Input") {
2385 _input->set_state (*child, version);
2386 } else if (prop->value() == "Output") {
2387 _output->set_state (*child, version);
2390 } else if (child->name() == X_("Processor")) {
2391 processor_state.add_child_copy (*child);
2392 } else if (child->name() == X_("Pannable")) {
2394 _pannable->set_state (*child, version);
2396 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2398 } else if (child->name() == Slavable::xml_node_name) {
2399 Slavable::set_state (*child, version);
2403 if ((prop = node.property (X_("meter-point"))) != 0) {
2404 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2405 set_meter_point (mp, true);
2407 _meter->set_display_to_user (_meter_point == MeterCustom);
2411 if ((prop = node.property (X_("meter-type"))) != 0) {
2412 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2415 _initial_io_setup = false;
2417 set_processor_state (processor_state);
2419 // this looks up the internal instrument in processors
2420 reset_instrument_info();
2422 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2423 set_denormal_protection (string_is_affirmative (prop->value()));
2426 if ((prop = node.property (X_("active"))) != 0) {
2427 bool yn = string_is_affirmative (prop->value());
2428 set_active (yn, this);
2431 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2432 PBD::ID id (prop->value ());
2433 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2434 ProcessorList::const_iterator i = _processors.begin ();
2435 while (i != _processors.end() && (*i)->id() != id) {
2439 if (i != _processors.end ()) {
2440 _processor_after_last_custom_meter = *i;
2441 _custom_meter_position_noted = true;
2445 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2448 if (child->name() == X_("Comment")) {
2450 /* XXX this is a terrible API design in libxml++ */
2452 XMLNode *cmt = *(child->children().begin());
2453 _comment = cmt->content();
2455 } else if (child->name() == Controllable::xml_node_name) {
2456 if ((prop = child->property (X_("name"))) == 0) {
2460 if (prop->value() == _gain_control->name()) {
2461 _gain_control->set_state (*child, version);
2462 } else if (prop->value() == _solo_control->name()) {
2463 _solo_control->set_state (*child, version);
2464 } else if (prop->value() == _solo_safe_control->name()) {
2465 _solo_safe_control->set_state (*child, version);
2466 } else if (prop->value() == _solo_isolate_control->name()) {
2467 _solo_isolate_control->set_state (*child, version);
2468 } else if (prop->value() == _mute_control->name()) {
2469 _mute_control->set_state (*child, version);
2470 } else if (prop->value() == _phase_control->name()) {
2471 _phase_control->set_state (*child, version);
2473 } else if (child->name() == MuteMaster::xml_node_name) {
2474 _mute_master->set_state (*child, version);
2476 } else if (child->name() == Automatable::xml_node_name) {
2477 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2485 Route::set_state_2X (const XMLNode& node, int version)
2489 XMLNodeConstIterator niter;
2491 XMLProperty const * prop;
2493 /* 2X things which still remain to be handled:
2499 if (node.name() != "Route") {
2500 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2504 Stripable::set_state (node, version);
2506 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2507 set_denormal_protection (string_is_affirmative (prop->value()));
2510 if ((prop = node.property (X_("muted"))) != 0) {
2513 bool muted = string_is_affirmative (prop->value());
2519 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2521 if (string_is_affirmative (prop->value())){
2522 mute_point = mute_point + "PreFader";
2527 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2529 if (string_is_affirmative (prop->value())){
2532 mute_point = mute_point + ",";
2535 mute_point = mute_point + "PostFader";
2540 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2542 if (string_is_affirmative (prop->value())){
2545 mute_point = mute_point + ",";
2548 mute_point = mute_point + "Listen";
2553 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2555 if (string_is_affirmative (prop->value())){
2558 mute_point = mute_point + ",";
2561 mute_point = mute_point + "Main";
2565 _mute_master->set_mute_points (mute_point);
2566 _mute_master->set_muted_by_self (true);
2570 if ((prop = node.property (X_("meter-point"))) != 0) {
2571 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2576 nlist = node.children ();
2577 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2581 if (child->name() == IO::state_node_name) {
2583 /* there is a note in IO::set_state_2X() about why we have to call
2587 _input->set_state_2X (*child, version, true);
2588 _output->set_state_2X (*child, version, false);
2590 if ((prop = child->property (X_("name"))) != 0) {
2591 Route::set_name (prop->value ());
2596 if ((prop = child->property (X_("active"))) != 0) {
2597 bool yn = string_is_affirmative (prop->value());
2598 _active = !yn; // force switch
2599 set_active (yn, this);
2602 if ((prop = child->property (X_("gain"))) != 0) {
2605 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2606 _amp->gain_control()->set_value (val, Controllable::NoGroup);
2610 /* Set up Panners in the IO */
2611 XMLNodeList io_nlist = child->children ();
2613 XMLNodeConstIterator io_niter;
2616 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2618 io_child = *io_niter;
2620 if (io_child->name() == X_("Panner")) {
2621 _main_outs->panner_shell()->set_state(*io_child, version);
2622 } else if (io_child->name() == X_("Automation")) {
2623 /* IO's automation is for the fader */
2624 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2630 XMLNodeList redirect_nodes;
2632 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2636 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2637 redirect_nodes.push_back(child);
2642 set_processor_state_2X (redirect_nodes, version);
2644 Stateful::save_extra_xml (node);
2646 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2649 if (child->name() == X_("Comment")) {
2651 /* XXX this is a terrible API design in libxml++ */
2653 XMLNode *cmt = *(child->children().begin());
2654 _comment = cmt->content();
2656 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2657 if (prop->value() == X_("solo")) {
2658 _solo_control->set_state (*child, version);
2659 } else if (prop->value() == X_("mute")) {
2660 _mute_control->set_state (*child, version);
2670 Route::get_processor_state ()
2672 XMLNode* root = new XMLNode (X_("redirects"));
2673 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2674 root->add_child_nocopy ((*i)->state (true));
2681 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2683 /* We don't bother removing existing processors not in nList, as this
2684 method will only be called when creating a Route from scratch, not
2685 for undo purposes. Just put processors in at the appropriate place
2689 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2690 add_processor_from_xml_2X (**i, version);
2695 Route::set_processor_state (const XMLNode& node)
2697 const XMLNodeList &nlist = node.children();
2698 XMLNodeConstIterator niter;
2699 ProcessorList new_order;
2700 bool must_configure = false;
2702 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2704 XMLProperty* prop = (*niter)->property ("type");
2706 if (prop->value() == "amp") {
2707 _amp->set_state (**niter, Stateful::current_state_version);
2708 new_order.push_back (_amp);
2709 } else if (prop->value() == "trim") {
2710 _trim->set_state (**niter, Stateful::current_state_version);
2711 new_order.push_back (_trim);
2712 } else if (prop->value() == "meter") {
2713 _meter->set_state (**niter, Stateful::current_state_version);
2714 new_order.push_back (_meter);
2715 } else if (prop->value() == "delay") {
2717 _delayline->set_state (**niter, Stateful::current_state_version);
2718 new_order.push_back (_delayline);
2720 } else if (prop->value() == "main-outs") {
2721 _main_outs->set_state (**niter, Stateful::current_state_version);
2722 } else if (prop->value() == "intreturn") {
2724 _intreturn.reset (new InternalReturn (_session));
2725 must_configure = true;
2727 _intreturn->set_state (**niter, Stateful::current_state_version);
2728 } else if (is_monitor() && prop->value() == "monitor") {
2729 if (!_monitor_control) {
2730 _monitor_control.reset (new MonitorProcessor (_session));
2731 must_configure = true;
2733 _monitor_control->set_state (**niter, Stateful::current_state_version);
2734 } else if (prop->value() == "capture") {
2735 /* CapturingProcessor should never be restored, it's always
2736 added explicitly when needed */
2738 ProcessorList::iterator o;
2740 for (o = _processors.begin(); o != _processors.end(); ++o) {
2741 XMLProperty const * id_prop = (*niter)->property(X_("id"));
2742 if (id_prop && (*o)->id() == id_prop->value()) {
2743 (*o)->set_state (**niter, Stateful::current_state_version);
2744 new_order.push_back (*o);
2749 // If the processor (*niter) is not on the route then create it
2751 if (o == _processors.end()) {
2753 boost::shared_ptr<Processor> processor;
2755 if (prop->value() == "intsend") {
2757 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2759 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2760 prop->value() == "lv2" ||
2761 prop->value() == "windows-vst" ||
2762 prop->value() == "lxvst" ||
2763 prop->value() == "luaproc" ||
2764 prop->value() == "audiounit") {
2766 if (_session.get_disable_all_loaded_plugins ()) {
2767 processor.reset (new UnknownProcessor (_session, **niter));
2769 processor.reset (new PluginInsert (_session));
2770 processor->set_owner (this);
2772 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
2773 pi->set_strict_io (true);
2777 } else if (prop->value() == "port") {
2779 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2781 } else if (prop->value() == "send") {
2783 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2784 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
2785 send->SelfDestruct.connect_same_thread (*this,
2786 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
2789 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2793 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2794 /* This processor could not be configured. Turn it into a UnknownProcessor */
2795 processor.reset (new UnknownProcessor (_session, **niter));
2798 /* subscribe to Sidechain IO changes */
2799 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
2800 if (pi && pi->has_sidechain ()) {
2801 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2804 /* we have to note the monitor send here, otherwise a new one will be created
2805 and the state of this one will be lost.
2807 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2808 if (isend && isend->role() == Delivery::Listen) {
2809 _monitor_send = isend;
2812 /* it doesn't matter if invisible processors are added here, as they
2813 will be sorted out by setup_invisible_processors () shortly.
2816 new_order.push_back (processor);
2817 must_configure = true;
2823 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2824 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2825 /* re-assign _processors w/o process-lock.
2826 * if there's an IO-processor present in _processors but
2827 * not in new_order, it will be deleted and ~IO takes
2830 _processors = new_order;
2832 if (must_configure) {
2833 configure_processors_unlocked (0, &lm);
2836 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2838 (*i)->set_owner (this);
2839 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2841 boost::shared_ptr<PluginInsert> pi;
2843 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2844 if (pi->has_no_inputs ()) {
2845 _have_internal_generator = true;
2852 reset_instrument_info ();
2853 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2854 set_processor_positions ();
2858 Route::curve_reallocate ()
2860 // _gain_automation_curve.finish_resize ();
2861 // _pan_automation_curve.finish_resize ();
2865 Route::silence (framecnt_t nframes)
2867 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2872 silence_unlocked (nframes);
2876 Route::silence_unlocked (framecnt_t nframes)
2878 /* Must be called with the processor lock held */
2880 const framepos_t now = _session.transport_frame ();
2884 _output->silence (nframes);
2886 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2887 boost::shared_ptr<PluginInsert> pi;
2889 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2890 // skip plugins, they don't need anything when we're not active
2894 (*i)->silence (nframes, now);
2897 if (nframes == _session.get_block_size()) {
2904 Route::add_internal_return ()
2907 _intreturn.reset (new InternalReturn (_session));
2908 add_processor (_intreturn, PreFader);
2913 Route::add_send_to_internal_return (InternalSend* send)
2915 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2917 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2918 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2921 return d->add_send (send);
2927 Route::remove_send_from_internal_return (InternalSend* send)
2929 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2931 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2932 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2935 return d->remove_send (send);
2941 Route::enable_monitor_send ()
2943 /* Caller must hold process lock */
2944 assert (!AudioEngine::instance()->process_lock().trylock());
2946 /* master never sends to monitor section via the normal mechanism */
2947 assert (!is_master ());
2948 assert (!is_monitor ());
2950 /* make sure we have one */
2951 if (!_monitor_send) {
2952 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
2953 _monitor_send->set_display_to_user (false);
2957 configure_processors (0);
2960 /** Add an aux send to a route.
2961 * @param route route to send to.
2962 * @param before Processor to insert before, or 0 to insert at the end.
2965 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2967 assert (route != _session.monitor_out ());
2970 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2972 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2974 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2976 if (d && d->target_route() == route) {
2977 /* already listening via the specified IO: do nothing */
2985 boost::shared_ptr<InternalSend> listener;
2988 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2989 listener.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
2992 add_processor (listener, before);
2994 } catch (failed_constructor& err) {
3002 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3004 ProcessorStreams err;
3005 ProcessorList::iterator tmp;
3008 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3010 /* have to do this early because otherwise processor reconfig
3011 * will put _monitor_send back in the list
3014 if (route == _session.monitor_out()) {
3015 _monitor_send.reset ();
3019 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3021 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3023 if (d && d->target_route() == route) {
3025 if (remove_processor (*x, &err, false) > 0) {
3031 /* list could have been demolished while we dropped the lock
3034 if (_session.engine().connected()) {
3035 /* i/o processors cannot be removed if the engine is not running
3036 * so don't live-loop in case the engine is N/A or dies
3046 Route::set_comment (string cmt, void *src)
3050 _session.set_dirty ();
3054 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3056 FeedRecord fr (other, via_sends_only);
3058 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3060 if (!result.second) {
3062 /* already a record for "other" - make sure sends-only information is correct */
3063 if (!via_sends_only && result.first->sends_only) {
3064 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3065 frp->sends_only = false;
3069 return result.second;
3073 Route::clear_fed_by ()
3079 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3081 const FedBy& fed_by (other->fed_by());
3083 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3084 boost::shared_ptr<Route> sr = f->r.lock();
3086 if (sr && (sr.get() == this)) {
3088 if (via_sends_only) {
3089 *via_sends_only = f->sends_only;
3100 Route::all_inputs () const
3102 /* TODO, if this works as expected,
3103 * cache the IOVector and maintain it via
3104 * input_change_handler(), sidechain_change_handler() etc
3107 ios.push_back (_input);
3109 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3110 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3112 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3113 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3116 iop = pi->sidechain();
3119 if (iop != 0 && iop->input()) {
3120 ios.push_back (iop->input());
3127 Route::all_outputs () const
3130 // _output is included via Delivery
3131 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3132 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3133 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3134 if (iop != 0 && iop->output()) {
3135 ios.push_back (iop->output());
3142 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3144 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3145 if (other->all_inputs().fed_by (_output)) {
3146 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3147 if (via_send_only) {
3148 *via_send_only = false;
3154 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3156 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3158 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3159 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3162 iop = pi->sidechain();
3166 boost::shared_ptr<const IO> iop_out = iop->output();
3167 if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
3168 // TODO this needs a delaylines in the Insert to align connections (!)
3169 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
3172 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3173 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3174 if (via_send_only) {
3175 *via_send_only = true;
3179 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3182 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3187 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3192 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3194 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3198 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3200 return _session._current_route_graph.feeds (shared_from_this (), other);
3203 /** Called from the (non-realtime) butler thread when the transport is stopped */
3205 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3207 framepos_t now = _session.transport_frame();
3210 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3212 Automatable::transport_stopped (now);
3214 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3216 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3220 (*i)->transport_stopped (now);
3224 _roll_delay = _initial_delay;
3228 Route::input_change_handler (IOChange change, void * /*src*/)
3230 if ((change.type & IOChange::ConfigurationChanged)) {
3231 /* This is called with the process lock held if change
3232 contains ConfigurationChanged
3234 configure_processors (0);
3235 _phase_control->resize (_input->n_ports().n_audio ());
3236 io_changed (); /* EMIT SIGNAL */
3239 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3242 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3243 if (_input->connected()) {
3244 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3245 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3249 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3250 if (does_feed && !sends_only) {
3251 if ((*i)->soloed()) {
3254 if ((*i)->solo_isolate_control()->solo_isolated()) {
3261 int delta = sbou - _solo_control->soloed_by_others_upstream();
3262 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3265 PBD::warning << string_compose (
3266 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3267 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3272 if (_solo_control->soloed_by_others_upstream()) {
3273 // ignore new connections (they're not propagated)
3275 _solo_control->mod_solo_by_others_upstream (delta);
3279 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3280 // solo-isolate currently only propagates downstream
3282 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3284 //_solo_isolated_by_upstream = ibou;
3287 // Session::route_solo_changed does not propagate indirect solo-changes
3288 // propagate downstream to tracks
3289 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3290 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3294 bool does_feed = feeds (*i, &sends_only);
3295 if (delta <= 0 && does_feed && !sends_only) {
3296 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3299 if (idelta < 0 && does_feed && !sends_only) {
3300 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3307 Route::output_change_handler (IOChange change, void * /*src*/)
3309 if (_initial_io_setup) {
3313 if ((change.type & IOChange::ConfigurationChanged)) {
3314 /* This is called with the process lock held if change
3315 contains ConfigurationChanged
3317 configure_processors (0);
3320 _session.reset_monitor_section();
3323 io_changed (); /* EMIT SIGNAL */
3326 if (_solo_control->soloed_by_others_downstream()) {
3328 /* checking all all downstream routes for
3329 * explicit of implict solo is a rather drastic measure,
3330 * ideally the input_change_handler() of the other route
3331 * would propagate the change to us.
3333 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3334 if (_output->connected()) {
3335 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3336 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3340 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3341 if (does_feed && !sends_only) {
3342 if ((*i)->soloed()) {
3349 int delta = sbod - _solo_control->soloed_by_others_downstream();
3351 // do not allow new connections to change implicit solo (no propagation)
3352 _solo_control->mod_solo_by_others_downstream (delta);
3353 // Session::route_solo_changed() does not propagate indirect solo-changes
3354 // propagate upstream to tracks
3355 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3356 if ((*i).get() == this || !can_solo()) {
3360 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3361 if (delta != 0 && does_feed && !sends_only) {
3362 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3371 Route::sidechain_change_handler (IOChange change, void* src)
3373 if (_initial_io_setup || _in_sidechain_setup) {
3377 input_change_handler (change, src);
3381 Route::pans_required () const
3383 if (n_outputs().n_audio() < 2) {
3387 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3391 Route::flush_processor_buffers_locked (framecnt_t nframes)
3393 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3394 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
3396 d->flush_buffers (nframes);
3398 boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
3400 p->flush_buffers (nframes);
3407 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3409 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3415 if (n_outputs().n_total() == 0) {
3419 if (!_active || n_inputs() == ChanCount::ZERO) {
3420 silence_unlocked (nframes);
3424 if (session_state_changing) {
3425 if (_session.transport_speed() != 0.0f) {
3426 /* we're rolling but some state is changing (e.g. our diskstream contents)
3427 so we cannot use them. Be silent till this is over.
3429 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3431 silence_unlocked (nframes);
3434 /* we're really not rolling, so we're either delivery silence or actually
3435 monitoring, both of which are safe to do while session_state_changing is true.
3439 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3441 fill_buffers_with_input (bufs, _input, nframes);
3443 if (_meter_point == MeterInput) {
3444 _meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
3447 _amp->apply_gain_automation (false);
3448 _trim->apply_gain_automation (false);
3449 passthru (bufs, start_frame, end_frame, nframes, 0);
3451 flush_processor_buffers_locked (nframes);
3457 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3459 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3464 if (n_outputs().n_total() == 0) {
3468 if (!_active || n_inputs().n_total() == 0) {
3469 silence_unlocked (nframes);
3473 framepos_t unused = 0;
3475 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3481 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3483 fill_buffers_with_input (bufs, _input, nframes);
3485 if (_meter_point == MeterInput) {
3486 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
3489 passthru (bufs, start_frame, end_frame, nframes, declick);
3491 flush_processor_buffers_locked (nframes);
3497 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3500 flush_processor_buffers_locked (nframes);
3505 Route::flush_processors ()
3507 /* XXX shouldn't really try to take this lock, since
3508 this is called from the RT audio thread.
3511 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3513 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3519 __attribute__((annotate("realtime")))
3522 Route::apply_processor_changes_rt ()
3524 int emissions = EmitNone;
3526 if (_pending_meter_point != _meter_point) {
3527 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3529 /* meters always have buffers for 'processor_max_streams'
3530 * they can be re-positioned without re-allocation */
3531 if (set_meter_point_unlocked()) {
3532 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3534 emissions |= EmitMeterChanged;
3539 bool changed = false;
3541 if (g_atomic_int_get (&_pending_process_reorder)) {
3542 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3544 apply_processor_order (_pending_processor_order);
3545 setup_invisible_processors ();
3547 g_atomic_int_set (&_pending_process_reorder, 0);
3548 emissions |= EmitRtProcessorChange;
3552 set_processor_positions ();
3554 if (emissions != 0) {
3555 g_atomic_int_set (&_pending_signals, emissions);
3558 return (!selfdestruct_sequence.empty ());
3562 Route::emit_pending_signals ()
3564 int sig = g_atomic_int_and (&_pending_signals, 0);
3565 if (sig & EmitMeterChanged) {
3566 _meter->emit_configuration_changed();
3567 meter_change (); /* EMIT SIGNAL */
3568 if (sig & EmitMeterVisibilityChange) {
3569 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3571 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3574 if (sig & EmitRtProcessorChange) {
3575 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3578 /* this would be a job for the butler.
3579 * Conceptually we should not take processe/processor locks here.
3580 * OTOH its more efficient (less overhead for summoning the butler and
3581 * telling her what do do) and signal emission is called
3582 * directly after the process callback, which decreases the chance
3583 * of x-runs when taking the locks.
3585 while (!selfdestruct_sequence.empty ()) {
3586 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3587 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3588 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3589 selfdestruct_sequence.pop_back ();
3592 remove_processor (proc);
3598 Route::set_meter_point (MeterPoint p, bool force)
3600 if (_pending_meter_point == p && !force) {
3604 if (force || !AudioEngine::instance()->running()) {
3605 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3606 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3607 _pending_meter_point = p;
3608 _meter->emit_configuration_changed();
3609 meter_change (); /* EMIT SIGNAL */
3610 if (set_meter_point_unlocked()) {
3611 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3613 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3616 _pending_meter_point = p;
3622 __attribute__((annotate("realtime")))
3625 Route::set_meter_point_unlocked ()
3628 /* Caller must hold process and processor write lock */
3629 assert (!AudioEngine::instance()->process_lock().trylock());
3630 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3631 assert (!lm.locked ());
3634 _meter_point = _pending_meter_point;
3636 bool meter_was_visible_to_user = _meter->display_to_user ();
3638 if (!_custom_meter_position_noted) {
3639 maybe_note_meter_position ();
3642 if (_meter_point != MeterCustom) {
3644 _meter->set_display_to_user (false);
3646 setup_invisible_processors ();
3649 _meter->set_display_to_user (true);
3651 /* If we have a previous position for the custom meter, try to put it there */
3652 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3654 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3655 if (i != _processors.end ()) {
3656 _processors.remove (_meter);
3657 _processors.insert (i, _meter);
3659 } else {// at end, right before the mains_out/panner
3660 _processors.remove (_meter);
3661 ProcessorList::iterator main = _processors.end();
3662 _processors.insert (--main, _meter);
3666 /* Set up the meter for its new position */
3668 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3672 if (loc == _processors.begin()) {
3673 m_in = _input->n_ports();
3675 ProcessorList::iterator before = loc;
3677 m_in = (*before)->output_streams ();
3680 _meter->reflect_inputs (m_in);
3682 /* we do not need to reconfigure the processors, because the meter
3683 (a) is always ready to handle processor_max_streams
3684 (b) is always an N-in/N-out processor, and thus moving
3685 it doesn't require any changes to the other processors.
3688 /* these should really be done after releasing the lock
3689 * but all those signals are subscribed to with gui_thread()
3692 return (_meter->display_to_user() != meter_was_visible_to_user);
3696 Route::listen_position_changed ()
3699 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3700 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3701 ProcessorState pstate (this);
3703 if (configure_processors_unlocked (0, &lm)) {
3704 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3706 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3711 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3712 _session.set_dirty ();
3715 boost::shared_ptr<CapturingProcessor>
3716 Route::add_export_point()
3718 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3719 if (!_capturing_processor) {
3721 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3722 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3724 // this aligns all tracks; but not tracks + busses
3725 assert (_session.worst_track_latency () >= _initial_delay);
3726 _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
3727 _capturing_processor->activate ();
3729 configure_processors_unlocked (0, &lw);
3733 return _capturing_processor;
3737 Route::update_signal_latency ()
3739 framecnt_t l = _output->user_latency();
3740 framecnt_t lamp = 0;
3741 bool before_amp = true;
3742 framecnt_t ltrim = 0;
3743 bool before_trim = true;
3745 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3746 if ((*i)->active ()) {
3747 l += (*i)->signal_latency ();
3752 if ((*i) == _trim) {
3763 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3765 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3766 _signal_latency_at_amp_position = lamp;
3767 _signal_latency_at_trim_position = ltrim;
3769 if (_signal_latency != l) {
3770 _signal_latency = l;
3771 signal_latency_changed (); /* EMIT SIGNAL */
3774 return _signal_latency;
3778 Route::set_user_latency (framecnt_t nframes)
3780 _output->set_user_latency (nframes);
3781 _session.update_latency_compensation ();
3785 Route::set_latency_compensation (framecnt_t longest_session_latency)
3787 framecnt_t old = _initial_delay;
3789 if (_signal_latency < longest_session_latency) {
3790 _initial_delay = longest_session_latency - _signal_latency;
3795 DEBUG_TRACE (DEBUG::Latency, string_compose (
3796 "%1: compensate for maximum latency of %2,"
3797 "given own latency of %3, using initial delay of %4\n",
3798 name(), longest_session_latency, _signal_latency, _initial_delay));
3800 if (_initial_delay != old) {
3801 initial_delay_changed (); /* EMIT SIGNAL */
3804 if (_session.transport_stopped()) {
3805 _roll_delay = _initial_delay;
3810 Route::set_block_size (pframes_t nframes)
3812 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3813 (*i)->set_block_size (nframes);
3816 _session.ensure_buffers (n_process_buffers ());
3820 Route::protect_automation ()
3822 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3823 (*i)->protect_automation();
3826 /** @param declick 1 to set a pending declick fade-in,
3827 * -1 to set a pending declick fade-out
3830 Route::set_pending_declick (int declick)
3833 /* this call is not allowed to turn off a pending declick */
3835 _pending_declick = declick;
3838 _pending_declick = 0;
3842 /** Shift automation forwards from a particular place, thereby inserting time.
3843 * Adds undo commands for any shifts that are performed.
3845 * @param pos Position to start shifting from.
3846 * @param frames Amount to shift forwards by.
3850 Route::shift (framepos_t pos, framecnt_t frames)
3852 /* gain automation */
3854 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3856 XMLNode &before = gc->alist()->get_state ();
3857 gc->alist()->shift (pos, frames);
3858 XMLNode &after = gc->alist()->get_state ();
3859 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3862 /* gain automation */
3864 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3866 XMLNode &before = gc->alist()->get_state ();
3867 gc->alist()->shift (pos, frames);
3868 XMLNode &after = gc->alist()->get_state ();
3869 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3872 // TODO mute automation ??
3874 /* pan automation */
3876 ControlSet::Controls& c (_pannable->controls());
3878 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3879 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3881 boost::shared_ptr<AutomationList> al = pc->alist();
3882 XMLNode& before = al->get_state ();
3883 al->shift (pos, frames);
3884 XMLNode& after = al->get_state ();
3885 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3890 /* redirect automation */
3892 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3893 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3895 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3897 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3898 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3900 boost::shared_ptr<AutomationList> al = ac->alist();
3901 XMLNode &before = al->get_state ();
3902 al->shift (pos, frames);
3903 XMLNode &after = al->get_state ();
3904 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3912 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
3914 boost::shared_ptr<Processor> processor (p.lock ());
3915 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
3919 pi->set_state_dir (d);
3923 Route::save_as_template (const string& path, const string& name)
3925 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
3926 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
3928 XMLNode& node (state (false));
3932 IO::set_name_in_state (*node.children().front(), name);
3934 tree.set_root (&node);
3936 /* return zero on success, non-zero otherwise */
3937 return !tree.write (path.c_str());
3942 Route::set_name (const string& str)
3944 if (str == name()) {
3948 string name = Route::ensure_track_or_route_name (str, _session);
3949 SessionObject::set_name (name);
3951 bool ret = (_input->set_name(name) && _output->set_name(name));
3954 /* rename the main outs. Leave other IO processors
3955 * with whatever name they already have, because its
3956 * just fine as it is (it will not contain the route
3957 * name if its a port insert, port send or port return).
3961 if (_main_outs->set_name (name)) {
3962 /* XXX returning false here is stupid because
3963 we already changed the route name.
3973 /** Set the name of a route in an XML description.
3974 * @param node XML <Route> node to set the name in.
3975 * @param name New name.
3978 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
3980 node.add_property (X_("name"), name);
3982 XMLNodeList children = node.children();
3983 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3985 if ((*i)->name() == X_("IO")) {
3987 IO::set_name_in_state (**i, name);
3989 } else if ((*i)->name() == X_("Processor")) {
3991 XMLProperty const * role = (*i)->property (X_("role"));
3992 if (role && role->value() == X_("Main")) {
3993 (*i)->add_property (X_("name"), name);
3996 } else if ((*i)->name() == X_("Diskstream")) {
3998 if (rename_playlist) {
3999 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4001 (*i)->add_property (X_("name"), name);
4007 boost::shared_ptr<Send>
4008 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4010 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4012 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4013 boost::shared_ptr<InternalSend> send;
4015 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4016 if (send->target_route() == target) {
4022 return boost::shared_ptr<Send>();
4026 Route::set_denormal_protection (bool yn)
4028 if (_denormal_protection != yn) {
4029 _denormal_protection = yn;
4030 denormal_protection_changed (); /* EMIT SIGNAL */
4035 Route::denormal_protection () const
4037 return _denormal_protection;
4041 Route::set_active (bool yn, void* src)
4043 if (_session.transport_rolling()) {
4047 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4048 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4052 if (_active != yn) {
4054 _input->set_active (yn);
4055 _output->set_active (yn);
4056 active_changed (); // EMIT SIGNAL
4057 _session.set_dirty ();
4061 boost::shared_ptr<Pannable>
4062 Route::pannable() const
4067 boost::shared_ptr<Panner>
4068 Route::panner() const
4071 return _main_outs->panner_shell()->panner();
4074 boost::shared_ptr<PannerShell>
4075 Route::panner_shell() const
4077 return _main_outs->panner_shell();
4080 boost::shared_ptr<GainControl>
4081 Route::gain_control() const
4083 return _gain_control;
4086 boost::shared_ptr<GainControl>
4087 Route::trim_control() const
4089 return _trim_control;
4092 boost::shared_ptr<PhaseControl>
4093 Route::phase_control() const
4095 return _phase_control;
4098 boost::shared_ptr<AutomationControl>
4099 Route::get_control (const Evoral::Parameter& param)
4101 /* either we own the control or .... */
4103 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4107 /* maybe one of our processors does or ... */
4109 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4110 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4111 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4119 /* nobody does so we'll make a new one */
4121 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4128 boost::shared_ptr<Processor>
4129 Route::nth_plugin (uint32_t n) const
4131 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4132 ProcessorList::const_iterator i;
4134 for (i = _processors.begin(); i != _processors.end(); ++i) {
4135 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4142 return boost::shared_ptr<Processor> ();
4145 boost::shared_ptr<Processor>
4146 Route::nth_send (uint32_t n) const
4148 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4149 ProcessorList::const_iterator i;
4151 for (i = _processors.begin(); i != _processors.end(); ++i) {
4152 if (boost::dynamic_pointer_cast<Send> (*i)) {
4154 if ((*i)->name().find (_("Monitor")) == 0) {
4155 /* send to monitor section is not considered
4156 to be an accessible send.
4167 return boost::shared_ptr<Processor> ();
4171 Route::has_io_processor_named (const string& name)
4173 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4174 ProcessorList::iterator i;
4176 for (i = _processors.begin(); i != _processors.end(); ++i) {
4177 if (boost::dynamic_pointer_cast<Send> (*i) ||
4178 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4179 if ((*i)->name() == name) {
4189 Route::set_processor_positions ()
4191 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4193 bool had_amp = false;
4194 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4195 (*i)->set_pre_fader (!had_amp);
4202 /** Called when there is a proposed change to the input port count */
4204 Route::input_port_count_changing (ChanCount to)
4206 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4208 /* The processors cannot be configured with the new input arrangement, so
4214 /* The change is ok */
4218 /** Called when there is a proposed change to the output port count */
4220 Route::output_port_count_changing (ChanCount to)
4222 if (_strict_io && !_in_configure_processors) {
4225 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4226 if (processor_out_streams.get(*t) > to.get(*t)) {
4230 /* The change is ok */
4235 Route::unknown_processors () const
4239 if (_session.get_disable_all_loaded_plugins ()) {
4240 // Do not list "missing plugins" if they are explicitly disabled
4244 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4245 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4246 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4247 p.push_back ((*i)->name ());
4256 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4258 /* we assume that all our input ports feed all our output ports. its not
4259 universally true, but the alternative is way too corner-case to worry about.
4262 LatencyRange all_connections;
4265 all_connections.min = 0;
4266 all_connections.max = 0;
4268 all_connections.min = ~((pframes_t) 0);
4269 all_connections.max = 0;
4271 /* iterate over all "from" ports and determine the latency range for all of their
4272 connections to the "outside" (outside of this Route).
4275 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4279 p->get_connected_latency_range (range, playback);
4281 all_connections.min = min (all_connections.min, range.min);
4282 all_connections.max = max (all_connections.max, range.max);
4286 /* set the "from" port latencies to the max/min range of all their connections */
4288 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4289 p->set_private_latency_range (all_connections, playback);
4292 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4294 all_connections.min += our_latency;
4295 all_connections.max += our_latency;
4297 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4298 p->set_private_latency_range (all_connections, playback);
4301 return all_connections.max;
4305 Route::set_private_port_latencies (bool playback) const
4307 framecnt_t own_latency = 0;
4309 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4310 OR LATENCY CALLBACK.
4312 This is called (early) from the latency callback. It computes the REAL
4313 latency associated with each port and stores the result as the "private"
4314 latency of the port. A later call to Route::set_public_port_latencies()
4315 sets all ports to the same value to reflect the fact that we do latency
4316 compensation and so all signals are delayed by the same amount as they
4317 flow through ardour.
4320 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4321 if ((*i)->active ()) {
4322 own_latency += (*i)->signal_latency ();
4327 /* playback: propagate latency from "outside the route" to outputs to inputs */
4328 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4330 /* capture: propagate latency from "outside the route" to inputs to outputs */
4331 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4336 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4338 /* this is called to set the JACK-visible port latencies, which take
4339 latency compensation into account.
4348 const PortSet& ports (_input->ports());
4349 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4350 p->set_public_latency_range (range, playback);
4355 const PortSet& ports (_output->ports());
4356 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4357 p->set_public_latency_range (range, playback);
4362 /** Put the invisible processors in the right place in _processors.
4363 * Must be called with a writer lock on _processor_lock held.
4366 __attribute__((annotate("realtime")))
4369 Route::setup_invisible_processors ()
4372 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4373 assert (!lm.locked ());
4377 /* too early to be doing this stuff */
4381 /* we'll build this new list here and then use it
4383 * TODO put the ProcessorList is on the stack for RT-safety.
4386 ProcessorList new_processors;
4388 /* find visible processors */
4390 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4391 if ((*i)->display_to_user ()) {
4392 new_processors.push_back (*i);
4398 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4400 if (amp == new_processors.end ()) {
4401 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4402 new_processors.push_front (_amp);
4403 amp = find (new_processors.begin(), new_processors.end(), _amp);
4406 /* and the processor after the amp */
4408 ProcessorList::iterator after_amp = amp;
4414 switch (_meter_point) {
4416 assert (!_meter->display_to_user ());
4417 new_processors.push_front (_meter);
4420 assert (!_meter->display_to_user ());
4421 new_processors.insert (amp, _meter);
4423 case MeterPostFader:
4424 /* do nothing here */
4427 /* do nothing here */
4430 /* the meter is visible, so we don't touch it here */
4437 assert (_main_outs);
4438 assert (!_main_outs->display_to_user ());
4439 new_processors.push_back (_main_outs);
4441 /* iterator for the main outs */
4443 ProcessorList::iterator main = new_processors.end();
4446 /* OUTPUT METERING */
4448 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4449 assert (!_meter->display_to_user ());
4451 /* add the processor just before or just after the main outs */
4453 ProcessorList::iterator meter_point = main;
4455 if (_meter_point == MeterOutput) {
4458 new_processors.insert (meter_point, _meter);
4463 if (_monitor_send && !is_monitor ()) {
4464 assert (!_monitor_send->display_to_user ());
4465 switch (Config->get_listen_position ()) {
4466 case PreFaderListen:
4467 switch (Config->get_pfl_position ()) {
4468 case PFLFromBeforeProcessors:
4469 new_processors.push_front (_monitor_send);
4471 case PFLFromAfterProcessors:
4472 new_processors.insert (amp, _monitor_send);
4475 _monitor_send->set_can_pan (false);
4477 case AfterFaderListen:
4478 switch (Config->get_afl_position ()) {
4479 case AFLFromBeforeProcessors:
4480 new_processors.insert (after_amp, _monitor_send);
4482 case AFLFromAfterProcessors:
4483 new_processors.insert (new_processors.end(), _monitor_send);
4486 _monitor_send->set_can_pan (true);
4491 #if 0 // not used - just yet
4492 if (!is_master() && !is_monitor() && !is_auditioner()) {
4493 new_processors.push_front (_delayline);
4497 /* MONITOR CONTROL */
4499 if (_monitor_control && is_monitor ()) {
4500 assert (!_monitor_control->display_to_user ());
4501 new_processors.insert (amp, _monitor_control);
4506 if (_trim && _trim->active()) {
4507 assert (!_trim->display_to_user ());
4508 new_processors.push_front (_trim);
4511 /* INTERNAL RETURN */
4513 /* doing this here means that any monitor control will come after
4514 the return and trim.
4518 assert (!_intreturn->display_to_user ());
4519 new_processors.push_front (_intreturn);
4522 /* EXPORT PROCESSOR */
4524 if (_capturing_processor) {
4525 assert (!_capturing_processor->display_to_user ());
4526 new_processors.push_front (_capturing_processor);
4529 _processors = new_processors;
4531 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4532 if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
4533 (*i)->enable (true);
4537 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4538 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4539 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4546 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4547 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4551 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4552 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4559 /** If the meter point is `Custom', make a note of where the meter is.
4560 * This is so that if the meter point is subsequently set to something else,
4561 * and then back to custom, we can put the meter back where it was last time
4562 * custom was enabled.
4564 * Must be called with the _processor_lock held.
4567 Route::maybe_note_meter_position ()
4569 if (_meter_point != MeterCustom) {
4573 _custom_meter_position_noted = true;
4574 /* custom meter points range from after trim to before panner/main_outs
4575 * this is a limitation by the current processor UI
4577 bool seen_trim = false;
4578 _processor_after_last_custom_meter.reset();
4579 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4580 if ((*i) == _trim) {
4583 if ((*i) == _main_outs) {
4584 _processor_after_last_custom_meter = *i;
4587 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4589 _processor_after_last_custom_meter = _trim;
4591 ProcessorList::iterator j = i;
4593 assert(j != _processors.end ()); // main_outs should be before
4594 _processor_after_last_custom_meter = *j;
4599 assert(_processor_after_last_custom_meter.lock());
4602 boost::shared_ptr<Processor>
4603 Route::processor_by_id (PBD::ID id) const
4605 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4606 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4607 if ((*i)->id() == id) {
4612 return boost::shared_ptr<Processor> ();
4615 /** @return the monitoring state, or in other words what data we are pushing
4616 * into the route (data from the inputs, data from disk or silence)
4619 Route::monitoring_state () const
4621 return MonitoringInput;
4624 /** @return what we should be metering; either the data coming from the input
4625 * IO or the data that is flowing through the route.
4628 Route::metering_state () const
4630 return MeteringRoute;
4634 Route::has_external_redirects () const
4636 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4638 /* ignore inactive processors and obviously ignore the main
4639 * outs since everything has them and we don't care.
4642 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4650 boost::shared_ptr<Processor>
4651 Route::the_instrument () const
4653 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4654 return the_instrument_unlocked ();
4657 boost::shared_ptr<Processor>
4658 Route::the_instrument_unlocked () const
4660 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4661 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4662 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4666 return boost::shared_ptr<Processor>();
4672 Route::non_realtime_locate (framepos_t pos)
4675 _pannable->transport_located (pos);
4678 if (_delayline.get()) {
4679 _delayline.get()->flush();
4683 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4684 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4686 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4687 (*i)->transport_located (pos);
4690 _roll_delay = _initial_delay;
4694 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4701 * We don't currently mix MIDI input together, so we don't need the
4702 * complex logic of the audio case.
4705 n_buffers = bufs.count().n_midi ();
4707 for (i = 0; i < n_buffers; ++i) {
4709 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4710 MidiBuffer& buf (bufs.get_midi (i));
4713 buf.copy (source_port->get_midi_buffer(nframes));
4715 buf.silence (nframes);
4721 n_buffers = bufs.count().n_audio();
4723 size_t n_ports = io->n_ports().n_audio();
4724 float scaling = 1.0f;
4726 if (n_ports > n_buffers) {
4727 scaling = ((float) n_buffers) / n_ports;
4730 for (i = 0; i < n_ports; ++i) {
4732 /* if there are more ports than buffers, map them onto buffers
4733 * in a round-robin fashion
4736 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4737 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4740 if (i < n_buffers) {
4742 /* first time through just copy a channel into
4746 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4748 if (scaling != 1.0f) {
4749 buf.apply_gain (scaling, nframes);
4754 /* on subsequent times around, merge data from
4755 * the port with what is already there
4758 if (scaling != 1.0f) {
4759 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4761 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4766 /* silence any remaining buffers */
4768 for (; i < n_buffers; ++i) {
4769 AudioBuffer& buf (bufs.get_audio (i));
4770 buf.silence (nframes);
4773 /* establish the initial setup of the buffer set, reflecting what was
4774 copied into it. unless, of course, we are the auditioner, in which
4775 case nothing was fed into it from the inputs at all.
4778 if (!is_auditioner()) {
4779 bufs.set_count (io->n_ports());
4783 boost::shared_ptr<AutomationControl>
4784 Route::pan_azimuth_control() const
4787 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4789 return boost::shared_ptr<AutomationControl>();
4791 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
4792 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4794 if (!_pannable || !panner()) {
4795 return boost::shared_ptr<AutomationControl>();
4797 return _pannable->pan_azimuth_control;
4801 boost::shared_ptr<AutomationControl>
4802 Route::pan_elevation_control() const
4804 if (Profile->get_mixbus() || !_pannable || !panner()) {
4805 return boost::shared_ptr<AutomationControl>();
4808 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4810 if (c.find (PanElevationAutomation) != c.end()) {
4811 return _pannable->pan_elevation_control;
4813 return boost::shared_ptr<AutomationControl>();
4816 boost::shared_ptr<AutomationControl>
4817 Route::pan_width_control() const
4819 if (Profile->get_mixbus() || !_pannable || !panner()) {
4820 return boost::shared_ptr<AutomationControl>();
4823 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4825 if (c.find (PanWidthAutomation) != c.end()) {
4826 return _pannable->pan_width_control;
4828 return boost::shared_ptr<AutomationControl>();
4831 boost::shared_ptr<AutomationControl>
4832 Route::pan_frontback_control() const
4834 if (Profile->get_mixbus() || !_pannable || !panner()) {
4835 return boost::shared_ptr<AutomationControl>();
4838 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4840 if (c.find (PanFrontBackAutomation) != c.end()) {
4841 return _pannable->pan_frontback_control;
4843 return boost::shared_ptr<AutomationControl>();
4846 boost::shared_ptr<AutomationControl>
4847 Route::pan_lfe_control() const
4849 if (Profile->get_mixbus() || !_pannable || !panner()) {
4850 return boost::shared_ptr<AutomationControl>();
4853 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4855 if (c.find (PanLFEAutomation) != c.end()) {
4856 return _pannable->pan_lfe_control;
4858 return boost::shared_ptr<AutomationControl>();
4863 Route::eq_band_cnt () const
4865 if (Profile->get_mixbus()) {
4868 /* Ardour has no well-known EQ object */
4873 boost::shared_ptr<AutomationControl>
4874 Route::eq_gain_controllable (uint32_t band) const
4877 boost::shared_ptr<PluginInsert> eq = ch_eq();
4880 return boost::shared_ptr<AutomationControl>();
4883 uint32_t port_number;
4886 if (is_master() || mixbus()) {
4893 if (is_master() || mixbus()) {
4900 if (is_master() || mixbus()) {
4907 return boost::shared_ptr<AutomationControl>();
4910 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4912 return boost::shared_ptr<AutomationControl>();
4915 boost::shared_ptr<AutomationControl>
4916 Route::eq_freq_controllable (uint32_t band) const
4920 if (mixbus() || is_master()) {
4921 /* no frequency controls for mixbusses or master */
4922 return boost::shared_ptr<AutomationControl>();
4925 boost::shared_ptr<PluginInsert> eq = ch_eq();
4928 return boost::shared_ptr<AutomationControl>();
4931 uint32_t port_number;
4943 return boost::shared_ptr<AutomationControl>();
4946 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4948 return boost::shared_ptr<AutomationControl>();
4952 boost::shared_ptr<AutomationControl>
4953 Route::eq_q_controllable (uint32_t band) const
4955 return boost::shared_ptr<AutomationControl>();
4958 boost::shared_ptr<AutomationControl>
4959 Route::eq_shape_controllable (uint32_t band) const
4961 return boost::shared_ptr<AutomationControl>();
4964 boost::shared_ptr<AutomationControl>
4965 Route::eq_enable_controllable () const
4968 boost::shared_ptr<PluginInsert> eq = ch_eq();
4971 return boost::shared_ptr<AutomationControl>();
4974 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
4976 return boost::shared_ptr<AutomationControl>();
4980 boost::shared_ptr<AutomationControl>
4981 Route::eq_hpf_controllable () const
4984 boost::shared_ptr<PluginInsert> eq = ch_eq();
4987 return boost::shared_ptr<AutomationControl>();
4990 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
4992 return boost::shared_ptr<AutomationControl>();
4997 Route::eq_band_name (uint32_t band) const
4999 if (Profile->get_mixbus()) {
5015 boost::shared_ptr<AutomationControl>
5016 Route::comp_enable_controllable () const
5019 boost::shared_ptr<PluginInsert> comp = ch_comp();
5022 return boost::shared_ptr<AutomationControl>();
5025 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5027 return boost::shared_ptr<AutomationControl>();
5030 boost::shared_ptr<AutomationControl>
5031 Route::comp_threshold_controllable () const
5034 boost::shared_ptr<PluginInsert> comp = ch_comp();
5037 return boost::shared_ptr<AutomationControl>();
5040 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5043 return boost::shared_ptr<AutomationControl>();
5046 boost::shared_ptr<AutomationControl>
5047 Route::comp_speed_controllable () const
5050 boost::shared_ptr<PluginInsert> comp = ch_comp();
5053 return boost::shared_ptr<AutomationControl>();
5056 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5058 return boost::shared_ptr<AutomationControl>();
5061 boost::shared_ptr<AutomationControl>
5062 Route::comp_mode_controllable () const
5065 boost::shared_ptr<PluginInsert> comp = ch_comp();
5068 return boost::shared_ptr<AutomationControl>();
5071 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5073 return boost::shared_ptr<AutomationControl>();
5076 boost::shared_ptr<AutomationControl>
5077 Route::comp_makeup_controllable () const
5080 boost::shared_ptr<PluginInsert> comp = ch_comp();
5083 return boost::shared_ptr<AutomationControl>();
5086 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5088 return boost::shared_ptr<AutomationControl>();
5091 boost::shared_ptr<AutomationControl>
5092 Route::comp_redux_controllable () const
5095 boost::shared_ptr<PluginInsert> comp = ch_comp();
5098 return boost::shared_ptr<AutomationControl>();
5101 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5103 return boost::shared_ptr<AutomationControl>();
5108 Route::comp_mode_name (uint32_t mode) const
5113 return _("Leveler");
5115 return _("Compressor");
5117 return _("Limiter");
5119 return mixbus() ? _("Sidechain") : _("Limiter");
5129 Route::comp_speed_name (uint32_t mode) const
5147 boost::shared_ptr<AutomationControl>
5148 Route::send_level_controllable (uint32_t n) const
5151 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5153 return boost::shared_ptr<AutomationControl>();
5158 return boost::shared_ptr<AutomationControl>();
5161 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5162 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5164 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5166 return boost::shared_ptr<AutomationControl>();
5168 return s->gain_control ();
5172 boost::shared_ptr<AutomationControl>
5173 Route::send_enable_controllable (uint32_t n) const
5176 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5178 return boost::shared_ptr<AutomationControl>();
5183 return boost::shared_ptr<AutomationControl>();
5186 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5187 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5189 /* although Ardour sends have enable/disable as part of the Processor
5190 API, it is not exposed as a controllable.
5192 XXX: we should fix this.
5194 return boost::shared_ptr<AutomationControl>();
5199 Route::send_name (uint32_t n) const
5205 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5209 boost::shared_ptr<Processor> p = nth_send (n);
5218 boost::shared_ptr<AutomationControl>
5219 Route::master_send_enable_controllable () const
5222 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5224 return boost::shared_ptr<AutomationControl>();
5226 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5228 return boost::shared_ptr<AutomationControl>();
5233 Route::slaved () const
5235 if (!_gain_control) {
5238 /* just test one particular control, not all of them */
5239 return _gain_control->slaved ();
5243 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5245 if (!vca || !_gain_control) {
5249 /* just test one particular control, not all of them */
5251 return _gain_control->slaved_to (vca->gain_control());
5255 Route::muted_by_others_soloing () const
5257 if (!can_be_muted_by_others ()) {
5261 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5265 Route::clear_all_solo_state ()
5267 double v = _solo_safe_control->get_value ();
5269 _solo_control->clear_all_solo_state ();
5272 _solo_safe_control->set_value (v, Controllable::NoGroup);