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/locale_guard.h"
34 #include "pbd/memento_command.h"
35 #include "pbd/stacktrace.h"
36 #include "pbd/types_convert.h"
37 #include "pbd/unwind.h"
39 #include "ardour/amp.h"
40 #include "ardour/audio_buffer.h"
41 #include "ardour/audio_track.h"
42 #include "ardour/audio_port.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/boost_debug.h"
45 #include "ardour/buffer.h"
46 #include "ardour/buffer_set.h"
47 #include "ardour/capturing_processor.h"
48 #include "ardour/debug.h"
49 #include "ardour/delivery.h"
50 #include "ardour/event_type_map.h"
51 #include "ardour/gain_control.h"
52 #include "ardour/internal_return.h"
53 #include "ardour/internal_send.h"
54 #include "ardour/meter.h"
55 #include "ardour/delayline.h"
56 #include "ardour/midi_buffer.h"
57 #include "ardour/midi_port.h"
58 #include "ardour/monitor_processor.h"
59 #include "ardour/pannable.h"
60 #include "ardour/panner.h"
61 #include "ardour/panner_shell.h"
62 #include "ardour/parameter_descriptor.h"
63 #include "ardour/phase_control.h"
64 #include "ardour/plugin_insert.h"
65 #include "ardour/port.h"
66 #include "ardour/port_insert.h"
67 #include "ardour/processor.h"
68 #include "ardour/profile.h"
69 #include "ardour/route.h"
70 #include "ardour/route_group.h"
71 #include "ardour/send.h"
72 #include "ardour/session.h"
73 #include "ardour/solo_control.h"
74 #include "ardour/solo_isolate_control.h"
75 #include "ardour/types_convert.h"
76 #include "ardour/unknown_processor.h"
77 #include "ardour/utils.h"
78 #include "ardour/vca.h"
83 using namespace ARDOUR;
86 PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
88 /** Base class for all routable/mixable objects (tracks and busses) */
89 Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType default_type)
90 : Stripable (sess, name, PresentationInfo (flag))
91 , GraphNode (sess._process_graph)
92 , Muteable (sess, name)
95 , _signal_latency_at_amp_position (0)
96 , _signal_latency_at_trim_position (0)
99 , _pending_process_reorder (0)
100 , _pending_signals (0)
101 , _pending_declick (true)
102 , _meter_point (MeterPostFader)
103 , _pending_meter_point (MeterPostFader)
104 , _meter_type (MeterPeak)
105 , _denormal_protection (false)
108 , _declickable (false)
109 , _have_internal_generator (false)
110 , _default_type (default_type)
112 , _in_configure_processors (false)
113 , _initial_io_setup (false)
114 , _in_sidechain_setup (false)
116 , _custom_meter_position_noted (false)
118 , _patch_selector_dialog (0)
120 processor_max_streams.reset();
123 boost::weak_ptr<Route>
124 Route::weakroute () {
125 return boost::weak_ptr<Route> (boost::dynamic_pointer_cast<Route> (shared_from_this ()));
131 /* set default meter type */
133 _meter_type = Config->get_meter_type_master ();
135 else if (dynamic_cast<Track*>(this)) {
136 _meter_type = Config->get_meter_type_track ();
138 _meter_type = Config->get_meter_type_bus ();
141 /* add standard controls */
143 _gain_control.reset (new GainControl (_session, GainAutomation));
144 _trim_control.reset (new GainControl (_session, TrimAutomation));
145 /* While the route has-a gain-control for consistency with Stripable and VCA
146 * ownership is handed over to the Amp Processor which manages the
147 * state of the Control and AutomationList as part of its
148 * Automatable API. -- Don't call add_control () here.
151 _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
152 add_control (_solo_control);
153 _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
155 _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
156 add_control (_mute_control);
158 _phase_control.reset (new PhaseControl (_session, X_("phase")));
159 add_control (_phase_control);
161 _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
162 add_control (_solo_isolate_control);
164 _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
165 add_control (_solo_safe_control);
169 if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
170 _pannable.reset (new Pannable (_session));
173 /* input and output objects */
175 _input.reset (new IO (_session, _name, IO::Input, _default_type));
176 _output.reset (new IO (_session, _name, IO::Output, _default_type));
178 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
179 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
181 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
182 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
184 /* add the amp/fader processor.
185 * it should be the first processor to be added on every route.
188 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
189 add_processor (_amp, PostFader);
192 _amp->set_display_name (_("Monitor"));
195 #if 0 // not used - just yet
196 if (!is_master() && !is_monitor() && !is_auditioner()) {
197 _delayline.reset (new DelayLine (_session, _name));
198 add_processor (_delayline, PreFader);
204 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
205 _trim->set_display_to_user (false);
207 if (dynamic_cast<AudioTrack*>(this)) {
208 /* we can't do this in the AudioTrack's constructor
209 * because _trim does not exit then
213 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
218 /* create standard processors: meter, main outs, monitor out;
219 they will be added to _processors by setup_invisible_processors ()
222 _meter.reset (new PeakMeter (_session, _name));
223 _meter->set_owner (this);
224 _meter->set_display_to_user (false);
227 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
228 _main_outs->activate ();
231 /* where we listen to tracks */
232 _intreturn.reset (new InternalReturn (_session));
233 _intreturn->activate ();
235 /* the thing that provides proper control over a control/monitor/listen bus
236 (such as per-channel cut, dim, solo, invert, etc).
238 _monitor_control.reset (new MonitorProcessor (_session));
239 _monitor_control->activate ();
242 /* now that we have _meter, its safe to connect to this */
245 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
246 configure_processors (0);
254 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
256 /* do this early so that we don't get incoming signals as we are going through destruction
261 /* don't use clear_processors here, as it depends on the session which may
262 be half-destroyed by now
265 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
266 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
267 (*i)->drop_references ();
270 _processors.clear ();
274 Route::ensure_track_or_route_name(string name, Session &session)
276 string newname = name;
278 while (!session.io_name_is_legal (newname)) {
279 newname = bump_name_once (newname, ' ');
286 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
288 // TODO route group, see set_gain()
289 // _trim_control->route_set_value (val);
293 Route::maybe_declick (BufferSet&, framecnt_t, int)
295 /* this is the "bus" implementation and they never declick.
300 /** Process this route for one (sub) cycle (process thread)
302 * @param bufs Scratch buffers to use for the signal path
303 * @param start_frame Initial transport frame
304 * @param end_frame Final transport frame
305 * @param nframes Number of frames to output (to ports)
307 * Note that (end_frame - start_frame) may not be equal to nframes when the
308 * transport speed isn't 1.0 (eg varispeed).
311 Route::process_output_buffers (BufferSet& bufs,
312 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
313 int declick, bool gain_automation_ok)
315 /* Caller must hold process lock */
316 assert (!AudioEngine::instance()->process_lock().trylock());
318 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
320 // can this actually happen? functions calling process_output_buffers()
321 // already take a reader-lock.
322 bufs.silence (nframes, 0);
326 automation_run (start_frame, nframes);
328 /* figure out if we're going to use gain automation */
329 if (gain_automation_ok) {
330 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
331 _amp->setup_gain_automation (
332 start_frame + _signal_latency_at_amp_position,
333 end_frame + _signal_latency_at_amp_position,
336 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
337 _trim->setup_gain_automation (
338 start_frame + _signal_latency_at_trim_position,
339 end_frame + _signal_latency_at_trim_position,
342 _amp->apply_gain_automation (false);
343 _trim->apply_gain_automation (false);
346 /* Tell main outs what to do about monitoring. We do this so that
347 on a transition between monitoring states we get a de-clicking gain
348 change in the _main_outs delivery, if config.get_use_monitor_fades()
351 We override this in the case where we have an internal generator.
353 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
355 _main_outs->no_outs_cuz_we_no_monitor (silence);
357 /* -------------------------------------------------------------------------------------------
358 GLOBAL DECLICK (for transport changes etc.)
359 ----------------------------------------------------------------------------------------- */
361 maybe_declick (bufs, nframes, declick);
362 _pending_declick = 0;
364 /* -------------------------------------------------------------------------------------------
365 DENORMAL CONTROL/PHASE INVERT
366 ----------------------------------------------------------------------------------------- */
368 if (!_phase_control->none()) {
372 if (_denormal_protection || Config->get_denormal_protection()) {
374 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
375 Sample* const sp = i->data();
377 if (_phase_control->inverted (chn)) {
378 for (pframes_t nx = 0; nx < nframes; ++nx) {
383 for (pframes_t nx = 0; nx < nframes; ++nx) {
391 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
392 Sample* const sp = i->data();
394 if (_phase_control->inverted (chn)) {
395 for (pframes_t nx = 0; nx < nframes; ++nx) {
404 if (_denormal_protection || Config->get_denormal_protection()) {
406 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
407 Sample* const sp = i->data();
408 for (pframes_t nx = 0; nx < nframes; ++nx) {
416 /* -------------------------------------------------------------------------------------------
418 ----------------------------------------------------------------------------------------- */
420 /* set this to be true if the meter will already have been ::run() earlier */
421 bool const meter_already_run = metering_state() == MeteringInput;
423 framecnt_t latency = 0;
424 const double speed = _session.transport_speed ();
426 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
428 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
429 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
434 /* if it has any inputs, make sure they match */
435 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
436 if (bufs.count() != (*i)->input_streams()) {
438 DEBUG::Processors, string_compose (
439 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
440 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
447 /* should we NOT run plugins here if the route is inactive?
448 do we catch route != active somewhere higher?
451 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
452 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
454 if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
455 const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
456 boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
457 _initial_delay + latency, longest_session_latency - latency);
460 (*i)->run (bufs, start_frame - latency, end_frame - latency, speed, nframes, *i != _processors.back());
461 bufs.set_count ((*i)->output_streams());
463 if ((*i)->active ()) {
464 latency += (*i)->signal_latency ();
470 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
471 boost::shared_ptr<Processor> endpoint,
472 bool include_endpoint, bool for_export, bool for_freeze)
474 /* If no processing is required, there's no need to go any further. */
475 if (!endpoint && !include_endpoint) {
479 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
480 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
481 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
483 /* trim is always at the top, for bounce no latency compensation is needed */
484 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
485 _trim->setup_gain_automation (start, start + nframes, nframes);
488 const double speed = _session.transport_speed ();
489 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
491 if (!include_endpoint && (*i) == endpoint) {
495 /* if we're *not* exporting, stop processing if we come across a routing processor. */
496 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
499 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
503 /* special case the panner (export outputs)
504 * Ideally we'd only run the panner, not the delivery itself...
505 * but panners need separate input/output buffers and some context
506 * (panshell, panner type, etc). AFAICT there is no ill side effect
507 * of re-using the main delivery when freewheeling/exporting a region.
509 if ((*i) == _main_outs) {
510 assert ((*i)->does_routing());
511 (*i)->run (buffers, start - latency, start - latency + nframes, speed, nframes, true);
512 buffers.set_count ((*i)->output_streams());
515 /* don't run any processors that do routing.
516 * Also don't bother with metering.
518 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
519 (*i)->run (buffers, start - latency, start - latency + nframes, 1.0, nframes, true);
520 buffers.set_count ((*i)->output_streams());
521 latency += (*i)->signal_latency ();
524 if ((*i) == endpoint) {
531 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
532 bool include_endpoint, bool for_export, bool for_freeze) const
534 framecnt_t latency = 0;
535 if (!endpoint && !include_endpoint) {
539 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
540 if (!include_endpoint && (*i) == endpoint) {
543 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
546 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
549 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
550 latency += (*i)->signal_latency ();
552 if ((*i) == endpoint) {
560 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
561 bool include_endpoint, bool for_export, bool for_freeze) const
563 if (!endpoint && !include_endpoint) {
567 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
568 if (!include_endpoint && (*i) == endpoint) {
571 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
574 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
577 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
578 cc = (*i)->output_streams();
580 if ((*i) == endpoint) {
588 Route::n_process_buffers ()
590 return max (_input->n_ports(), processor_max_streams);
594 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
596 assert (is_monitor());
597 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
598 fill_buffers_with_input (bufs, _input, nframes);
599 passthru (bufs, start_frame, end_frame, nframes, declick);
603 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
607 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
609 /* control/monitor bus ignores input ports when something is
610 feeding the listen "stream". data will "arrive" into the
611 route from the intreturn processor element.
614 bufs.silence (nframes, 0);
617 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
618 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
622 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
624 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
626 bufs.set_count (_input->n_ports());
627 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
628 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
632 Route::set_listen (bool yn)
635 if (_monitor_send->active() == yn) {
639 _monitor_send->activate ();
641 _monitor_send->deactivate ();
647 Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
649 /* nothing to do if we're not using AFL/PFL. But if we are, we need
650 to alter the active state of the monitor send.
653 if (Config->get_solo_control_is_listen_control ()) {
654 set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
659 Route::push_solo_isolate_upstream (int32_t delta)
661 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
663 boost::shared_ptr<RouteList> routes = _session.get_routes ();
664 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
666 if ((*i).get() == this || !(*i)->can_solo()) {
671 bool does_feed = feeds (*i, &sends_only);
673 if (does_feed && !sends_only) {
674 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
680 Route::push_solo_upstream (int delta)
682 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
683 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
687 boost::shared_ptr<Route> sr (i->r.lock());
689 sr->solo_control()->mod_solo_by_others_downstream (-delta);
696 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
698 cerr << name << " {" << endl;
699 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
700 p != procs.end(); ++p) {
701 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
707 /** Supposing that we want to insert a Processor at a given Placement, return
708 * the processor to add the new one before (or 0 to add at the end).
710 boost::shared_ptr<Processor>
711 Route::before_processor_for_placement (Placement p)
713 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
715 ProcessorList::iterator loc;
718 /* generic pre-fader: insert immediately before the amp */
719 loc = find (_processors.begin(), _processors.end(), _amp);
721 /* generic post-fader: insert right before the main outs */
722 loc = find (_processors.begin(), _processors.end(), _main_outs);
725 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
728 /** Supposing that we want to insert a Processor at a given index, return
729 * the processor to add the new one before (or 0 to add at the end).
731 boost::shared_ptr<Processor>
732 Route::before_processor_for_index (int index)
735 return boost::shared_ptr<Processor> ();
738 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
740 ProcessorList::iterator i = _processors.begin ();
742 while (i != _processors.end() && j < index) {
743 if ((*i)->display_to_user()) {
750 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
753 /** Add a processor either pre- or post-fader
754 * @return 0 on success, non-0 on failure.
757 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
759 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
763 /** Add a processor to a route such that it ends up with a given index into the visible processors.
764 * @param index Index to add the processor at, or -1 to add at the end of the list.
765 * @return 0 on success, non-0 on failure.
768 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
770 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
773 /** Add a processor to the route.
774 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
775 * @return 0 on success, non-0 on failure.
778 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
780 assert (processor != _meter);
781 assert (processor != _main_outs);
783 DEBUG_TRACE (DEBUG::Processors, string_compose (
784 "%1 adding processor %2\n", name(), processor->name()));
788 pl.push_back (processor);
789 int rv = add_processors (pl, before, err);
795 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
796 processor->activate ();
803 Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
805 /* We cannot destruct the processor here (usually RT-thread
806 * with various locks held - in case of sends also io_locks).
807 * Queue for deletion in low-priority thread.
809 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
810 selfdestruct_sequence.push_back (wp);
814 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
816 XMLProperty const * prop;
819 boost::shared_ptr<Processor> processor;
821 /* bit of a hack: get the `placement' property from the <Redirect> tag here
822 so that we can add the processor in the right place (pre/post-fader)
825 XMLNodeList const & children = node.children ();
826 XMLNodeList::const_iterator i = children.begin ();
828 while (i != children.end() && (*i)->name() != X_("Redirect")) {
832 Placement placement = PreFader;
834 if (i != children.end()) {
835 if ((prop = (*i)->property (X_("placement"))) != 0) {
836 placement = Placement (string_2_enum (prop->value(), placement));
840 if (node.name() == "Insert") {
842 if ((prop = node.property ("type")) != 0) {
844 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
845 prop->value() == "lv2" ||
846 prop->value() == "windows-vst" ||
847 prop->value() == "mac-vst" ||
848 prop->value() == "lxvst" ||
849 prop->value() == "audiounit") {
851 if (_session.get_disable_all_loaded_plugins ()) {
852 processor.reset (new UnknownProcessor (_session, node));
854 processor.reset (new PluginInsert (_session));
855 processor->set_owner (this);
860 processor.reset (new PortInsert (_session, _pannable, _mute_master));
865 } else if (node.name() == "Send") {
867 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
868 processor.reset (new Send (_session, sendpan, _mute_master));
872 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
876 if (processor->set_state (node, version)) {
880 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
881 if (i != children.end()) {
882 if ((prop = (*i)->property (X_("active"))) != 0) {
883 if ( string_to<bool> (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
884 processor->activate();
886 processor->deactivate();
890 return (add_processor (processor, placement, 0, false) == 0);
893 catch (failed_constructor &err) {
894 warning << _("processor could not be created. Ignored.") << endmsg;
900 inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
901 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
904 inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
905 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
909 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
911 ProcessorList::iterator loc;
912 boost::shared_ptr <PluginInsert> fanout;
914 if (g_atomic_int_get (&_pending_process_reorder)) {
915 /* we need to flush any pending re-order changes */
916 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
917 apply_processor_changes_rt ();
921 loc = find(_processors.begin(), _processors.end(), before);
922 if (loc == _processors.end ()) {
926 /* nothing specified - at end */
927 loc = _processors.end ();
930 if (others.empty()) {
934 ProcessorList to_skip;
936 // check if there's an instrument to replace or configure
937 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
938 boost::shared_ptr<PluginInsert> pi;
939 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
942 if (!pi->plugin ()->get_info ()->is_instrument ()) {
945 boost::shared_ptr<Processor> instrument = the_instrument ();
946 ChanCount in (DataType::MIDI, 1);
947 ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
949 PluginSetupOptions flags = None;
952 in = instrument->input_streams ();
953 out = instrument->output_streams ();
955 if (pi->has_output_presets (in, out)) {
959 pi->set_strict_io (_strict_io);
961 PluginSetupOptions mask = None;
962 if (Config->get_ask_replace_instrument ()) {
965 if (Config->get_ask_setup_instrument ()) {
972 boost::optional<int> rv = PluginSetup (boost::dynamic_pointer_cast<Route>(shared_from_this ()), pi, flags); /* EMIT SIGNAL */
973 int mode = rv.get_value_or (0);
976 to_skip.push_back (*i); // don't add this one;
979 replace_processor (instrument, *i, err);
980 to_skip.push_back (*i);
985 if ((mode & 5) == 4) {
992 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
993 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
994 ProcessorState pstate (this);
996 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1001 ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
1002 if (check != to_skip.end()) {
1006 boost::shared_ptr<PluginInsert> pi;
1008 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1009 pi->set_strict_io (_strict_io);
1013 /* Ensure that only one amp is in the list at any time */
1014 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
1015 if (check != _processors.end()) {
1016 if (before == _amp) {
1017 /* Already in position; all is well */
1020 _processors.erase (check);
1025 assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
1027 _processors.insert (loc, *i);
1028 (*i)->set_owner (this);
1031 if (configure_processors_unlocked (err, &lm)) {
1033 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
1038 if (pi && pi->has_sidechain ()) {
1039 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
1042 if ((*i)->active()) {
1043 // emit ActiveChanged() and latency_changed() if needed
1047 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1049 boost::shared_ptr<Send> send;
1050 if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
1051 send->SelfDestruct.connect_same_thread (*this,
1052 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
1056 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1057 boost::shared_ptr<PluginInsert> pi;
1059 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1060 if (pi->has_no_inputs ()) {
1061 _have_internal_generator = true;
1067 _output->set_user_latency (0);
1070 reset_instrument_info ();
1071 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1072 set_processor_positions ();
1074 if (fanout && fanout->configured ()
1075 && fanout->output_streams().n_audio() > 2
1076 && boost::dynamic_pointer_cast<PluginInsert> (the_instrument ()) == fanout) {
1077 fan_out (); /* EMIT SIGNAL */
1083 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1085 if (p == PreFader) {
1086 start = _processors.begin();
1087 end = find(_processors.begin(), _processors.end(), _amp);
1089 start = find(_processors.begin(), _processors.end(), _amp);
1091 end = _processors.end();
1095 /** Turn off all processors with a given placement
1096 * @param p Placement of processors to disable
1099 Route::disable_processors (Placement p)
1101 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1103 ProcessorList::iterator start, end;
1104 placement_range(p, start, end);
1106 for (ProcessorList::iterator i = start; i != end; ++i) {
1107 (*i)->enable (false);
1110 _session.set_dirty ();
1113 /** Turn off all redirects
1116 Route::disable_processors ()
1118 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1120 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1121 (*i)->enable (false);
1124 _session.set_dirty ();
1127 /** Turn off all redirects with a given placement
1128 * @param p Placement of redirects to disable
1131 Route::disable_plugins (Placement p)
1133 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1135 ProcessorList::iterator start, end;
1136 placement_range(p, start, end);
1138 for (ProcessorList::iterator i = start; i != end; ++i) {
1139 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1140 (*i)->enable (false);
1144 _session.set_dirty ();
1147 /** Turn off all plugins
1150 Route::disable_plugins ()
1152 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1154 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1155 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1156 (*i)->enable (false);
1160 _session.set_dirty ();
1165 Route::ab_plugins (bool forward)
1167 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1171 /* forward = turn off all active redirects, and mark them so that the next time
1172 we go the other way, we will revert them
1175 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1176 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1179 if (!(*i)->display_to_user ()) {
1183 if (boost::dynamic_pointer_cast<PluginInsert> (*i)->is_channelstrip()) {
1188 if ((*i)->enabled ()) {
1189 (*i)->enable (false);
1190 (*i)->set_next_ab_is_active (true);
1192 (*i)->set_next_ab_is_active (false);
1198 /* backward = if the redirect was marked to go active on the next ab, do so */
1200 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1201 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1204 if (!(*i)->display_to_user ()) {
1208 if (boost::dynamic_pointer_cast<PluginInsert> (*i)->is_channelstrip()) {
1213 (*i)->enable ((*i)->get_next_ab_is_active ());
1217 _session.set_dirty ();
1221 /** Remove processors with a given placement.
1222 * @param p Placement of processors to remove.
1225 Route::clear_processors (Placement p)
1227 if (!_session.engine().connected()) {
1231 bool already_deleting = _session.deletion_in_progress();
1232 if (!already_deleting) {
1233 _session.set_deletion_in_progress();
1236 ProcessorList old_list = _processors;
1238 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1239 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1240 ProcessorList new_list;
1241 ProcessorStreams err;
1242 bool seen_amp = false;
1244 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1250 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1252 /* you can't remove these */
1254 new_list.push_back (*i);
1261 new_list.push_back (*i);
1264 (*i)->drop_references ();
1272 (*i)->drop_references ();
1275 new_list.push_back (*i);
1282 _processors = new_list;
1283 configure_processors_unlocked (&err, &lm); // this can't fail
1285 /* drop references w/o process-lock (I/O procs may re-take it in ~IO() */
1288 processor_max_streams.reset();
1289 _have_internal_generator = false;
1290 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1291 set_processor_positions ();
1293 reset_instrument_info ();
1295 if (!already_deleting) {
1296 _session.clear_deletion_in_progress();
1301 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1303 // TODO once the export point can be configured properly, do something smarter here
1304 if (processor == _capturing_processor) {
1305 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1306 if (need_process_lock) {
1310 _capturing_processor.reset();
1312 if (need_process_lock) {
1317 /* these can never be removed */
1319 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1323 if (!_session.engine().connected()) {
1327 processor_max_streams.reset();
1330 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1331 if (need_process_lock) {
1335 /* Caller must hold process lock */
1336 assert (!AudioEngine::instance()->process_lock().trylock());
1338 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1340 ProcessorState pstate (this);
1342 ProcessorList::iterator i;
1343 bool removed = false;
1345 for (i = _processors.begin(); i != _processors.end(); ) {
1346 if (*i == processor) {
1348 /* move along, see failure case for configure_processors()
1349 where we may need to reconfigure the processor.
1352 /* stop redirects that send signals to JACK ports
1353 from causing noise as a result of no longer being
1357 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1358 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
1362 iop = pi->sidechain();
1369 i = _processors.erase (i);
1377 _output->set_user_latency (0);
1385 if (configure_processors_unlocked (err, &lm)) {
1387 /* we know this will work, because it worked before :) */
1388 configure_processors_unlocked (0, &lm);
1392 _have_internal_generator = false;
1394 for (i = _processors.begin(); i != _processors.end(); ++i) {
1395 boost::shared_ptr<PluginInsert> pi;
1397 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1398 if (pi->has_no_inputs ()) {
1399 _have_internal_generator = true;
1404 if (need_process_lock) {
1409 reset_instrument_info ();
1410 processor->drop_references ();
1411 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1412 set_processor_positions ();
1418 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1420 /* these can never be removed */
1421 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1424 /* and can't be used as substitute, either */
1425 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1429 /* I/Os are out, too */
1430 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1434 /* this function cannot be used to swap/reorder processors */
1435 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1439 if (!AudioEngine::instance()->connected() || !old || !sub) {
1443 /* ensure that sub is not owned by another route */
1444 if (sub->owner ()) {
1449 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1450 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1451 ProcessorState pstate (this);
1453 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1455 ProcessorList::iterator i;
1456 bool replaced = false;
1457 bool enable = old->enabled ();
1459 for (i = _processors.begin(); i != _processors.end(); ) {
1461 i = _processors.erase (i);
1462 _processors.insert (i, sub);
1463 sub->set_owner (this);
1476 boost::shared_ptr<PluginInsert> pi;
1477 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1478 pi->set_strict_io (true);
1482 if (configure_processors_unlocked (err, &lm)) {
1484 configure_processors_unlocked (0, &lm);
1488 _have_internal_generator = false;
1490 for (i = _processors.begin(); i != _processors.end(); ++i) {
1491 boost::shared_ptr<PluginInsert> pi;
1492 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1493 if (pi->has_no_inputs ()) {
1494 _have_internal_generator = true;
1504 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1505 _output->set_user_latency (0);
1508 reset_instrument_info ();
1509 old->drop_references ();
1510 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1511 set_processor_positions ();
1516 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1518 ProcessorList deleted;
1520 if (!_session.engine().connected()) {
1524 processor_max_streams.reset();
1527 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1528 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1529 ProcessorState pstate (this);
1531 ProcessorList::iterator i;
1532 boost::shared_ptr<Processor> processor;
1534 for (i = _processors.begin(); i != _processors.end(); ) {
1538 /* these can never be removed */
1540 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1545 /* see if its in the list of processors to delete */
1547 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1552 /* stop IOProcessors that send to JACK ports
1553 from causing noise as a result of no longer being
1557 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
1558 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
1561 iop = pi->sidechain();
1568 deleted.push_back (processor);
1569 i = _processors.erase (i);
1572 if (deleted.empty()) {
1573 /* none of those in the requested list were found */
1577 _output->set_user_latency (0);
1579 if (configure_processors_unlocked (err, &lm)) {
1581 /* we know this will work, because it worked before :) */
1582 configure_processors_unlocked (0, &lm);
1587 _have_internal_generator = false;
1589 for (i = _processors.begin(); i != _processors.end(); ++i) {
1590 boost::shared_ptr<PluginInsert> pi;
1592 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1593 if (pi->has_no_inputs ()) {
1594 _have_internal_generator = true;
1601 /* now try to do what we need to so that those that were removed will be deleted */
1603 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1604 (*i)->drop_references ();
1607 reset_instrument_info ();
1608 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1609 set_processor_positions ();
1615 Route::reset_instrument_info ()
1617 boost::shared_ptr<Processor> instr = the_instrument();
1619 _instrument_info.set_internal_instrument (instr);
1623 /** Caller must hold process lock */
1625 Route::configure_processors (ProcessorStreams* err)
1627 #ifndef PLATFORM_WINDOWS
1628 assert (!AudioEngine::instance()->process_lock().trylock());
1631 if (!_in_configure_processors) {
1632 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1633 return configure_processors_unlocked (err, &lm);
1640 Route::input_streams () const
1642 return _input->n_ports ();
1645 list<pair<ChanCount, ChanCount> >
1646 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1648 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1650 return try_configure_processors_unlocked (in, err);
1653 list<pair<ChanCount, ChanCount> >
1654 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1656 // Check each processor in order to see if we can configure as requested
1658 list<pair<ChanCount, ChanCount> > configuration;
1661 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1662 DEBUG_TRACE (DEBUG::Processors, "{\n");
1664 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1666 if ((*p)->can_support_io_configuration(in, out)) {
1668 if (boost::dynamic_pointer_cast<Delivery> (*p)
1669 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
1671 && (is_monitor() || _strict_io || Profile->get_mixbus ())) {
1672 /* with strict I/O the panner + output are forced to
1673 * follow the last processor's output.
1675 * Delivery::can_support_io_configuration() will only add ports,
1676 * but not remove excess ports.
1678 * This works because the delivery only requires
1679 * as many outputs as there are inputs.
1680 * Delivery::configure_io() will do the actual removal
1681 * by calling _output->ensure_io()
1683 if (!is_master() && _session.master_out () && in.n_audio() > 0) {
1684 /* ..but at least as many as there are master-inputs, if
1685 * the delivery is dealing with audio */
1686 // XXX this may need special-casing for mixbus (master-outputs)
1687 // and should maybe be a preference anyway ?!
1688 out = ChanCount::max (in, _session.master_out ()->n_inputs ());
1694 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1695 configuration.push_back(make_pair(in, out));
1698 // restriction for Monitor Section Processors
1699 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
1700 /* Note: The Monitor follows the master-bus and has no panner.
1702 * The general idea is to only allow plugins that retain the channel-count
1703 * and plugins with MIDI in (e.g VSTs with control that will remain unconnected).
1704 * Then again 5.1 in, monitor stereo is a valid use-case.
1706 * and worse: we only refuse adding plugins *here*.
1708 * 1) stereo-master, stereo-mon, add a stereo-plugin, OK
1709 * 2) change master-bus, add a channel
1710 * 2a) monitor-secion follows
1711 * 3) monitor processors fail to re-reconfigure (stereo plugin)
1712 * 4) re-load session, monitor-processor remains unconfigured, crash.
1714 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration change.\n");
1716 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
1717 // internal sends make no sense, only feedback
1718 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1719 return list<pair<ChanCount, ChanCount> > ();
1721 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
1722 /* External Sends can be problematic. one can add/remove ports
1723 * there signal leaves the DAW to external monitors anyway, so there's
1724 * no real use for allowing them here anyway.
1726 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
1727 return list<pair<ChanCount, ChanCount> > ();
1729 if (boost::dynamic_pointer_cast<Send> (*p)) {
1731 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1732 return list<pair<ChanCount, ChanCount> > ();
1741 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1742 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1743 DEBUG_TRACE (DEBUG::Processors, "}\n");
1744 return list<pair<ChanCount, ChanCount> > ();
1748 DEBUG_TRACE (DEBUG::Processors, "}\n");
1750 return configuration;
1753 /** Set the input/output configuration of each processor in the processors list.
1754 * Caller must hold process lock.
1755 * Return 0 on success, otherwise configuration is impossible.
1758 Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
1760 #ifndef PLATFORM_WINDOWS
1761 assert (!AudioEngine::instance()->process_lock().trylock());
1764 if (_in_configure_processors) {
1768 /* put invisible processors where they should be */
1769 setup_invisible_processors ();
1771 _in_configure_processors = true;
1773 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1775 if (configuration.empty ()) {
1776 _in_configure_processors = false;
1781 bool seen_mains_out = false;
1782 processor_out_streams = _input->n_ports();
1783 processor_max_streams.reset();
1785 /* processor configure_io() may result in adding ports
1786 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
1788 * with jack2 adding ports results in a graph-order callback,
1789 * which calls Session::resort_routes() and eventually
1790 * Route::direct_feeds_according_to_reality()
1791 * which takes a ReaderLock (_processor_lock).
1793 * so we can't hold a WriterLock here until jack2 threading
1796 * NB. we still hold the process lock
1798 * (ardour's own engines do call graph-order from the
1799 * process-thread and hence do not have this issue; besides
1800 * merely adding ports won't trigger a graph-order, only
1801 * making connections does)
1805 // TODO check for a potential ReaderLock after ReaderLock ??
1806 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
1808 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1809 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1811 if (!(*p)->configure_io(c->first, c->second)) {
1812 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1813 _in_configure_processors = false;
1818 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1819 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1821 boost::shared_ptr<IOProcessor> iop;
1822 boost::shared_ptr<PluginInsert> pi;
1823 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1824 /* plugins connected via Split or Hide Match may have more channels.
1825 * route/scratch buffers are needed for all of them
1826 * The configuration may only be a subset (both input and output)
1828 processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
1830 else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
1831 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
1832 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
1836 if (boost::dynamic_pointer_cast<Delivery> (*p)
1837 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1838 /* main delivery will increase port count to match input.
1839 * the Delivery::Main is usually the last processor - followed only by
1842 seen_mains_out = true;
1844 if (!seen_mains_out) {
1845 processor_out_streams = out;
1854 _meter->set_max_channels (processor_max_streams);
1857 /* make sure we have sufficient scratch buffers to cope with the new processor
1860 _session.ensure_buffers (n_process_buffers ());
1862 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1864 _in_configure_processors = false;
1868 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1869 * @param state New active state for those processors.
1872 Route::all_visible_processors_active (bool state)
1874 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1876 if (_processors.empty()) {
1880 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1881 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1885 boost::shared_ptr<PluginInsert> pi;
1886 if (0 != (pi = boost::dynamic_pointer_cast<PluginInsert>(*i))) {
1887 if (pi->is_channelstrip ()) {
1892 (*i)->enable (state);
1895 _session.set_dirty ();
1899 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1901 /* check if re-order requires re-configuration of any processors
1902 * -> compare channel configuration for all processors
1904 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1905 ChanCount c = input_streams ();
1907 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1909 if (c != (*j)->input_streams()) {
1912 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1915 if ((*i)->input_streams() != c) {
1918 c = (*i)->output_streams();
1930 __attribute__((annotate("realtime")))
1933 Route::apply_processor_order (const ProcessorList& new_order)
1935 /* need to hold processor_lock; either read or write lock
1936 * and the engine process_lock.
1937 * Due to r/w lock ambiguity we can only assert the latter
1939 assert (!AudioEngine::instance()->process_lock().trylock());
1942 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1943 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1944 * processors in the current actual processor list that are hidden. Any visible processors
1945 * in the current list but not in "new_order" will be assumed to be deleted.
1948 /* "as_it_will_be" and "_processors" are lists of shared pointers.
1949 * actual memory usage is small, but insert/erase is not actually rt-safe :(
1950 * (note though that ::processors_reorder_needs_configure() ensured that
1951 * this function will only ever be called from the rt-thread if no processor were removed)
1953 * either way, I can't proove it, but an x-run due to re-order here is less likley
1954 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
1957 ProcessorList as_it_will_be;
1958 ProcessorList::iterator oiter;
1959 ProcessorList::const_iterator niter;
1961 oiter = _processors.begin();
1962 niter = new_order.begin();
1964 while (niter != new_order.end()) {
1966 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1967 then append it to the temp list.
1969 Otherwise, see if the next processor in the old list is in the new list. if not,
1970 its been deleted. If its there, append it to the temp list.
1973 if (oiter == _processors.end()) {
1975 /* no more elements in the old list, so just stick the rest of
1976 the new order onto the temp list.
1979 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1980 while (niter != new_order.end()) {
1987 if (!(*oiter)->display_to_user()) {
1989 as_it_will_be.push_back (*oiter);
1993 /* visible processor: check that its in the new order */
1995 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1996 /* deleted: do nothing, shared_ptr<> will clean up */
1998 /* ignore this one, and add the next item from the new order instead */
1999 as_it_will_be.push_back (*niter);
2004 /* now remove from old order - its taken care of no matter what */
2005 oiter = _processors.erase (oiter);
2009 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2011 /* If the meter is in a custom position, find it and make a rough note of its position */
2012 maybe_note_meter_position ();
2016 Route::move_instrument_down (bool postfader)
2018 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2019 ProcessorList new_order;
2020 boost::shared_ptr<Processor> instrument;
2021 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2022 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
2023 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
2025 } else if (instrument && *i == _amp) {
2027 new_order.push_back (*i);
2028 new_order.push_back (instrument);
2030 new_order.push_back (instrument);
2031 new_order.push_back (*i);
2034 new_order.push_back (*i);
2041 reorder_processors (new_order, 0);
2045 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2047 // it a change is already queued, wait for it
2048 // (unless engine is stopped. apply immediately and proceed
2049 while (g_atomic_int_get (&_pending_process_reorder)) {
2050 if (!AudioEngine::instance()->running()) {
2051 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2052 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2054 apply_processor_order(_pending_processor_order);
2055 setup_invisible_processors ();
2057 g_atomic_int_set (&_pending_process_reorder, 0);
2059 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2060 set_processor_positions ();
2062 // TODO rather use a semaphore or something.
2063 // but since ::reorder_processors() is called
2064 // from the GUI thread, this is fine..
2069 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2071 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2072 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2073 ProcessorState pstate (this);
2075 apply_processor_order (new_order);
2077 if (configure_processors_unlocked (err, &lm)) {
2085 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2086 set_processor_positions ();
2089 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2090 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2092 // _pending_processor_order is protected by _processor_lock
2093 _pending_processor_order = new_order;
2094 g_atomic_int_set (&_pending_process_reorder, 1);
2101 Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
2103 boost::shared_ptr<PluginInsert> pi;
2104 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2108 if (pi->has_sidechain () == add) {
2109 return true; // ?? call failed, but result is as expected.
2113 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2114 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2115 if (i == _processors.end ()) {
2121 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
2122 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2123 PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
2125 lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
2127 if (!pi->add_sidechain ()) {
2131 if (!pi->del_sidechain ()) {
2137 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2142 pi->del_sidechain ();
2144 pi->add_sidechain ();
2145 // TODO restore side-chain's state.
2150 configure_processors_unlocked (0, &lm);
2153 if (pi->has_sidechain ()) {
2154 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2157 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2158 _session.set_dirty ();
2163 Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
2165 boost::shared_ptr<PluginInsert> pi;
2166 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2171 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2172 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2173 if (i == _processors.end ()) {
2179 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2180 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2182 const ChanCount& old (pi->preset_out ());
2183 if (!pi->set_preset_out (outs)) {
2184 return true; // no change, OK
2187 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2190 pi->set_preset_out (old);
2193 configure_processors_unlocked (0, &lm);
2196 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2197 _session.set_dirty ();
2202 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2205 return customize_plugin_insert (proc, 0, unused, unused);
2209 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
2211 boost::shared_ptr<PluginInsert> pi;
2212 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2217 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2218 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2219 if (i == _processors.end ()) {
2225 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2226 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2228 bool old_cust = pi->custom_cfg ();
2229 uint32_t old_cnt = pi->get_count ();
2230 ChanCount old_chan = pi->output_streams ();
2231 ChanCount old_sinks = pi->natural_input_streams ();
2234 pi->set_custom_cfg (false);
2236 pi->set_custom_cfg (true);
2237 pi->set_count (count);
2238 pi->set_outputs (outs);
2239 pi->set_sinks (sinks);
2242 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2246 pi->set_count (old_cnt);
2247 pi->set_sinks (old_sinks);
2248 pi->set_outputs (old_chan);
2249 pi->set_custom_cfg (old_cust);
2253 configure_processors_unlocked (0, &lm);
2256 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2257 _session.set_dirty ();
2262 Route::set_strict_io (const bool enable)
2264 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2266 if (_strict_io != enable) {
2267 _strict_io = enable;
2268 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2269 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2270 boost::shared_ptr<PluginInsert> pi;
2271 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2272 pi->set_strict_io (_strict_io);
2276 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2280 _strict_io = !enable; // restore old value
2281 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2282 boost::shared_ptr<PluginInsert> pi;
2283 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2284 pi->set_strict_io (_strict_io);
2291 configure_processors (0);
2294 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2295 _session.set_dirty ();
2307 Route::get_template()
2309 return state(false);
2313 Route::state(bool full_state)
2315 if (!_session._template_state_dir.empty()) {
2316 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2319 XMLNode *node = new XMLNode("Route");
2320 ProcessorList::iterator i;
2322 node->set_property ("id", id ());
2323 node->set_property ("name", name());
2324 node->set_property ("default-type", _default_type);
2325 node->set_property ("strict-io", _strict_io);
2327 node->add_child_nocopy (_presentation_info.get_state());
2329 node->set_property ("active", _active);
2330 node->set_property ("denormal-protection", _denormal_protection);
2331 node->set_property ("meter-point", _meter_point);
2333 node->set_property ("meter-type", _meter_type);
2336 node->set_property ("route-group", _route_group->name());
2339 node->add_child_nocopy (_solo_control->get_state ());
2340 node->add_child_nocopy (_solo_isolate_control->get_state ());
2341 node->add_child_nocopy (_solo_safe_control->get_state ());
2343 node->add_child_nocopy (_input->state (full_state));
2344 node->add_child_nocopy (_output->state (full_state));
2345 node->add_child_nocopy (_mute_master->get_state ());
2347 node->add_child_nocopy (_mute_control->get_state ());
2348 node->add_child_nocopy (_phase_control->get_state ());
2351 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2354 if (_comment.length()) {
2355 XMLNode *cmt = node->add_child ("Comment");
2356 cmt->add_content (_comment);
2360 node->add_child_nocopy (_pannable->state (full_state));
2364 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2365 for (i = _processors.begin(); i != _processors.end(); ++i) {
2367 /* template save: do not include internal sends functioning as
2368 aux sends because the chance of the target ID
2369 in the session where this template is used
2372 similarly, do not save listen sends which connect to
2373 the monitor section, because these will always be
2376 boost::shared_ptr<InternalSend> is;
2378 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2379 if (is->role() == Delivery::Listen) {
2384 node->add_child_nocopy((*i)->state (full_state));
2389 node->add_child_copy (*_extra_xml);
2392 if (_custom_meter_position_noted) {
2393 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2395 node->set_property (X_("processor-after-last-custom-meter"), after->id());
2399 if (!_session._template_state_dir.empty()) {
2400 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2403 node->add_child_copy (Slavable::get_state());
2409 Route::set_state (const XMLNode& node, int version)
2411 if (version < 3000) {
2412 return set_state_2X (node, version);
2416 XMLNodeConstIterator niter;
2419 if (node.name() != "Route"){
2420 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2424 std::string route_name;
2425 if (node.get_property (X_("name"), route_name)) {
2426 Route::set_name (route_name);
2430 _initial_io_setup = true;
2432 Stripable::set_state (node, version);
2434 node.get_property (X_("strict-io"), _strict_io);
2437 /* monitor bus does not get a panner, but if (re)created
2438 via XML, it will already have one by the time we
2439 call ::set_state(). so ... remove it.
2444 /* add all processors (except amp, which is always present) */
2446 nlist = node.children();
2447 XMLNode processor_state (X_("processor_state"));
2449 Stateful::save_extra_xml (node);
2451 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2455 if (child->name() == IO::state_node_name) {
2456 std::string direction;
2457 if (!child->get_property (X_("direction"), direction)) {
2461 if (direction == "Input") {
2462 _input->set_state (*child, version);
2463 } else if (direction == "Output") {
2464 _output->set_state (*child, version);
2467 } else if (child->name() == X_("Processor")) {
2468 processor_state.add_child_copy (*child);
2469 } else if (child->name() == X_("Pannable")) {
2471 _pannable->set_state (*child, version);
2473 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2475 } else if (child->name() == Slavable::xml_node_name) {
2476 Slavable::set_state (*child, version);
2481 if (node.get_property (X_("meter-point"), mp)) {
2482 set_meter_point (mp, true);
2484 _meter->set_display_to_user (_meter_point == MeterCustom);
2488 node.get_property (X_("meter-type"), _meter_type);
2490 _initial_io_setup = false;
2492 set_processor_state (processor_state);
2494 // this looks up the internal instrument in processors
2495 reset_instrument_info();
2497 bool denormal_protection;
2498 if (node.get_property (X_("denormal-protection"), denormal_protection)) {
2499 set_denormal_protection (denormal_protection);
2502 /* convert old 3001 state */
2503 std::string phase_invert_str;
2504 if (node.get_property (X_("phase-invert"), phase_invert_str)) {
2505 _phase_control->set_phase_invert (boost::dynamic_bitset<> (phase_invert_str));
2509 if (node.get_property (X_("active"), is_active)) {
2510 set_active (is_active, this);
2513 std::string id_string;
2514 if (node.get_property (X_("processor-after-last-custom-meter"), id_string)) {
2515 PBD::ID id (id_string);
2516 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2517 ProcessorList::const_iterator i = _processors.begin ();
2518 while (i != _processors.end() && (*i)->id() != id) {
2522 if (i != _processors.end ()) {
2523 _processor_after_last_custom_meter = *i;
2524 _custom_meter_position_noted = true;
2528 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2531 if (child->name() == X_("Comment")) {
2533 /* XXX this is a terrible API design in libxml++ */
2535 XMLNode *cmt = *(child->children().begin());
2536 _comment = cmt->content();
2538 } else if (child->name() == Controllable::xml_node_name) {
2539 std::string control_name;
2540 if (!child->get_property (X_("name"), control_name)) {
2544 if (control_name == _solo_control->name()) {
2545 _solo_control->set_state (*child, version);
2546 } else if (control_name == _solo_safe_control->name()) {
2547 _solo_safe_control->set_state (*child, version);
2548 } else if (control_name == _solo_isolate_control->name()) {
2549 _solo_isolate_control->set_state (*child, version);
2550 } else if (control_name == _mute_control->name()) {
2551 _mute_control->set_state (*child, version);
2552 } else if (control_name == _phase_control->name()) {
2553 _phase_control->set_state (*child, version);
2555 Evoral::Parameter p = EventTypeMap::instance().from_symbol (control_name);
2556 if (p.type () >= MidiCCAutomation && p.type () < MidiSystemExclusiveAutomation) {
2557 boost::shared_ptr<AutomationControl> ac = automation_control (p, true);
2559 ac->set_state (*child, version);
2563 } else if (child->name() == MuteMaster::xml_node_name) {
2564 _mute_master->set_state (*child, version);
2566 } else if (child->name() == Automatable::xml_node_name) {
2567 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2575 Route::set_state_2X (const XMLNode& node, int version)
2579 XMLNodeConstIterator niter;
2581 XMLProperty const * prop;
2583 /* 2X things which still remain to be handled:
2589 if (node.name() != "Route") {
2590 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2594 Stripable::set_state (node, version);
2596 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2597 set_denormal_protection (string_to<bool> (prop->value()));
2600 if ((prop = node.property (X_("muted"))) != 0) {
2603 bool muted = string_to<bool> (prop->value());
2609 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2611 if (string_to<bool> (prop->value())){
2612 mute_point = mute_point + "PreFader";
2617 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2619 if (string_to<bool> (prop->value())){
2622 mute_point = mute_point + ",";
2625 mute_point = mute_point + "PostFader";
2630 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2632 if (string_to<bool> (prop->value())){
2635 mute_point = mute_point + ",";
2638 mute_point = mute_point + "Listen";
2643 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2645 if (string_to<bool> (prop->value())){
2648 mute_point = mute_point + ",";
2651 mute_point = mute_point + "Main";
2655 _mute_master->set_mute_points (mute_point);
2656 _mute_master->set_muted_by_self (true);
2660 if ((prop = node.property (X_("meter-point"))) != 0) {
2661 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2666 nlist = node.children ();
2667 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2671 if (child->name() == IO::state_node_name) {
2673 /* there is a note in IO::set_state_2X() about why we have to call
2677 _input->set_state_2X (*child, version, true);
2678 _output->set_state_2X (*child, version, false);
2680 if ((prop = child->property (X_("name"))) != 0) {
2681 Route::set_name (prop->value ());
2686 if ((prop = child->property (X_("active"))) != 0) {
2687 bool yn = string_to<bool> (prop->value());
2688 _active = !yn; // force switch
2689 set_active (yn, this);
2692 if ((prop = child->property (X_("gain"))) != 0) {
2695 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2696 _amp->gain_control()->set_value (val, Controllable::NoGroup);
2700 /* Set up Panners in the IO */
2701 XMLNodeList io_nlist = child->children ();
2703 XMLNodeConstIterator io_niter;
2706 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2708 io_child = *io_niter;
2710 if (io_child->name() == X_("Panner")) {
2711 _main_outs->panner_shell()->set_state(*io_child, version);
2712 } else if (io_child->name() == X_("Automation")) {
2713 /* IO's automation is for the fader */
2714 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2720 XMLNodeList redirect_nodes;
2722 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2726 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2727 redirect_nodes.push_back(child);
2732 set_processor_state_2X (redirect_nodes, version);
2734 Stateful::save_extra_xml (node);
2736 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2739 if (child->name() == X_("Comment")) {
2741 /* XXX this is a terrible API design in libxml++ */
2743 XMLNode *cmt = *(child->children().begin());
2744 _comment = cmt->content();
2746 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2747 if (prop->value() == X_("solo")) {
2748 _solo_control->set_state (*child, version);
2749 } else if (prop->value() == X_("mute")) {
2750 _mute_control->set_state (*child, version);
2760 Route::get_processor_state ()
2762 XMLNode* root = new XMLNode (X_("redirects"));
2763 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2764 root->add_child_nocopy ((*i)->state (true));
2771 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2773 /* We don't bother removing existing processors not in nList, as this
2774 method will only be called when creating a Route from scratch, not
2775 for undo purposes. Just put processors in at the appropriate place
2779 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2780 add_processor_from_xml_2X (**i, version);
2785 Route::set_processor_state (const XMLNode& node)
2787 const XMLNodeList &nlist = node.children();
2788 XMLNodeConstIterator niter;
2789 ProcessorList new_order;
2790 bool must_configure = false;
2792 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2794 XMLProperty* prop = (*niter)->property ("type");
2796 if (prop->value() == "amp") {
2797 _amp->set_state (**niter, Stateful::current_state_version);
2798 new_order.push_back (_amp);
2799 } else if (prop->value() == "trim") {
2800 _trim->set_state (**niter, Stateful::current_state_version);
2801 new_order.push_back (_trim);
2802 } else if (prop->value() == "meter") {
2803 _meter->set_state (**niter, Stateful::current_state_version);
2804 new_order.push_back (_meter);
2805 } else if (prop->value() == "delay") {
2807 _delayline->set_state (**niter, Stateful::current_state_version);
2808 new_order.push_back (_delayline);
2810 } else if (prop->value() == "main-outs") {
2811 _main_outs->set_state (**niter, Stateful::current_state_version);
2812 } else if (prop->value() == "intreturn") {
2814 _intreturn.reset (new InternalReturn (_session));
2815 must_configure = true;
2817 _intreturn->set_state (**niter, Stateful::current_state_version);
2818 } else if (is_monitor() && prop->value() == "monitor") {
2819 if (!_monitor_control) {
2820 _monitor_control.reset (new MonitorProcessor (_session));
2821 must_configure = true;
2823 _monitor_control->set_state (**niter, Stateful::current_state_version);
2824 } else if (prop->value() == "capture") {
2825 /* CapturingProcessor should never be restored, it's always
2826 added explicitly when needed */
2828 ProcessorList::iterator o;
2830 for (o = _processors.begin(); o != _processors.end(); ++o) {
2831 XMLProperty const * id_prop = (*niter)->property(X_("id"));
2832 if (id_prop && (*o)->id() == id_prop->value()) {
2833 (*o)->set_state (**niter, Stateful::current_state_version);
2834 new_order.push_back (*o);
2839 // If the processor (*niter) is not on the route then create it
2841 if (o == _processors.end()) {
2843 boost::shared_ptr<Processor> processor;
2845 if (prop->value() == "intsend") {
2847 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2849 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2850 prop->value() == "lv2" ||
2851 prop->value() == "windows-vst" ||
2852 prop->value() == "mac-vst" ||
2853 prop->value() == "lxvst" ||
2854 prop->value() == "luaproc" ||
2855 prop->value() == "audiounit") {
2857 if (_session.get_disable_all_loaded_plugins ()) {
2858 processor.reset (new UnknownProcessor (_session, **niter));
2860 processor.reset (new PluginInsert (_session));
2861 processor->set_owner (this);
2863 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
2864 pi->set_strict_io (true);
2868 } else if (prop->value() == "port") {
2870 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2872 } else if (prop->value() == "send") {
2874 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2875 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
2876 send->SelfDestruct.connect_same_thread (*this,
2877 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
2880 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2884 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2885 /* This processor could not be configured. Turn it into a UnknownProcessor */
2886 processor.reset (new UnknownProcessor (_session, **niter));
2889 /* subscribe to Sidechain IO changes */
2890 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
2891 if (pi && pi->has_sidechain ()) {
2892 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2895 /* we have to note the monitor send here, otherwise a new one will be created
2896 and the state of this one will be lost.
2898 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2899 if (isend && isend->role() == Delivery::Listen) {
2900 _monitor_send = isend;
2903 /* it doesn't matter if invisible processors are added here, as they
2904 will be sorted out by setup_invisible_processors () shortly.
2907 new_order.push_back (processor);
2908 must_configure = true;
2913 ProcessorList old_list = _processors; // keep a copy
2915 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2916 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2917 /* re-assign _processors w/o process-lock.
2918 * if there's an IO-processor present in _processors but
2919 * not in new_order, it will be deleted and ~IO takes
2922 _processors = new_order;
2924 if (must_configure) {
2925 configure_processors_unlocked (0, &lm);
2928 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2930 (*i)->set_owner (this);
2931 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2933 boost::shared_ptr<PluginInsert> pi;
2935 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2936 if (pi->has_no_inputs ()) {
2937 _have_internal_generator = true;
2943 /* drop references w/o process-lock (I/O procs may re-take it in ~IO() */
2946 reset_instrument_info ();
2947 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2948 set_processor_positions ();
2952 Route::curve_reallocate ()
2954 // _gain_automation_curve.finish_resize ();
2955 // _pan_automation_curve.finish_resize ();
2959 Route::silence (framecnt_t nframes)
2961 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2966 silence_unlocked (nframes);
2970 Route::silence_unlocked (framecnt_t nframes)
2972 /* Must be called with the processor lock held */
2974 const framepos_t now = _session.transport_frame ();
2978 _output->silence (nframes);
2980 // update owned automated controllables
2981 automation_run (now, nframes);
2983 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2984 boost::shared_ptr<PluginInsert> pi;
2986 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2987 /* evaluate automated automation controls */
2988 pi->automation_run (now, nframes);
2989 /* skip plugins, they don't need anything when we're not active */
2993 (*i)->silence (nframes, now);
2996 if (nframes == _session.get_block_size()) {
3003 Route::add_internal_return ()
3006 _intreturn.reset (new InternalReturn (_session));
3007 add_processor (_intreturn, PreFader);
3012 Route::add_send_to_internal_return (InternalSend* send)
3014 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3016 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3017 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3020 return d->add_send (send);
3026 Route::remove_send_from_internal_return (InternalSend* send)
3028 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3030 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3031 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3034 return d->remove_send (send);
3040 Route::enable_monitor_send ()
3042 /* Caller must hold process lock */
3043 assert (!AudioEngine::instance()->process_lock().trylock());
3045 /* master never sends to monitor section via the normal mechanism */
3046 assert (!is_master ());
3047 assert (!is_monitor ());
3049 /* make sure we have one */
3050 if (!_monitor_send) {
3051 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3052 _monitor_send->set_display_to_user (false);
3056 configure_processors (0);
3059 /** Add an aux send to a route.
3060 * @param route route to send to.
3061 * @param before Processor to insert before, or 0 to insert at the end.
3064 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3066 assert (route != _session.monitor_out ());
3069 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3071 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3073 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3075 if (d && d->target_route() == route) {
3076 /* already listening via the specified IO: do nothing */
3084 boost::shared_ptr<InternalSend> listener;
3087 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3088 listener.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3091 add_processor (listener, before);
3093 } catch (failed_constructor& err) {
3101 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3103 ProcessorStreams err;
3104 ProcessorList::iterator tmp;
3107 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3109 /* have to do this early because otherwise processor reconfig
3110 * will put _monitor_send back in the list
3113 if (route == _session.monitor_out()) {
3114 _monitor_send.reset ();
3118 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3120 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3122 if (d && d->target_route() == route) {
3124 if (remove_processor (*x, &err, false) > 0) {
3130 /* list could have been demolished while we dropped the lock
3133 if (_session.engine().connected()) {
3134 /* i/o processors cannot be removed if the engine is not running
3135 * so don't live-loop in case the engine is N/A or dies
3145 Route::set_comment (string cmt, void *src)
3149 _session.set_dirty ();
3153 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3155 FeedRecord fr (other, via_sends_only);
3157 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3159 if (!result.second) {
3161 /* already a record for "other" - make sure sends-only information is correct */
3162 if (!via_sends_only && result.first->sends_only) {
3163 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3164 frp->sends_only = false;
3168 return result.second;
3172 Route::clear_fed_by ()
3178 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3180 const FedBy& fed_by (other->fed_by());
3182 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3183 boost::shared_ptr<Route> sr = f->r.lock();
3185 if (sr && (sr.get() == this)) {
3187 if (via_sends_only) {
3188 *via_sends_only = f->sends_only;
3199 Route::all_inputs () const
3201 /* TODO, if this works as expected,
3202 * cache the IOVector and maintain it via
3203 * input_change_handler(), sidechain_change_handler() etc
3206 ios.push_back (_input);
3208 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3209 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3211 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3212 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3215 iop = pi->sidechain();
3218 if (iop != 0 && iop->input()) {
3219 ios.push_back (iop->input());
3226 Route::all_outputs () const
3229 // _output is included via Delivery
3230 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3231 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3232 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3233 if (iop != 0 && iop->output()) {
3234 ios.push_back (iop->output());
3241 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3243 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3244 if (other->all_inputs().fed_by (_output)) {
3245 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3246 if (via_send_only) {
3247 *via_send_only = false;
3253 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3255 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3257 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3258 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3261 iop = pi->sidechain();
3265 boost::shared_ptr<const IO> iop_out = iop->output();
3266 if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
3267 // TODO this needs a delaylines in the Insert to align connections (!)
3268 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
3271 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3272 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3273 if (via_send_only) {
3274 *via_send_only = true;
3278 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3281 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3286 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3291 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3293 return _session._current_route_graph.has (boost::dynamic_pointer_cast<Route> (shared_from_this ()), other, via_send_only);
3297 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3299 return _session._current_route_graph.feeds (boost::dynamic_pointer_cast<Route> (shared_from_this ()), other);
3302 /** Called from the (non-realtime) butler thread when the transport is stopped */
3304 Route::non_realtime_transport_stop (framepos_t now, bool flush)
3307 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3309 Automatable::non_realtime_transport_stop (now, flush);
3311 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3313 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && flush)) {
3317 (*i)->non_realtime_transport_stop (now, flush);
3321 _roll_delay = _initial_delay;
3325 Route::input_change_handler (IOChange change, void * /*src*/)
3327 if ((change.type & IOChange::ConfigurationChanged)) {
3328 /* This is called with the process lock held if change
3329 contains ConfigurationChanged
3331 configure_processors (0);
3332 _phase_control->resize (_input->n_ports().n_audio ());
3333 io_changed (); /* EMIT SIGNAL */
3336 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3339 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3340 if (_input->connected()) {
3341 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3342 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3346 bool does_feed = (*i)->direct_feeds_according_to_reality (boost::dynamic_pointer_cast<Route> (shared_from_this()), &sends_only);
3347 if (does_feed && !sends_only) {
3348 if ((*i)->soloed()) {
3351 if ((*i)->solo_isolate_control()->solo_isolated()) {
3358 int delta = sbou - _solo_control->soloed_by_others_upstream();
3359 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3362 PBD::warning << string_compose (
3363 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3364 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3369 if (_solo_control->soloed_by_others_upstream()) {
3370 // ignore new connections (they're not propagated)
3372 _solo_control->mod_solo_by_others_upstream (delta);
3376 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3377 // solo-isolate currently only propagates downstream
3379 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3381 //_solo_isolated_by_upstream = ibou;
3384 // Session::route_solo_changed does not propagate indirect solo-changes
3385 // propagate downstream to tracks
3386 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3387 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3391 bool does_feed = feeds (*i, &sends_only);
3392 if (delta <= 0 && does_feed && !sends_only) {
3393 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3396 if (idelta < 0 && does_feed && !sends_only) {
3397 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3404 Route::output_change_handler (IOChange change, void * /*src*/)
3406 if (_initial_io_setup) {
3410 if ((change.type & IOChange::ConfigurationChanged)) {
3411 /* This is called with the process lock held if change
3412 contains ConfigurationChanged
3414 configure_processors (0);
3417 _session.reset_monitor_section();
3420 io_changed (); /* EMIT SIGNAL */
3423 if ((change.type & IOChange::ConnectionsChanged)) {
3425 /* do this ONLY if connections have changed. Configuration
3426 * changes do not, by themselves alter solo upstream or
3427 * downstream status.
3430 if (_solo_control->soloed_by_others_downstream()) {
3432 /* checking all all downstream routes for
3433 * explicit of implict solo is a rather drastic measure,
3434 * ideally the input_change_handler() of the other route
3435 * would propagate the change to us.
3437 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3438 if (_output->connected()) {
3439 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3440 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3444 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3445 if (does_feed && !sends_only) {
3446 if ((*i)->soloed()) {
3454 int delta = sbod - _solo_control->soloed_by_others_downstream();
3456 // do not allow new connections to change implicit solo (no propagation)
3457 _solo_control->mod_solo_by_others_downstream (delta);
3458 // Session::route_solo_changed() does not propagate indirect solo-changes
3459 // propagate upstream to tracks
3460 boost::shared_ptr<Route> shared_this = boost::dynamic_pointer_cast<Route> (shared_from_this());
3461 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3462 if ((*i).get() == this || !can_solo()) {
3466 bool does_feed = (*i)->feeds (shared_this, &sends_only);
3467 if (delta != 0 && does_feed && !sends_only) {
3468 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3478 Route::sidechain_change_handler (IOChange change, void* src)
3480 if (_initial_io_setup || _in_sidechain_setup) {
3484 input_change_handler (change, src);
3488 Route::pans_required () const
3490 if (n_outputs().n_audio() < 2) {
3494 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3498 Route::flush_processor_buffers_locked (framecnt_t nframes)
3500 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3501 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
3503 d->flush_buffers (nframes);
3505 boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
3507 p->flush_buffers (nframes);
3514 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3516 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3523 silence_unlocked (nframes);
3527 if (session_state_changing) {
3528 if (_session.transport_speed() != 0.0f) {
3529 /* we're rolling but some state is changing (e.g. our diskstream contents)
3530 so we cannot use them. Be silent till this is over.
3532 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3534 silence_unlocked (nframes);
3537 /* we're really not rolling, so we're either delivery silence or actually
3538 monitoring, both of which are safe to do while session_state_changing is true.
3542 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3544 fill_buffers_with_input (bufs, _input, nframes);
3546 if (_meter_point == MeterInput) {
3547 _meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
3550 _amp->apply_gain_automation (false);
3551 _trim->apply_gain_automation (false);
3552 passthru (bufs, start_frame, end_frame, nframes, 0);
3554 flush_processor_buffers_locked (nframes);
3560 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3562 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3568 silence_unlocked (nframes);
3572 framepos_t unused = 0;
3574 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3580 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3582 fill_buffers_with_input (bufs, _input, nframes);
3584 if (_meter_point == MeterInput) {
3585 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
3588 passthru (bufs, start_frame, end_frame, nframes, declick);
3590 flush_processor_buffers_locked (nframes);
3596 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3599 flush_processor_buffers_locked (nframes);
3604 Route::flush_processors ()
3606 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3608 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3614 __attribute__((annotate("realtime")))
3617 Route::apply_processor_changes_rt ()
3619 int emissions = EmitNone;
3621 if (_pending_meter_point != _meter_point) {
3622 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3624 /* meters always have buffers for 'processor_max_streams'
3625 * they can be re-positioned without re-allocation */
3626 if (set_meter_point_unlocked()) {
3627 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3629 emissions |= EmitMeterChanged;
3634 bool changed = false;
3636 if (g_atomic_int_get (&_pending_process_reorder)) {
3637 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3639 apply_processor_order (_pending_processor_order);
3640 setup_invisible_processors ();
3642 g_atomic_int_set (&_pending_process_reorder, 0);
3643 emissions |= EmitRtProcessorChange;
3647 set_processor_positions ();
3649 if (emissions != 0) {
3650 g_atomic_int_set (&_pending_signals, emissions);
3653 return (!selfdestruct_sequence.empty ());
3657 Route::emit_pending_signals ()
3659 int sig = g_atomic_int_and (&_pending_signals, 0);
3660 if (sig & EmitMeterChanged) {
3661 _meter->emit_configuration_changed();
3662 meter_change (); /* EMIT SIGNAL */
3663 if (sig & EmitMeterVisibilityChange) {
3664 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3666 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3669 if (sig & EmitRtProcessorChange) {
3670 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3673 /* this would be a job for the butler.
3674 * Conceptually we should not take processe/processor locks here.
3675 * OTOH its more efficient (less overhead for summoning the butler and
3676 * telling her what do do) and signal emission is called
3677 * directly after the process callback, which decreases the chance
3678 * of x-runs when taking the locks.
3680 while (!selfdestruct_sequence.empty ()) {
3681 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3682 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3683 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3684 selfdestruct_sequence.pop_back ();
3687 remove_processor (proc);
3693 Route::set_meter_point (MeterPoint p, bool force)
3695 if (_pending_meter_point == p && !force) {
3699 if (force || !AudioEngine::instance()->running()) {
3700 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3701 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3702 _pending_meter_point = p;
3703 _meter->emit_configuration_changed();
3704 meter_change (); /* EMIT SIGNAL */
3705 if (set_meter_point_unlocked()) {
3706 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3708 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3711 _pending_meter_point = p;
3717 __attribute__((annotate("realtime")))
3720 Route::set_meter_point_unlocked ()
3723 /* Caller must hold process and processor write lock */
3724 assert (!AudioEngine::instance()->process_lock().trylock());
3725 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3726 assert (!lm.locked ());
3729 _meter_point = _pending_meter_point;
3731 bool meter_was_visible_to_user = _meter->display_to_user ();
3733 if (!_custom_meter_position_noted) {
3734 maybe_note_meter_position ();
3737 if (_meter_point != MeterCustom) {
3739 _meter->set_display_to_user (false);
3741 setup_invisible_processors ();
3744 _meter->set_display_to_user (true);
3746 /* If we have a previous position for the custom meter, try to put it there */
3747 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3749 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3750 if (i != _processors.end ()) {
3751 _processors.remove (_meter);
3752 _processors.insert (i, _meter);
3754 } else {// at end, right before the mains_out/panner
3755 _processors.remove (_meter);
3756 ProcessorList::iterator main = _processors.end();
3757 _processors.insert (--main, _meter);
3761 /* Set up the meter for its new position */
3763 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3767 if (loc == _processors.begin()) {
3768 m_in = _input->n_ports();
3770 ProcessorList::iterator before = loc;
3772 m_in = (*before)->output_streams ();
3775 _meter->reflect_inputs (m_in);
3777 /* we do not need to reconfigure the processors, because the meter
3778 (a) is always ready to handle processor_max_streams
3779 (b) is always an N-in/N-out processor, and thus moving
3780 it doesn't require any changes to the other processors.
3783 /* these should really be done after releasing the lock
3784 * but all those signals are subscribed to with gui_thread()
3787 return (_meter->display_to_user() != meter_was_visible_to_user);
3791 Route::listen_position_changed ()
3794 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3795 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3796 ProcessorState pstate (this);
3798 if (configure_processors_unlocked (0, &lm)) {
3799 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3801 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3806 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3807 _session.set_dirty ();
3810 boost::shared_ptr<CapturingProcessor>
3811 Route::add_export_point()
3813 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3814 if (!_capturing_processor) {
3816 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3817 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3819 // this aligns all tracks; but not tracks + busses
3820 assert (_session.worst_track_latency () >= _initial_delay);
3821 _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
3822 _capturing_processor->activate ();
3824 configure_processors_unlocked (0, &lw);
3828 return _capturing_processor;
3832 Route::update_signal_latency ()
3834 framecnt_t l = _output->user_latency();
3835 framecnt_t lamp = 0;
3836 bool before_amp = true;
3837 framecnt_t ltrim = 0;
3838 bool before_trim = true;
3840 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3841 if ((*i)->active ()) {
3842 l += (*i)->signal_latency ();
3847 if ((*i) == _trim) {
3858 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3860 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3861 _signal_latency_at_amp_position = lamp;
3862 _signal_latency_at_trim_position = ltrim;
3864 if (_signal_latency != l) {
3865 _signal_latency = l;
3866 signal_latency_changed (); /* EMIT SIGNAL */
3869 return _signal_latency;
3873 Route::set_user_latency (framecnt_t nframes)
3875 _output->set_user_latency (nframes);
3876 _session.update_latency_compensation ();
3880 Route::set_latency_compensation (framecnt_t longest_session_latency)
3882 framecnt_t old = _initial_delay;
3884 if (_signal_latency < longest_session_latency) {
3885 _initial_delay = longest_session_latency - _signal_latency;
3890 DEBUG_TRACE (DEBUG::Latency, string_compose (
3891 "%1: compensate for maximum latency of %2,"
3892 "given own latency of %3, using initial delay of %4\n",
3893 name(), longest_session_latency, _signal_latency, _initial_delay));
3895 if (_initial_delay != old) {
3896 initial_delay_changed (); /* EMIT SIGNAL */
3899 if (_session.transport_stopped()) {
3900 _roll_delay = _initial_delay;
3905 Route::set_block_size (pframes_t nframes)
3907 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3908 (*i)->set_block_size (nframes);
3911 _session.ensure_buffers (n_process_buffers ());
3915 Route::protect_automation ()
3917 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3918 (*i)->protect_automation();
3921 /** @param declick 1 to set a pending declick fade-in,
3922 * -1 to set a pending declick fade-out
3925 Route::set_pending_declick (int declick)
3928 /* this call is not allowed to turn off a pending declick */
3930 _pending_declick = declick;
3933 _pending_declick = 0;
3937 /** Shift automation forwards from a particular place, thereby inserting time.
3938 * Adds undo commands for any shifts that are performed.
3940 * @param pos Position to start shifting from.
3941 * @param frames Amount to shift forwards by.
3945 Route::shift (framepos_t pos, framecnt_t frames)
3947 /* gain automation */
3949 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3951 XMLNode &before = gc->alist()->get_state ();
3952 gc->alist()->shift (pos, frames);
3953 XMLNode &after = gc->alist()->get_state ();
3954 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3957 /* gain automation */
3959 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3961 XMLNode &before = gc->alist()->get_state ();
3962 gc->alist()->shift (pos, frames);
3963 XMLNode &after = gc->alist()->get_state ();
3964 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3967 // TODO mute automation ??
3969 /* pan automation */
3971 ControlSet::Controls& c (_pannable->controls());
3973 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3974 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3976 boost::shared_ptr<AutomationList> al = pc->alist();
3977 XMLNode& before = al->get_state ();
3978 al->shift (pos, frames);
3979 XMLNode& after = al->get_state ();
3980 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3985 /* redirect automation */
3987 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3988 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3990 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3992 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3993 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3995 boost::shared_ptr<AutomationList> al = ac->alist();
3996 XMLNode &before = al->get_state ();
3997 al->shift (pos, frames);
3998 XMLNode &after = al->get_state ();
3999 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4007 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
4009 boost::shared_ptr<Processor> processor (p.lock ());
4010 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
4014 pi->set_state_dir (d);
4018 Route::save_as_template (const string& path, const string& name, const string& description)
4020 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
4021 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
4023 XMLNode& node (state (false));
4024 node.set_property (X_("name"), name);
4026 node.remove_nodes (X_("description"));
4027 if (!description.empty()) {
4028 XMLNode* desc = new XMLNode(X_("description"));
4029 XMLNode* desc_cont = new XMLNode(X_("content"), description);
4030 desc->add_child_nocopy (*desc_cont);
4032 node.add_child_nocopy (*desc);
4037 IO::set_name_in_state (*node.children().front(), name);
4039 tree.set_root (&node);
4041 /* return zero on success, non-zero otherwise */
4042 return !tree.write (path.c_str());
4047 Route::set_name (const string& str)
4053 if (str == name()) {
4057 string name = Route::ensure_track_or_route_name (str, _session);
4058 SessionObject::set_name (name);
4060 bool ret = (_input->set_name(name) && _output->set_name(name));
4063 /* rename the main outs. Leave other IO processors
4064 * with whatever name they already have, because its
4065 * just fine as it is (it will not contain the route
4066 * name if its a port insert, port send or port return).
4070 if (_main_outs->set_name (name)) {
4071 /* XXX returning false here is stupid because
4072 we already changed the route name.
4082 /** Set the name of a route in an XML description.
4083 * @param node XML <Route> node to set the name in.
4084 * @param name New name.
4087 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
4089 node.set_property (X_("name"), name);
4091 XMLNodeList children = node.children();
4092 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4094 if ((*i)->name() == X_("IO")) {
4096 IO::set_name_in_state (**i, name);
4098 } else if ((*i)->name() == X_("Processor")) {
4101 if ((*i)->get_property (X_("role"), str) && str == X_("Main")) {
4102 (*i)->set_property (X_("name"), name);
4105 } else if ((*i)->name() == X_("Diskstream")) {
4107 if (rename_playlist) {
4108 (*i)->set_property (X_("playlist"), name + ".1");
4110 (*i)->set_property (X_("name"), name);
4116 boost::shared_ptr<Send>
4117 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4119 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4121 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4122 boost::shared_ptr<InternalSend> send;
4124 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4125 if (send->target_route() == target) {
4131 return boost::shared_ptr<Send>();
4135 Route::set_denormal_protection (bool yn)
4137 if (_denormal_protection != yn) {
4138 _denormal_protection = yn;
4139 denormal_protection_changed (); /* EMIT SIGNAL */
4144 Route::denormal_protection () const
4146 return _denormal_protection;
4150 Route::set_active (bool yn, void* src)
4152 if (_session.transport_rolling()) {
4156 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4157 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4161 if (_active != yn) {
4163 _input->set_active (yn);
4164 _output->set_active (yn);
4165 flush_processors ();
4166 active_changed (); // EMIT SIGNAL
4167 _session.set_dirty ();
4171 boost::shared_ptr<Pannable>
4172 Route::pannable() const
4177 boost::shared_ptr<Panner>
4178 Route::panner() const
4181 return _main_outs->panner_shell()->panner();
4184 boost::shared_ptr<PannerShell>
4185 Route::panner_shell() const
4187 return _main_outs->panner_shell();
4190 boost::shared_ptr<GainControl>
4191 Route::gain_control() const
4193 return _gain_control;
4196 boost::shared_ptr<GainControl>
4197 Route::trim_control() const
4199 return _trim_control;
4202 boost::shared_ptr<PhaseControl>
4203 Route::phase_control() const
4205 return _phase_control;
4208 boost::shared_ptr<AutomationControl>
4209 Route::get_control (const Evoral::Parameter& param)
4211 /* either we own the control or .... */
4213 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4217 /* maybe one of our processors does or ... */
4219 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4220 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4221 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4229 /* nobody does so we'll make a new one */
4231 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4238 boost::shared_ptr<Processor>
4239 Route::nth_plugin (uint32_t n) const
4241 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4242 ProcessorList::const_iterator i;
4244 for (i = _processors.begin(); i != _processors.end(); ++i) {
4245 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4252 return boost::shared_ptr<Processor> ();
4255 boost::shared_ptr<Processor>
4256 Route::nth_send (uint32_t n) const
4258 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4259 ProcessorList::const_iterator i;
4261 for (i = _processors.begin(); i != _processors.end(); ++i) {
4262 if (boost::dynamic_pointer_cast<Send> (*i)) {
4264 if ((*i)->name().find (_("Monitor")) == 0) {
4265 /* send to monitor section is not considered
4266 to be an accessible send.
4277 return boost::shared_ptr<Processor> ();
4281 Route::has_io_processor_named (const string& name)
4283 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4284 ProcessorList::iterator i;
4286 for (i = _processors.begin(); i != _processors.end(); ++i) {
4287 if (boost::dynamic_pointer_cast<Send> (*i) ||
4288 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4289 if ((*i)->name() == name) {
4299 Route::set_processor_positions ()
4301 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4303 bool had_amp = false;
4304 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4305 (*i)->set_pre_fader (!had_amp);
4312 /** Called when there is a proposed change to the input port count */
4314 Route::input_port_count_changing (ChanCount to)
4316 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4318 /* The processors cannot be configured with the new input arrangement, so
4324 /* The change is ok */
4328 /** Called when there is a proposed change to the output port count */
4330 Route::output_port_count_changing (ChanCount to)
4332 if (_strict_io && !_in_configure_processors) {
4335 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4336 if (processor_out_streams.get(*t) > to.get(*t)) {
4340 /* The change is ok */
4345 Route::unknown_processors () const
4349 if (_session.get_disable_all_loaded_plugins ()) {
4350 // Do not list "missing plugins" if they are explicitly disabled
4354 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4355 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4356 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4357 p.push_back ((*i)->name ());
4366 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4368 /* we assume that all our input ports feed all our output ports. its not
4369 universally true, but the alternative is way too corner-case to worry about.
4372 LatencyRange all_connections;
4375 all_connections.min = 0;
4376 all_connections.max = 0;
4378 all_connections.min = ~((pframes_t) 0);
4379 all_connections.max = 0;
4381 /* iterate over all "from" ports and determine the latency range for all of their
4382 connections to the "outside" (outside of this Route).
4385 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4389 p->get_connected_latency_range (range, playback);
4391 all_connections.min = min (all_connections.min, range.min);
4392 all_connections.max = max (all_connections.max, range.max);
4396 /* set the "from" port latencies to the max/min range of all their connections */
4398 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4399 p->set_private_latency_range (all_connections, playback);
4402 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4404 all_connections.min += our_latency;
4405 all_connections.max += our_latency;
4407 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4408 p->set_private_latency_range (all_connections, playback);
4411 return all_connections.max;
4415 Route::set_private_port_latencies (bool playback) const
4417 framecnt_t own_latency = 0;
4419 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4420 OR LATENCY CALLBACK.
4422 This is called (early) from the latency callback. It computes the REAL
4423 latency associated with each port and stores the result as the "private"
4424 latency of the port. A later call to Route::set_public_port_latencies()
4425 sets all ports to the same value to reflect the fact that we do latency
4426 compensation and so all signals are delayed by the same amount as they
4427 flow through ardour.
4430 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4431 if ((*i)->active ()) {
4432 own_latency += (*i)->signal_latency ();
4437 /* playback: propagate latency from "outside the route" to outputs to inputs */
4438 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4440 /* capture: propagate latency from "outside the route" to inputs to outputs */
4441 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4446 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4448 /* this is called to set the JACK-visible port latencies, which take
4449 latency compensation into account.
4458 const PortSet& ports (_input->ports());
4459 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4460 p->set_public_latency_range (range, playback);
4465 const PortSet& ports (_output->ports());
4466 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4467 p->set_public_latency_range (range, playback);
4472 /** Put the invisible processors in the right place in _processors.
4473 * Must be called with a writer lock on _processor_lock held.
4476 __attribute__((annotate("realtime")))
4479 Route::setup_invisible_processors ()
4482 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4483 assert (!lm.locked ());
4487 /* too early to be doing this stuff */
4491 /* we'll build this new list here and then use it
4493 * TODO put the ProcessorList is on the stack for RT-safety.
4496 ProcessorList new_processors;
4498 /* find visible processors */
4500 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4501 if ((*i)->display_to_user ()) {
4502 new_processors.push_back (*i);
4508 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4510 if (amp == new_processors.end ()) {
4511 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4512 new_processors.push_front (_amp);
4513 amp = find (new_processors.begin(), new_processors.end(), _amp);
4516 /* and the processor after the amp */
4518 ProcessorList::iterator after_amp = amp;
4524 switch (_meter_point) {
4526 assert (!_meter->display_to_user ());
4527 new_processors.push_front (_meter);
4530 assert (!_meter->display_to_user ());
4531 new_processors.insert (amp, _meter);
4533 case MeterPostFader:
4534 /* do nothing here */
4537 /* do nothing here */
4540 /* the meter is visible, so we don't touch it here */
4547 assert (_main_outs);
4548 assert (!_main_outs->display_to_user ());
4549 new_processors.push_back (_main_outs);
4551 /* iterator for the main outs */
4553 ProcessorList::iterator main = new_processors.end();
4556 /* OUTPUT METERING */
4558 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4559 assert (!_meter->display_to_user ());
4561 /* add the processor just before or just after the main outs */
4563 ProcessorList::iterator meter_point = main;
4565 if (_meter_point == MeterOutput) {
4568 new_processors.insert (meter_point, _meter);
4573 if (_monitor_send && !is_monitor ()) {
4574 assert (!_monitor_send->display_to_user ());
4575 switch (Config->get_listen_position ()) {
4576 case PreFaderListen:
4577 switch (Config->get_pfl_position ()) {
4578 case PFLFromBeforeProcessors:
4579 new_processors.push_front (_monitor_send);
4581 case PFLFromAfterProcessors:
4582 new_processors.insert (amp, _monitor_send);
4585 _monitor_send->set_can_pan (false);
4587 case AfterFaderListen:
4588 switch (Config->get_afl_position ()) {
4589 case AFLFromBeforeProcessors:
4590 new_processors.insert (after_amp, _monitor_send);
4592 case AFLFromAfterProcessors:
4593 new_processors.insert (new_processors.end(), _monitor_send);
4596 _monitor_send->set_can_pan (true);
4601 #if 0 // not used - just yet
4602 if (!is_master() && !is_monitor() && !is_auditioner()) {
4603 new_processors.push_front (_delayline);
4607 /* MONITOR CONTROL */
4609 if (_monitor_control && is_monitor ()) {
4610 assert (!_monitor_control->display_to_user ());
4611 new_processors.insert (amp, _monitor_control);
4616 if (_trim && _trim->active()) {
4617 assert (!_trim->display_to_user ());
4618 new_processors.push_front (_trim);
4621 /* INTERNAL RETURN */
4623 /* doing this here means that any monitor control will come after
4624 the return and trim.
4628 assert (!_intreturn->display_to_user ());
4629 new_processors.push_front (_intreturn);
4632 /* EXPORT PROCESSOR */
4634 if (_capturing_processor) {
4635 assert (!_capturing_processor->display_to_user ());
4636 new_processors.push_front (_capturing_processor);
4639 _processors = new_processors;
4641 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4642 if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
4643 (*i)->enable (true);
4647 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4648 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4649 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4656 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4657 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4661 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4662 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4669 /** If the meter point is `Custom', make a note of where the meter is.
4670 * This is so that if the meter point is subsequently set to something else,
4671 * and then back to custom, we can put the meter back where it was last time
4672 * custom was enabled.
4674 * Must be called with the _processor_lock held.
4677 Route::maybe_note_meter_position ()
4679 if (_meter_point != MeterCustom) {
4683 _custom_meter_position_noted = true;
4684 /* custom meter points range from after trim to before panner/main_outs
4685 * this is a limitation by the current processor UI
4687 bool seen_trim = false;
4688 _processor_after_last_custom_meter.reset();
4689 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4690 if ((*i) == _trim) {
4693 if ((*i) == _main_outs) {
4694 _processor_after_last_custom_meter = *i;
4697 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4699 _processor_after_last_custom_meter = _trim;
4701 ProcessorList::iterator j = i;
4703 assert(j != _processors.end ()); // main_outs should be before
4704 _processor_after_last_custom_meter = *j;
4709 assert(_processor_after_last_custom_meter.lock());
4712 boost::shared_ptr<Processor>
4713 Route::processor_by_id (PBD::ID id) const
4715 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4716 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4717 if ((*i)->id() == id) {
4722 return boost::shared_ptr<Processor> ();
4725 /** @return the monitoring state, or in other words what data we are pushing
4726 * into the route (data from the inputs, data from disk or silence)
4729 Route::monitoring_state () const
4731 return MonitoringInput;
4734 /** @return what we should be metering; either the data coming from the input
4735 * IO or the data that is flowing through the route.
4738 Route::metering_state () const
4740 return MeteringRoute;
4744 Route::has_external_redirects () const
4746 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4748 /* ignore inactive processors and obviously ignore the main
4749 * outs since everything has them and we don't care.
4752 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4760 boost::shared_ptr<Processor>
4761 Route::the_instrument () const
4763 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4764 return the_instrument_unlocked ();
4767 boost::shared_ptr<Processor>
4768 Route::the_instrument_unlocked () const
4770 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4771 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4772 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4776 return boost::shared_ptr<Processor>();
4782 Route::non_realtime_locate (framepos_t pos)
4784 Automatable::non_realtime_locate (pos);
4787 _pannable->non_realtime_locate (pos);
4790 if (_delayline.get()) {
4791 _delayline.get()->flush();
4795 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4796 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4798 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4799 (*i)->non_realtime_locate (pos);
4802 _roll_delay = _initial_delay;
4806 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4813 * We don't currently mix MIDI input together, so we don't need the
4814 * complex logic of the audio case.
4817 n_buffers = bufs.count().n_midi ();
4819 for (i = 0; i < n_buffers; ++i) {
4821 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4822 MidiBuffer& buf (bufs.get_midi (i));
4825 buf.copy (source_port->get_midi_buffer(nframes));
4827 buf.silence (nframes);
4833 n_buffers = bufs.count().n_audio();
4835 size_t n_ports = io->n_ports().n_audio();
4836 float scaling = 1.0f;
4838 if (n_ports > n_buffers) {
4839 scaling = ((float) n_buffers) / n_ports;
4842 for (i = 0; i < n_ports; ++i) {
4844 /* if there are more ports than buffers, map them onto buffers
4845 * in a round-robin fashion
4848 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4849 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4852 if (i < n_buffers) {
4854 /* first time through just copy a channel into
4858 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4860 if (scaling != 1.0f) {
4861 buf.apply_gain (scaling, nframes);
4866 /* on subsequent times around, merge data from
4867 * the port with what is already there
4870 if (scaling != 1.0f) {
4871 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4873 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4878 /* silence any remaining buffers */
4880 for (; i < n_buffers; ++i) {
4881 AudioBuffer& buf (bufs.get_audio (i));
4882 buf.silence (nframes);
4885 /* establish the initial setup of the buffer set, reflecting what was
4886 copied into it. unless, of course, we are the auditioner, in which
4887 case nothing was fed into it from the inputs at all.
4890 if (!is_auditioner()) {
4891 bufs.set_count (io->n_ports());
4895 boost::shared_ptr<AutomationControl>
4896 Route::pan_azimuth_control() const
4899 # undef MIXBUS_PORTS_H
4900 # include "../../gtk2_ardour/mixbus_ports.h"
4901 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4903 return boost::shared_ptr<AutomationControl>();
4905 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4907 if (!_pannable || !panner()) {
4908 return boost::shared_ptr<AutomationControl>();
4910 return _pannable->pan_azimuth_control;
4914 boost::shared_ptr<AutomationControl>
4915 Route::pan_elevation_control() const
4917 if (Profile->get_mixbus() || !_pannable || !panner()) {
4918 return boost::shared_ptr<AutomationControl>();
4921 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4923 if (c.find (PanElevationAutomation) != c.end()) {
4924 return _pannable->pan_elevation_control;
4926 return boost::shared_ptr<AutomationControl>();
4929 boost::shared_ptr<AutomationControl>
4930 Route::pan_width_control() const
4933 if (mixbus() && _ch_pre) {
4935 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(_ch_pre->control(Evoral::Parameter(PluginAutomation, 0, 5)));
4938 if (Profile->get_mixbus() || !_pannable || !panner()) {
4939 return boost::shared_ptr<AutomationControl>();
4942 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4944 if (c.find (PanWidthAutomation) != c.end()) {
4945 return _pannable->pan_width_control;
4947 return boost::shared_ptr<AutomationControl>();
4950 boost::shared_ptr<AutomationControl>
4951 Route::pan_frontback_control() const
4953 if (Profile->get_mixbus() || !_pannable || !panner()) {
4954 return boost::shared_ptr<AutomationControl>();
4957 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4959 if (c.find (PanFrontBackAutomation) != c.end()) {
4960 return _pannable->pan_frontback_control;
4962 return boost::shared_ptr<AutomationControl>();
4965 boost::shared_ptr<AutomationControl>
4966 Route::pan_lfe_control() const
4968 if (Profile->get_mixbus() || !_pannable || !panner()) {
4969 return boost::shared_ptr<AutomationControl>();
4972 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4974 if (c.find (PanLFEAutomation) != c.end()) {
4975 return _pannable->pan_lfe_control;
4977 return boost::shared_ptr<AutomationControl>();
4982 Route::eq_band_cnt () const
4984 if (Profile->get_mixbus()) {
4986 if (is_master() || mixbus()) {
4995 /* Ardour has no well-known EQ object */
5000 boost::shared_ptr<AutomationControl>
5001 Route::eq_gain_controllable (uint32_t band) const
5004 boost::shared_ptr<PluginInsert> eq = ch_eq();
5007 return boost::shared_ptr<AutomationControl>();
5010 uint32_t port_number;
5011 if (is_master() || mixbus()) {
5013 case 0: port_number = 4; break;
5014 case 1: port_number = 3; break;
5015 case 2: port_number = 2; break;
5017 return boost::shared_ptr<AutomationControl>();
5022 case 0: port_number = 14; break;
5023 case 1: port_number = 12; break;
5024 case 2: port_number = 10; break;
5025 case 3: port_number = 8; break;
5027 return boost::shared_ptr<AutomationControl>();
5031 case 0: port_number = 8; break;
5032 case 1: port_number = 6; break;
5033 case 2: port_number = 4; break;
5035 return boost::shared_ptr<AutomationControl>();
5040 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5042 return boost::shared_ptr<AutomationControl>();
5045 boost::shared_ptr<AutomationControl>
5046 Route::eq_freq_controllable (uint32_t band) const
5049 if (mixbus() || is_master()) {
5050 /* no frequency controls for mixbusses or master */
5051 return boost::shared_ptr<AutomationControl>();
5054 boost::shared_ptr<PluginInsert> eq = ch_eq();
5057 return boost::shared_ptr<AutomationControl>();
5060 uint32_t port_number;
5063 case 0: port_number = 13; break; // lo
5064 case 1: port_number = 11; break; // lo mid
5065 case 2: port_number = 9; break; // hi mid
5066 case 3: port_number = 7; break; // hi
5068 return boost::shared_ptr<AutomationControl>();
5072 case 0: port_number = 7; break;
5073 case 1: port_number = 5; break;
5074 case 2: port_number = 3; break;
5076 return boost::shared_ptr<AutomationControl>();
5080 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5082 return boost::shared_ptr<AutomationControl>();
5086 boost::shared_ptr<AutomationControl>
5087 Route::eq_q_controllable (uint32_t band) const
5089 return boost::shared_ptr<AutomationControl>();
5092 boost::shared_ptr<AutomationControl>
5093 Route::eq_shape_controllable (uint32_t band) const
5096 boost::shared_ptr<PluginInsert> eq = ch_eq();
5097 if (is_master() || mixbus() || !eq) {
5098 return boost::shared_ptr<AutomationControl>();
5102 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4))); // lo bell
5105 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3))); // hi bell
5111 return boost::shared_ptr<AutomationControl>();
5114 boost::shared_ptr<AutomationControl>
5115 Route::eq_enable_controllable () const
5118 boost::shared_ptr<PluginInsert> eq = ch_eq();
5121 return boost::shared_ptr<AutomationControl>();
5124 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5126 return boost::shared_ptr<AutomationControl>();
5130 boost::shared_ptr<AutomationControl>
5131 Route::filter_freq_controllable (bool hpf) const
5134 boost::shared_ptr<PluginInsert> eq = ch_eq();
5136 if (is_master() || mixbus() || !eq) {
5137 return boost::shared_ptr<AutomationControl>();
5141 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5))); // HPF freq
5143 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5147 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6))); // LPF freq
5149 return boost::shared_ptr<AutomationControl>();
5154 return boost::shared_ptr<AutomationControl>();
5158 boost::shared_ptr<AutomationControl>
5159 Route::filter_slope_controllable (bool) const
5161 return boost::shared_ptr<AutomationControl>();
5164 boost::shared_ptr<AutomationControl>
5165 Route::filter_enable_controllable (bool) const
5168 boost::shared_ptr<PluginInsert> eq = ch_eq();
5170 if (is_master() || mixbus() || !eq) {
5171 return boost::shared_ptr<AutomationControl>();
5174 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5176 return boost::shared_ptr<AutomationControl>();
5181 Route::eq_band_name (uint32_t band) const
5184 if (is_master() || mixbus()) {
5186 if (Profile->get_mixbus()) {
5188 case 0: return _("lo");
5189 case 1: return _("mid");
5190 case 2: return _("hi");
5191 default: return string();
5199 case 0: return _("lo");
5200 case 1: return _("lo mid");
5201 case 2: return _("hi mid");
5202 case 3: return _("hi");
5203 default: return string();
5209 boost::shared_ptr<AutomationControl>
5210 Route::comp_enable_controllable () const
5213 boost::shared_ptr<PluginInsert> comp = ch_comp();
5216 return boost::shared_ptr<AutomationControl>();
5219 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5221 return boost::shared_ptr<AutomationControl>();
5224 boost::shared_ptr<AutomationControl>
5225 Route::comp_threshold_controllable () const
5228 boost::shared_ptr<PluginInsert> comp = ch_comp();
5231 return boost::shared_ptr<AutomationControl>();
5234 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5237 return boost::shared_ptr<AutomationControl>();
5240 boost::shared_ptr<AutomationControl>
5241 Route::comp_speed_controllable () const
5244 boost::shared_ptr<PluginInsert> comp = ch_comp();
5247 return boost::shared_ptr<AutomationControl>();
5250 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5252 return boost::shared_ptr<AutomationControl>();
5255 boost::shared_ptr<AutomationControl>
5256 Route::comp_mode_controllable () const
5259 boost::shared_ptr<PluginInsert> comp = ch_comp();
5262 return boost::shared_ptr<AutomationControl>();
5265 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5267 return boost::shared_ptr<AutomationControl>();
5270 boost::shared_ptr<AutomationControl>
5271 Route::comp_makeup_controllable () const
5274 boost::shared_ptr<PluginInsert> comp = ch_comp();
5277 return boost::shared_ptr<AutomationControl>();
5280 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5282 return boost::shared_ptr<AutomationControl>();
5285 boost::shared_ptr<ReadOnlyControl>
5286 Route::comp_redux_controllable () const
5289 boost::shared_ptr<PluginInsert> comp = ch_comp();
5292 return boost::shared_ptr<ReadOnlyControl>();
5295 return comp->control_output (2);
5297 return comp->control_output (6);
5301 return boost::shared_ptr<ReadOnlyControl>();
5306 Route::comp_mode_name (uint32_t mode) const
5311 return _("Leveler");
5313 return _("Compressor");
5315 return _("Limiter");
5317 return mixbus() ? _("Sidechain") : _("Limiter");
5327 Route::comp_speed_name (uint32_t mode) const
5345 boost::shared_ptr<AutomationControl>
5346 Route::send_level_controllable (uint32_t n) const
5349 # undef MIXBUS_PORTS_H
5350 # include "../../gtk2_ardour/mixbus_ports.h"
5351 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5352 if (plug && !mixbus()) {
5353 uint32_t port_id = 0;
5355 case 0: port_id = port_channel_post_aux1_level; break;
5356 case 1: port_id = port_channel_post_aux2_level; break;
5357 case 2: port_id = port_channel_post_aux3_level; break;
5358 case 3: port_id = port_channel_post_aux4_level; break;
5359 case 4: port_id = port_channel_post_aux5_level; break;
5360 case 5: port_id = port_channel_post_aux6_level; break;
5361 case 6: port_id = port_channel_post_aux7_level; break;
5362 case 7: port_id = port_channel_post_aux8_level; break;
5364 case 8: port_id = port_channel_post_aux9_level; break;
5365 case 9: port_id = port_channel_post_aux10_level; break;
5366 case 10: port_id = port_channel_post_aux11_level; break;
5367 case 11: port_id = port_channel_post_aux12_level; break;
5374 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5385 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5387 return boost::shared_ptr<AutomationControl>();
5389 return s->gain_control ();
5392 boost::shared_ptr<AutomationControl>
5393 Route::send_enable_controllable (uint32_t n) const
5396 # undef MIXBUS_PORTS_H
5397 # include "../../gtk2_ardour/mixbus_ports.h"
5398 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5399 if (plug && !mixbus()) {
5400 uint32_t port_id = 0;
5402 case 0: port_id = port_channel_post_aux1_asgn; break;
5403 case 1: port_id = port_channel_post_aux2_asgn; break;
5404 case 2: port_id = port_channel_post_aux3_asgn; break;
5405 case 3: port_id = port_channel_post_aux4_asgn; break;
5406 case 4: port_id = port_channel_post_aux5_asgn; break;
5407 case 5: port_id = port_channel_post_aux6_asgn; break;
5408 case 6: port_id = port_channel_post_aux7_asgn; break;
5409 case 7: port_id = port_channel_post_aux8_asgn; break;
5411 case 8: port_id = port_channel_post_aux9_asgn; break;
5412 case 9: port_id = port_channel_post_aux10_asgn; break;
5413 case 10: port_id = port_channel_post_aux11_asgn; break;
5414 case 11: port_id = port_channel_post_aux12_asgn; break;
5421 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5432 /* although Ardour sends have enable/disable as part of the Processor
5433 * API, it is not exposed as a controllable.
5435 * XXX: we should fix this (make it click-free, automatable enable-control)
5437 return boost::shared_ptr<AutomationControl>();
5441 Route::send_name (uint32_t n) const
5444 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5445 if (plug && !mixbus()) {
5448 return _session.get_mixbus (n)->name();
5453 return _session.get_mixbus (n)->name();
5459 boost::shared_ptr<Processor> p = nth_send (n);
5467 boost::shared_ptr<AutomationControl>
5468 Route::master_send_enable_controllable () const
5471 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5473 return boost::shared_ptr<AutomationControl>();
5475 # undef MIXBUS_PORTS_H
5476 # include "../../gtk2_ardour/mixbus_ports.h"
5477 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5479 return boost::shared_ptr<AutomationControl>();
5484 Route::slaved () const
5486 if (!_gain_control) {
5489 /* just test one particular control, not all of them */
5490 return _gain_control->slaved ();
5494 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5496 if (!vca || !_gain_control) {
5500 /* just test one particular control, not all of them */
5502 return _gain_control->slaved_to (vca->gain_control());
5506 Route::muted_by_others_soloing () const
5508 if (!can_be_muted_by_others ()) {
5512 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5516 Route::clear_all_solo_state ()
5518 _solo_control->clear_all_solo_state ();
5521 boost::shared_ptr<AutomationControl>
5522 Route::automation_control_recurse (PBD::ID const & id) const
5524 boost::shared_ptr<AutomationControl> ac = Automatable::automation_control (id);
5530 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
5532 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
5533 if ((ac = (*i)->automation_control (id))) {
5538 return boost::shared_ptr<AutomationControl> ();
5542 Route::slavables () const
5544 SlavableControlList rv;
5545 rv.push_back (_gain_control);
5546 rv.push_back (_mute_control);
5547 rv.push_back (_solo_control);