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)
119 processor_max_streams.reset();
122 boost::weak_ptr<Route>
123 Route::weakroute () {
124 return boost::weak_ptr<Route> (boost::dynamic_pointer_cast<Route> (shared_from_this ()));
130 /* set default meter type */
132 _meter_type = Config->get_meter_type_master ();
134 else if (dynamic_cast<Track*>(this)) {
135 _meter_type = Config->get_meter_type_track ();
137 _meter_type = Config->get_meter_type_bus ();
140 /* add standard controls */
142 _gain_control.reset (new GainControl (_session, GainAutomation));
143 _trim_control.reset (new GainControl (_session, TrimAutomation));
144 /* While the route has-a gain-control for consistency with Stripable and VCA
145 * ownership is handed over to the Amp Processor which manages the
146 * state of the Control and AutomationList as part of its
147 * Automatable API. -- Don't call add_control () here.
150 _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
151 add_control (_solo_control);
152 _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
154 _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
155 add_control (_mute_control);
157 _phase_control.reset (new PhaseControl (_session, X_("phase")));
158 add_control (_phase_control);
160 _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
161 add_control (_solo_isolate_control);
163 _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
164 add_control (_solo_safe_control);
168 if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
169 _pannable.reset (new Pannable (_session));
172 /* input and output objects */
174 _input.reset (new IO (_session, _name, IO::Input, _default_type));
175 _output.reset (new IO (_session, _name, IO::Output, _default_type));
177 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
178 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
180 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
181 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
183 /* add the amp/fader processor.
184 * it should be the first processor to be added on every route.
187 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
188 add_processor (_amp, PostFader);
191 _amp->set_display_name (_("Monitor"));
194 #if 0 // not used - just yet
195 if (!is_master() && !is_monitor() && !is_auditioner()) {
196 _delayline.reset (new DelayLine (_session, _name));
197 add_processor (_delayline, PreFader);
203 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
204 _trim->set_display_to_user (false);
206 if (dynamic_cast<AudioTrack*>(this)) {
207 /* we can't do this in the AudioTrack's constructor
208 * because _trim does not exit then
212 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
217 /* create standard processors: meter, main outs, monitor out;
218 they will be added to _processors by setup_invisible_processors ()
221 _meter.reset (new PeakMeter (_session, _name));
222 _meter->set_owner (this);
223 _meter->set_display_to_user (false);
226 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
227 _main_outs->activate ();
230 /* where we listen to tracks */
231 _intreturn.reset (new InternalReturn (_session));
232 _intreturn->activate ();
234 /* the thing that provides proper control over a control/monitor/listen bus
235 (such as per-channel cut, dim, solo, invert, etc).
237 _monitor_control.reset (new MonitorProcessor (_session));
238 _monitor_control->activate ();
241 /* now that we have _meter, its safe to connect to this */
244 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
245 configure_processors (0);
253 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
255 /* do this early so that we don't get incoming signals as we are going through destruction
260 /* don't use clear_processors here, as it depends on the session which may
261 be half-destroyed by now
264 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
265 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
266 (*i)->drop_references ();
269 _processors.clear ();
273 Route::ensure_track_or_route_name(string name, Session &session)
275 string newname = name;
277 while (!session.io_name_is_legal (newname)) {
278 newname = bump_name_once (newname, ' ');
285 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
287 // TODO route group, see set_gain()
288 // _trim_control->route_set_value (val);
292 Route::maybe_declick (BufferSet&, framecnt_t, int)
294 /* this is the "bus" implementation and they never declick.
299 /** Process this route for one (sub) cycle (process thread)
301 * @param bufs Scratch buffers to use for the signal path
302 * @param start_frame Initial transport frame
303 * @param end_frame Final transport frame
304 * @param nframes Number of frames to output (to ports)
306 * Note that (end_frame - start_frame) may not be equal to nframes when the
307 * transport speed isn't 1.0 (eg varispeed).
310 Route::process_output_buffers (BufferSet& bufs,
311 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
312 int declick, bool gain_automation_ok)
314 /* Caller must hold process lock */
315 assert (!AudioEngine::instance()->process_lock().trylock());
317 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
319 // can this actually happen? functions calling process_output_buffers()
320 // already take a reader-lock.
321 bufs.silence (nframes, 0);
325 automation_run (start_frame, nframes);
327 /* figure out if we're going to use gain automation */
328 if (gain_automation_ok) {
329 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
330 _amp->setup_gain_automation (
331 start_frame + _signal_latency_at_amp_position,
332 end_frame + _signal_latency_at_amp_position,
335 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
336 _trim->setup_gain_automation (
337 start_frame + _signal_latency_at_trim_position,
338 end_frame + _signal_latency_at_trim_position,
341 _amp->apply_gain_automation (false);
342 _trim->apply_gain_automation (false);
345 /* Tell main outs what to do about monitoring. We do this so that
346 on a transition between monitoring states we get a de-clicking gain
347 change in the _main_outs delivery, if config.get_use_monitor_fades()
350 We override this in the case where we have an internal generator.
352 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
354 _main_outs->no_outs_cuz_we_no_monitor (silence);
356 /* -------------------------------------------------------------------------------------------
357 GLOBAL DECLICK (for transport changes etc.)
358 ----------------------------------------------------------------------------------------- */
360 maybe_declick (bufs, nframes, declick);
361 _pending_declick = 0;
363 /* -------------------------------------------------------------------------------------------
364 DENORMAL CONTROL/PHASE INVERT
365 ----------------------------------------------------------------------------------------- */
367 if (!_phase_control->none()) {
371 if (_denormal_protection || Config->get_denormal_protection()) {
373 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
374 Sample* const sp = i->data();
376 if (_phase_control->inverted (chn)) {
377 for (pframes_t nx = 0; nx < nframes; ++nx) {
382 for (pframes_t nx = 0; nx < nframes; ++nx) {
390 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
391 Sample* const sp = i->data();
393 if (_phase_control->inverted (chn)) {
394 for (pframes_t nx = 0; nx < nframes; ++nx) {
403 if (_denormal_protection || Config->get_denormal_protection()) {
405 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
406 Sample* const sp = i->data();
407 for (pframes_t nx = 0; nx < nframes; ++nx) {
415 /* -------------------------------------------------------------------------------------------
417 ----------------------------------------------------------------------------------------- */
419 /* set this to be true if the meter will already have been ::run() earlier */
420 bool const meter_already_run = metering_state() == MeteringInput;
422 framecnt_t latency = 0;
423 const double speed = _session.transport_speed ();
425 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
427 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
428 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
433 /* if it has any inputs, make sure they match */
434 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
435 if (bufs.count() != (*i)->input_streams()) {
437 DEBUG::Processors, string_compose (
438 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
439 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
446 /* should we NOT run plugins here if the route is inactive?
447 do we catch route != active somewhere higher?
450 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
451 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
453 if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
454 const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
455 boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
456 _initial_delay + latency, longest_session_latency - latency);
459 (*i)->run (bufs, start_frame - latency, end_frame - latency, speed, nframes, *i != _processors.back());
460 bufs.set_count ((*i)->output_streams());
462 if ((*i)->active ()) {
463 latency += (*i)->signal_latency ();
469 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
470 boost::shared_ptr<Processor> endpoint,
471 bool include_endpoint, bool for_export, bool for_freeze)
473 /* If no processing is required, there's no need to go any further. */
474 if (!endpoint && !include_endpoint) {
478 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
479 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
480 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
482 /* trim is always at the top, for bounce no latency compensation is needed */
483 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
484 _trim->setup_gain_automation (start, start + nframes, nframes);
487 const double speed = _session.transport_speed ();
488 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
490 if (!include_endpoint && (*i) == endpoint) {
494 /* if we're *not* exporting, stop processing if we come across a routing processor. */
495 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
498 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
502 /* special case the panner (export outputs)
503 * Ideally we'd only run the panner, not the delivery itself...
504 * but panners need separate input/output buffers and some context
505 * (panshell, panner type, etc). AFAICT there is no ill side effect
506 * of re-using the main delivery when freewheeling/exporting a region.
508 if ((*i) == _main_outs) {
509 assert ((*i)->does_routing());
510 (*i)->run (buffers, start - latency, start - latency + nframes, speed, nframes, true);
511 buffers.set_count ((*i)->output_streams());
514 /* don't run any processors that do routing.
515 * Also don't bother with metering.
517 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
518 (*i)->run (buffers, start - latency, start - latency + nframes, 1.0, nframes, true);
519 buffers.set_count ((*i)->output_streams());
520 latency += (*i)->signal_latency ();
523 if ((*i) == endpoint) {
530 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
531 bool include_endpoint, bool for_export, bool for_freeze) const
533 framecnt_t latency = 0;
534 if (!endpoint && !include_endpoint) {
538 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
539 if (!include_endpoint && (*i) == endpoint) {
542 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
545 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
548 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
549 latency += (*i)->signal_latency ();
551 if ((*i) == endpoint) {
559 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
560 bool include_endpoint, bool for_export, bool for_freeze) const
562 if (!endpoint && !include_endpoint) {
566 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
567 if (!include_endpoint && (*i) == endpoint) {
570 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
573 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
576 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
577 cc = (*i)->output_streams();
579 if ((*i) == endpoint) {
587 Route::n_process_buffers ()
589 return max (_input->n_ports(), processor_max_streams);
593 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
595 assert (is_monitor());
596 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
597 fill_buffers_with_input (bufs, _input, nframes);
598 passthru (bufs, start_frame, end_frame, nframes, declick);
602 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
606 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
608 /* control/monitor bus ignores input ports when something is
609 feeding the listen "stream". data will "arrive" into the
610 route from the intreturn processor element.
613 bufs.silence (nframes, 0);
616 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
617 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
621 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
623 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
625 bufs.set_count (_input->n_ports());
626 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
627 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
631 Route::set_listen (bool yn)
634 if (_monitor_send->active() == yn) {
638 _monitor_send->activate ();
640 _monitor_send->deactivate ();
646 Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
648 /* nothing to do if we're not using AFL/PFL. But if we are, we need
649 to alter the active state of the monitor send.
652 if (Config->get_solo_control_is_listen_control ()) {
653 set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
658 Route::push_solo_isolate_upstream (int32_t delta)
660 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
662 boost::shared_ptr<RouteList> routes = _session.get_routes ();
663 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
665 if ((*i).get() == this || !(*i)->can_solo()) {
670 bool does_feed = feeds (*i, &sends_only);
672 if (does_feed && !sends_only) {
673 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
679 Route::push_solo_upstream (int delta)
681 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
682 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
686 boost::shared_ptr<Route> sr (i->r.lock());
688 sr->solo_control()->mod_solo_by_others_downstream (-delta);
695 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
697 cerr << name << " {" << endl;
698 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
699 p != procs.end(); ++p) {
700 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
706 /** Supposing that we want to insert a Processor at a given Placement, return
707 * the processor to add the new one before (or 0 to add at the end).
709 boost::shared_ptr<Processor>
710 Route::before_processor_for_placement (Placement p)
712 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
714 ProcessorList::iterator loc;
717 /* generic pre-fader: insert immediately before the amp */
718 loc = find (_processors.begin(), _processors.end(), _amp);
720 /* generic post-fader: insert right before the main outs */
721 loc = find (_processors.begin(), _processors.end(), _main_outs);
724 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
727 /** Supposing that we want to insert a Processor at a given index, return
728 * the processor to add the new one before (or 0 to add at the end).
730 boost::shared_ptr<Processor>
731 Route::before_processor_for_index (int index)
734 return boost::shared_ptr<Processor> ();
737 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
739 ProcessorList::iterator i = _processors.begin ();
741 while (i != _processors.end() && j < index) {
742 if ((*i)->display_to_user()) {
749 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
752 /** Add a processor either pre- or post-fader
753 * @return 0 on success, non-0 on failure.
756 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
758 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
762 /** Add a processor to a route such that it ends up with a given index into the visible processors.
763 * @param index Index to add the processor at, or -1 to add at the end of the list.
764 * @return 0 on success, non-0 on failure.
767 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
769 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
772 /** Add a processor to the route.
773 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
774 * @return 0 on success, non-0 on failure.
777 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
779 assert (processor != _meter);
780 assert (processor != _main_outs);
782 DEBUG_TRACE (DEBUG::Processors, string_compose (
783 "%1 adding processor %2\n", name(), processor->name()));
787 pl.push_back (processor);
788 int rv = add_processors (pl, before, err);
794 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
795 processor->activate ();
802 Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
804 /* We cannot destruct the processor here (usually RT-thread
805 * with various locks held - in case of sends also io_locks).
806 * Queue for deletion in low-priority thread.
808 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
809 selfdestruct_sequence.push_back (wp);
813 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
815 XMLProperty const * prop;
818 boost::shared_ptr<Processor> processor;
820 /* bit of a hack: get the `placement' property from the <Redirect> tag here
821 so that we can add the processor in the right place (pre/post-fader)
824 XMLNodeList const & children = node.children ();
825 XMLNodeList::const_iterator i = children.begin ();
827 while (i != children.end() && (*i)->name() != X_("Redirect")) {
831 Placement placement = PreFader;
833 if (i != children.end()) {
834 if ((prop = (*i)->property (X_("placement"))) != 0) {
835 placement = Placement (string_2_enum (prop->value(), placement));
839 if (node.name() == "Insert") {
841 if ((prop = node.property ("type")) != 0) {
843 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
844 prop->value() == "lv2" ||
845 prop->value() == "windows-vst" ||
846 prop->value() == "mac-vst" ||
847 prop->value() == "lxvst" ||
848 prop->value() == "audiounit") {
850 if (_session.get_disable_all_loaded_plugins ()) {
851 processor.reset (new UnknownProcessor (_session, node));
853 processor.reset (new PluginInsert (_session));
854 processor->set_owner (this);
859 processor.reset (new PortInsert (_session, _pannable, _mute_master));
864 } else if (node.name() == "Send") {
866 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
867 processor.reset (new Send (_session, sendpan, _mute_master));
871 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
875 if (processor->set_state (node, version)) {
879 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
880 if (i != children.end()) {
881 if ((prop = (*i)->property (X_("active"))) != 0) {
882 if ( string_to<bool> (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
883 processor->activate();
885 processor->deactivate();
889 return (add_processor (processor, placement, 0, false) == 0);
892 catch (failed_constructor &err) {
893 warning << _("processor could not be created. Ignored.") << endmsg;
899 inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
900 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
903 inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
904 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
908 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
910 ProcessorList::iterator loc;
911 boost::shared_ptr <PluginInsert> fanout;
913 if (g_atomic_int_get (&_pending_process_reorder)) {
914 /* we need to flush any pending re-order changes */
915 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
916 apply_processor_changes_rt ();
920 loc = find(_processors.begin(), _processors.end(), before);
921 if (loc == _processors.end ()) {
925 /* nothing specified - at end */
926 loc = _processors.end ();
929 if (!AudioEngine::instance()->connected()) {
933 if (others.empty()) {
937 ProcessorList to_skip;
939 // check if there's an instrument to replace or configure
940 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
941 boost::shared_ptr<PluginInsert> pi;
942 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
945 if (!pi->plugin ()->get_info ()->is_instrument ()) {
948 boost::shared_ptr<Processor> instrument = the_instrument ();
949 ChanCount in (DataType::MIDI, 1);
950 ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
952 PluginSetupOptions flags = None;
955 in = instrument->input_streams ();
956 out = instrument->output_streams ();
958 if (pi->has_output_presets (in, out)) {
962 pi->set_strict_io (_strict_io);
964 PluginSetupOptions mask = None;
965 if (Config->get_ask_replace_instrument ()) {
968 if (Config->get_ask_setup_instrument ()) {
975 boost::optional<int> rv = PluginSetup (boost::dynamic_pointer_cast<Route>(shared_from_this ()), pi, flags); /* EMIT SIGNAL */
976 int mode = rv.get_value_or (0);
979 to_skip.push_back (*i); // don't add this one;
982 replace_processor (instrument, *i, err);
983 to_skip.push_back (*i);
988 if ((mode & 5) == 4) {
995 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
996 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
997 ProcessorState pstate (this);
999 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1004 ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
1005 if (check != to_skip.end()) {
1009 boost::shared_ptr<PluginInsert> pi;
1011 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1012 pi->set_strict_io (_strict_io);
1016 /* Ensure that only one amp is in the list at any time */
1017 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
1018 if (check != _processors.end()) {
1019 if (before == _amp) {
1020 /* Already in position; all is well */
1023 _processors.erase (check);
1028 assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
1030 _processors.insert (loc, *i);
1031 (*i)->set_owner (this);
1034 if (configure_processors_unlocked (err, &lm)) {
1036 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
1041 if (pi && pi->has_sidechain ()) {
1042 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
1045 if ((*i)->active()) {
1046 // emit ActiveChanged() and latency_changed() if needed
1050 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1052 boost::shared_ptr<Send> send;
1053 if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
1054 send->SelfDestruct.connect_same_thread (*this,
1055 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
1059 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1060 boost::shared_ptr<PluginInsert> pi;
1062 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1063 if (pi->has_no_inputs ()) {
1064 _have_internal_generator = true;
1070 _output->set_user_latency (0);
1073 reset_instrument_info ();
1074 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1075 set_processor_positions ();
1077 if (fanout && fanout->configured ()
1078 && fanout->output_streams().n_audio() > 2
1079 && boost::dynamic_pointer_cast<PluginInsert> (the_instrument ()) == fanout) {
1080 fan_out (); /* EMIT SIGNAL */
1086 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1088 if (p == PreFader) {
1089 start = _processors.begin();
1090 end = find(_processors.begin(), _processors.end(), _amp);
1092 start = find(_processors.begin(), _processors.end(), _amp);
1094 end = _processors.end();
1098 /** Turn off all processors with a given placement
1099 * @param p Placement of processors to disable
1102 Route::disable_processors (Placement p)
1104 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1106 ProcessorList::iterator start, end;
1107 placement_range(p, start, end);
1109 for (ProcessorList::iterator i = start; i != end; ++i) {
1110 (*i)->enable (false);
1113 _session.set_dirty ();
1116 /** Turn off all redirects
1119 Route::disable_processors ()
1121 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1123 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1124 (*i)->enable (false);
1127 _session.set_dirty ();
1130 /** Turn off all redirects with a given placement
1131 * @param p Placement of redirects to disable
1134 Route::disable_plugins (Placement p)
1136 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1138 ProcessorList::iterator start, end;
1139 placement_range(p, start, end);
1141 for (ProcessorList::iterator i = start; i != end; ++i) {
1142 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1143 (*i)->enable (false);
1147 _session.set_dirty ();
1150 /** Turn off all plugins
1153 Route::disable_plugins ()
1155 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1157 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1158 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1159 (*i)->enable (false);
1163 _session.set_dirty ();
1168 Route::ab_plugins (bool forward)
1170 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1174 /* forward = turn off all active redirects, and mark them so that the next time
1175 we go the other way, we will revert them
1178 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1179 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1182 if (!(*i)->display_to_user ()) {
1186 if (boost::dynamic_pointer_cast<PluginInsert> (*i)->is_channelstrip()) {
1191 if ((*i)->enabled ()) {
1192 (*i)->enable (false);
1193 (*i)->set_next_ab_is_active (true);
1195 (*i)->set_next_ab_is_active (false);
1201 /* backward = if the redirect was marked to go active on the next ab, do so */
1203 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1204 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1207 if (!(*i)->display_to_user ()) {
1211 if (boost::dynamic_pointer_cast<PluginInsert> (*i)->is_channelstrip()) {
1216 (*i)->enable ((*i)->get_next_ab_is_active ());
1220 _session.set_dirty ();
1224 /** Remove processors with a given placement.
1225 * @param p Placement of processors to remove.
1228 Route::clear_processors (Placement p)
1230 if (!_session.engine().connected()) {
1234 bool already_deleting = _session.deletion_in_progress();
1235 if (!already_deleting) {
1236 _session.set_deletion_in_progress();
1239 ProcessorList old_list = _processors;
1241 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1242 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1243 ProcessorList new_list;
1244 ProcessorStreams err;
1245 bool seen_amp = false;
1247 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1253 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1255 /* you can't remove these */
1257 new_list.push_back (*i);
1264 new_list.push_back (*i);
1267 (*i)->drop_references ();
1275 (*i)->drop_references ();
1278 new_list.push_back (*i);
1285 _processors = new_list;
1286 configure_processors_unlocked (&err, &lm); // this can't fail
1288 /* drop references w/o process-lock (I/O procs may re-take it in ~IO() */
1291 processor_max_streams.reset();
1292 _have_internal_generator = false;
1293 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1294 set_processor_positions ();
1296 reset_instrument_info ();
1298 if (!already_deleting) {
1299 _session.clear_deletion_in_progress();
1304 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1306 // TODO once the export point can be configured properly, do something smarter here
1307 if (processor == _capturing_processor) {
1308 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1309 if (need_process_lock) {
1313 _capturing_processor.reset();
1315 if (need_process_lock) {
1320 /* these can never be removed */
1322 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1326 if (!_session.engine().connected()) {
1330 processor_max_streams.reset();
1333 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1334 if (need_process_lock) {
1338 /* Caller must hold process lock */
1339 assert (!AudioEngine::instance()->process_lock().trylock());
1341 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1343 ProcessorState pstate (this);
1345 ProcessorList::iterator i;
1346 bool removed = false;
1348 for (i = _processors.begin(); i != _processors.end(); ) {
1349 if (*i == processor) {
1351 /* move along, see failure case for configure_processors()
1352 where we may need to reconfigure the processor.
1355 /* stop redirects that send signals to JACK ports
1356 from causing noise as a result of no longer being
1360 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1361 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
1365 iop = pi->sidechain();
1372 i = _processors.erase (i);
1380 _output->set_user_latency (0);
1388 if (configure_processors_unlocked (err, &lm)) {
1390 /* we know this will work, because it worked before :) */
1391 configure_processors_unlocked (0, &lm);
1395 _have_internal_generator = false;
1397 for (i = _processors.begin(); i != _processors.end(); ++i) {
1398 boost::shared_ptr<PluginInsert> pi;
1400 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1401 if (pi->has_no_inputs ()) {
1402 _have_internal_generator = true;
1407 if (need_process_lock) {
1412 reset_instrument_info ();
1413 processor->drop_references ();
1414 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1415 set_processor_positions ();
1421 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1423 /* these can never be removed */
1424 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1427 /* and can't be used as substitute, either */
1428 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1432 /* I/Os are out, too */
1433 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1437 /* this function cannot be used to swap/reorder processors */
1438 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1442 if (!AudioEngine::instance()->connected() || !old || !sub) {
1446 /* ensure that sub is not owned by another route */
1447 if (sub->owner ()) {
1452 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1453 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1454 ProcessorState pstate (this);
1456 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1458 ProcessorList::iterator i;
1459 bool replaced = false;
1460 bool enable = old->enabled ();
1462 for (i = _processors.begin(); i != _processors.end(); ) {
1464 i = _processors.erase (i);
1465 _processors.insert (i, sub);
1466 sub->set_owner (this);
1479 boost::shared_ptr<PluginInsert> pi;
1480 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1481 pi->set_strict_io (true);
1485 if (configure_processors_unlocked (err, &lm)) {
1487 configure_processors_unlocked (0, &lm);
1491 _have_internal_generator = false;
1493 for (i = _processors.begin(); i != _processors.end(); ++i) {
1494 boost::shared_ptr<PluginInsert> pi;
1495 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1496 if (pi->has_no_inputs ()) {
1497 _have_internal_generator = true;
1507 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1508 _output->set_user_latency (0);
1511 reset_instrument_info ();
1512 old->drop_references ();
1513 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1514 set_processor_positions ();
1519 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1521 ProcessorList deleted;
1523 if (!_session.engine().connected()) {
1527 processor_max_streams.reset();
1530 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1531 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1532 ProcessorState pstate (this);
1534 ProcessorList::iterator i;
1535 boost::shared_ptr<Processor> processor;
1537 for (i = _processors.begin(); i != _processors.end(); ) {
1541 /* these can never be removed */
1543 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1548 /* see if its in the list of processors to delete */
1550 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1555 /* stop IOProcessors that send to JACK ports
1556 from causing noise as a result of no longer being
1560 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
1561 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
1564 iop = pi->sidechain();
1571 deleted.push_back (processor);
1572 i = _processors.erase (i);
1575 if (deleted.empty()) {
1576 /* none of those in the requested list were found */
1580 _output->set_user_latency (0);
1582 if (configure_processors_unlocked (err, &lm)) {
1584 /* we know this will work, because it worked before :) */
1585 configure_processors_unlocked (0, &lm);
1590 _have_internal_generator = false;
1592 for (i = _processors.begin(); i != _processors.end(); ++i) {
1593 boost::shared_ptr<PluginInsert> pi;
1595 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1596 if (pi->has_no_inputs ()) {
1597 _have_internal_generator = true;
1604 /* now try to do what we need to so that those that were removed will be deleted */
1606 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1607 (*i)->drop_references ();
1610 reset_instrument_info ();
1611 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1612 set_processor_positions ();
1618 Route::reset_instrument_info ()
1620 boost::shared_ptr<Processor> instr = the_instrument();
1622 _instrument_info.set_internal_instrument (instr);
1626 /** Caller must hold process lock */
1628 Route::configure_processors (ProcessorStreams* err)
1630 #ifndef PLATFORM_WINDOWS
1631 assert (!AudioEngine::instance()->process_lock().trylock());
1634 if (!_in_configure_processors) {
1635 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1636 return configure_processors_unlocked (err, &lm);
1643 Route::input_streams () const
1645 return _input->n_ports ();
1648 list<pair<ChanCount, ChanCount> >
1649 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1651 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1653 return try_configure_processors_unlocked (in, err);
1656 list<pair<ChanCount, ChanCount> >
1657 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1659 // Check each processor in order to see if we can configure as requested
1661 list<pair<ChanCount, ChanCount> > configuration;
1664 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1665 DEBUG_TRACE (DEBUG::Processors, "{\n");
1667 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1669 if ((*p)->can_support_io_configuration(in, out)) {
1671 if (boost::dynamic_pointer_cast<Delivery> (*p)
1672 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
1674 && (is_monitor() || _strict_io || Profile->get_mixbus ())) {
1675 /* with strict I/O the panner + output are forced to
1676 * follow the last processor's output.
1678 * Delivery::can_support_io_configuration() will only add ports,
1679 * but not remove excess ports.
1681 * This works because the delivery only requires
1682 * as many outputs as there are inputs.
1683 * Delivery::configure_io() will do the actual removal
1684 * by calling _output->ensure_io()
1686 if (!is_master() && _session.master_out () && in.n_audio() > 0) {
1687 /* ..but at least as many as there are master-inputs, if
1688 * the delivery is dealing with audio */
1689 // XXX this may need special-casing for mixbus (master-outputs)
1690 // and should maybe be a preference anyway ?!
1691 out = ChanCount::max (in, _session.master_out ()->n_inputs ());
1697 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1698 configuration.push_back(make_pair(in, out));
1701 // restriction for Monitor Section Processors
1702 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
1703 /* Note: The Monitor follows the master-bus and has no panner.
1705 * The general idea is to only allow plugins that retain the channel-count
1706 * and plugins with MIDI in (e.g VSTs with control that will remain unconnected).
1707 * Then again 5.1 in, monitor stereo is a valid use-case.
1709 * and worse: we only refuse adding plugins *here*.
1711 * 1) stereo-master, stereo-mon, add a stereo-plugin, OK
1712 * 2) change master-bus, add a channel
1713 * 2a) monitor-secion follows
1714 * 3) monitor processors fail to re-reconfigure (stereo plugin)
1715 * 4) re-load session, monitor-processor remains unconfigured, crash.
1717 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration change.\n");
1719 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
1720 // internal sends make no sense, only feedback
1721 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1722 return list<pair<ChanCount, ChanCount> > ();
1724 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
1725 /* External Sends can be problematic. one can add/remove ports
1726 * there signal leaves the DAW to external monitors anyway, so there's
1727 * no real use for allowing them here anyway.
1729 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
1730 return list<pair<ChanCount, ChanCount> > ();
1732 if (boost::dynamic_pointer_cast<Send> (*p)) {
1734 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1735 return list<pair<ChanCount, ChanCount> > ();
1744 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1745 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1746 DEBUG_TRACE (DEBUG::Processors, "}\n");
1747 return list<pair<ChanCount, ChanCount> > ();
1751 DEBUG_TRACE (DEBUG::Processors, "}\n");
1753 return configuration;
1756 /** Set the input/output configuration of each processor in the processors list.
1757 * Caller must hold process lock.
1758 * Return 0 on success, otherwise configuration is impossible.
1761 Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
1763 #ifndef PLATFORM_WINDOWS
1764 assert (!AudioEngine::instance()->process_lock().trylock());
1767 if (_in_configure_processors) {
1771 /* put invisible processors where they should be */
1772 setup_invisible_processors ();
1774 _in_configure_processors = true;
1776 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1778 if (configuration.empty ()) {
1779 _in_configure_processors = false;
1784 bool seen_mains_out = false;
1785 processor_out_streams = _input->n_ports();
1786 processor_max_streams.reset();
1788 /* processor configure_io() may result in adding ports
1789 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
1791 * with jack2 adding ports results in a graph-order callback,
1792 * which calls Session::resort_routes() and eventually
1793 * Route::direct_feeds_according_to_reality()
1794 * which takes a ReaderLock (_processor_lock).
1796 * so we can't hold a WriterLock here until jack2 threading
1799 * NB. we still hold the process lock
1801 * (ardour's own engines do call graph-order from the
1802 * process-thread and hence do not have this issue; besides
1803 * merely adding ports won't trigger a graph-order, only
1804 * making connections does)
1808 // TODO check for a potential ReaderLock after ReaderLock ??
1809 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
1811 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1812 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1814 if (!(*p)->configure_io(c->first, c->second)) {
1815 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1816 _in_configure_processors = false;
1821 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1822 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1824 boost::shared_ptr<IOProcessor> iop;
1825 boost::shared_ptr<PluginInsert> pi;
1826 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1827 /* plugins connected via Split or Hide Match may have more channels.
1828 * route/scratch buffers are needed for all of them
1829 * The configuration may only be a subset (both input and output)
1831 processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
1833 else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
1834 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
1835 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
1839 if (boost::dynamic_pointer_cast<Delivery> (*p)
1840 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1841 /* main delivery will increase port count to match input.
1842 * the Delivery::Main is usually the last processor - followed only by
1845 seen_mains_out = true;
1847 if (!seen_mains_out) {
1848 processor_out_streams = out;
1857 _meter->set_max_channels (processor_max_streams);
1860 /* make sure we have sufficient scratch buffers to cope with the new processor
1863 _session.ensure_buffers (n_process_buffers ());
1865 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1867 _in_configure_processors = false;
1871 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1872 * @param state New active state for those processors.
1875 Route::all_visible_processors_active (bool state)
1877 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1879 if (_processors.empty()) {
1883 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1884 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1888 boost::shared_ptr<PluginInsert> pi;
1889 if (0 != (pi = boost::dynamic_pointer_cast<PluginInsert>(*i))) {
1890 if (pi->is_channelstrip ()) {
1895 (*i)->enable (state);
1898 _session.set_dirty ();
1902 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1904 /* check if re-order requires re-configuration of any processors
1905 * -> compare channel configuration for all processors
1907 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1908 ChanCount c = input_streams ();
1910 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1912 if (c != (*j)->input_streams()) {
1915 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1918 if ((*i)->input_streams() != c) {
1921 c = (*i)->output_streams();
1933 __attribute__((annotate("realtime")))
1936 Route::apply_processor_order (const ProcessorList& new_order)
1938 /* need to hold processor_lock; either read or write lock
1939 * and the engine process_lock.
1940 * Due to r/w lock ambiguity we can only assert the latter
1942 assert (!AudioEngine::instance()->process_lock().trylock());
1945 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1946 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1947 * processors in the current actual processor list that are hidden. Any visible processors
1948 * in the current list but not in "new_order" will be assumed to be deleted.
1951 /* "as_it_will_be" and "_processors" are lists of shared pointers.
1952 * actual memory usage is small, but insert/erase is not actually rt-safe :(
1953 * (note though that ::processors_reorder_needs_configure() ensured that
1954 * this function will only ever be called from the rt-thread if no processor were removed)
1956 * either way, I can't proove it, but an x-run due to re-order here is less likley
1957 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
1960 ProcessorList as_it_will_be;
1961 ProcessorList::iterator oiter;
1962 ProcessorList::const_iterator niter;
1964 oiter = _processors.begin();
1965 niter = new_order.begin();
1967 while (niter != new_order.end()) {
1969 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1970 then append it to the temp list.
1972 Otherwise, see if the next processor in the old list is in the new list. if not,
1973 its been deleted. If its there, append it to the temp list.
1976 if (oiter == _processors.end()) {
1978 /* no more elements in the old list, so just stick the rest of
1979 the new order onto the temp list.
1982 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1983 while (niter != new_order.end()) {
1990 if (!(*oiter)->display_to_user()) {
1992 as_it_will_be.push_back (*oiter);
1996 /* visible processor: check that its in the new order */
1998 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1999 /* deleted: do nothing, shared_ptr<> will clean up */
2001 /* ignore this one, and add the next item from the new order instead */
2002 as_it_will_be.push_back (*niter);
2007 /* now remove from old order - its taken care of no matter what */
2008 oiter = _processors.erase (oiter);
2012 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2014 /* If the meter is in a custom position, find it and make a rough note of its position */
2015 maybe_note_meter_position ();
2019 Route::move_instrument_down (bool postfader)
2021 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2022 ProcessorList new_order;
2023 boost::shared_ptr<Processor> instrument;
2024 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2025 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
2026 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
2028 } else if (instrument && *i == _amp) {
2030 new_order.push_back (*i);
2031 new_order.push_back (instrument);
2033 new_order.push_back (instrument);
2034 new_order.push_back (*i);
2037 new_order.push_back (*i);
2044 reorder_processors (new_order, 0);
2048 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2050 // it a change is already queued, wait for it
2051 // (unless engine is stopped. apply immediately and proceed
2052 while (g_atomic_int_get (&_pending_process_reorder)) {
2053 if (!AudioEngine::instance()->running()) {
2054 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2055 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2057 apply_processor_order(_pending_processor_order);
2058 setup_invisible_processors ();
2060 g_atomic_int_set (&_pending_process_reorder, 0);
2062 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2063 set_processor_positions ();
2065 // TODO rather use a semaphore or something.
2066 // but since ::reorder_processors() is called
2067 // from the GUI thread, this is fine..
2072 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2074 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2075 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2076 ProcessorState pstate (this);
2078 apply_processor_order (new_order);
2080 if (configure_processors_unlocked (err, &lm)) {
2088 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2089 set_processor_positions ();
2092 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2093 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2095 // _pending_processor_order is protected by _processor_lock
2096 _pending_processor_order = new_order;
2097 g_atomic_int_set (&_pending_process_reorder, 1);
2104 Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
2106 boost::shared_ptr<PluginInsert> pi;
2107 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2111 if (pi->has_sidechain () == add) {
2112 return true; // ?? call failed, but result is as expected.
2116 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2117 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2118 if (i == _processors.end ()) {
2124 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
2125 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2126 PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
2128 lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
2130 if (!pi->add_sidechain ()) {
2134 if (!pi->del_sidechain ()) {
2140 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2145 pi->del_sidechain ();
2147 pi->add_sidechain ();
2148 // TODO restore side-chain's state.
2153 configure_processors_unlocked (0, &lm);
2156 if (pi->has_sidechain ()) {
2157 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2160 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2161 _session.set_dirty ();
2166 Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
2168 boost::shared_ptr<PluginInsert> pi;
2169 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2174 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2175 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2176 if (i == _processors.end ()) {
2182 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2183 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2185 const ChanCount& old (pi->preset_out ());
2186 if (!pi->set_preset_out (outs)) {
2187 return true; // no change, OK
2190 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2193 pi->set_preset_out (old);
2196 configure_processors_unlocked (0, &lm);
2199 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2200 _session.set_dirty ();
2205 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2208 return customize_plugin_insert (proc, 0, unused, unused);
2212 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
2214 boost::shared_ptr<PluginInsert> pi;
2215 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2220 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2221 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2222 if (i == _processors.end ()) {
2228 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2229 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2231 bool old_cust = pi->custom_cfg ();
2232 uint32_t old_cnt = pi->get_count ();
2233 ChanCount old_chan = pi->output_streams ();
2234 ChanCount old_sinks = pi->natural_input_streams ();
2237 pi->set_custom_cfg (false);
2239 pi->set_custom_cfg (true);
2240 pi->set_count (count);
2241 pi->set_outputs (outs);
2242 pi->set_sinks (sinks);
2245 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2249 pi->set_count (old_cnt);
2250 pi->set_sinks (old_sinks);
2251 pi->set_outputs (old_chan);
2252 pi->set_custom_cfg (old_cust);
2256 configure_processors_unlocked (0, &lm);
2259 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2260 _session.set_dirty ();
2265 Route::set_strict_io (const bool enable)
2267 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2269 if (_strict_io != enable) {
2270 _strict_io = enable;
2271 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2272 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2273 boost::shared_ptr<PluginInsert> pi;
2274 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2275 pi->set_strict_io (_strict_io);
2279 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2283 _strict_io = !enable; // restore old value
2284 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2285 boost::shared_ptr<PluginInsert> pi;
2286 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2287 pi->set_strict_io (_strict_io);
2294 configure_processors (0);
2297 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2298 _session.set_dirty ();
2310 Route::get_template()
2312 return state(false);
2316 Route::state(bool full_state)
2318 if (!_session._template_state_dir.empty()) {
2319 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2322 XMLNode *node = new XMLNode("Route");
2323 ProcessorList::iterator i;
2325 node->set_property ("id", id ());
2326 node->set_property ("name", name());
2327 node->set_property ("default-type", _default_type);
2328 node->set_property ("strict-io", _strict_io);
2330 node->add_child_nocopy (_presentation_info.get_state());
2332 node->set_property ("active", _active);
2333 node->set_property ("denormal-protection", _denormal_protection);
2334 node->set_property ("meter-point", _meter_point);
2336 node->set_property ("meter-type", _meter_type);
2339 node->set_property ("route-group", _route_group->name());
2342 node->add_child_nocopy (_solo_control->get_state ());
2343 node->add_child_nocopy (_solo_isolate_control->get_state ());
2344 node->add_child_nocopy (_solo_safe_control->get_state ());
2346 node->add_child_nocopy (_input->state (full_state));
2347 node->add_child_nocopy (_output->state (full_state));
2348 node->add_child_nocopy (_mute_master->get_state ());
2350 node->add_child_nocopy (_mute_control->get_state ());
2351 node->add_child_nocopy (_phase_control->get_state ());
2354 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2357 if (_comment.length()) {
2358 XMLNode *cmt = node->add_child ("Comment");
2359 cmt->add_content (_comment);
2363 node->add_child_nocopy (_pannable->state (full_state));
2367 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2368 for (i = _processors.begin(); i != _processors.end(); ++i) {
2370 /* template save: do not include internal sends functioning as
2371 aux sends because the chance of the target ID
2372 in the session where this template is used
2375 similarly, do not save listen sends which connect to
2376 the monitor section, because these will always be
2379 boost::shared_ptr<InternalSend> is;
2381 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2382 if (is->role() == Delivery::Listen) {
2387 node->add_child_nocopy((*i)->state (full_state));
2392 node->add_child_copy (*_extra_xml);
2395 if (_custom_meter_position_noted) {
2396 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2398 node->set_property (X_("processor-after-last-custom-meter"), after->id());
2402 if (!_session._template_state_dir.empty()) {
2403 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2406 node->add_child_copy (Slavable::get_state());
2412 Route::set_state (const XMLNode& node, int version)
2414 if (version < 3000) {
2415 return set_state_2X (node, version);
2419 XMLNodeConstIterator niter;
2422 if (node.name() != "Route"){
2423 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2427 std::string route_name;
2428 if (node.get_property (X_("name"), route_name)) {
2429 Route::set_name (route_name);
2433 _initial_io_setup = true;
2435 Stripable::set_state (node, version);
2437 node.get_property (X_("strict-io"), _strict_io);
2440 /* monitor bus does not get a panner, but if (re)created
2441 via XML, it will already have one by the time we
2442 call ::set_state(). so ... remove it.
2447 /* add all processors (except amp, which is always present) */
2449 nlist = node.children();
2450 XMLNode processor_state (X_("processor_state"));
2452 Stateful::save_extra_xml (node);
2454 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2458 if (child->name() == IO::state_node_name) {
2459 std::string direction;
2460 if (!child->get_property (X_("direction"), direction)) {
2464 if (direction == "Input") {
2465 _input->set_state (*child, version);
2466 } else if (direction == "Output") {
2467 _output->set_state (*child, version);
2470 } else if (child->name() == X_("Processor")) {
2471 processor_state.add_child_copy (*child);
2472 } else if (child->name() == X_("Pannable")) {
2474 _pannable->set_state (*child, version);
2476 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2478 } else if (child->name() == Slavable::xml_node_name) {
2479 Slavable::set_state (*child, version);
2484 if (node.get_property (X_("meter-point"), mp)) {
2485 set_meter_point (mp, true);
2487 _meter->set_display_to_user (_meter_point == MeterCustom);
2491 node.get_property (X_("meter-type"), _meter_type);
2493 _initial_io_setup = false;
2495 set_processor_state (processor_state);
2497 // this looks up the internal instrument in processors
2498 reset_instrument_info();
2500 bool denormal_protection;
2501 if (node.get_property (X_("denormal-protection"), denormal_protection)) {
2502 set_denormal_protection (denormal_protection);
2505 /* convert old 3001 state */
2506 std::string phase_invert_str;
2507 if (node.get_property (X_("phase-invert"), phase_invert_str)) {
2508 _phase_control->set_phase_invert (boost::dynamic_bitset<> (phase_invert_str));
2512 if (node.get_property (X_("active"), is_active)) {
2513 set_active (is_active, this);
2516 std::string id_string;
2517 if (node.get_property (X_("processor-after-last-custom-meter"), id_string)) {
2518 PBD::ID id (id_string);
2519 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2520 ProcessorList::const_iterator i = _processors.begin ();
2521 while (i != _processors.end() && (*i)->id() != id) {
2525 if (i != _processors.end ()) {
2526 _processor_after_last_custom_meter = *i;
2527 _custom_meter_position_noted = true;
2531 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2534 if (child->name() == X_("Comment")) {
2536 /* XXX this is a terrible API design in libxml++ */
2538 XMLNode *cmt = *(child->children().begin());
2539 _comment = cmt->content();
2541 } else if (child->name() == Controllable::xml_node_name) {
2542 std::string control_name;
2543 if (!child->get_property (X_("name"), control_name)) {
2547 if (control_name == _solo_control->name()) {
2548 _solo_control->set_state (*child, version);
2549 } else if (control_name == _solo_safe_control->name()) {
2550 _solo_safe_control->set_state (*child, version);
2551 } else if (control_name == _solo_isolate_control->name()) {
2552 _solo_isolate_control->set_state (*child, version);
2553 } else if (control_name == _mute_control->name()) {
2554 _mute_control->set_state (*child, version);
2555 } else if (control_name == _phase_control->name()) {
2556 _phase_control->set_state (*child, version);
2558 Evoral::Parameter p = EventTypeMap::instance().from_symbol (control_name);
2559 if (p.type () >= MidiCCAutomation && p.type () < MidiSystemExclusiveAutomation) {
2560 boost::shared_ptr<AutomationControl> ac = automation_control (p, true);
2562 ac->set_state (*child, version);
2566 } else if (child->name() == MuteMaster::xml_node_name) {
2567 _mute_master->set_state (*child, version);
2569 } else if (child->name() == Automatable::xml_node_name) {
2570 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2578 Route::set_state_2X (const XMLNode& node, int version)
2582 XMLNodeConstIterator niter;
2584 XMLProperty const * prop;
2586 /* 2X things which still remain to be handled:
2592 if (node.name() != "Route") {
2593 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2597 Stripable::set_state (node, version);
2599 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2600 set_denormal_protection (string_to<bool> (prop->value()));
2603 if ((prop = node.property (X_("muted"))) != 0) {
2606 bool muted = string_to<bool> (prop->value());
2612 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2614 if (string_to<bool> (prop->value())){
2615 mute_point = mute_point + "PreFader";
2620 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2622 if (string_to<bool> (prop->value())){
2625 mute_point = mute_point + ",";
2628 mute_point = mute_point + "PostFader";
2633 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2635 if (string_to<bool> (prop->value())){
2638 mute_point = mute_point + ",";
2641 mute_point = mute_point + "Listen";
2646 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2648 if (string_to<bool> (prop->value())){
2651 mute_point = mute_point + ",";
2654 mute_point = mute_point + "Main";
2658 _mute_master->set_mute_points (mute_point);
2659 _mute_master->set_muted_by_self (true);
2663 if ((prop = node.property (X_("meter-point"))) != 0) {
2664 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2669 nlist = node.children ();
2670 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2674 if (child->name() == IO::state_node_name) {
2676 /* there is a note in IO::set_state_2X() about why we have to call
2680 _input->set_state_2X (*child, version, true);
2681 _output->set_state_2X (*child, version, false);
2683 if ((prop = child->property (X_("name"))) != 0) {
2684 Route::set_name (prop->value ());
2689 if ((prop = child->property (X_("active"))) != 0) {
2690 bool yn = string_to<bool> (prop->value());
2691 _active = !yn; // force switch
2692 set_active (yn, this);
2695 if ((prop = child->property (X_("gain"))) != 0) {
2698 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2699 _amp->gain_control()->set_value (val, Controllable::NoGroup);
2703 /* Set up Panners in the IO */
2704 XMLNodeList io_nlist = child->children ();
2706 XMLNodeConstIterator io_niter;
2709 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2711 io_child = *io_niter;
2713 if (io_child->name() == X_("Panner")) {
2714 _main_outs->panner_shell()->set_state(*io_child, version);
2715 } else if (io_child->name() == X_("Automation")) {
2716 /* IO's automation is for the fader */
2717 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2723 XMLNodeList redirect_nodes;
2725 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2729 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2730 redirect_nodes.push_back(child);
2735 set_processor_state_2X (redirect_nodes, version);
2737 Stateful::save_extra_xml (node);
2739 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2742 if (child->name() == X_("Comment")) {
2744 /* XXX this is a terrible API design in libxml++ */
2746 XMLNode *cmt = *(child->children().begin());
2747 _comment = cmt->content();
2749 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2750 if (prop->value() == X_("solo")) {
2751 _solo_control->set_state (*child, version);
2752 } else if (prop->value() == X_("mute")) {
2753 _mute_control->set_state (*child, version);
2763 Route::get_processor_state ()
2765 XMLNode* root = new XMLNode (X_("redirects"));
2766 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2767 root->add_child_nocopy ((*i)->state (true));
2774 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2776 /* We don't bother removing existing processors not in nList, as this
2777 method will only be called when creating a Route from scratch, not
2778 for undo purposes. Just put processors in at the appropriate place
2782 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2783 add_processor_from_xml_2X (**i, version);
2788 Route::set_processor_state (const XMLNode& node)
2790 const XMLNodeList &nlist = node.children();
2791 XMLNodeConstIterator niter;
2792 ProcessorList new_order;
2793 bool must_configure = false;
2795 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2797 XMLProperty* prop = (*niter)->property ("type");
2799 if (prop->value() == "amp") {
2800 _amp->set_state (**niter, Stateful::current_state_version);
2801 new_order.push_back (_amp);
2802 } else if (prop->value() == "trim") {
2803 _trim->set_state (**niter, Stateful::current_state_version);
2804 new_order.push_back (_trim);
2805 } else if (prop->value() == "meter") {
2806 _meter->set_state (**niter, Stateful::current_state_version);
2807 new_order.push_back (_meter);
2808 } else if (prop->value() == "delay") {
2810 _delayline->set_state (**niter, Stateful::current_state_version);
2811 new_order.push_back (_delayline);
2813 } else if (prop->value() == "main-outs") {
2814 _main_outs->set_state (**niter, Stateful::current_state_version);
2815 } else if (prop->value() == "intreturn") {
2817 _intreturn.reset (new InternalReturn (_session));
2818 must_configure = true;
2820 _intreturn->set_state (**niter, Stateful::current_state_version);
2821 } else if (is_monitor() && prop->value() == "monitor") {
2822 if (!_monitor_control) {
2823 _monitor_control.reset (new MonitorProcessor (_session));
2824 must_configure = true;
2826 _monitor_control->set_state (**niter, Stateful::current_state_version);
2827 } else if (prop->value() == "capture") {
2828 /* CapturingProcessor should never be restored, it's always
2829 added explicitly when needed */
2831 ProcessorList::iterator o;
2833 for (o = _processors.begin(); o != _processors.end(); ++o) {
2834 XMLProperty const * id_prop = (*niter)->property(X_("id"));
2835 if (id_prop && (*o)->id() == id_prop->value()) {
2836 (*o)->set_state (**niter, Stateful::current_state_version);
2837 new_order.push_back (*o);
2842 // If the processor (*niter) is not on the route then create it
2844 if (o == _processors.end()) {
2846 boost::shared_ptr<Processor> processor;
2848 if (prop->value() == "intsend") {
2850 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2852 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2853 prop->value() == "lv2" ||
2854 prop->value() == "windows-vst" ||
2855 prop->value() == "mac-vst" ||
2856 prop->value() == "lxvst" ||
2857 prop->value() == "luaproc" ||
2858 prop->value() == "audiounit") {
2860 if (_session.get_disable_all_loaded_plugins ()) {
2861 processor.reset (new UnknownProcessor (_session, **niter));
2863 processor.reset (new PluginInsert (_session));
2864 processor->set_owner (this);
2866 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
2867 pi->set_strict_io (true);
2871 } else if (prop->value() == "port") {
2873 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2875 } else if (prop->value() == "send") {
2877 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2878 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
2879 send->SelfDestruct.connect_same_thread (*this,
2880 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
2883 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2887 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2888 /* This processor could not be configured. Turn it into a UnknownProcessor */
2889 processor.reset (new UnknownProcessor (_session, **niter));
2892 /* subscribe to Sidechain IO changes */
2893 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
2894 if (pi && pi->has_sidechain ()) {
2895 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2898 /* we have to note the monitor send here, otherwise a new one will be created
2899 and the state of this one will be lost.
2901 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2902 if (isend && isend->role() == Delivery::Listen) {
2903 _monitor_send = isend;
2906 /* it doesn't matter if invisible processors are added here, as they
2907 will be sorted out by setup_invisible_processors () shortly.
2910 new_order.push_back (processor);
2911 must_configure = true;
2916 ProcessorList old_list = _processors; // keep a copy
2918 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2919 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2920 /* re-assign _processors w/o process-lock.
2921 * if there's an IO-processor present in _processors but
2922 * not in new_order, it will be deleted and ~IO takes
2925 _processors = new_order;
2927 if (must_configure) {
2928 configure_processors_unlocked (0, &lm);
2931 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2933 (*i)->set_owner (this);
2934 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2936 boost::shared_ptr<PluginInsert> pi;
2938 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2939 if (pi->has_no_inputs ()) {
2940 _have_internal_generator = true;
2946 /* drop references w/o process-lock (I/O procs may re-take it in ~IO() */
2949 reset_instrument_info ();
2950 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2951 set_processor_positions ();
2955 Route::curve_reallocate ()
2957 // _gain_automation_curve.finish_resize ();
2958 // _pan_automation_curve.finish_resize ();
2962 Route::silence (framecnt_t nframes)
2964 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2969 silence_unlocked (nframes);
2973 Route::silence_unlocked (framecnt_t nframes)
2975 /* Must be called with the processor lock held */
2977 const framepos_t now = _session.transport_frame ();
2981 _output->silence (nframes);
2983 // update owned automated controllables
2984 automation_run (now, nframes);
2986 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2987 boost::shared_ptr<PluginInsert> pi;
2989 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2990 /* evaluate automated automation controls */
2991 pi->automation_run (now, nframes);
2992 /* skip plugins, they don't need anything when we're not active */
2996 (*i)->silence (nframes, now);
2999 if (nframes == _session.get_block_size()) {
3006 Route::add_internal_return ()
3009 _intreturn.reset (new InternalReturn (_session));
3010 add_processor (_intreturn, PreFader);
3015 Route::add_send_to_internal_return (InternalSend* send)
3017 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3019 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3020 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3023 return d->add_send (send);
3029 Route::remove_send_from_internal_return (InternalSend* send)
3031 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3033 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3034 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3037 return d->remove_send (send);
3043 Route::enable_monitor_send ()
3045 /* Caller must hold process lock */
3046 assert (!AudioEngine::instance()->process_lock().trylock());
3048 /* master never sends to monitor section via the normal mechanism */
3049 assert (!is_master ());
3050 assert (!is_monitor ());
3052 /* make sure we have one */
3053 if (!_monitor_send) {
3054 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3055 _monitor_send->set_display_to_user (false);
3059 configure_processors (0);
3062 /** Add an aux send to a route.
3063 * @param route route to send to.
3064 * @param before Processor to insert before, or 0 to insert at the end.
3067 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3069 assert (route != _session.monitor_out ());
3072 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3074 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3076 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3078 if (d && d->target_route() == route) {
3079 /* already listening via the specified IO: do nothing */
3087 boost::shared_ptr<InternalSend> listener;
3090 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3091 listener.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3094 add_processor (listener, before);
3096 } catch (failed_constructor& err) {
3104 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3106 ProcessorStreams err;
3107 ProcessorList::iterator tmp;
3110 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3112 /* have to do this early because otherwise processor reconfig
3113 * will put _monitor_send back in the list
3116 if (route == _session.monitor_out()) {
3117 _monitor_send.reset ();
3121 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3123 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3125 if (d && d->target_route() == route) {
3127 if (remove_processor (*x, &err, false) > 0) {
3133 /* list could have been demolished while we dropped the lock
3136 if (_session.engine().connected()) {
3137 /* i/o processors cannot be removed if the engine is not running
3138 * so don't live-loop in case the engine is N/A or dies
3148 Route::set_comment (string cmt, void *src)
3152 _session.set_dirty ();
3156 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3158 FeedRecord fr (other, via_sends_only);
3160 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3162 if (!result.second) {
3164 /* already a record for "other" - make sure sends-only information is correct */
3165 if (!via_sends_only && result.first->sends_only) {
3166 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3167 frp->sends_only = false;
3171 return result.second;
3175 Route::clear_fed_by ()
3181 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3183 const FedBy& fed_by (other->fed_by());
3185 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3186 boost::shared_ptr<Route> sr = f->r.lock();
3188 if (sr && (sr.get() == this)) {
3190 if (via_sends_only) {
3191 *via_sends_only = f->sends_only;
3202 Route::all_inputs () const
3204 /* TODO, if this works as expected,
3205 * cache the IOVector and maintain it via
3206 * input_change_handler(), sidechain_change_handler() etc
3209 ios.push_back (_input);
3211 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3212 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3214 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3215 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3218 iop = pi->sidechain();
3221 if (iop != 0 && iop->input()) {
3222 ios.push_back (iop->input());
3229 Route::all_outputs () const
3232 // _output is included via Delivery
3233 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3234 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3235 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3236 if (iop != 0 && iop->output()) {
3237 ios.push_back (iop->output());
3244 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3246 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3247 if (other->all_inputs().fed_by (_output)) {
3248 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3249 if (via_send_only) {
3250 *via_send_only = false;
3256 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3258 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3260 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3261 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3264 iop = pi->sidechain();
3268 boost::shared_ptr<const IO> iop_out = iop->output();
3269 if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
3270 // TODO this needs a delaylines in the Insert to align connections (!)
3271 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
3274 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3275 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3276 if (via_send_only) {
3277 *via_send_only = true;
3281 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3284 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3289 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3294 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3296 return _session._current_route_graph.has (boost::dynamic_pointer_cast<Route> (shared_from_this ()), other, via_send_only);
3300 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3302 return _session._current_route_graph.feeds (boost::dynamic_pointer_cast<Route> (shared_from_this ()), other);
3305 /** Called from the (non-realtime) butler thread when the transport is stopped */
3307 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3309 framepos_t now = _session.transport_frame();
3312 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3314 Automatable::transport_stopped (now);
3316 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3318 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3322 (*i)->transport_stopped (now);
3326 _roll_delay = _initial_delay;
3330 Route::input_change_handler (IOChange change, void * /*src*/)
3332 if ((change.type & IOChange::ConfigurationChanged)) {
3333 /* This is called with the process lock held if change
3334 contains ConfigurationChanged
3336 configure_processors (0);
3337 _phase_control->resize (_input->n_ports().n_audio ());
3338 io_changed (); /* EMIT SIGNAL */
3341 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3344 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3345 if (_input->connected()) {
3346 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3347 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3351 bool does_feed = (*i)->direct_feeds_according_to_reality (boost::dynamic_pointer_cast<Route> (shared_from_this()), &sends_only);
3352 if (does_feed && !sends_only) {
3353 if ((*i)->soloed()) {
3356 if ((*i)->solo_isolate_control()->solo_isolated()) {
3363 int delta = sbou - _solo_control->soloed_by_others_upstream();
3364 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3367 PBD::warning << string_compose (
3368 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3369 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3374 if (_solo_control->soloed_by_others_upstream()) {
3375 // ignore new connections (they're not propagated)
3377 _solo_control->mod_solo_by_others_upstream (delta);
3381 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3382 // solo-isolate currently only propagates downstream
3384 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3386 //_solo_isolated_by_upstream = ibou;
3389 // Session::route_solo_changed does not propagate indirect solo-changes
3390 // propagate downstream to tracks
3391 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3392 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3396 bool does_feed = feeds (*i, &sends_only);
3397 if (delta <= 0 && does_feed && !sends_only) {
3398 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3401 if (idelta < 0 && does_feed && !sends_only) {
3402 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3409 Route::output_change_handler (IOChange change, void * /*src*/)
3411 if (_initial_io_setup) {
3415 if ((change.type & IOChange::ConfigurationChanged)) {
3416 /* This is called with the process lock held if change
3417 contains ConfigurationChanged
3419 configure_processors (0);
3422 _session.reset_monitor_section();
3425 io_changed (); /* EMIT SIGNAL */
3428 if ((change.type & IOChange::ConnectionsChanged)) {
3430 /* do this ONLY if connections have changed. Configuration
3431 * changes do not, by themselves alter solo upstream or
3432 * downstream status.
3435 if (_solo_control->soloed_by_others_downstream()) {
3437 /* checking all all downstream routes for
3438 * explicit of implict solo is a rather drastic measure,
3439 * ideally the input_change_handler() of the other route
3440 * would propagate the change to us.
3442 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3443 if (_output->connected()) {
3444 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3445 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3449 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3450 if (does_feed && !sends_only) {
3451 if ((*i)->soloed()) {
3459 int delta = sbod - _solo_control->soloed_by_others_downstream();
3461 // do not allow new connections to change implicit solo (no propagation)
3462 _solo_control->mod_solo_by_others_downstream (delta);
3463 // Session::route_solo_changed() does not propagate indirect solo-changes
3464 // propagate upstream to tracks
3465 boost::shared_ptr<Route> shared_this = boost::dynamic_pointer_cast<Route> (shared_from_this());
3466 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3467 if ((*i).get() == this || !can_solo()) {
3471 bool does_feed = (*i)->feeds (shared_this, &sends_only);
3472 if (delta != 0 && does_feed && !sends_only) {
3473 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3483 Route::sidechain_change_handler (IOChange change, void* src)
3485 if (_initial_io_setup || _in_sidechain_setup) {
3489 input_change_handler (change, src);
3493 Route::pans_required () const
3495 if (n_outputs().n_audio() < 2) {
3499 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3503 Route::flush_processor_buffers_locked (framecnt_t nframes)
3505 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3506 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
3508 d->flush_buffers (nframes);
3510 boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
3512 p->flush_buffers (nframes);
3519 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3521 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3528 silence_unlocked (nframes);
3532 if (session_state_changing) {
3533 if (_session.transport_speed() != 0.0f) {
3534 /* we're rolling but some state is changing (e.g. our diskstream contents)
3535 so we cannot use them. Be silent till this is over.
3537 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3539 silence_unlocked (nframes);
3542 /* we're really not rolling, so we're either delivery silence or actually
3543 monitoring, both of which are safe to do while session_state_changing is true.
3547 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3549 fill_buffers_with_input (bufs, _input, nframes);
3551 if (_meter_point == MeterInput) {
3552 _meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
3555 _amp->apply_gain_automation (false);
3556 _trim->apply_gain_automation (false);
3557 passthru (bufs, start_frame, end_frame, nframes, 0);
3559 flush_processor_buffers_locked (nframes);
3565 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3567 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3573 silence_unlocked (nframes);
3577 framepos_t unused = 0;
3579 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3585 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3587 fill_buffers_with_input (bufs, _input, nframes);
3589 if (_meter_point == MeterInput) {
3590 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
3593 passthru (bufs, start_frame, end_frame, nframes, declick);
3595 flush_processor_buffers_locked (nframes);
3601 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3604 flush_processor_buffers_locked (nframes);
3609 Route::flush_processors ()
3611 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3613 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3619 __attribute__((annotate("realtime")))
3622 Route::apply_processor_changes_rt ()
3624 int emissions = EmitNone;
3626 if (_pending_meter_point != _meter_point) {
3627 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3629 /* meters always have buffers for 'processor_max_streams'
3630 * they can be re-positioned without re-allocation */
3631 if (set_meter_point_unlocked()) {
3632 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3634 emissions |= EmitMeterChanged;
3639 bool changed = false;
3641 if (g_atomic_int_get (&_pending_process_reorder)) {
3642 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3644 apply_processor_order (_pending_processor_order);
3645 setup_invisible_processors ();
3647 g_atomic_int_set (&_pending_process_reorder, 0);
3648 emissions |= EmitRtProcessorChange;
3652 set_processor_positions ();
3654 if (emissions != 0) {
3655 g_atomic_int_set (&_pending_signals, emissions);
3658 return (!selfdestruct_sequence.empty ());
3662 Route::emit_pending_signals ()
3664 int sig = g_atomic_int_and (&_pending_signals, 0);
3665 if (sig & EmitMeterChanged) {
3666 _meter->emit_configuration_changed();
3667 meter_change (); /* EMIT SIGNAL */
3668 if (sig & EmitMeterVisibilityChange) {
3669 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3671 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3674 if (sig & EmitRtProcessorChange) {
3675 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3678 /* this would be a job for the butler.
3679 * Conceptually we should not take processe/processor locks here.
3680 * OTOH its more efficient (less overhead for summoning the butler and
3681 * telling her what do do) and signal emission is called
3682 * directly after the process callback, which decreases the chance
3683 * of x-runs when taking the locks.
3685 while (!selfdestruct_sequence.empty ()) {
3686 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3687 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3688 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3689 selfdestruct_sequence.pop_back ();
3692 remove_processor (proc);
3698 Route::set_meter_point (MeterPoint p, bool force)
3700 if (_pending_meter_point == p && !force) {
3704 if (force || !AudioEngine::instance()->running()) {
3705 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3706 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3707 _pending_meter_point = p;
3708 _meter->emit_configuration_changed();
3709 meter_change (); /* EMIT SIGNAL */
3710 if (set_meter_point_unlocked()) {
3711 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3713 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3716 _pending_meter_point = p;
3722 __attribute__((annotate("realtime")))
3725 Route::set_meter_point_unlocked ()
3728 /* Caller must hold process and processor write lock */
3729 assert (!AudioEngine::instance()->process_lock().trylock());
3730 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3731 assert (!lm.locked ());
3734 _meter_point = _pending_meter_point;
3736 bool meter_was_visible_to_user = _meter->display_to_user ();
3738 if (!_custom_meter_position_noted) {
3739 maybe_note_meter_position ();
3742 if (_meter_point != MeterCustom) {
3744 _meter->set_display_to_user (false);
3746 setup_invisible_processors ();
3749 _meter->set_display_to_user (true);
3751 /* If we have a previous position for the custom meter, try to put it there */
3752 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3754 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3755 if (i != _processors.end ()) {
3756 _processors.remove (_meter);
3757 _processors.insert (i, _meter);
3759 } else {// at end, right before the mains_out/panner
3760 _processors.remove (_meter);
3761 ProcessorList::iterator main = _processors.end();
3762 _processors.insert (--main, _meter);
3766 /* Set up the meter for its new position */
3768 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3772 if (loc == _processors.begin()) {
3773 m_in = _input->n_ports();
3775 ProcessorList::iterator before = loc;
3777 m_in = (*before)->output_streams ();
3780 _meter->reflect_inputs (m_in);
3782 /* we do not need to reconfigure the processors, because the meter
3783 (a) is always ready to handle processor_max_streams
3784 (b) is always an N-in/N-out processor, and thus moving
3785 it doesn't require any changes to the other processors.
3788 /* these should really be done after releasing the lock
3789 * but all those signals are subscribed to with gui_thread()
3792 return (_meter->display_to_user() != meter_was_visible_to_user);
3796 Route::listen_position_changed ()
3799 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3800 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3801 ProcessorState pstate (this);
3803 if (configure_processors_unlocked (0, &lm)) {
3804 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3806 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3811 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3812 _session.set_dirty ();
3815 boost::shared_ptr<CapturingProcessor>
3816 Route::add_export_point()
3818 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3819 if (!_capturing_processor) {
3821 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3822 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3824 // this aligns all tracks; but not tracks + busses
3825 assert (_session.worst_track_latency () >= _initial_delay);
3826 _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
3827 _capturing_processor->activate ();
3829 configure_processors_unlocked (0, &lw);
3833 return _capturing_processor;
3837 Route::update_signal_latency ()
3839 framecnt_t l = _output->user_latency();
3840 framecnt_t lamp = 0;
3841 bool before_amp = true;
3842 framecnt_t ltrim = 0;
3843 bool before_trim = true;
3845 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3846 if ((*i)->active ()) {
3847 l += (*i)->signal_latency ();
3852 if ((*i) == _trim) {
3863 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3865 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3866 _signal_latency_at_amp_position = lamp;
3867 _signal_latency_at_trim_position = ltrim;
3869 if (_signal_latency != l) {
3870 _signal_latency = l;
3871 signal_latency_changed (); /* EMIT SIGNAL */
3874 return _signal_latency;
3878 Route::set_user_latency (framecnt_t nframes)
3880 _output->set_user_latency (nframes);
3881 _session.update_latency_compensation ();
3885 Route::set_latency_compensation (framecnt_t longest_session_latency)
3887 framecnt_t old = _initial_delay;
3889 if (_signal_latency < longest_session_latency) {
3890 _initial_delay = longest_session_latency - _signal_latency;
3895 DEBUG_TRACE (DEBUG::Latency, string_compose (
3896 "%1: compensate for maximum latency of %2,"
3897 "given own latency of %3, using initial delay of %4\n",
3898 name(), longest_session_latency, _signal_latency, _initial_delay));
3900 if (_initial_delay != old) {
3901 initial_delay_changed (); /* EMIT SIGNAL */
3904 if (_session.transport_stopped()) {
3905 _roll_delay = _initial_delay;
3910 Route::set_block_size (pframes_t nframes)
3912 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3913 (*i)->set_block_size (nframes);
3916 _session.ensure_buffers (n_process_buffers ());
3920 Route::protect_automation ()
3922 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3923 (*i)->protect_automation();
3926 /** @param declick 1 to set a pending declick fade-in,
3927 * -1 to set a pending declick fade-out
3930 Route::set_pending_declick (int declick)
3933 /* this call is not allowed to turn off a pending declick */
3935 _pending_declick = declick;
3938 _pending_declick = 0;
3942 /** Shift automation forwards from a particular place, thereby inserting time.
3943 * Adds undo commands for any shifts that are performed.
3945 * @param pos Position to start shifting from.
3946 * @param frames Amount to shift forwards by.
3950 Route::shift (framepos_t pos, framecnt_t frames)
3952 /* gain automation */
3954 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3956 XMLNode &before = gc->alist()->get_state ();
3957 gc->alist()->shift (pos, frames);
3958 XMLNode &after = gc->alist()->get_state ();
3959 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3962 /* gain automation */
3964 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3966 XMLNode &before = gc->alist()->get_state ();
3967 gc->alist()->shift (pos, frames);
3968 XMLNode &after = gc->alist()->get_state ();
3969 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3972 // TODO mute automation ??
3974 /* pan automation */
3976 ControlSet::Controls& c (_pannable->controls());
3978 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3979 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3981 boost::shared_ptr<AutomationList> al = pc->alist();
3982 XMLNode& before = al->get_state ();
3983 al->shift (pos, frames);
3984 XMLNode& after = al->get_state ();
3985 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3990 /* redirect automation */
3992 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3993 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3995 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3997 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3998 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
4000 boost::shared_ptr<AutomationList> al = ac->alist();
4001 XMLNode &before = al->get_state ();
4002 al->shift (pos, frames);
4003 XMLNode &after = al->get_state ();
4004 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4012 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
4014 boost::shared_ptr<Processor> processor (p.lock ());
4015 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
4019 pi->set_state_dir (d);
4023 Route::save_as_template (const string& path, const string& name)
4025 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
4026 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
4028 XMLNode& node (state (false));
4032 IO::set_name_in_state (*node.children().front(), name);
4034 tree.set_root (&node);
4036 /* return zero on success, non-zero otherwise */
4037 return !tree.write (path.c_str());
4042 Route::set_name (const string& str)
4048 if (str == name()) {
4052 string name = Route::ensure_track_or_route_name (str, _session);
4053 SessionObject::set_name (name);
4055 bool ret = (_input->set_name(name) && _output->set_name(name));
4058 /* rename the main outs. Leave other IO processors
4059 * with whatever name they already have, because its
4060 * just fine as it is (it will not contain the route
4061 * name if its a port insert, port send or port return).
4065 if (_main_outs->set_name (name)) {
4066 /* XXX returning false here is stupid because
4067 we already changed the route name.
4077 /** Set the name of a route in an XML description.
4078 * @param node XML <Route> node to set the name in.
4079 * @param name New name.
4082 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
4084 node.set_property (X_("name"), name);
4086 XMLNodeList children = node.children();
4087 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4089 if ((*i)->name() == X_("IO")) {
4091 IO::set_name_in_state (**i, name);
4093 } else if ((*i)->name() == X_("Processor")) {
4096 if ((*i)->get_property (X_("role"), str) && str == X_("Main")) {
4097 (*i)->set_property (X_("name"), name);
4100 } else if ((*i)->name() == X_("Diskstream")) {
4102 if (rename_playlist) {
4103 (*i)->set_property (X_("playlist"), name + ".1");
4105 (*i)->set_property (X_("name"), name);
4111 boost::shared_ptr<Send>
4112 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4114 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4116 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4117 boost::shared_ptr<InternalSend> send;
4119 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4120 if (send->target_route() == target) {
4126 return boost::shared_ptr<Send>();
4130 Route::set_denormal_protection (bool yn)
4132 if (_denormal_protection != yn) {
4133 _denormal_protection = yn;
4134 denormal_protection_changed (); /* EMIT SIGNAL */
4139 Route::denormal_protection () const
4141 return _denormal_protection;
4145 Route::set_active (bool yn, void* src)
4147 if (_session.transport_rolling()) {
4151 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4152 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4156 if (_active != yn) {
4158 _input->set_active (yn);
4159 _output->set_active (yn);
4160 flush_processors ();
4161 active_changed (); // EMIT SIGNAL
4162 _session.set_dirty ();
4166 boost::shared_ptr<Pannable>
4167 Route::pannable() const
4172 boost::shared_ptr<Panner>
4173 Route::panner() const
4176 return _main_outs->panner_shell()->panner();
4179 boost::shared_ptr<PannerShell>
4180 Route::panner_shell() const
4182 return _main_outs->panner_shell();
4185 boost::shared_ptr<GainControl>
4186 Route::gain_control() const
4188 return _gain_control;
4191 boost::shared_ptr<GainControl>
4192 Route::trim_control() const
4194 return _trim_control;
4197 boost::shared_ptr<PhaseControl>
4198 Route::phase_control() const
4200 return _phase_control;
4203 boost::shared_ptr<AutomationControl>
4204 Route::get_control (const Evoral::Parameter& param)
4206 /* either we own the control or .... */
4208 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4212 /* maybe one of our processors does or ... */
4214 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4215 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4216 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4224 /* nobody does so we'll make a new one */
4226 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4233 boost::shared_ptr<Processor>
4234 Route::nth_plugin (uint32_t n) const
4236 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4237 ProcessorList::const_iterator i;
4239 for (i = _processors.begin(); i != _processors.end(); ++i) {
4240 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4247 return boost::shared_ptr<Processor> ();
4250 boost::shared_ptr<Processor>
4251 Route::nth_send (uint32_t n) const
4253 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4254 ProcessorList::const_iterator i;
4256 for (i = _processors.begin(); i != _processors.end(); ++i) {
4257 if (boost::dynamic_pointer_cast<Send> (*i)) {
4259 if ((*i)->name().find (_("Monitor")) == 0) {
4260 /* send to monitor section is not considered
4261 to be an accessible send.
4272 return boost::shared_ptr<Processor> ();
4276 Route::has_io_processor_named (const string& name)
4278 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4279 ProcessorList::iterator i;
4281 for (i = _processors.begin(); i != _processors.end(); ++i) {
4282 if (boost::dynamic_pointer_cast<Send> (*i) ||
4283 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4284 if ((*i)->name() == name) {
4294 Route::set_processor_positions ()
4296 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4298 bool had_amp = false;
4299 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4300 (*i)->set_pre_fader (!had_amp);
4307 /** Called when there is a proposed change to the input port count */
4309 Route::input_port_count_changing (ChanCount to)
4311 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4313 /* The processors cannot be configured with the new input arrangement, so
4319 /* The change is ok */
4323 /** Called when there is a proposed change to the output port count */
4325 Route::output_port_count_changing (ChanCount to)
4327 if (_strict_io && !_in_configure_processors) {
4330 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4331 if (processor_out_streams.get(*t) > to.get(*t)) {
4335 /* The change is ok */
4340 Route::unknown_processors () const
4344 if (_session.get_disable_all_loaded_plugins ()) {
4345 // Do not list "missing plugins" if they are explicitly disabled
4349 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4350 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4351 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4352 p.push_back ((*i)->name ());
4361 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4363 /* we assume that all our input ports feed all our output ports. its not
4364 universally true, but the alternative is way too corner-case to worry about.
4367 LatencyRange all_connections;
4370 all_connections.min = 0;
4371 all_connections.max = 0;
4373 all_connections.min = ~((pframes_t) 0);
4374 all_connections.max = 0;
4376 /* iterate over all "from" ports and determine the latency range for all of their
4377 connections to the "outside" (outside of this Route).
4380 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4384 p->get_connected_latency_range (range, playback);
4386 all_connections.min = min (all_connections.min, range.min);
4387 all_connections.max = max (all_connections.max, range.max);
4391 /* set the "from" port latencies to the max/min range of all their connections */
4393 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4394 p->set_private_latency_range (all_connections, playback);
4397 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4399 all_connections.min += our_latency;
4400 all_connections.max += our_latency;
4402 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4403 p->set_private_latency_range (all_connections, playback);
4406 return all_connections.max;
4410 Route::set_private_port_latencies (bool playback) const
4412 framecnt_t own_latency = 0;
4414 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4415 OR LATENCY CALLBACK.
4417 This is called (early) from the latency callback. It computes the REAL
4418 latency associated with each port and stores the result as the "private"
4419 latency of the port. A later call to Route::set_public_port_latencies()
4420 sets all ports to the same value to reflect the fact that we do latency
4421 compensation and so all signals are delayed by the same amount as they
4422 flow through ardour.
4425 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4426 if ((*i)->active ()) {
4427 own_latency += (*i)->signal_latency ();
4432 /* playback: propagate latency from "outside the route" to outputs to inputs */
4433 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4435 /* capture: propagate latency from "outside the route" to inputs to outputs */
4436 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4441 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4443 /* this is called to set the JACK-visible port latencies, which take
4444 latency compensation into account.
4453 const PortSet& ports (_input->ports());
4454 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4455 p->set_public_latency_range (range, playback);
4460 const PortSet& ports (_output->ports());
4461 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4462 p->set_public_latency_range (range, playback);
4467 /** Put the invisible processors in the right place in _processors.
4468 * Must be called with a writer lock on _processor_lock held.
4471 __attribute__((annotate("realtime")))
4474 Route::setup_invisible_processors ()
4477 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4478 assert (!lm.locked ());
4482 /* too early to be doing this stuff */
4486 /* we'll build this new list here and then use it
4488 * TODO put the ProcessorList is on the stack for RT-safety.
4491 ProcessorList new_processors;
4493 /* find visible processors */
4495 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4496 if ((*i)->display_to_user ()) {
4497 new_processors.push_back (*i);
4503 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4505 if (amp == new_processors.end ()) {
4506 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4507 new_processors.push_front (_amp);
4508 amp = find (new_processors.begin(), new_processors.end(), _amp);
4511 /* and the processor after the amp */
4513 ProcessorList::iterator after_amp = amp;
4519 switch (_meter_point) {
4521 assert (!_meter->display_to_user ());
4522 new_processors.push_front (_meter);
4525 assert (!_meter->display_to_user ());
4526 new_processors.insert (amp, _meter);
4528 case MeterPostFader:
4529 /* do nothing here */
4532 /* do nothing here */
4535 /* the meter is visible, so we don't touch it here */
4542 assert (_main_outs);
4543 assert (!_main_outs->display_to_user ());
4544 new_processors.push_back (_main_outs);
4546 /* iterator for the main outs */
4548 ProcessorList::iterator main = new_processors.end();
4551 /* OUTPUT METERING */
4553 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4554 assert (!_meter->display_to_user ());
4556 /* add the processor just before or just after the main outs */
4558 ProcessorList::iterator meter_point = main;
4560 if (_meter_point == MeterOutput) {
4563 new_processors.insert (meter_point, _meter);
4568 if (_monitor_send && !is_monitor ()) {
4569 assert (!_monitor_send->display_to_user ());
4570 switch (Config->get_listen_position ()) {
4571 case PreFaderListen:
4572 switch (Config->get_pfl_position ()) {
4573 case PFLFromBeforeProcessors:
4574 new_processors.push_front (_monitor_send);
4576 case PFLFromAfterProcessors:
4577 new_processors.insert (amp, _monitor_send);
4580 _monitor_send->set_can_pan (false);
4582 case AfterFaderListen:
4583 switch (Config->get_afl_position ()) {
4584 case AFLFromBeforeProcessors:
4585 new_processors.insert (after_amp, _monitor_send);
4587 case AFLFromAfterProcessors:
4588 new_processors.insert (new_processors.end(), _monitor_send);
4591 _monitor_send->set_can_pan (true);
4596 #if 0 // not used - just yet
4597 if (!is_master() && !is_monitor() && !is_auditioner()) {
4598 new_processors.push_front (_delayline);
4602 /* MONITOR CONTROL */
4604 if (_monitor_control && is_monitor ()) {
4605 assert (!_monitor_control->display_to_user ());
4606 new_processors.insert (amp, _monitor_control);
4611 if (_trim && _trim->active()) {
4612 assert (!_trim->display_to_user ());
4613 new_processors.push_front (_trim);
4616 /* INTERNAL RETURN */
4618 /* doing this here means that any monitor control will come after
4619 the return and trim.
4623 assert (!_intreturn->display_to_user ());
4624 new_processors.push_front (_intreturn);
4627 /* EXPORT PROCESSOR */
4629 if (_capturing_processor) {
4630 assert (!_capturing_processor->display_to_user ());
4631 new_processors.push_front (_capturing_processor);
4634 _processors = new_processors;
4636 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4637 if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
4638 (*i)->enable (true);
4642 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4643 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4644 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4651 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4652 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4656 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4657 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4664 /** If the meter point is `Custom', make a note of where the meter is.
4665 * This is so that if the meter point is subsequently set to something else,
4666 * and then back to custom, we can put the meter back where it was last time
4667 * custom was enabled.
4669 * Must be called with the _processor_lock held.
4672 Route::maybe_note_meter_position ()
4674 if (_meter_point != MeterCustom) {
4678 _custom_meter_position_noted = true;
4679 /* custom meter points range from after trim to before panner/main_outs
4680 * this is a limitation by the current processor UI
4682 bool seen_trim = false;
4683 _processor_after_last_custom_meter.reset();
4684 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4685 if ((*i) == _trim) {
4688 if ((*i) == _main_outs) {
4689 _processor_after_last_custom_meter = *i;
4692 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4694 _processor_after_last_custom_meter = _trim;
4696 ProcessorList::iterator j = i;
4698 assert(j != _processors.end ()); // main_outs should be before
4699 _processor_after_last_custom_meter = *j;
4704 assert(_processor_after_last_custom_meter.lock());
4707 boost::shared_ptr<Processor>
4708 Route::processor_by_id (PBD::ID id) const
4710 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4711 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4712 if ((*i)->id() == id) {
4717 return boost::shared_ptr<Processor> ();
4720 /** @return the monitoring state, or in other words what data we are pushing
4721 * into the route (data from the inputs, data from disk or silence)
4724 Route::monitoring_state () const
4726 return MonitoringInput;
4729 /** @return what we should be metering; either the data coming from the input
4730 * IO or the data that is flowing through the route.
4733 Route::metering_state () const
4735 return MeteringRoute;
4739 Route::has_external_redirects () const
4741 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4743 /* ignore inactive processors and obviously ignore the main
4744 * outs since everything has them and we don't care.
4747 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4755 boost::shared_ptr<Processor>
4756 Route::the_instrument () const
4758 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4759 return the_instrument_unlocked ();
4762 boost::shared_ptr<Processor>
4763 Route::the_instrument_unlocked () const
4765 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4766 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4767 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4771 return boost::shared_ptr<Processor>();
4777 Route::non_realtime_locate (framepos_t pos)
4780 _pannable->transport_located (pos);
4783 if (_delayline.get()) {
4784 _delayline.get()->flush();
4788 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4789 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4791 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4792 (*i)->transport_located (pos);
4795 _roll_delay = _initial_delay;
4799 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4806 * We don't currently mix MIDI input together, so we don't need the
4807 * complex logic of the audio case.
4810 n_buffers = bufs.count().n_midi ();
4812 for (i = 0; i < n_buffers; ++i) {
4814 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4815 MidiBuffer& buf (bufs.get_midi (i));
4818 buf.copy (source_port->get_midi_buffer(nframes));
4820 buf.silence (nframes);
4826 n_buffers = bufs.count().n_audio();
4828 size_t n_ports = io->n_ports().n_audio();
4829 float scaling = 1.0f;
4831 if (n_ports > n_buffers) {
4832 scaling = ((float) n_buffers) / n_ports;
4835 for (i = 0; i < n_ports; ++i) {
4837 /* if there are more ports than buffers, map them onto buffers
4838 * in a round-robin fashion
4841 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4842 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4845 if (i < n_buffers) {
4847 /* first time through just copy a channel into
4851 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4853 if (scaling != 1.0f) {
4854 buf.apply_gain (scaling, nframes);
4859 /* on subsequent times around, merge data from
4860 * the port with what is already there
4863 if (scaling != 1.0f) {
4864 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4866 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4871 /* silence any remaining buffers */
4873 for (; i < n_buffers; ++i) {
4874 AudioBuffer& buf (bufs.get_audio (i));
4875 buf.silence (nframes);
4878 /* establish the initial setup of the buffer set, reflecting what was
4879 copied into it. unless, of course, we are the auditioner, in which
4880 case nothing was fed into it from the inputs at all.
4883 if (!is_auditioner()) {
4884 bufs.set_count (io->n_ports());
4888 boost::shared_ptr<AutomationControl>
4889 Route::pan_azimuth_control() const
4892 # undef MIXBUS_PORTS_H
4893 # include "../../gtk2_ardour/mixbus_ports.h"
4894 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4896 return boost::shared_ptr<AutomationControl>();
4898 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4900 if (!_pannable || !panner()) {
4901 return boost::shared_ptr<AutomationControl>();
4903 return _pannable->pan_azimuth_control;
4907 boost::shared_ptr<AutomationControl>
4908 Route::pan_elevation_control() const
4910 if (Profile->get_mixbus() || !_pannable || !panner()) {
4911 return boost::shared_ptr<AutomationControl>();
4914 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4916 if (c.find (PanElevationAutomation) != c.end()) {
4917 return _pannable->pan_elevation_control;
4919 return boost::shared_ptr<AutomationControl>();
4922 boost::shared_ptr<AutomationControl>
4923 Route::pan_width_control() const
4926 if (mixbus() && _ch_pre) {
4928 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(_ch_pre->control(Evoral::Parameter(PluginAutomation, 0, 5)));
4931 if (Profile->get_mixbus() || !_pannable || !panner()) {
4932 return boost::shared_ptr<AutomationControl>();
4935 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4937 if (c.find (PanWidthAutomation) != c.end()) {
4938 return _pannable->pan_width_control;
4940 return boost::shared_ptr<AutomationControl>();
4943 boost::shared_ptr<AutomationControl>
4944 Route::pan_frontback_control() const
4946 if (Profile->get_mixbus() || !_pannable || !panner()) {
4947 return boost::shared_ptr<AutomationControl>();
4950 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4952 if (c.find (PanFrontBackAutomation) != c.end()) {
4953 return _pannable->pan_frontback_control;
4955 return boost::shared_ptr<AutomationControl>();
4958 boost::shared_ptr<AutomationControl>
4959 Route::pan_lfe_control() const
4961 if (Profile->get_mixbus() || !_pannable || !panner()) {
4962 return boost::shared_ptr<AutomationControl>();
4965 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4967 if (c.find (PanLFEAutomation) != c.end()) {
4968 return _pannable->pan_lfe_control;
4970 return boost::shared_ptr<AutomationControl>();
4975 Route::eq_band_cnt () const
4977 if (Profile->get_mixbus()) {
4979 if (is_master() || mixbus()) {
4988 /* Ardour has no well-known EQ object */
4993 boost::shared_ptr<AutomationControl>
4994 Route::eq_gain_controllable (uint32_t band) const
4997 boost::shared_ptr<PluginInsert> eq = ch_eq();
5000 return boost::shared_ptr<AutomationControl>();
5003 uint32_t port_number;
5004 if (is_master() || mixbus()) {
5006 case 0: port_number = 4; break;
5007 case 1: port_number = 3; break;
5008 case 2: port_number = 2; break;
5010 return boost::shared_ptr<AutomationControl>();
5015 case 0: port_number = 14; break;
5016 case 1: port_number = 12; break;
5017 case 2: port_number = 10; break;
5018 case 3: port_number = 8; break;
5020 return boost::shared_ptr<AutomationControl>();
5024 case 0: port_number = 8; break;
5025 case 1: port_number = 6; break;
5026 case 2: port_number = 4; break;
5028 return boost::shared_ptr<AutomationControl>();
5033 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5035 return boost::shared_ptr<AutomationControl>();
5038 boost::shared_ptr<AutomationControl>
5039 Route::eq_freq_controllable (uint32_t band) const
5042 if (mixbus() || is_master()) {
5043 /* no frequency controls for mixbusses or master */
5044 return boost::shared_ptr<AutomationControl>();
5047 boost::shared_ptr<PluginInsert> eq = ch_eq();
5050 return boost::shared_ptr<AutomationControl>();
5053 uint32_t port_number;
5056 case 0: port_number = 13; break; // lo
5057 case 1: port_number = 11; break; // lo mid
5058 case 2: port_number = 9; break; // hi mid
5059 case 3: port_number = 7; break; // hi
5061 return boost::shared_ptr<AutomationControl>();
5065 case 0: port_number = 7; break;
5066 case 1: port_number = 5; break;
5067 case 2: port_number = 3; break;
5069 return boost::shared_ptr<AutomationControl>();
5073 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5075 return boost::shared_ptr<AutomationControl>();
5079 boost::shared_ptr<AutomationControl>
5080 Route::eq_q_controllable (uint32_t band) const
5082 return boost::shared_ptr<AutomationControl>();
5085 boost::shared_ptr<AutomationControl>
5086 Route::eq_shape_controllable (uint32_t band) const
5089 boost::shared_ptr<PluginInsert> eq = ch_eq();
5090 if (is_master() || mixbus() || !eq) {
5091 return boost::shared_ptr<AutomationControl>();
5095 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4))); // lo bell
5098 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3))); // hi bell
5104 return boost::shared_ptr<AutomationControl>();
5107 boost::shared_ptr<AutomationControl>
5108 Route::eq_enable_controllable () const
5111 boost::shared_ptr<PluginInsert> eq = ch_eq();
5114 return boost::shared_ptr<AutomationControl>();
5117 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5119 return boost::shared_ptr<AutomationControl>();
5123 boost::shared_ptr<AutomationControl>
5124 Route::filter_freq_controllable (bool hpf) const
5127 boost::shared_ptr<PluginInsert> eq = ch_eq();
5129 if (is_master() || mixbus() || !eq) {
5130 return boost::shared_ptr<AutomationControl>();
5134 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5))); // HPF freq
5136 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5140 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6))); // LPF freq
5142 return boost::shared_ptr<AutomationControl>();
5147 return boost::shared_ptr<AutomationControl>();
5151 boost::shared_ptr<AutomationControl>
5152 Route::filter_slope_controllable (bool) const
5154 return boost::shared_ptr<AutomationControl>();
5157 boost::shared_ptr<AutomationControl>
5158 Route::filter_enable_controllable (bool) const
5161 boost::shared_ptr<PluginInsert> eq = ch_eq();
5163 if (is_master() || mixbus() || !eq) {
5164 return boost::shared_ptr<AutomationControl>();
5167 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5169 return boost::shared_ptr<AutomationControl>();
5174 Route::eq_band_name (uint32_t band) const
5177 if (is_master() || mixbus()) {
5179 if (Profile->get_mixbus()) {
5181 case 0: return _("lo");
5182 case 1: return _("mid");
5183 case 2: return _("hi");
5184 default: return string();
5192 case 0: return _("lo");
5193 case 1: return _("lo mid");
5194 case 2: return _("hi mid");
5195 case 3: return _("hi");
5196 default: return string();
5202 boost::shared_ptr<AutomationControl>
5203 Route::comp_enable_controllable () const
5206 boost::shared_ptr<PluginInsert> comp = ch_comp();
5209 return boost::shared_ptr<AutomationControl>();
5212 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5214 return boost::shared_ptr<AutomationControl>();
5217 boost::shared_ptr<AutomationControl>
5218 Route::comp_threshold_controllable () const
5221 boost::shared_ptr<PluginInsert> comp = ch_comp();
5224 return boost::shared_ptr<AutomationControl>();
5227 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5230 return boost::shared_ptr<AutomationControl>();
5233 boost::shared_ptr<AutomationControl>
5234 Route::comp_speed_controllable () const
5237 boost::shared_ptr<PluginInsert> comp = ch_comp();
5240 return boost::shared_ptr<AutomationControl>();
5243 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5245 return boost::shared_ptr<AutomationControl>();
5248 boost::shared_ptr<AutomationControl>
5249 Route::comp_mode_controllable () const
5252 boost::shared_ptr<PluginInsert> comp = ch_comp();
5255 return boost::shared_ptr<AutomationControl>();
5258 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5260 return boost::shared_ptr<AutomationControl>();
5263 boost::shared_ptr<AutomationControl>
5264 Route::comp_makeup_controllable () const
5267 boost::shared_ptr<PluginInsert> comp = ch_comp();
5270 return boost::shared_ptr<AutomationControl>();
5273 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5275 return boost::shared_ptr<AutomationControl>();
5278 boost::shared_ptr<ReadOnlyControl>
5279 Route::comp_redux_controllable () const
5282 boost::shared_ptr<PluginInsert> comp = ch_comp();
5285 return boost::shared_ptr<ReadOnlyControl>();
5288 return comp->control_output (2);
5290 return comp->control_output (6);
5294 return boost::shared_ptr<ReadOnlyControl>();
5299 Route::comp_mode_name (uint32_t mode) const
5304 return _("Leveler");
5306 return _("Compressor");
5308 return _("Limiter");
5310 return mixbus() ? _("Sidechain") : _("Limiter");
5320 Route::comp_speed_name (uint32_t mode) const
5338 boost::shared_ptr<AutomationControl>
5339 Route::send_level_controllable (uint32_t n) const
5342 # undef MIXBUS_PORTS_H
5343 # include "../../gtk2_ardour/mixbus_ports.h"
5344 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5345 if (plug && !mixbus()) {
5346 uint32_t port_id = 0;
5348 case 0: port_id = port_channel_post_aux1_level; break;
5349 case 1: port_id = port_channel_post_aux2_level; break;
5350 case 2: port_id = port_channel_post_aux3_level; break;
5351 case 3: port_id = port_channel_post_aux4_level; break;
5352 case 4: port_id = port_channel_post_aux5_level; break;
5353 case 5: port_id = port_channel_post_aux6_level; break;
5354 case 6: port_id = port_channel_post_aux7_level; break;
5355 case 7: port_id = port_channel_post_aux8_level; break;
5357 case 8: port_id = port_channel_post_aux9_level; break;
5358 case 9: port_id = port_channel_post_aux10_level; break;
5359 case 10: port_id = port_channel_post_aux11_level; break;
5360 case 11: port_id = port_channel_post_aux12_level; break;
5367 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5378 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5380 return boost::shared_ptr<AutomationControl>();
5382 return s->gain_control ();
5385 boost::shared_ptr<AutomationControl>
5386 Route::send_enable_controllable (uint32_t n) const
5389 # undef MIXBUS_PORTS_H
5390 # include "../../gtk2_ardour/mixbus_ports.h"
5391 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5393 uint32_t port_id = 0;
5395 case 0: port_id = port_channel_post_aux1_asgn; break;
5396 case 1: port_id = port_channel_post_aux2_asgn; break;
5397 case 2: port_id = port_channel_post_aux3_asgn; break;
5398 case 3: port_id = port_channel_post_aux4_asgn; break;
5399 case 4: port_id = port_channel_post_aux5_asgn; break;
5400 case 5: port_id = port_channel_post_aux6_asgn; break;
5401 case 6: port_id = port_channel_post_aux7_asgn; break;
5402 case 7: port_id = port_channel_post_aux8_asgn; break;
5404 case 8: port_id = port_channel_post_aux9_asgn; break;
5405 case 9: port_id = port_channel_post_aux10_asgn; break;
5406 case 10: port_id = port_channel_post_aux11_asgn; break;
5407 case 11: port_id = port_channel_post_aux12_asgn; break;
5414 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5425 /* although Ardour sends have enable/disable as part of the Processor
5426 * API, it is not exposed as a controllable.
5428 * XXX: we should fix this (make it click-free, automatable enable-control)
5430 return boost::shared_ptr<AutomationControl>();
5434 Route::send_name (uint32_t n) const
5439 return _session.get_mixbus (n)->name();
5444 return _session.get_mixbus (n)->name();
5449 boost::shared_ptr<Processor> p = nth_send (n);
5457 boost::shared_ptr<AutomationControl>
5458 Route::master_send_enable_controllable () const
5461 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5463 return boost::shared_ptr<AutomationControl>();
5465 # undef MIXBUS_PORTS_H
5466 # include "../../gtk2_ardour/mixbus_ports.h"
5467 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5469 return boost::shared_ptr<AutomationControl>();
5474 Route::slaved () const
5476 if (!_gain_control) {
5479 /* just test one particular control, not all of them */
5480 return _gain_control->slaved ();
5484 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5486 if (!vca || !_gain_control) {
5490 /* just test one particular control, not all of them */
5492 return _gain_control->slaved_to (vca->gain_control());
5496 Route::muted_by_others_soloing () const
5498 if (!can_be_muted_by_others ()) {
5502 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5506 Route::clear_all_solo_state ()
5508 _solo_control->clear_all_solo_state ();
5511 boost::shared_ptr<AutomationControl>
5512 Route::automation_control_recurse (PBD::ID const & id) const
5514 boost::shared_ptr<AutomationControl> ac = Automatable::automation_control (id);
5520 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
5522 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
5523 if ((ac = (*i)->automation_control (id))) {
5528 return boost::shared_ptr<AutomationControl> ();
5532 Route::slavables () const
5534 SlavableControlList rv;
5535 rv.push_back (_gain_control);
5536 rv.push_back (_mute_control);
5537 rv.push_back (_solo_control);