2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/unwind.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_track.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/boost_debug.h"
44 #include "ardour/buffer.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/capturing_processor.h"
47 #include "ardour/debug.h"
48 #include "ardour/delivery.h"
49 #include "ardour/gain_control.h"
50 #include "ardour/internal_return.h"
51 #include "ardour/internal_send.h"
52 #include "ardour/meter.h"
53 #include "ardour/delayline.h"
54 #include "ardour/midi_buffer.h"
55 #include "ardour/midi_port.h"
56 #include "ardour/monitor_processor.h"
57 #include "ardour/pannable.h"
58 #include "ardour/panner.h"
59 #include "ardour/panner_shell.h"
60 #include "ardour/parameter_descriptor.h"
61 #include "ardour/phase_control.h"
62 #include "ardour/plugin_insert.h"
63 #include "ardour/port.h"
64 #include "ardour/port_insert.h"
65 #include "ardour/processor.h"
66 #include "ardour/profile.h"
67 #include "ardour/route.h"
68 #include "ardour/route_group.h"
69 #include "ardour/send.h"
70 #include "ardour/session.h"
71 #include "ardour/solo_control.h"
72 #include "ardour/solo_isolate_control.h"
73 #include "ardour/unknown_processor.h"
74 #include "ardour/utils.h"
75 #include "ardour/vca.h"
80 using namespace ARDOUR;
83 PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
85 /** Base class for all routable/mixable objects (tracks and busses) */
86 Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType default_type)
87 : Stripable (sess, name, PresentationInfo (flag))
88 , GraphNode (sess._process_graph)
89 , Muteable (sess, name)
93 , _signal_latency_at_amp_position (0)
94 , _signal_latency_at_trim_position (0)
97 , _pending_process_reorder (0)
98 , _pending_signals (0)
99 , _pending_declick (true)
100 , _meter_point (MeterPostFader)
101 , _pending_meter_point (MeterPostFader)
102 , _meter_type (MeterPeak)
103 , _denormal_protection (false)
106 , _declickable (false)
107 , _have_internal_generator (false)
108 , _default_type (default_type)
110 , _in_configure_processors (false)
111 , _initial_io_setup (false)
112 , _in_sidechain_setup (false)
114 , _custom_meter_position_noted (false)
117 processor_max_streams.reset();
123 /* set default meter type */
125 _meter_type = Config->get_meter_type_master ();
127 else if (dynamic_cast<Track*>(this)) {
128 _meter_type = Config->get_meter_type_track ();
130 _meter_type = Config->get_meter_type_bus ();
133 /* add standard controls */
135 _gain_control.reset (new GainControl (_session, GainAutomation));
136 add_control (_gain_control);
138 _trim_control.reset (new GainControl (_session, TrimAutomation));
139 add_control (_trim_control);
141 _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
142 add_control (_solo_control);
143 _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
145 _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
146 add_control (_mute_control);
148 _phase_control.reset (new PhaseControl (_session, X_("phase")));
149 add_control (_phase_control);
151 _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
152 add_control (_solo_isolate_control);
154 _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
155 add_control (_solo_safe_control);
159 if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
160 _pannable.reset (new Pannable (_session));
163 /* input and output objects */
165 _input.reset (new IO (_session, _name, IO::Input, _default_type));
166 _output.reset (new IO (_session, _name, IO::Output, _default_type));
168 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
169 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
171 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
172 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
174 /* add the amp/fader processor.
175 * it should be the first processor to be added on every route.
178 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
179 add_processor (_amp, PostFader);
182 _amp->set_display_name (_("Monitor"));
185 #if 0 // not used - just yet
186 if (!is_master() && !is_monitor() && !is_auditioner()) {
187 _delayline.reset (new DelayLine (_session, _name));
188 add_processor (_delayline, PreFader);
194 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
195 _trim->set_display_to_user (false);
197 if (dynamic_cast<AudioTrack*>(this)) {
198 /* we can't do this in the AudioTrack's constructor
199 * because _trim does not exit then
203 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
208 /* create standard processors: meter, main outs, monitor out;
209 they will be added to _processors by setup_invisible_processors ()
212 _meter.reset (new PeakMeter (_session, _name));
213 _meter->set_owner (this);
214 _meter->set_display_to_user (false);
217 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
218 _main_outs->activate ();
221 /* where we listen to tracks */
222 _intreturn.reset (new InternalReturn (_session));
223 _intreturn->activate ();
225 /* the thing that provides proper control over a control/monitor/listen bus
226 (such as per-channel cut, dim, solo, invert, etc).
228 _monitor_control.reset (new MonitorProcessor (_session));
229 _monitor_control->activate ();
232 if (is_master() || is_monitor() || is_auditioner()) {
233 _mute_master->set_solo_ignore (true);
236 /* now that we have _meter, its safe to connect to this */
239 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
240 configure_processors (0);
248 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
250 /* do this early so that we don't get incoming signals as we are going through destruction
255 /* don't use clear_processors here, as it depends on the session which may
256 be half-destroyed by now
259 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
260 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
261 (*i)->drop_references ();
264 _processors.clear ();
268 Route::ensure_track_or_route_name(string name, Session &session)
270 string newname = name;
272 while (!session.io_name_is_legal (newname)) {
273 newname = bump_name_once (newname, ' ');
280 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
282 // TODO route group, see set_gain()
283 // _trim_control->route_set_value (val);
287 Route::maybe_declick (BufferSet&, framecnt_t, int)
289 /* this is the "bus" implementation and they never declick.
294 /** Process this route for one (sub) cycle (process thread)
296 * @param bufs Scratch buffers to use for the signal path
297 * @param start_frame Initial transport frame
298 * @param end_frame Final transport frame
299 * @param nframes Number of frames to output (to ports)
301 * Note that (end_frame - start_frame) may not be equal to nframes when the
302 * transport speed isn't 1.0 (eg varispeed).
305 Route::process_output_buffers (BufferSet& bufs,
306 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
307 int declick, bool gain_automation_ok)
309 /* Caller must hold process lock */
310 assert (!AudioEngine::instance()->process_lock().trylock());
312 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
314 // can this actually happen? functions calling process_output_buffers()
315 // already take a reader-lock.
316 bufs.silence (nframes, 0);
320 _mute_control->automation_run (start_frame, nframes);
322 /* figure out if we're going to use gain automation */
323 if (gain_automation_ok) {
324 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
325 _amp->setup_gain_automation (
326 start_frame + _signal_latency_at_amp_position,
327 end_frame + _signal_latency_at_amp_position,
330 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
331 _trim->setup_gain_automation (
332 start_frame + _signal_latency_at_trim_position,
333 end_frame + _signal_latency_at_trim_position,
336 _amp->apply_gain_automation (false);
337 _trim->apply_gain_automation (false);
340 /* Tell main outs what to do about monitoring. We do this so that
341 on a transition between monitoring states we get a de-clicking gain
342 change in the _main_outs delivery, if config.get_use_monitor_fades()
345 We override this in the case where we have an internal generator.
347 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
349 _main_outs->no_outs_cuz_we_no_monitor (silence);
351 /* -------------------------------------------------------------------------------------------
352 GLOBAL DECLICK (for transport changes etc.)
353 ----------------------------------------------------------------------------------------- */
355 maybe_declick (bufs, nframes, declick);
356 _pending_declick = 0;
358 /* -------------------------------------------------------------------------------------------
359 DENORMAL CONTROL/PHASE INVERT
360 ----------------------------------------------------------------------------------------- */
362 if (!_phase_control->none()) {
366 if (_denormal_protection || Config->get_denormal_protection()) {
368 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
369 Sample* const sp = i->data();
371 if (_phase_control->inverted (chn)) {
372 for (pframes_t nx = 0; nx < nframes; ++nx) {
377 for (pframes_t nx = 0; nx < nframes; ++nx) {
385 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
386 Sample* const sp = i->data();
388 if (_phase_control->inverted (chn)) {
389 for (pframes_t nx = 0; nx < nframes; ++nx) {
398 if (_denormal_protection || Config->get_denormal_protection()) {
400 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
401 Sample* const sp = i->data();
402 for (pframes_t nx = 0; nx < nframes; ++nx) {
410 /* -------------------------------------------------------------------------------------------
412 ----------------------------------------------------------------------------------------- */
414 /* set this to be true if the meter will already have been ::run() earlier */
415 bool const meter_already_run = metering_state() == MeteringInput;
417 framecnt_t latency = 0;
419 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
421 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
422 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
427 /* if it has any inputs, make sure they match */
428 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
429 if (bufs.count() != (*i)->input_streams()) {
431 DEBUG::Processors, string_compose (
432 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
433 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
440 /* should we NOT run plugins here if the route is inactive?
441 do we catch route != active somewhere higher?
444 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
445 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
447 if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
448 const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
449 boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
450 _initial_delay + latency, longest_session_latency - latency);
453 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
454 bufs.set_count ((*i)->output_streams());
456 if ((*i)->active ()) {
457 latency += (*i)->signal_latency ();
463 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
464 boost::shared_ptr<Processor> endpoint,
465 bool include_endpoint, bool for_export, bool for_freeze)
467 /* If no processing is required, there's no need to go any further. */
468 if (!endpoint && !include_endpoint) {
472 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
473 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
474 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
476 /* trim is always at the top, for bounce no latency compensation is needed */
477 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
478 _trim->setup_gain_automation (start, start + nframes, nframes);
481 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
483 if (!include_endpoint && (*i) == endpoint) {
487 /* if we're *not* exporting, stop processing if we come across a routing processor. */
488 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
491 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
495 /* special case the panner (export outputs)
496 * Ideally we'd only run the panner, not the delivery itself...
497 * but panners need separate input/output buffers and some context
498 * (panshell, panner type, etc). AFAICT there is no ill side effect
499 * of re-using the main delivery when freewheeling/exporting a region.
501 if ((*i) == _main_outs) {
502 assert ((*i)->does_routing());
503 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
504 buffers.set_count ((*i)->output_streams());
507 /* don't run any processors that do routing.
508 * Also don't bother with metering.
510 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
511 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
512 buffers.set_count ((*i)->output_streams());
513 latency += (*i)->signal_latency ();
516 if ((*i) == endpoint) {
523 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
524 bool include_endpoint, bool for_export, bool for_freeze) const
526 framecnt_t latency = 0;
527 if (!endpoint && !include_endpoint) {
531 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
532 if (!include_endpoint && (*i) == endpoint) {
535 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
538 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
541 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
542 latency += (*i)->signal_latency ();
544 if ((*i) == endpoint) {
552 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
553 bool include_endpoint, bool for_export, bool for_freeze) const
555 if (!endpoint && !include_endpoint) {
559 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
560 if (!include_endpoint && (*i) == endpoint) {
563 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
566 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
569 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
570 cc = (*i)->output_streams();
572 if ((*i) == endpoint) {
580 Route::n_process_buffers ()
582 return max (_input->n_ports(), processor_max_streams);
586 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
588 assert (is_monitor());
589 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
590 fill_buffers_with_input (bufs, _input, nframes);
591 passthru (bufs, start_frame, end_frame, nframes, declick);
595 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
599 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
601 /* control/monitor bus ignores input ports when something is
602 feeding the listen "stream". data will "arrive" into the
603 route from the intreturn processor element.
606 bufs.silence (nframes, 0);
609 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
610 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
614 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
616 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
618 bufs.set_count (_input->n_ports());
619 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
620 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
624 Route::set_listen (bool yn)
628 _monitor_send->activate ();
630 _monitor_send->deactivate ();
636 Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
638 /* nothing to do if we're not using AFL/PFL. But if we are, we need
639 to alter the active state of the monitor send.
642 if (Config->get_solo_control_is_listen_control ()) {
643 set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
648 Route::push_solo_isolate_upstream (int32_t delta)
650 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
652 boost::shared_ptr<RouteList> routes = _session.get_routes ();
653 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
655 if ((*i).get() == this || !(*i)->can_solo()) {
660 bool does_feed = feeds (*i, &sends_only);
662 if (does_feed && !sends_only) {
663 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
669 Route::push_solo_upstream (int delta)
671 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
672 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
676 boost::shared_ptr<Route> sr (i->r.lock());
678 sr->solo_control()->mod_solo_by_others_downstream (-delta);
685 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
687 cerr << name << " {" << endl;
688 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
689 p != procs.end(); ++p) {
690 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
696 /** Supposing that we want to insert a Processor at a given Placement, return
697 * the processor to add the new one before (or 0 to add at the end).
699 boost::shared_ptr<Processor>
700 Route::before_processor_for_placement (Placement p)
702 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
704 ProcessorList::iterator loc;
707 /* generic pre-fader: insert immediately before the amp */
708 loc = find (_processors.begin(), _processors.end(), _amp);
710 /* generic post-fader: insert right before the main outs */
711 loc = find (_processors.begin(), _processors.end(), _main_outs);
714 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
717 /** Supposing that we want to insert a Processor at a given index, return
718 * the processor to add the new one before (or 0 to add at the end).
720 boost::shared_ptr<Processor>
721 Route::before_processor_for_index (int index)
724 return boost::shared_ptr<Processor> ();
727 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
729 ProcessorList::iterator i = _processors.begin ();
731 while (i != _processors.end() && j < index) {
732 if ((*i)->display_to_user()) {
739 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
742 /** Add a processor either pre- or post-fader
743 * @return 0 on success, non-0 on failure.
746 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
748 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
752 /** Add a processor to a route such that it ends up with a given index into the visible processors.
753 * @param index Index to add the processor at, or -1 to add at the end of the list.
754 * @return 0 on success, non-0 on failure.
757 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
759 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
762 /** Add a processor to the route.
763 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
764 * @return 0 on success, non-0 on failure.
767 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
769 assert (processor != _meter);
770 assert (processor != _main_outs);
772 DEBUG_TRACE (DEBUG::Processors, string_compose (
773 "%1 adding processor %2\n", name(), processor->name()));
777 pl.push_back (processor);
778 int rv = add_processors (pl, before, err);
784 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
785 processor->activate ();
792 Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
794 /* We cannot destruct the processor here (usually RT-thread
795 * with various locks held - in case of sends also io_locks).
796 * Queue for deletion in low-priority thread.
798 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
799 selfdestruct_sequence.push_back (wp);
803 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
805 XMLProperty const * prop;
808 boost::shared_ptr<Processor> processor;
810 /* bit of a hack: get the `placement' property from the <Redirect> tag here
811 so that we can add the processor in the right place (pre/post-fader)
814 XMLNodeList const & children = node.children ();
815 XMLNodeList::const_iterator i = children.begin ();
817 while (i != children.end() && (*i)->name() != X_("Redirect")) {
821 Placement placement = PreFader;
823 if (i != children.end()) {
824 if ((prop = (*i)->property (X_("placement"))) != 0) {
825 placement = Placement (string_2_enum (prop->value(), placement));
829 if (node.name() == "Insert") {
831 if ((prop = node.property ("type")) != 0) {
833 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
834 prop->value() == "lv2" ||
835 prop->value() == "windows-vst" ||
836 prop->value() == "lxvst" ||
837 prop->value() == "audiounit") {
839 if (_session.get_disable_all_loaded_plugins ()) {
840 processor.reset (new UnknownProcessor (_session, node));
842 processor.reset (new PluginInsert (_session));
843 processor->set_owner (this);
848 processor.reset (new PortInsert (_session, _pannable, _mute_master));
853 } else if (node.name() == "Send") {
855 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
856 processor.reset (new Send (_session, sendpan, _mute_master));
860 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
864 if (processor->set_state (node, version)) {
868 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
869 if (i != children.end()) {
870 if ((prop = (*i)->property (X_("active"))) != 0) {
871 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
872 processor->activate();
874 processor->deactivate();
878 return (add_processor (processor, placement, 0, false) == 0);
881 catch (failed_constructor &err) {
882 warning << _("processor could not be created. Ignored.") << endmsg;
888 inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
889 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
892 inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
893 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
897 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
899 ProcessorList::iterator loc;
902 loc = find(_processors.begin(), _processors.end(), before);
903 if (loc == _processors.end ()) {
907 /* nothing specified - at end */
908 loc = _processors.end ();
911 if (!AudioEngine::instance()->connected()) {
915 if (others.empty()) {
919 ProcessorList to_skip;
921 // check if there's an instrument to replace or configure
922 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
923 boost::shared_ptr<PluginInsert> pi;
924 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
927 if (!pi->plugin ()->get_info ()->is_instrument ()) {
930 boost::shared_ptr<Processor> instrument = the_instrument ();
931 ChanCount in (DataType::MIDI, 1);
932 ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
934 PluginSetupOptions flags = None;
937 in = instrument->input_streams ();
938 out = instrument->output_streams ();
940 if (pi->has_output_presets (in, out)) {
944 pi->set_strict_io (_strict_io);
946 PluginSetupOptions mask = None;
947 if (Config->get_ask_replace_instrument ()) {
950 if (Config->get_ask_setup_instrument ()) {
957 boost::optional<int> rv = PluginSetup (shared_from_this (), pi, flags); /* EMIT SIGNAL */
958 switch (rv.get_value_or (0)) {
960 to_skip.push_back (*i); // don't add this one;
963 replace_processor (instrument, *i, err);
964 to_skip.push_back (*i);
973 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
974 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
975 ProcessorState pstate (this);
977 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
982 ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
983 if (check != to_skip.end()) {
987 boost::shared_ptr<PluginInsert> pi;
989 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
990 pi->set_strict_io (_strict_io);
994 /* Ensure that only one amp is in the list at any time */
995 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
996 if (check != _processors.end()) {
997 if (before == _amp) {
998 /* Already in position; all is well */
1001 _processors.erase (check);
1006 assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
1008 _processors.insert (loc, *i);
1009 (*i)->set_owner (this);
1012 if (configure_processors_unlocked (err, &lm)) {
1014 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
1019 if ((*i)->active()) {
1023 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1025 boost::shared_ptr<Send> send;
1026 if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
1027 send->SelfDestruct.connect_same_thread (*this,
1028 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
1032 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1033 boost::shared_ptr<PluginInsert> pi;
1035 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1036 if (pi->has_no_inputs ()) {
1037 _have_internal_generator = true;
1043 _output->set_user_latency (0);
1046 reset_instrument_info ();
1047 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1048 set_processor_positions ();
1054 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1056 if (p == PreFader) {
1057 start = _processors.begin();
1058 end = find(_processors.begin(), _processors.end(), _amp);
1060 start = find(_processors.begin(), _processors.end(), _amp);
1062 end = _processors.end();
1066 /** Turn off all processors with a given placement
1067 * @param p Placement of processors to disable
1070 Route::disable_processors (Placement p)
1072 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1074 ProcessorList::iterator start, end;
1075 placement_range(p, start, end);
1077 for (ProcessorList::iterator i = start; i != end; ++i) {
1078 (*i)->deactivate ();
1081 _session.set_dirty ();
1084 /** Turn off all redirects
1087 Route::disable_processors ()
1089 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1091 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1092 (*i)->deactivate ();
1095 _session.set_dirty ();
1098 /** Turn off all redirects with a given placement
1099 * @param p Placement of redirects to disable
1102 Route::disable_plugins (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 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1111 (*i)->deactivate ();
1115 _session.set_dirty ();
1118 /** Turn off all plugins
1121 Route::disable_plugins ()
1123 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1125 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1126 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1127 (*i)->deactivate ();
1131 _session.set_dirty ();
1136 Route::ab_plugins (bool forward)
1138 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1142 /* forward = turn off all active redirects, and mark them so that the next time
1143 we go the other way, we will revert them
1146 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1147 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1151 if ((*i)->active()) {
1152 (*i)->deactivate ();
1153 (*i)->set_next_ab_is_active (true);
1155 (*i)->set_next_ab_is_active (false);
1161 /* backward = if the redirect was marked to go active on the next ab, do so */
1163 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1165 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1169 if ((*i)->get_next_ab_is_active()) {
1172 (*i)->deactivate ();
1177 _session.set_dirty ();
1181 /** Remove processors with a given placement.
1182 * @param p Placement of processors to remove.
1185 Route::clear_processors (Placement p)
1187 if (!_session.engine().connected()) {
1191 bool already_deleting = _session.deletion_in_progress();
1192 if (!already_deleting) {
1193 _session.set_deletion_in_progress();
1197 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1198 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1199 ProcessorList new_list;
1200 ProcessorStreams err;
1201 bool seen_amp = false;
1203 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1209 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1211 /* you can't remove these */
1213 new_list.push_back (*i);
1220 new_list.push_back (*i);
1223 (*i)->drop_references ();
1231 (*i)->drop_references ();
1234 new_list.push_back (*i);
1241 _processors = new_list;
1242 configure_processors_unlocked (&err, &lm); // this can't fail
1245 processor_max_streams.reset();
1246 _have_internal_generator = false;
1247 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1248 set_processor_positions ();
1250 reset_instrument_info ();
1252 if (!already_deleting) {
1253 _session.clear_deletion_in_progress();
1258 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1260 // TODO once the export point can be configured properly, do something smarter here
1261 if (processor == _capturing_processor) {
1262 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1263 if (need_process_lock) {
1267 _capturing_processor.reset();
1269 if (need_process_lock) {
1274 /* these can never be removed */
1276 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1280 if (!_session.engine().connected()) {
1284 processor_max_streams.reset();
1287 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1288 if (need_process_lock) {
1292 /* Caller must hold process lock */
1293 assert (!AudioEngine::instance()->process_lock().trylock());
1295 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1297 ProcessorState pstate (this);
1299 ProcessorList::iterator i;
1300 bool removed = false;
1302 for (i = _processors.begin(); i != _processors.end(); ) {
1303 if (*i == processor) {
1305 /* move along, see failure case for configure_processors()
1306 where we may need to reconfigure the processor.
1309 /* stop redirects that send signals to JACK ports
1310 from causing noise as a result of no longer being
1314 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1315 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
1319 iop = pi->sidechain();
1326 i = _processors.erase (i);
1334 _output->set_user_latency (0);
1342 if (configure_processors_unlocked (err, &lm)) {
1344 /* we know this will work, because it worked before :) */
1345 configure_processors_unlocked (0, &lm);
1349 _have_internal_generator = false;
1351 for (i = _processors.begin(); i != _processors.end(); ++i) {
1352 boost::shared_ptr<PluginInsert> pi;
1354 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1355 if (pi->has_no_inputs ()) {
1356 _have_internal_generator = true;
1361 if (need_process_lock) {
1366 reset_instrument_info ();
1367 processor->drop_references ();
1368 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1369 set_processor_positions ();
1375 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1377 /* these can never be removed */
1378 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1381 /* and can't be used as substitute, either */
1382 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1386 /* I/Os are out, too */
1387 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1391 /* this function cannot be used to swap/reorder processors */
1392 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1396 if (!AudioEngine::instance()->connected() || !old || !sub) {
1400 /* ensure that sub is not owned by another route */
1401 if (sub->owner ()) {
1406 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1407 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1408 ProcessorState pstate (this);
1410 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1412 ProcessorList::iterator i;
1413 bool replaced = false;
1414 bool enable = old->active ();
1416 for (i = _processors.begin(); i != _processors.end(); ) {
1418 i = _processors.erase (i);
1419 _processors.insert (i, sub);
1420 sub->set_owner (this);
1433 boost::shared_ptr<PluginInsert> pi;
1434 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1435 pi->set_strict_io (true);
1439 if (configure_processors_unlocked (err, &lm)) {
1441 configure_processors_unlocked (0, &lm);
1445 _have_internal_generator = false;
1447 for (i = _processors.begin(); i != _processors.end(); ++i) {
1448 boost::shared_ptr<PluginInsert> pi;
1449 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1450 if (pi->has_no_inputs ()) {
1451 _have_internal_generator = true;
1461 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1462 _output->set_user_latency (0);
1465 reset_instrument_info ();
1466 old->drop_references ();
1467 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1468 set_processor_positions ();
1473 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1475 ProcessorList deleted;
1477 if (!_session.engine().connected()) {
1481 processor_max_streams.reset();
1484 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1485 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1486 ProcessorState pstate (this);
1488 ProcessorList::iterator i;
1489 boost::shared_ptr<Processor> processor;
1491 for (i = _processors.begin(); i != _processors.end(); ) {
1495 /* these can never be removed */
1497 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1502 /* see if its in the list of processors to delete */
1504 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1509 /* stop IOProcessors that send to JACK ports
1510 from causing noise as a result of no longer being
1514 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
1515 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
1518 iop = pi->sidechain();
1525 deleted.push_back (processor);
1526 i = _processors.erase (i);
1529 if (deleted.empty()) {
1530 /* none of those in the requested list were found */
1534 _output->set_user_latency (0);
1536 if (configure_processors_unlocked (err, &lm)) {
1538 /* we know this will work, because it worked before :) */
1539 configure_processors_unlocked (0, &lm);
1544 _have_internal_generator = false;
1546 for (i = _processors.begin(); i != _processors.end(); ++i) {
1547 boost::shared_ptr<PluginInsert> pi;
1549 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1550 if (pi->has_no_inputs ()) {
1551 _have_internal_generator = true;
1558 /* now try to do what we need to so that those that were removed will be deleted */
1560 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1561 (*i)->drop_references ();
1564 reset_instrument_info ();
1565 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1566 set_processor_positions ();
1572 Route::reset_instrument_info ()
1574 boost::shared_ptr<Processor> instr = the_instrument();
1576 _instrument_info.set_internal_instrument (instr);
1580 /** Caller must hold process lock */
1582 Route::configure_processors (ProcessorStreams* err)
1584 #ifndef PLATFORM_WINDOWS
1585 assert (!AudioEngine::instance()->process_lock().trylock());
1588 if (!_in_configure_processors) {
1589 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1590 return configure_processors_unlocked (err, &lm);
1597 Route::input_streams () const
1599 return _input->n_ports ();
1602 list<pair<ChanCount, ChanCount> >
1603 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1605 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1607 return try_configure_processors_unlocked (in, err);
1610 list<pair<ChanCount, ChanCount> >
1611 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1613 // Check each processor in order to see if we can configure as requested
1615 list<pair<ChanCount, ChanCount> > configuration;
1618 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1619 DEBUG_TRACE (DEBUG::Processors, "{\n");
1621 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1623 if ((*p)->can_support_io_configuration(in, out)) {
1625 if (boost::dynamic_pointer_cast<Delivery> (*p)
1626 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
1628 && (is_monitor() || _strict_io || Profile->get_mixbus ())) {
1629 /* with strict I/O the panner + output are forced to
1630 * follow the last processor's output.
1632 * Delivery::can_support_io_configuration() will only add ports,
1633 * but not remove excess ports.
1635 * This works because the delivery only requires
1636 * as many outputs as there are inputs.
1637 * Delivery::configure_io() will do the actual removal
1638 * by calling _output->ensure_io()
1640 if (!is_master() && _session.master_out ()) {
1641 /* ..but at least as many as there are master-inputs */
1642 // XXX this may need special-casing for mixbus (master-outputs)
1643 // and should maybe be a preference anyway ?!
1644 out = ChanCount::max (in, _session.master_out ()->n_inputs ());
1650 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1651 configuration.push_back(make_pair(in, out));
1654 // restriction for Monitor Section Processors
1655 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
1656 /* do not allow to add/remove channels (for now)
1657 * The Monitor follows the master-bus and has no panner (unpan)
1658 * but do allow processors with midi-in to be added (e.g VSTs with control that
1659 * will remain unconnected)
1661 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration not allowed.\n");
1662 return list<pair<ChanCount, ChanCount> > ();
1664 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
1665 // internal sends make no sense, only feedback
1666 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1667 return list<pair<ChanCount, ChanCount> > ();
1669 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
1670 /* External Sends can be problematic. one can add/remove ports
1671 * there signal leaves the DAW to external monitors anyway, so there's
1672 * no real use for allowing them here anyway.
1674 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
1675 return list<pair<ChanCount, ChanCount> > ();
1677 if (boost::dynamic_pointer_cast<Send> (*p)) {
1679 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1680 return list<pair<ChanCount, ChanCount> > ();
1689 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1690 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1691 DEBUG_TRACE (DEBUG::Processors, "}\n");
1692 return list<pair<ChanCount, ChanCount> > ();
1696 DEBUG_TRACE (DEBUG::Processors, "}\n");
1698 return configuration;
1701 /** Set the input/output configuration of each processor in the processors list.
1702 * Caller must hold process lock.
1703 * Return 0 on success, otherwise configuration is impossible.
1706 Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
1708 #ifndef PLATFORM_WINDOWS
1709 assert (!AudioEngine::instance()->process_lock().trylock());
1712 if (_in_configure_processors) {
1716 /* put invisible processors where they should be */
1717 setup_invisible_processors ();
1719 _in_configure_processors = true;
1721 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1723 if (configuration.empty ()) {
1724 _in_configure_processors = false;
1729 bool seen_mains_out = false;
1730 processor_out_streams = _input->n_ports();
1731 processor_max_streams.reset();
1733 /* processor configure_io() may result in adding ports
1734 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
1736 * with jack2 adding ports results in a graph-order callback,
1737 * which calls Session::resort_routes() and eventually
1738 * Route::direct_feeds_according_to_reality()
1739 * which takes a ReaderLock (_processor_lock).
1741 * so we can't hold a WriterLock here until jack2 threading
1744 * NB. we still hold the process lock
1746 * (ardour's own engines do call graph-order from the
1747 * process-thread and hence do not have this issue; besides
1748 * merely adding ports won't trigger a graph-order, only
1749 * making connections does)
1753 // TODO check for a potential ReaderLock after ReaderLock ??
1754 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
1756 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1757 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1759 if (!(*p)->configure_io(c->first, c->second)) {
1760 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1761 _in_configure_processors = false;
1766 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1767 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1769 boost::shared_ptr<IOProcessor> iop;
1770 boost::shared_ptr<PluginInsert> pi;
1771 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1772 /* plugins connected via Split or Hide Match may have more channels.
1773 * route/scratch buffers are needed for all of them
1774 * The configuration may only be a subset (both input and output)
1776 processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
1778 else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
1779 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
1780 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
1784 if (boost::dynamic_pointer_cast<Delivery> (*p)
1785 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1786 /* main delivery will increase port count to match input.
1787 * the Delivery::Main is usually the last processor - followed only by
1790 seen_mains_out = true;
1792 if (!seen_mains_out) {
1793 processor_out_streams = out;
1802 _meter->set_max_channels (processor_max_streams);
1805 /* make sure we have sufficient scratch buffers to cope with the new processor
1808 _session.ensure_buffers (n_process_buffers ());
1810 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1812 _in_configure_processors = false;
1816 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1817 * @param state New active state for those processors.
1820 Route::all_visible_processors_active (bool state)
1822 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1824 if (_processors.empty()) {
1828 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1829 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1836 (*i)->deactivate ();
1840 _session.set_dirty ();
1844 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1846 /* check if re-order requires re-configuration of any processors
1847 * -> compare channel configuration for all processors
1849 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1850 ChanCount c = input_streams ();
1852 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1854 if (c != (*j)->input_streams()) {
1857 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1860 if ((*i)->input_streams() != c) {
1863 c = (*i)->output_streams();
1875 __attribute__((annotate("realtime")))
1878 Route::apply_processor_order (const ProcessorList& new_order)
1880 /* need to hold processor_lock; either read or write lock
1881 * and the engine process_lock.
1882 * Due to r/w lock ambiguity we can only assert the latter
1884 assert (!AudioEngine::instance()->process_lock().trylock());
1887 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1888 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1889 * processors in the current actual processor list that are hidden. Any visible processors
1890 * in the current list but not in "new_order" will be assumed to be deleted.
1893 /* "as_it_will_be" and "_processors" are lists of shared pointers.
1894 * actual memory usage is small, but insert/erase is not actually rt-safe :(
1895 * (note though that ::processors_reorder_needs_configure() ensured that
1896 * this function will only ever be called from the rt-thread if no processor were removed)
1898 * either way, I can't proove it, but an x-run due to re-order here is less likley
1899 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
1902 ProcessorList as_it_will_be;
1903 ProcessorList::iterator oiter;
1904 ProcessorList::const_iterator niter;
1906 oiter = _processors.begin();
1907 niter = new_order.begin();
1909 while (niter != new_order.end()) {
1911 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1912 then append it to the temp list.
1914 Otherwise, see if the next processor in the old list is in the new list. if not,
1915 its been deleted. If its there, append it to the temp list.
1918 if (oiter == _processors.end()) {
1920 /* no more elements in the old list, so just stick the rest of
1921 the new order onto the temp list.
1924 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1925 while (niter != new_order.end()) {
1932 if (!(*oiter)->display_to_user()) {
1934 as_it_will_be.push_back (*oiter);
1938 /* visible processor: check that its in the new order */
1940 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1941 /* deleted: do nothing, shared_ptr<> will clean up */
1943 /* ignore this one, and add the next item from the new order instead */
1944 as_it_will_be.push_back (*niter);
1949 /* now remove from old order - its taken care of no matter what */
1950 oiter = _processors.erase (oiter);
1954 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1956 /* If the meter is in a custom position, find it and make a rough note of its position */
1957 maybe_note_meter_position ();
1961 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1963 // it a change is already queued, wait for it
1964 // (unless engine is stopped. apply immediately and proceed
1965 while (g_atomic_int_get (&_pending_process_reorder)) {
1966 if (!AudioEngine::instance()->running()) {
1967 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
1968 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1970 apply_processor_order(_pending_processor_order);
1971 setup_invisible_processors ();
1973 g_atomic_int_set (&_pending_process_reorder, 0);
1975 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1976 set_processor_positions ();
1978 // TODO rather use a semaphore or something.
1979 // but since ::reorder_processors() is called
1980 // from the GUI thread, this is fine..
1985 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
1987 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1988 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1989 ProcessorState pstate (this);
1991 apply_processor_order (new_order);
1993 if (configure_processors_unlocked (err, &lm)) {
2001 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2002 set_processor_positions ();
2005 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2006 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2008 // _pending_processor_order is protected by _processor_lock
2009 _pending_processor_order = new_order;
2010 g_atomic_int_set (&_pending_process_reorder, 1);
2017 Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
2019 boost::shared_ptr<PluginInsert> pi;
2020 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2024 if (pi->has_sidechain () == add) {
2025 return true; // ?? call failed, but result is as expected.
2029 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2030 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2031 if (i == _processors.end ()) {
2037 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
2038 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2039 PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
2041 lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
2043 if (!pi->add_sidechain ()) {
2047 if (!pi->del_sidechain ()) {
2053 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2058 pi->del_sidechain ();
2060 pi->add_sidechain ();
2061 // TODO restore side-chain's state.
2066 configure_processors_unlocked (0, &lm);
2069 if (pi->has_sidechain ()) {
2070 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2073 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2074 _session.set_dirty ();
2079 Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
2081 boost::shared_ptr<PluginInsert> pi;
2082 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2087 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2088 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2089 if (i == _processors.end ()) {
2095 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2096 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2098 const ChanCount& old (pi->preset_out ());
2099 if (!pi->set_preset_out (outs)) {
2100 return true; // no change, OK
2103 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2106 pi->set_preset_out (old);
2109 configure_processors_unlocked (0, &lm);
2112 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2113 _session.set_dirty ();
2118 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2121 return customize_plugin_insert (proc, 0, unused, unused);
2125 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
2127 boost::shared_ptr<PluginInsert> pi;
2128 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2133 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2134 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2135 if (i == _processors.end ()) {
2141 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2142 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2144 bool old_cust = pi->custom_cfg ();
2145 uint32_t old_cnt = pi->get_count ();
2146 ChanCount old_chan = pi->output_streams ();
2147 ChanCount old_sinks = pi->natural_input_streams ();
2150 pi->set_custom_cfg (false);
2152 pi->set_custom_cfg (true);
2153 pi->set_count (count);
2154 pi->set_outputs (outs);
2155 pi->set_sinks (sinks);
2158 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2162 pi->set_count (old_cnt);
2163 pi->set_sinks (old_sinks);
2164 pi->set_outputs (old_chan);
2165 pi->set_custom_cfg (old_cust);
2169 configure_processors_unlocked (0, &lm);
2172 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2173 _session.set_dirty ();
2178 Route::set_strict_io (const bool enable)
2180 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2182 if (_strict_io != enable) {
2183 _strict_io = enable;
2184 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2185 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2186 boost::shared_ptr<PluginInsert> pi;
2187 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2188 pi->set_strict_io (_strict_io);
2192 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2196 _strict_io = !enable; // restore old value
2197 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2198 boost::shared_ptr<PluginInsert> pi;
2199 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2200 pi->set_strict_io (_strict_io);
2207 configure_processors (0);
2210 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2211 _session.set_dirty ();
2223 Route::get_template()
2225 return state(false);
2229 Route::state(bool full_state)
2232 if (!_session._template_state_dir.empty()) {
2233 assert (!full_state); // only for templates
2234 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2237 XMLNode *node = new XMLNode("Route");
2238 ProcessorList::iterator i;
2241 id().print (buf, sizeof (buf));
2242 node->add_property("id", buf);
2243 node->add_property ("name", _name);
2244 node->add_property("default-type", _default_type.to_string());
2245 node->add_property ("strict-io", _strict_io);
2247 node->add_child_nocopy (_presentation_info.get_state());
2249 node->add_property("active", _active?"yes":"no");
2251 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2252 node->add_property("meter-point", enum_2_string (_meter_point));
2254 node->add_property("meter-type", enum_2_string (_meter_type));
2257 node->add_property("route-group", _route_group->name());
2260 node->add_child_nocopy (_solo_control->get_state ());
2261 node->add_child_nocopy (_solo_isolate_control->get_state ());
2262 node->add_child_nocopy (_solo_safe_control->get_state ());
2264 node->add_child_nocopy (_input->state (full_state));
2265 node->add_child_nocopy (_output->state (full_state));
2266 node->add_child_nocopy (_mute_master->get_state ());
2268 node->add_child_nocopy (_mute_control->get_state ());
2269 node->add_child_nocopy (_phase_control->get_state ());
2272 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2275 if (_comment.length()) {
2276 XMLNode *cmt = node->add_child ("Comment");
2277 cmt->add_content (_comment);
2281 node->add_child_nocopy (_pannable->state (full_state));
2285 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2286 for (i = _processors.begin(); i != _processors.end(); ++i) {
2288 /* template save: do not include internal sends functioning as
2289 aux sends because the chance of the target ID
2290 in the session where this template is used
2293 similarly, do not save listen sends which connect to
2294 the monitor section, because these will always be
2297 boost::shared_ptr<InternalSend> is;
2299 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2300 if (is->role() == Delivery::Listen) {
2305 node->add_child_nocopy((*i)->state (full_state));
2310 node->add_child_copy (*_extra_xml);
2313 if (_custom_meter_position_noted) {
2314 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2316 after->id().print (buf, sizeof (buf));
2317 node->add_property (X_("processor-after-last-custom-meter"), buf);
2321 if (!_session._template_state_dir.empty()) {
2322 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2325 node->add_child_copy (Slavable::get_state());
2331 Route::set_state (const XMLNode& node, int version)
2333 if (version < 3000) {
2334 return set_state_2X (node, version);
2338 XMLNodeConstIterator niter;
2340 XMLProperty const * prop;
2342 if (node.name() != "Route"){
2343 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2347 if ((prop = node.property (X_("name"))) != 0) {
2348 Route::set_name (prop->value());
2352 _initial_io_setup = true;
2354 Stripable::set_state (node, version);
2356 if ((prop = node.property (X_("strict-io"))) != 0) {
2357 _strict_io = string_is_affirmative (prop->value());
2361 _mute_master->set_solo_ignore (true);
2365 /* monitor bus does not get a panner, but if (re)created
2366 via XML, it will already have one by the time we
2367 call ::set_state(). so ... remove it.
2372 /* add all processors (except amp, which is always present) */
2374 nlist = node.children();
2375 XMLNode processor_state (X_("processor_state"));
2377 Stateful::save_extra_xml (node);
2379 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2383 if (child->name() == IO::state_node_name) {
2384 if ((prop = child->property (X_("direction"))) == 0) {
2388 if (prop->value() == "Input") {
2389 _input->set_state (*child, version);
2390 } else if (prop->value() == "Output") {
2391 _output->set_state (*child, version);
2394 } else if (child->name() == X_("Processor")) {
2395 processor_state.add_child_copy (*child);
2396 } else if (child->name() == X_("Pannable")) {
2398 _pannable->set_state (*child, version);
2400 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2402 } else if (child->name() == Controllable::xml_node_name) {
2403 if ((prop = child->property (X_("name"))) == 0) {
2407 if (prop->value() == _gain_control->name()) {
2408 _gain_control->set_state (*child, version);
2409 } else if (prop->value() == _solo_control->name()) {
2410 _solo_control->set_state (*child, version);
2411 } else if (prop->value() == _solo_safe_control->name()) {
2412 _solo_safe_control->set_state (*child, version);
2413 } else if (prop->value() == _solo_isolate_control->name()) {
2414 _solo_isolate_control->set_state (*child, version);
2415 } else if (prop->value() == _solo_control->name()) {
2416 _mute_control->set_state (*child, version);
2418 } else if (child->name() == Slavable::xml_node_name) {
2419 Slavable::set_state (*child, version);
2423 if ((prop = node.property (X_("meter-point"))) != 0) {
2424 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2425 set_meter_point (mp, true);
2427 _meter->set_display_to_user (_meter_point == MeterCustom);
2431 if ((prop = node.property (X_("meter-type"))) != 0) {
2432 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2435 _initial_io_setup = false;
2437 set_processor_state (processor_state);
2439 // this looks up the internal instrument in processors
2440 reset_instrument_info();
2442 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2443 set_denormal_protection (string_is_affirmative (prop->value()));
2446 if ((prop = node.property (X_("active"))) != 0) {
2447 bool yn = string_is_affirmative (prop->value());
2448 set_active (yn, this);
2451 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2452 PBD::ID id (prop->value ());
2453 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2454 ProcessorList::const_iterator i = _processors.begin ();
2455 while (i != _processors.end() && (*i)->id() != id) {
2459 if (i != _processors.end ()) {
2460 _processor_after_last_custom_meter = *i;
2461 _custom_meter_position_noted = true;
2465 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2468 if (child->name() == X_("Comment")) {
2470 /* XXX this is a terrible API design in libxml++ */
2472 XMLNode *cmt = *(child->children().begin());
2473 _comment = cmt->content();
2475 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2476 if (prop->value() == "solo") {
2477 _solo_control->set_state (*child, version);
2478 } else if (prop->value() == "mute") {
2479 _mute_control->set_state (*child, version);
2482 } else if (child->name() == MuteMaster::xml_node_name) {
2483 _mute_master->set_state (*child, version);
2485 } else if (child->name() == Automatable::xml_node_name) {
2486 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2494 Route::set_state_2X (const XMLNode& node, int version)
2498 XMLNodeConstIterator niter;
2500 XMLProperty const * prop;
2502 /* 2X things which still remain to be handled:
2508 if (node.name() != "Route") {
2509 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2513 Stripable::set_state (node, version);
2515 if (is_master() || is_monitor() || is_auditioner()) {
2516 _mute_master->set_solo_ignore (true);
2519 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2520 set_denormal_protection (string_is_affirmative (prop->value()));
2523 if ((prop = node.property (X_("muted"))) != 0) {
2526 bool muted = string_is_affirmative (prop->value());
2532 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2534 if (string_is_affirmative (prop->value())){
2535 mute_point = mute_point + "PreFader";
2540 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2542 if (string_is_affirmative (prop->value())){
2545 mute_point = mute_point + ",";
2548 mute_point = mute_point + "PostFader";
2553 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2555 if (string_is_affirmative (prop->value())){
2558 mute_point = mute_point + ",";
2561 mute_point = mute_point + "Listen";
2566 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2568 if (string_is_affirmative (prop->value())){
2571 mute_point = mute_point + ",";
2574 mute_point = mute_point + "Main";
2578 _mute_master->set_mute_points (mute_point);
2579 _mute_master->set_muted_by_self (true);
2583 if ((prop = node.property (X_("meter-point"))) != 0) {
2584 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2589 nlist = node.children ();
2590 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2594 if (child->name() == IO::state_node_name) {
2596 /* there is a note in IO::set_state_2X() about why we have to call
2600 _input->set_state_2X (*child, version, true);
2601 _output->set_state_2X (*child, version, false);
2603 if ((prop = child->property (X_("name"))) != 0) {
2604 Route::set_name (prop->value ());
2609 if ((prop = child->property (X_("active"))) != 0) {
2610 bool yn = string_is_affirmative (prop->value());
2611 _active = !yn; // force switch
2612 set_active (yn, this);
2615 if ((prop = child->property (X_("gain"))) != 0) {
2618 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2619 _amp->gain_control()->set_value (val, Controllable::NoGroup);
2623 /* Set up Panners in the IO */
2624 XMLNodeList io_nlist = child->children ();
2626 XMLNodeConstIterator io_niter;
2629 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2631 io_child = *io_niter;
2633 if (io_child->name() == X_("Panner")) {
2634 _main_outs->panner_shell()->set_state(*io_child, version);
2635 } else if (io_child->name() == X_("Automation")) {
2636 /* IO's automation is for the fader */
2637 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2643 XMLNodeList redirect_nodes;
2645 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2649 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2650 redirect_nodes.push_back(child);
2655 set_processor_state_2X (redirect_nodes, version);
2657 Stateful::save_extra_xml (node);
2659 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2662 if (child->name() == X_("Comment")) {
2664 /* XXX this is a terrible API design in libxml++ */
2666 XMLNode *cmt = *(child->children().begin());
2667 _comment = cmt->content();
2669 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2670 if (prop->value() == X_("solo")) {
2671 _solo_control->set_state (*child, version);
2672 } else if (prop->value() == X_("mute")) {
2673 _mute_control->set_state (*child, version);
2683 Route::get_processor_state ()
2685 XMLNode* root = new XMLNode (X_("redirects"));
2686 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2687 root->add_child_nocopy ((*i)->state (true));
2694 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2696 /* We don't bother removing existing processors not in nList, as this
2697 method will only be called when creating a Route from scratch, not
2698 for undo purposes. Just put processors in at the appropriate place
2702 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2703 add_processor_from_xml_2X (**i, version);
2708 Route::set_processor_state (const XMLNode& node)
2710 const XMLNodeList &nlist = node.children();
2711 XMLNodeConstIterator niter;
2712 ProcessorList new_order;
2713 bool must_configure = false;
2715 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2717 XMLProperty* prop = (*niter)->property ("type");
2719 if (prop->value() == "amp") {
2720 _amp->set_state (**niter, Stateful::current_state_version);
2721 new_order.push_back (_amp);
2722 } else if (prop->value() == "trim") {
2723 _trim->set_state (**niter, Stateful::current_state_version);
2724 new_order.push_back (_trim);
2725 } else if (prop->value() == "meter") {
2726 _meter->set_state (**niter, Stateful::current_state_version);
2727 new_order.push_back (_meter);
2728 } else if (prop->value() == "delay") {
2730 _delayline->set_state (**niter, Stateful::current_state_version);
2731 new_order.push_back (_delayline);
2733 } else if (prop->value() == "main-outs") {
2734 _main_outs->set_state (**niter, Stateful::current_state_version);
2735 } else if (prop->value() == "intreturn") {
2737 _intreturn.reset (new InternalReturn (_session));
2738 must_configure = true;
2740 _intreturn->set_state (**niter, Stateful::current_state_version);
2741 } else if (is_monitor() && prop->value() == "monitor") {
2742 if (!_monitor_control) {
2743 _monitor_control.reset (new MonitorProcessor (_session));
2744 must_configure = true;
2746 _monitor_control->set_state (**niter, Stateful::current_state_version);
2747 } else if (prop->value() == "capture") {
2748 /* CapturingProcessor should never be restored, it's always
2749 added explicitly when needed */
2751 ProcessorList::iterator o;
2753 for (o = _processors.begin(); o != _processors.end(); ++o) {
2754 XMLProperty const * id_prop = (*niter)->property(X_("id"));
2755 if (id_prop && (*o)->id() == id_prop->value()) {
2756 (*o)->set_state (**niter, Stateful::current_state_version);
2757 new_order.push_back (*o);
2762 // If the processor (*niter) is not on the route then create it
2764 if (o == _processors.end()) {
2766 boost::shared_ptr<Processor> processor;
2768 if (prop->value() == "intsend") {
2770 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2772 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2773 prop->value() == "lv2" ||
2774 prop->value() == "windows-vst" ||
2775 prop->value() == "lxvst" ||
2776 prop->value() == "luaproc" ||
2777 prop->value() == "audiounit") {
2779 if (_session.get_disable_all_loaded_plugins ()) {
2780 processor.reset (new UnknownProcessor (_session, **niter));
2782 processor.reset (new PluginInsert (_session));
2783 processor->set_owner (this);
2785 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
2786 pi->set_strict_io (true);
2790 } else if (prop->value() == "port") {
2792 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2794 } else if (prop->value() == "send") {
2796 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2797 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
2798 send->SelfDestruct.connect_same_thread (*this,
2799 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
2802 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2806 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2807 /* This processor could not be configured. Turn it into a UnknownProcessor */
2808 processor.reset (new UnknownProcessor (_session, **niter));
2811 /* subscribe to Sidechain IO changes */
2812 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
2813 if (pi && pi->has_sidechain ()) {
2814 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2817 /* we have to note the monitor send here, otherwise a new one will be created
2818 and the state of this one will be lost.
2820 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2821 if (isend && isend->role() == Delivery::Listen) {
2822 _monitor_send = isend;
2825 /* it doesn't matter if invisible processors are added here, as they
2826 will be sorted out by setup_invisible_processors () shortly.
2829 new_order.push_back (processor);
2830 must_configure = true;
2836 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2837 /* re-assign _processors w/o process-lock.
2838 * if there's an IO-processor present in _processors but
2839 * not in new_order, it will be deleted and ~IO takes
2842 _processors = new_order;
2843 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2845 if (must_configure) {
2846 configure_processors_unlocked (0, &lm);
2849 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2851 (*i)->set_owner (this);
2852 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2854 boost::shared_ptr<PluginInsert> pi;
2856 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2857 if (pi->has_no_inputs ()) {
2858 _have_internal_generator = true;
2865 reset_instrument_info ();
2866 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2867 set_processor_positions ();
2871 Route::curve_reallocate ()
2873 // _gain_automation_curve.finish_resize ();
2874 // _pan_automation_curve.finish_resize ();
2878 Route::silence (framecnt_t nframes)
2880 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2885 silence_unlocked (nframes);
2889 Route::silence_unlocked (framecnt_t nframes)
2891 /* Must be called with the processor lock held */
2895 _output->silence (nframes);
2897 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2898 boost::shared_ptr<PluginInsert> pi;
2900 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2901 // skip plugins, they don't need anything when we're not active
2905 (*i)->silence (nframes);
2908 if (nframes == _session.get_block_size()) {
2915 Route::add_internal_return ()
2918 _intreturn.reset (new InternalReturn (_session));
2919 add_processor (_intreturn, PreFader);
2924 Route::add_send_to_internal_return (InternalSend* send)
2926 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2928 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2929 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2932 return d->add_send (send);
2938 Route::remove_send_from_internal_return (InternalSend* send)
2940 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2942 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2943 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2946 return d->remove_send (send);
2952 Route::enable_monitor_send ()
2954 /* Caller must hold process lock */
2955 assert (!AudioEngine::instance()->process_lock().trylock());
2957 /* master never sends to monitor section via the normal mechanism */
2958 assert (!is_master ());
2959 assert (!is_monitor ());
2961 /* make sure we have one */
2962 if (!_monitor_send) {
2963 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
2964 _monitor_send->set_display_to_user (false);
2968 configure_processors (0);
2971 /** Add an aux send to a route.
2972 * @param route route to send to.
2973 * @param before Processor to insert before, or 0 to insert at the end.
2976 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2978 assert (route != _session.monitor_out ());
2981 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2983 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2985 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2987 if (d && d->target_route() == route) {
2988 /* already listening via the specified IO: do nothing */
2996 boost::shared_ptr<InternalSend> listener;
2999 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3000 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3001 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3004 add_processor (listener, before);
3006 } catch (failed_constructor& err) {
3014 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3016 ProcessorStreams err;
3017 ProcessorList::iterator tmp;
3020 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3022 /* have to do this early because otherwise processor reconfig
3023 * will put _monitor_send back in the list
3026 if (route == _session.monitor_out()) {
3027 _monitor_send.reset ();
3031 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3033 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3035 if (d && d->target_route() == route) {
3037 if (remove_processor (*x, &err, false) > 0) {
3043 /* list could have been demolished while we dropped the lock
3046 if (_session.engine().connected()) {
3047 /* i/o processors cannot be removed if the engine is not running
3048 * so don't live-loop in case the engine is N/A or dies
3058 Route::set_comment (string cmt, void *src)
3062 _session.set_dirty ();
3066 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3068 FeedRecord fr (other, via_sends_only);
3070 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3072 if (!result.second) {
3074 /* already a record for "other" - make sure sends-only information is correct */
3075 if (!via_sends_only && result.first->sends_only) {
3076 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3077 frp->sends_only = false;
3081 return result.second;
3085 Route::clear_fed_by ()
3091 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3093 const FedBy& fed_by (other->fed_by());
3095 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3096 boost::shared_ptr<Route> sr = f->r.lock();
3098 if (sr && (sr.get() == this)) {
3100 if (via_sends_only) {
3101 *via_sends_only = f->sends_only;
3112 Route::all_inputs () const
3114 /* TODO, if this works as expected,
3115 * cache the IOVector and maintain it via
3116 * input_change_handler(), sidechain_change_handler() etc
3119 ios.push_back (_input);
3121 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3122 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3124 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3125 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3128 iop = pi->sidechain();
3131 if (iop != 0 && iop->input()) {
3132 ios.push_back (iop->input());
3139 Route::all_outputs () const
3142 // _output is included via Delivery
3143 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3144 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3145 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3146 if (iop != 0 && iop->output()) {
3147 ios.push_back (iop->output());
3154 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3156 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3157 if (other->all_inputs().fed_by (_output)) {
3158 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3159 if (via_send_only) {
3160 *via_send_only = false;
3166 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3168 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3170 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3171 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3174 iop = pi->sidechain();
3178 boost::shared_ptr<const IO> iop_out = iop->output();
3179 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3180 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3181 if (via_send_only) {
3182 *via_send_only = true;
3186 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3189 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3194 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3199 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3201 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3205 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3207 return _session._current_route_graph.feeds (shared_from_this (), other);
3210 /** Called from the (non-realtime) butler thread when the transport is stopped */
3212 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3214 framepos_t now = _session.transport_frame();
3217 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3219 Automatable::transport_stopped (now);
3221 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3223 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3227 (*i)->transport_stopped (now);
3231 _roll_delay = _initial_delay;
3235 Route::input_change_handler (IOChange change, void * /*src*/)
3237 if ((change.type & IOChange::ConfigurationChanged)) {
3238 /* This is called with the process lock held if change
3239 contains ConfigurationChanged
3241 configure_processors (0);
3242 _phase_control->resize (_input->n_ports().n_audio ());
3243 io_changed (); /* EMIT SIGNAL */
3246 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3249 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3250 if (_input->connected()) {
3251 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3252 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3256 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3257 if (does_feed && !sends_only) {
3258 if ((*i)->soloed()) {
3261 if ((*i)->solo_isolate_control()->solo_isolated()) {
3268 int delta = sbou - _solo_control->soloed_by_others_upstream();
3269 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3272 PBD::warning << string_compose (
3273 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3274 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3279 if (_solo_control->soloed_by_others_upstream()) {
3280 // ignore new connections (they're not propagated)
3282 _solo_control->mod_solo_by_others_upstream (delta);
3286 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3287 // solo-isolate currently only propagates downstream
3289 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3291 //_solo_isolated_by_upstream = ibou;
3294 // Session::route_solo_changed does not propagate indirect solo-changes
3295 // propagate downstream to tracks
3296 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3297 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3301 bool does_feed = feeds (*i, &sends_only);
3302 if (delta <= 0 && does_feed && !sends_only) {
3303 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3306 if (idelta < 0 && does_feed && !sends_only) {
3307 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3314 Route::output_change_handler (IOChange change, void * /*src*/)
3316 if (_initial_io_setup) {
3320 if ((change.type & IOChange::ConfigurationChanged)) {
3321 /* This is called with the process lock held if change
3322 contains ConfigurationChanged
3324 configure_processors (0);
3327 _session.reset_monitor_section();
3330 io_changed (); /* EMIT SIGNAL */
3333 if (_solo_control->soloed_by_others_downstream()) {
3335 /* checking all all downstream routes for
3336 * explicit of implict solo is a rather drastic measure,
3337 * ideally the input_change_handler() of the other route
3338 * would propagate the change to us.
3340 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3341 if (_output->connected()) {
3342 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3343 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3347 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3348 if (does_feed && !sends_only) {
3349 if ((*i)->soloed()) {
3356 int delta = sbod - _solo_control->soloed_by_others_downstream();
3358 // do not allow new connections to change implicit solo (no propagation)
3359 _solo_control->mod_solo_by_others_downstream (delta);
3360 // Session::route_solo_changed() does not propagate indirect solo-changes
3361 // propagate upstream to tracks
3362 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3363 if ((*i).get() == this || !can_solo()) {
3367 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3368 if (delta != 0 && does_feed && !sends_only) {
3369 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3378 Route::sidechain_change_handler (IOChange change, void* src)
3380 if (_initial_io_setup || _in_sidechain_setup) {
3384 input_change_handler (change, src);
3388 Route::pans_required () const
3390 if (n_outputs().n_audio() < 2) {
3394 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3398 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3400 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3406 if (n_outputs().n_total() == 0) {
3410 if (!_active || n_inputs() == ChanCount::ZERO) {
3411 silence_unlocked (nframes);
3415 if (session_state_changing) {
3416 if (_session.transport_speed() != 0.0f) {
3417 /* we're rolling but some state is changing (e.g. our diskstream contents)
3418 so we cannot use them. Be silent till this is over.
3420 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3422 silence_unlocked (nframes);
3425 /* we're really not rolling, so we're either delivery silence or actually
3426 monitoring, both of which are safe to do while session_state_changing is true.
3430 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3432 fill_buffers_with_input (bufs, _input, nframes);
3434 if (_meter_point == MeterInput) {
3435 _meter->run (bufs, start_frame, end_frame, nframes, true);
3438 _amp->apply_gain_automation (false);
3439 _trim->apply_gain_automation (false);
3440 passthru (bufs, start_frame, end_frame, nframes, 0);
3446 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3448 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3453 if (n_outputs().n_total() == 0) {
3457 if (!_active || n_inputs().n_total() == 0) {
3458 silence_unlocked (nframes);
3462 framepos_t unused = 0;
3464 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3470 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3472 fill_buffers_with_input (bufs, _input, nframes);
3474 if (_meter_point == MeterInput) {
3475 _meter->run (bufs, start_frame, end_frame, nframes, true);
3478 passthru (bufs, start_frame, end_frame, nframes, declick);
3484 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3491 Route::flush_processors ()
3493 /* XXX shouldn't really try to take this lock, since
3494 this is called from the RT audio thread.
3497 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3499 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3505 __attribute__((annotate("realtime")))
3508 Route::apply_processor_changes_rt ()
3510 int emissions = EmitNone;
3512 if (_pending_meter_point != _meter_point) {
3513 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3515 /* meters always have buffers for 'processor_max_streams'
3516 * they can be re-positioned without re-allocation */
3517 if (set_meter_point_unlocked()) {
3518 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3520 emissions |= EmitMeterChanged;
3525 bool changed = false;
3527 if (g_atomic_int_get (&_pending_process_reorder)) {
3528 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3530 apply_processor_order (_pending_processor_order);
3531 setup_invisible_processors ();
3533 g_atomic_int_set (&_pending_process_reorder, 0);
3534 emissions |= EmitRtProcessorChange;
3538 set_processor_positions ();
3540 if (emissions != 0) {
3541 g_atomic_int_set (&_pending_signals, emissions);
3544 return (!selfdestruct_sequence.empty ());
3548 Route::emit_pending_signals ()
3550 int sig = g_atomic_int_and (&_pending_signals, 0);
3551 if (sig & EmitMeterChanged) {
3552 _meter->emit_configuration_changed();
3553 meter_change (); /* EMIT SIGNAL */
3554 if (sig & EmitMeterVisibilityChange) {
3555 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3557 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3560 if (sig & EmitRtProcessorChange) {
3561 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3564 /* this would be a job for the butler.
3565 * Conceptually we should not take processe/processor locks here.
3566 * OTOH its more efficient (less overhead for summoning the butler and
3567 * telling her what do do) and signal emission is called
3568 * directly after the process callback, which decreases the chance
3569 * of x-runs when taking the locks.
3571 while (!selfdestruct_sequence.empty ()) {
3572 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3573 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3574 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3575 selfdestruct_sequence.pop_back ();
3578 remove_processor (proc);
3584 Route::set_meter_point (MeterPoint p, bool force)
3586 if (_pending_meter_point == p && !force) {
3590 if (force || !AudioEngine::instance()->running()) {
3591 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3592 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3593 _pending_meter_point = p;
3594 _meter->emit_configuration_changed();
3595 meter_change (); /* EMIT SIGNAL */
3596 if (set_meter_point_unlocked()) {
3597 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3599 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3602 _pending_meter_point = p;
3608 __attribute__((annotate("realtime")))
3611 Route::set_meter_point_unlocked ()
3614 /* Caller must hold process and processor write lock */
3615 assert (!AudioEngine::instance()->process_lock().trylock());
3616 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3617 assert (!lm.locked ());
3620 _meter_point = _pending_meter_point;
3622 bool meter_was_visible_to_user = _meter->display_to_user ();
3624 if (!_custom_meter_position_noted) {
3625 maybe_note_meter_position ();
3628 if (_meter_point != MeterCustom) {
3630 _meter->set_display_to_user (false);
3632 setup_invisible_processors ();
3635 _meter->set_display_to_user (true);
3637 /* If we have a previous position for the custom meter, try to put it there */
3638 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3640 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3641 if (i != _processors.end ()) {
3642 _processors.remove (_meter);
3643 _processors.insert (i, _meter);
3645 } else {// at end, right before the mains_out/panner
3646 _processors.remove (_meter);
3647 ProcessorList::iterator main = _processors.end();
3648 _processors.insert (--main, _meter);
3652 /* Set up the meter for its new position */
3654 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3658 if (loc == _processors.begin()) {
3659 m_in = _input->n_ports();
3661 ProcessorList::iterator before = loc;
3663 m_in = (*before)->output_streams ();
3666 _meter->reflect_inputs (m_in);
3668 /* we do not need to reconfigure the processors, because the meter
3669 (a) is always ready to handle processor_max_streams
3670 (b) is always an N-in/N-out processor, and thus moving
3671 it doesn't require any changes to the other processors.
3674 /* these should really be done after releasing the lock
3675 * but all those signals are subscribed to with gui_thread()
3678 return (_meter->display_to_user() != meter_was_visible_to_user);
3682 Route::listen_position_changed ()
3685 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3686 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3687 ProcessorState pstate (this);
3689 if (configure_processors_unlocked (0, &lm)) {
3690 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3692 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3697 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3698 _session.set_dirty ();
3701 boost::shared_ptr<CapturingProcessor>
3702 Route::add_export_point()
3704 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3705 if (!_capturing_processor) {
3707 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3708 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3710 _capturing_processor.reset (new CapturingProcessor (_session));
3711 _capturing_processor->activate ();
3713 configure_processors_unlocked (0, &lw);
3717 return _capturing_processor;
3721 Route::update_signal_latency ()
3723 framecnt_t l = _output->user_latency();
3724 framecnt_t lamp = 0;
3725 bool before_amp = true;
3726 framecnt_t ltrim = 0;
3727 bool before_trim = true;
3729 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3730 if ((*i)->active ()) {
3731 l += (*i)->signal_latency ();
3736 if ((*i) == _trim) {
3747 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3749 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3750 _signal_latency_at_amp_position = lamp;
3751 _signal_latency_at_trim_position = ltrim;
3753 if (_signal_latency != l) {
3754 _signal_latency = l;
3755 signal_latency_changed (); /* EMIT SIGNAL */
3758 return _signal_latency;
3762 Route::set_user_latency (framecnt_t nframes)
3764 _output->set_user_latency (nframes);
3765 _session.update_latency_compensation ();
3769 Route::set_latency_compensation (framecnt_t longest_session_latency)
3771 framecnt_t old = _initial_delay;
3773 if (_signal_latency < longest_session_latency) {
3774 _initial_delay = longest_session_latency - _signal_latency;
3779 DEBUG_TRACE (DEBUG::Latency, string_compose (
3780 "%1: compensate for maximum latency of %2,"
3781 "given own latency of %3, using initial delay of %4\n",
3782 name(), longest_session_latency, _signal_latency, _initial_delay));
3784 if (_initial_delay != old) {
3785 initial_delay_changed (); /* EMIT SIGNAL */
3788 if (_session.transport_stopped()) {
3789 _roll_delay = _initial_delay;
3794 Route::set_block_size (pframes_t nframes)
3796 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3797 (*i)->set_block_size (nframes);
3800 _session.ensure_buffers (n_process_buffers ());
3804 Route::protect_automation ()
3806 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3807 (*i)->protect_automation();
3810 /** @param declick 1 to set a pending declick fade-in,
3811 * -1 to set a pending declick fade-out
3814 Route::set_pending_declick (int declick)
3817 /* this call is not allowed to turn off a pending declick */
3819 _pending_declick = declick;
3822 _pending_declick = 0;
3826 /** Shift automation forwards from a particular place, thereby inserting time.
3827 * Adds undo commands for any shifts that are performed.
3829 * @param pos Position to start shifting from.
3830 * @param frames Amount to shift forwards by.
3834 Route::shift (framepos_t pos, framecnt_t frames)
3836 /* gain automation */
3838 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3840 XMLNode &before = gc->alist()->get_state ();
3841 gc->alist()->shift (pos, frames);
3842 XMLNode &after = gc->alist()->get_state ();
3843 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3846 /* gain automation */
3848 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3850 XMLNode &before = gc->alist()->get_state ();
3851 gc->alist()->shift (pos, frames);
3852 XMLNode &after = gc->alist()->get_state ();
3853 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3856 // TODO mute automation ??
3858 /* pan automation */
3860 ControlSet::Controls& c (_pannable->controls());
3862 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3863 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3865 boost::shared_ptr<AutomationList> al = pc->alist();
3866 XMLNode& before = al->get_state ();
3867 al->shift (pos, frames);
3868 XMLNode& after = al->get_state ();
3869 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3874 /* redirect automation */
3876 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3877 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3879 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3881 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3882 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3884 boost::shared_ptr<AutomationList> al = ac->alist();
3885 XMLNode &before = al->get_state ();
3886 al->shift (pos, frames);
3887 XMLNode &after = al->get_state ();
3888 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3896 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
3898 boost::shared_ptr<Processor> processor (p.lock ());
3899 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
3903 pi->set_state_dir (d);
3907 Route::save_as_template (const string& path, const string& name)
3909 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
3910 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
3912 XMLNode& node (state (false));
3916 IO::set_name_in_state (*node.children().front(), name);
3918 tree.set_root (&node);
3920 /* return zero on success, non-zero otherwise */
3921 return !tree.write (path.c_str());
3926 Route::set_name (const string& str)
3928 if (str == name()) {
3932 string name = Route::ensure_track_or_route_name (str, _session);
3933 SessionObject::set_name (name);
3935 bool ret = (_input->set_name(name) && _output->set_name(name));
3938 /* rename the main outs. Leave other IO processors
3939 * with whatever name they already have, because its
3940 * just fine as it is (it will not contain the route
3941 * name if its a port insert, port send or port return).
3945 if (_main_outs->set_name (name)) {
3946 /* XXX returning false here is stupid because
3947 we already changed the route name.
3957 /** Set the name of a route in an XML description.
3958 * @param node XML <Route> node to set the name in.
3959 * @param name New name.
3962 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
3964 node.add_property (X_("name"), name);
3966 XMLNodeList children = node.children();
3967 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3969 if ((*i)->name() == X_("IO")) {
3971 IO::set_name_in_state (**i, name);
3973 } else if ((*i)->name() == X_("Processor")) {
3975 XMLProperty const * role = (*i)->property (X_("role"));
3976 if (role && role->value() == X_("Main")) {
3977 (*i)->add_property (X_("name"), name);
3980 } else if ((*i)->name() == X_("Diskstream")) {
3982 if (rename_playlist) {
3983 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3985 (*i)->add_property (X_("name"), name);
3991 boost::shared_ptr<Send>
3992 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3994 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3996 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3997 boost::shared_ptr<InternalSend> send;
3999 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4000 if (send->target_route() == target) {
4006 return boost::shared_ptr<Send>();
4010 Route::set_denormal_protection (bool yn)
4012 if (_denormal_protection != yn) {
4013 _denormal_protection = yn;
4014 denormal_protection_changed (); /* EMIT SIGNAL */
4019 Route::denormal_protection () const
4021 return _denormal_protection;
4025 Route::set_active (bool yn, void* src)
4027 if (_session.transport_rolling()) {
4031 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4032 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4036 if (_active != yn) {
4038 _input->set_active (yn);
4039 _output->set_active (yn);
4040 active_changed (); // EMIT SIGNAL
4041 _session.set_dirty ();
4045 boost::shared_ptr<Pannable>
4046 Route::pannable() const
4051 boost::shared_ptr<Panner>
4052 Route::panner() const
4055 return _main_outs->panner_shell()->panner();
4058 boost::shared_ptr<PannerShell>
4059 Route::panner_shell() const
4061 return _main_outs->panner_shell();
4064 boost::shared_ptr<GainControl>
4065 Route::gain_control() const
4067 return _gain_control;
4070 boost::shared_ptr<GainControl>
4071 Route::trim_control() const
4073 return _trim_control;
4076 boost::shared_ptr<PhaseControl>
4077 Route::phase_control() const
4079 return _phase_control;
4082 boost::shared_ptr<AutomationControl>
4083 Route::get_control (const Evoral::Parameter& param)
4085 /* either we own the control or .... */
4087 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4091 /* maybe one of our processors does or ... */
4093 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4094 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4095 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4103 /* nobody does so we'll make a new one */
4105 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4112 boost::shared_ptr<Processor>
4113 Route::nth_plugin (uint32_t n) const
4115 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4116 ProcessorList::const_iterator i;
4118 for (i = _processors.begin(); i != _processors.end(); ++i) {
4119 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4126 return boost::shared_ptr<Processor> ();
4129 boost::shared_ptr<Processor>
4130 Route::nth_send (uint32_t n) const
4132 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4133 ProcessorList::const_iterator i;
4135 for (i = _processors.begin(); i != _processors.end(); ++i) {
4136 if (boost::dynamic_pointer_cast<Send> (*i)) {
4138 if ((*i)->name().find (_("Monitor")) == 0) {
4139 /* send to monitor section is not considered
4140 to be an accessible send.
4151 return boost::shared_ptr<Processor> ();
4155 Route::has_io_processor_named (const string& name)
4157 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4158 ProcessorList::iterator i;
4160 for (i = _processors.begin(); i != _processors.end(); ++i) {
4161 if (boost::dynamic_pointer_cast<Send> (*i) ||
4162 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4163 if ((*i)->name() == name) {
4173 Route::set_processor_positions ()
4175 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4177 bool had_amp = false;
4178 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4179 (*i)->set_pre_fader (!had_amp);
4186 /** Called when there is a proposed change to the input port count */
4188 Route::input_port_count_changing (ChanCount to)
4190 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4192 /* The processors cannot be configured with the new input arrangement, so
4198 /* The change is ok */
4202 /** Called when there is a proposed change to the output port count */
4204 Route::output_port_count_changing (ChanCount to)
4206 if (_strict_io && !_in_configure_processors) {
4209 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4210 if (processor_out_streams.get(*t) > to.get(*t)) {
4214 /* The change is ok */
4219 Route::unknown_processors () const
4223 if (_session.get_disable_all_loaded_plugins ()) {
4224 // Do not list "missing plugins" if they are explicitly disabled
4228 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4229 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4230 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4231 p.push_back ((*i)->name ());
4240 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4242 /* we assume that all our input ports feed all our output ports. its not
4243 universally true, but the alternative is way too corner-case to worry about.
4246 LatencyRange all_connections;
4249 all_connections.min = 0;
4250 all_connections.max = 0;
4252 all_connections.min = ~((pframes_t) 0);
4253 all_connections.max = 0;
4255 /* iterate over all "from" ports and determine the latency range for all of their
4256 connections to the "outside" (outside of this Route).
4259 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4263 p->get_connected_latency_range (range, playback);
4265 all_connections.min = min (all_connections.min, range.min);
4266 all_connections.max = max (all_connections.max, range.max);
4270 /* set the "from" port latencies to the max/min range of all their connections */
4272 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4273 p->set_private_latency_range (all_connections, playback);
4276 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4278 all_connections.min += our_latency;
4279 all_connections.max += our_latency;
4281 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4282 p->set_private_latency_range (all_connections, playback);
4285 return all_connections.max;
4289 Route::set_private_port_latencies (bool playback) const
4291 framecnt_t own_latency = 0;
4293 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4294 OR LATENCY CALLBACK.
4296 This is called (early) from the latency callback. It computes the REAL
4297 latency associated with each port and stores the result as the "private"
4298 latency of the port. A later call to Route::set_public_port_latencies()
4299 sets all ports to the same value to reflect the fact that we do latency
4300 compensation and so all signals are delayed by the same amount as they
4301 flow through ardour.
4304 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4305 if ((*i)->active ()) {
4306 own_latency += (*i)->signal_latency ();
4311 /* playback: propagate latency from "outside the route" to outputs to inputs */
4312 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4314 /* capture: propagate latency from "outside the route" to inputs to outputs */
4315 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4320 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4322 /* this is called to set the JACK-visible port latencies, which take
4323 latency compensation into account.
4332 const PortSet& ports (_input->ports());
4333 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4334 p->set_public_latency_range (range, playback);
4339 const PortSet& ports (_output->ports());
4340 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4341 p->set_public_latency_range (range, playback);
4346 /** Put the invisible processors in the right place in _processors.
4347 * Must be called with a writer lock on _processor_lock held.
4350 __attribute__((annotate("realtime")))
4353 Route::setup_invisible_processors ()
4356 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4357 assert (!lm.locked ());
4361 /* too early to be doing this stuff */
4365 /* we'll build this new list here and then use it
4367 * TODO put the ProcessorList is on the stack for RT-safety.
4370 ProcessorList new_processors;
4372 /* find visible processors */
4374 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4375 if ((*i)->display_to_user ()) {
4376 new_processors.push_back (*i);
4382 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4384 if (amp == new_processors.end ()) {
4385 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4386 new_processors.push_front (_amp);
4387 amp = find (new_processors.begin(), new_processors.end(), _amp);
4390 /* and the processor after the amp */
4392 ProcessorList::iterator after_amp = amp;
4398 switch (_meter_point) {
4400 assert (!_meter->display_to_user ());
4401 new_processors.push_front (_meter);
4404 assert (!_meter->display_to_user ());
4405 new_processors.insert (amp, _meter);
4407 case MeterPostFader:
4408 /* do nothing here */
4411 /* do nothing here */
4414 /* the meter is visible, so we don't touch it here */
4421 assert (_main_outs);
4422 assert (!_main_outs->display_to_user ());
4423 new_processors.push_back (_main_outs);
4425 /* iterator for the main outs */
4427 ProcessorList::iterator main = new_processors.end();
4430 /* OUTPUT METERING */
4432 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4433 assert (!_meter->display_to_user ());
4435 /* add the processor just before or just after the main outs */
4437 ProcessorList::iterator meter_point = main;
4439 if (_meter_point == MeterOutput) {
4442 new_processors.insert (meter_point, _meter);
4447 if (_monitor_send && !is_monitor ()) {
4448 assert (!_monitor_send->display_to_user ());
4449 switch (Config->get_listen_position ()) {
4450 case PreFaderListen:
4451 switch (Config->get_pfl_position ()) {
4452 case PFLFromBeforeProcessors:
4453 new_processors.push_front (_monitor_send);
4455 case PFLFromAfterProcessors:
4456 new_processors.insert (amp, _monitor_send);
4459 _monitor_send->set_can_pan (false);
4461 case AfterFaderListen:
4462 switch (Config->get_afl_position ()) {
4463 case AFLFromBeforeProcessors:
4464 new_processors.insert (after_amp, _monitor_send);
4466 case AFLFromAfterProcessors:
4467 new_processors.insert (new_processors.end(), _monitor_send);
4470 _monitor_send->set_can_pan (true);
4475 #if 0 // not used - just yet
4476 if (!is_master() && !is_monitor() && !is_auditioner()) {
4477 new_processors.push_front (_delayline);
4481 /* MONITOR CONTROL */
4483 if (_monitor_control && is_monitor ()) {
4484 assert (!_monitor_control->display_to_user ());
4485 new_processors.insert (amp, _monitor_control);
4488 /* INTERNAL RETURN */
4490 /* doing this here means that any monitor control will come just after
4495 assert (!_intreturn->display_to_user ());
4496 new_processors.push_front (_intreturn);
4499 if (_trim && _trim->active()) {
4500 assert (!_trim->display_to_user ());
4501 new_processors.push_front (_trim);
4503 /* EXPORT PROCESSOR */
4505 if (_capturing_processor) {
4506 assert (!_capturing_processor->display_to_user ());
4507 new_processors.push_front (_capturing_processor);
4510 _processors = new_processors;
4512 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4513 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4518 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4519 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4520 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4527 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4528 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4532 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4533 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4540 /** If the meter point is `Custom', make a note of where the meter is.
4541 * This is so that if the meter point is subsequently set to something else,
4542 * and then back to custom, we can put the meter back where it was last time
4543 * custom was enabled.
4545 * Must be called with the _processor_lock held.
4548 Route::maybe_note_meter_position ()
4550 if (_meter_point != MeterCustom) {
4554 _custom_meter_position_noted = true;
4555 /* custom meter points range from after trim to before panner/main_outs
4556 * this is a limitation by the current processor UI
4558 bool seen_trim = false;
4559 _processor_after_last_custom_meter.reset();
4560 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4561 if ((*i) == _trim) {
4564 if ((*i) == _main_outs) {
4565 _processor_after_last_custom_meter = *i;
4568 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4570 _processor_after_last_custom_meter = _trim;
4572 ProcessorList::iterator j = i;
4574 assert(j != _processors.end ()); // main_outs should be before
4575 _processor_after_last_custom_meter = *j;
4580 assert(_processor_after_last_custom_meter.lock());
4583 boost::shared_ptr<Processor>
4584 Route::processor_by_id (PBD::ID id) const
4586 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4587 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4588 if ((*i)->id() == id) {
4593 return boost::shared_ptr<Processor> ();
4596 /** @return the monitoring state, or in other words what data we are pushing
4597 * into the route (data from the inputs, data from disk or silence)
4600 Route::monitoring_state () const
4602 return MonitoringInput;
4605 /** @return what we should be metering; either the data coming from the input
4606 * IO or the data that is flowing through the route.
4609 Route::metering_state () const
4611 return MeteringRoute;
4615 Route::has_external_redirects () const
4617 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4619 /* ignore inactive processors and obviously ignore the main
4620 * outs since everything has them and we don't care.
4623 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4631 boost::shared_ptr<Processor>
4632 Route::the_instrument () const
4634 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4635 return the_instrument_unlocked ();
4638 boost::shared_ptr<Processor>
4639 Route::the_instrument_unlocked () const
4641 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4642 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4643 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4647 return boost::shared_ptr<Processor>();
4653 Route::non_realtime_locate (framepos_t pos)
4656 _pannable->transport_located (pos);
4659 if (_delayline.get()) {
4660 _delayline.get()->flush();
4664 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4665 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4667 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4668 (*i)->transport_located (pos);
4671 _roll_delay = _initial_delay;
4675 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4682 * We don't currently mix MIDI input together, so we don't need the
4683 * complex logic of the audio case.
4686 n_buffers = bufs.count().n_midi ();
4688 for (i = 0; i < n_buffers; ++i) {
4690 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4691 MidiBuffer& buf (bufs.get_midi (i));
4694 buf.copy (source_port->get_midi_buffer(nframes));
4696 buf.silence (nframes);
4702 n_buffers = bufs.count().n_audio();
4704 size_t n_ports = io->n_ports().n_audio();
4705 float scaling = 1.0f;
4707 if (n_ports > n_buffers) {
4708 scaling = ((float) n_buffers) / n_ports;
4711 for (i = 0; i < n_ports; ++i) {
4713 /* if there are more ports than buffers, map them onto buffers
4714 * in a round-robin fashion
4717 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4718 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4721 if (i < n_buffers) {
4723 /* first time through just copy a channel into
4727 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4729 if (scaling != 1.0f) {
4730 buf.apply_gain (scaling, nframes);
4735 /* on subsequent times around, merge data from
4736 * the port with what is already there
4739 if (scaling != 1.0f) {
4740 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4742 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4747 /* silence any remaining buffers */
4749 for (; i < n_buffers; ++i) {
4750 AudioBuffer& buf (bufs.get_audio (i));
4751 buf.silence (nframes);
4754 /* establish the initial setup of the buffer set, reflecting what was
4755 copied into it. unless, of course, we are the auditioner, in which
4756 case nothing was fed into it from the inputs at all.
4759 if (!is_auditioner()) {
4760 bufs.set_count (io->n_ports());
4764 boost::shared_ptr<AutomationControl>
4765 Route::pan_azimuth_control() const
4768 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4770 return boost::shared_ptr<AutomationControl>();
4772 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
4773 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4775 if (!_pannable || !panner()) {
4776 return boost::shared_ptr<AutomationControl>();
4778 return _pannable->pan_azimuth_control;
4782 boost::shared_ptr<AutomationControl>
4783 Route::pan_elevation_control() const
4785 if (Profile->get_mixbus() || !_pannable || !panner()) {
4786 return boost::shared_ptr<AutomationControl>();
4789 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4791 if (c.find (PanElevationAutomation) != c.end()) {
4792 return _pannable->pan_elevation_control;
4794 return boost::shared_ptr<AutomationControl>();
4797 boost::shared_ptr<AutomationControl>
4798 Route::pan_width_control() const
4800 if (Profile->get_mixbus() || !_pannable || !panner()) {
4801 return boost::shared_ptr<AutomationControl>();
4804 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4806 if (c.find (PanWidthAutomation) != c.end()) {
4807 return _pannable->pan_width_control;
4809 return boost::shared_ptr<AutomationControl>();
4812 boost::shared_ptr<AutomationControl>
4813 Route::pan_frontback_control() const
4815 if (Profile->get_mixbus() || !_pannable || !panner()) {
4816 return boost::shared_ptr<AutomationControl>();
4819 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4821 if (c.find (PanFrontBackAutomation) != c.end()) {
4822 return _pannable->pan_frontback_control;
4824 return boost::shared_ptr<AutomationControl>();
4827 boost::shared_ptr<AutomationControl>
4828 Route::pan_lfe_control() const
4830 if (Profile->get_mixbus() || !_pannable || !panner()) {
4831 return boost::shared_ptr<AutomationControl>();
4834 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4836 if (c.find (PanLFEAutomation) != c.end()) {
4837 return _pannable->pan_lfe_control;
4839 return boost::shared_ptr<AutomationControl>();
4844 Route::eq_band_cnt () const
4846 if (Profile->get_mixbus()) {
4849 /* Ardour has no well-known EQ object */
4854 boost::shared_ptr<AutomationControl>
4855 Route::eq_gain_controllable (uint32_t band) const
4858 boost::shared_ptr<PluginInsert> eq = ch_eq();
4861 return boost::shared_ptr<AutomationControl>();
4864 uint32_t port_number;
4867 if (is_master() || mixbus()) {
4874 if (is_master() || mixbus()) {
4881 if (is_master() || mixbus()) {
4888 return boost::shared_ptr<AutomationControl>();
4891 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4893 return boost::shared_ptr<AutomationControl>();
4896 boost::shared_ptr<AutomationControl>
4897 Route::eq_freq_controllable (uint32_t band) const
4901 if (mixbus() || is_master()) {
4902 /* no frequency controls for mixbusses or master */
4903 return boost::shared_ptr<AutomationControl>();
4906 boost::shared_ptr<PluginInsert> eq = ch_eq();
4909 return boost::shared_ptr<AutomationControl>();
4912 uint32_t port_number;
4924 return boost::shared_ptr<AutomationControl>();
4927 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4929 return boost::shared_ptr<AutomationControl>();
4933 boost::shared_ptr<AutomationControl>
4934 Route::eq_q_controllable (uint32_t band) const
4936 return boost::shared_ptr<AutomationControl>();
4939 boost::shared_ptr<AutomationControl>
4940 Route::eq_shape_controllable (uint32_t band) const
4942 return boost::shared_ptr<AutomationControl>();
4945 boost::shared_ptr<AutomationControl>
4946 Route::eq_enable_controllable () const
4949 boost::shared_ptr<PluginInsert> eq = ch_eq();
4952 return boost::shared_ptr<AutomationControl>();
4955 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
4957 return boost::shared_ptr<AutomationControl>();
4961 boost::shared_ptr<AutomationControl>
4962 Route::eq_hpf_controllable () const
4965 boost::shared_ptr<PluginInsert> eq = ch_eq();
4968 return boost::shared_ptr<AutomationControl>();
4971 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
4973 return boost::shared_ptr<AutomationControl>();
4978 Route::eq_band_name (uint32_t band) const
4980 if (Profile->get_mixbus()) {
4996 boost::shared_ptr<AutomationControl>
4997 Route::comp_enable_controllable () const
5000 boost::shared_ptr<PluginInsert> comp = ch_comp();
5003 return boost::shared_ptr<AutomationControl>();
5006 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5008 return boost::shared_ptr<AutomationControl>();
5011 boost::shared_ptr<AutomationControl>
5012 Route::comp_threshold_controllable () const
5015 boost::shared_ptr<PluginInsert> comp = ch_comp();
5018 return boost::shared_ptr<AutomationControl>();
5021 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5024 return boost::shared_ptr<AutomationControl>();
5027 boost::shared_ptr<AutomationControl>
5028 Route::comp_speed_controllable () const
5031 boost::shared_ptr<PluginInsert> comp = ch_comp();
5034 return boost::shared_ptr<AutomationControl>();
5037 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5039 return boost::shared_ptr<AutomationControl>();
5042 boost::shared_ptr<AutomationControl>
5043 Route::comp_mode_controllable () const
5046 boost::shared_ptr<PluginInsert> comp = ch_comp();
5049 return boost::shared_ptr<AutomationControl>();
5052 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5054 return boost::shared_ptr<AutomationControl>();
5057 boost::shared_ptr<AutomationControl>
5058 Route::comp_makeup_controllable () const
5061 boost::shared_ptr<PluginInsert> comp = ch_comp();
5064 return boost::shared_ptr<AutomationControl>();
5067 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5069 return boost::shared_ptr<AutomationControl>();
5072 boost::shared_ptr<AutomationControl>
5073 Route::comp_redux_controllable () const
5076 boost::shared_ptr<PluginInsert> comp = ch_comp();
5079 return boost::shared_ptr<AutomationControl>();
5082 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5084 return boost::shared_ptr<AutomationControl>();
5089 Route::comp_mode_name (uint32_t mode) const
5094 return _("Leveler");
5096 return _("Compressor");
5098 return _("Limiter");
5100 return mixbus() ? _("Sidechain") : _("Limiter");
5110 Route::comp_speed_name (uint32_t mode) const
5128 boost::shared_ptr<AutomationControl>
5129 Route::send_level_controllable (uint32_t n) const
5132 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5134 return boost::shared_ptr<AutomationControl>();
5139 return boost::shared_ptr<AutomationControl>();
5142 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5143 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5145 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5147 return boost::shared_ptr<AutomationControl>();
5149 return s->gain_control ();
5153 boost::shared_ptr<AutomationControl>
5154 Route::send_enable_controllable (uint32_t n) const
5157 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5159 return boost::shared_ptr<AutomationControl>();
5164 return boost::shared_ptr<AutomationControl>();
5167 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5168 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5170 /* although Ardour sends have enable/disable as part of the Processor
5171 API, it is not exposed as a controllable.
5173 XXX: we should fix this.
5175 return boost::shared_ptr<AutomationControl>();
5180 Route::send_name (uint32_t n) const
5186 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5190 boost::shared_ptr<Processor> p = nth_send (n);
5199 boost::shared_ptr<AutomationControl>
5200 Route::master_send_enable_controllable () const
5203 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5205 return boost::shared_ptr<AutomationControl>();
5207 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5209 return boost::shared_ptr<AutomationControl>();
5214 Route::slaved () const
5216 if (!_gain_control) {
5219 /* just test one particular control, not all of them */
5220 return _gain_control->slaved ();
5224 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5226 if (!vca || !_gain_control) {
5230 /* just test one particular control, not all of them */
5232 return _gain_control->slaved_to (vca->gain_control());
5236 Route::muted_by_others_soloing () const
5238 if (!can_be_muted_by_others ()) {
5242 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5246 Route::clear_all_solo_state ()
5248 double v = _solo_safe_control->get_value ();
5250 _solo_control->clear_all_solo_state ();
5253 _solo_safe_control->set_value (v, Controllable::NoGroup);