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/event_type_map.h"
50 #include "ardour/gain_control.h"
51 #include "ardour/internal_return.h"
52 #include "ardour/internal_send.h"
53 #include "ardour/meter.h"
54 #include "ardour/delayline.h"
55 #include "ardour/midi_buffer.h"
56 #include "ardour/midi_port.h"
57 #include "ardour/monitor_processor.h"
58 #include "ardour/pannable.h"
59 #include "ardour/panner.h"
60 #include "ardour/panner_shell.h"
61 #include "ardour/parameter_descriptor.h"
62 #include "ardour/phase_control.h"
63 #include "ardour/plugin_insert.h"
64 #include "ardour/port.h"
65 #include "ardour/port_insert.h"
66 #include "ardour/processor.h"
67 #include "ardour/profile.h"
68 #include "ardour/route.h"
69 #include "ardour/route_group.h"
70 #include "ardour/send.h"
71 #include "ardour/session.h"
72 #include "ardour/solo_control.h"
73 #include "ardour/solo_isolate_control.h"
74 #include "ardour/unknown_processor.h"
75 #include "ardour/utils.h"
76 #include "ardour/vca.h"
81 using namespace ARDOUR;
84 PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
86 /** Base class for all routable/mixable objects (tracks and busses) */
87 Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType default_type)
88 : Stripable (sess, name, PresentationInfo (flag))
89 , GraphNode (sess._process_graph)
90 , Muteable (sess, name)
94 , _signal_latency_at_amp_position (0)
95 , _signal_latency_at_trim_position (0)
98 , _pending_process_reorder (0)
99 , _pending_signals (0)
100 , _pending_declick (true)
101 , _meter_point (MeterPostFader)
102 , _pending_meter_point (MeterPostFader)
103 , _meter_type (MeterPeak)
104 , _denormal_protection (false)
107 , _declickable (false)
108 , _have_internal_generator (false)
109 , _default_type (default_type)
111 , _in_configure_processors (false)
112 , _initial_io_setup (false)
113 , _in_sidechain_setup (false)
115 , _custom_meter_position_noted (false)
118 processor_max_streams.reset();
121 boost::weak_ptr<Route>
122 Route::weakroute () {
123 return boost::weak_ptr<Route> (shared_from_this ());
129 /* set default meter type */
131 _meter_type = Config->get_meter_type_master ();
133 else if (dynamic_cast<Track*>(this)) {
134 _meter_type = Config->get_meter_type_track ();
136 _meter_type = Config->get_meter_type_bus ();
139 /* add standard controls */
141 _gain_control.reset (new GainControl (_session, GainAutomation));
142 add_control (_gain_control);
144 _trim_control.reset (new GainControl (_session, TrimAutomation));
145 add_control (_trim_control);
147 _solo_control.reset (new SoloControl (_session, X_("solo"), *this, *this));
148 add_control (_solo_control);
149 _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
151 _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
152 add_control (_mute_control);
154 _phase_control.reset (new PhaseControl (_session, X_("phase")));
155 add_control (_phase_control);
157 _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
158 add_control (_solo_isolate_control);
160 _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
161 add_control (_solo_safe_control);
165 if (!(_presentation_info.flags() & PresentationInfo::MonitorOut)) {
166 _pannable.reset (new Pannable (_session));
169 /* input and output objects */
171 _input.reset (new IO (_session, _name, IO::Input, _default_type));
172 _output.reset (new IO (_session, _name, IO::Output, _default_type));
174 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
175 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
177 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
178 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
180 /* add the amp/fader processor.
181 * it should be the first processor to be added on every route.
184 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
185 add_processor (_amp, PostFader);
188 _amp->set_display_name (_("Monitor"));
191 #if 0 // not used - just yet
192 if (!is_master() && !is_monitor() && !is_auditioner()) {
193 _delayline.reset (new DelayLine (_session, _name));
194 add_processor (_delayline, PreFader);
200 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
201 _trim->set_display_to_user (false);
203 if (dynamic_cast<AudioTrack*>(this)) {
204 /* we can't do this in the AudioTrack's constructor
205 * because _trim does not exit then
209 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
214 /* create standard processors: meter, main outs, monitor out;
215 they will be added to _processors by setup_invisible_processors ()
218 _meter.reset (new PeakMeter (_session, _name));
219 _meter->set_owner (this);
220 _meter->set_display_to_user (false);
223 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
224 _main_outs->activate ();
227 /* where we listen to tracks */
228 _intreturn.reset (new InternalReturn (_session));
229 _intreturn->activate ();
231 /* the thing that provides proper control over a control/monitor/listen bus
232 (such as per-channel cut, dim, solo, invert, etc).
234 _monitor_control.reset (new MonitorProcessor (_session));
235 _monitor_control->activate ();
238 /* now that we have _meter, its safe to connect to this */
241 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
242 configure_processors (0);
250 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
252 /* do this early so that we don't get incoming signals as we are going through destruction
257 /* don't use clear_processors here, as it depends on the session which may
258 be half-destroyed by now
261 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
262 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
263 (*i)->drop_references ();
266 _processors.clear ();
270 Route::ensure_track_or_route_name(string name, Session &session)
272 string newname = name;
274 while (!session.io_name_is_legal (newname)) {
275 newname = bump_name_once (newname, ' ');
282 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
284 // TODO route group, see set_gain()
285 // _trim_control->route_set_value (val);
289 Route::maybe_declick (BufferSet&, framecnt_t, int)
291 /* this is the "bus" implementation and they never declick.
296 /** Process this route for one (sub) cycle (process thread)
298 * @param bufs Scratch buffers to use for the signal path
299 * @param start_frame Initial transport frame
300 * @param end_frame Final transport frame
301 * @param nframes Number of frames to output (to ports)
303 * Note that (end_frame - start_frame) may not be equal to nframes when the
304 * transport speed isn't 1.0 (eg varispeed).
307 Route::process_output_buffers (BufferSet& bufs,
308 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
309 int declick, bool gain_automation_ok)
311 /* Caller must hold process lock */
312 assert (!AudioEngine::instance()->process_lock().trylock());
314 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
316 // can this actually happen? functions calling process_output_buffers()
317 // already take a reader-lock.
318 bufs.silence (nframes, 0);
322 _mute_control->automation_run (start_frame, nframes);
324 /* figure out if we're going to use gain automation */
325 if (gain_automation_ok) {
326 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
327 _amp->setup_gain_automation (
328 start_frame + _signal_latency_at_amp_position,
329 end_frame + _signal_latency_at_amp_position,
332 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
333 _trim->setup_gain_automation (
334 start_frame + _signal_latency_at_trim_position,
335 end_frame + _signal_latency_at_trim_position,
338 _amp->apply_gain_automation (false);
339 _trim->apply_gain_automation (false);
342 /* Tell main outs what to do about monitoring. We do this so that
343 on a transition between monitoring states we get a de-clicking gain
344 change in the _main_outs delivery, if config.get_use_monitor_fades()
347 We override this in the case where we have an internal generator.
349 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
351 _main_outs->no_outs_cuz_we_no_monitor (silence);
353 /* -------------------------------------------------------------------------------------------
354 GLOBAL DECLICK (for transport changes etc.)
355 ----------------------------------------------------------------------------------------- */
357 maybe_declick (bufs, nframes, declick);
358 _pending_declick = 0;
360 /* -------------------------------------------------------------------------------------------
361 DENORMAL CONTROL/PHASE INVERT
362 ----------------------------------------------------------------------------------------- */
364 if (!_phase_control->none()) {
368 if (_denormal_protection || Config->get_denormal_protection()) {
370 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
371 Sample* const sp = i->data();
373 if (_phase_control->inverted (chn)) {
374 for (pframes_t nx = 0; nx < nframes; ++nx) {
379 for (pframes_t nx = 0; nx < nframes; ++nx) {
387 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
388 Sample* const sp = i->data();
390 if (_phase_control->inverted (chn)) {
391 for (pframes_t nx = 0; nx < nframes; ++nx) {
400 if (_denormal_protection || Config->get_denormal_protection()) {
402 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
403 Sample* const sp = i->data();
404 for (pframes_t nx = 0; nx < nframes; ++nx) {
412 /* -------------------------------------------------------------------------------------------
414 ----------------------------------------------------------------------------------------- */
416 /* set this to be true if the meter will already have been ::run() earlier */
417 bool const meter_already_run = metering_state() == MeteringInput;
419 framecnt_t latency = 0;
420 const double speed = _session.transport_speed ();
422 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
424 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
425 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
430 /* if it has any inputs, make sure they match */
431 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
432 if (bufs.count() != (*i)->input_streams()) {
434 DEBUG::Processors, string_compose (
435 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
436 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
443 /* should we NOT run plugins here if the route is inactive?
444 do we catch route != active somewhere higher?
447 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
448 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
450 if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
451 const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
452 boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
453 _initial_delay + latency, longest_session_latency - latency);
456 (*i)->run (bufs, start_frame - latency, end_frame - latency, speed, nframes, *i != _processors.back());
457 bufs.set_count ((*i)->output_streams());
459 if ((*i)->active ()) {
460 latency += (*i)->signal_latency ();
466 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
467 boost::shared_ptr<Processor> endpoint,
468 bool include_endpoint, bool for_export, bool for_freeze)
470 /* If no processing is required, there's no need to go any further. */
471 if (!endpoint && !include_endpoint) {
475 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
476 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
477 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
479 /* trim is always at the top, for bounce no latency compensation is needed */
480 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
481 _trim->setup_gain_automation (start, start + nframes, nframes);
484 const double speed = _session.transport_speed ();
485 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
487 if (!include_endpoint && (*i) == endpoint) {
491 /* if we're *not* exporting, stop processing if we come across a routing processor. */
492 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
495 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
499 /* special case the panner (export outputs)
500 * Ideally we'd only run the panner, not the delivery itself...
501 * but panners need separate input/output buffers and some context
502 * (panshell, panner type, etc). AFAICT there is no ill side effect
503 * of re-using the main delivery when freewheeling/exporting a region.
505 if ((*i) == _main_outs) {
506 assert ((*i)->does_routing());
507 (*i)->run (buffers, start - latency, start - latency + nframes, speed, nframes, true);
508 buffers.set_count ((*i)->output_streams());
511 /* don't run any processors that do routing.
512 * Also don't bother with metering.
514 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
515 (*i)->run (buffers, start - latency, start - latency + nframes, 1.0, nframes, true);
516 buffers.set_count ((*i)->output_streams());
517 latency += (*i)->signal_latency ();
520 if ((*i) == endpoint) {
527 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
528 bool include_endpoint, bool for_export, bool for_freeze) const
530 framecnt_t latency = 0;
531 if (!endpoint && !include_endpoint) {
535 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
536 if (!include_endpoint && (*i) == endpoint) {
539 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
542 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
545 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
546 latency += (*i)->signal_latency ();
548 if ((*i) == endpoint) {
556 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
557 bool include_endpoint, bool for_export, bool for_freeze) const
559 if (!endpoint && !include_endpoint) {
563 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
564 if (!include_endpoint && (*i) == endpoint) {
567 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
570 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
573 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
574 cc = (*i)->output_streams();
576 if ((*i) == endpoint) {
584 Route::n_process_buffers ()
586 return max (_input->n_ports(), processor_max_streams);
590 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
592 assert (is_monitor());
593 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
594 fill_buffers_with_input (bufs, _input, nframes);
595 passthru (bufs, start_frame, end_frame, nframes, declick);
599 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
603 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
605 /* control/monitor bus ignores input ports when something is
606 feeding the listen "stream". data will "arrive" into the
607 route from the intreturn processor element.
610 bufs.silence (nframes, 0);
613 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
614 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
618 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
620 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
622 bufs.set_count (_input->n_ports());
623 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
624 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
628 Route::set_listen (bool yn)
631 if (_monitor_send->active() == yn) {
635 _monitor_send->activate ();
637 _monitor_send->deactivate ();
643 Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
645 /* nothing to do if we're not using AFL/PFL. But if we are, we need
646 to alter the active state of the monitor send.
649 if (Config->get_solo_control_is_listen_control ()) {
650 set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
655 Route::push_solo_isolate_upstream (int32_t delta)
657 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
659 boost::shared_ptr<RouteList> routes = _session.get_routes ();
660 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
662 if ((*i).get() == this || !(*i)->can_solo()) {
667 bool does_feed = feeds (*i, &sends_only);
669 if (does_feed && !sends_only) {
670 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
676 Route::push_solo_upstream (int delta)
678 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
679 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
683 boost::shared_ptr<Route> sr (i->r.lock());
685 sr->solo_control()->mod_solo_by_others_downstream (-delta);
692 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
694 cerr << name << " {" << endl;
695 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
696 p != procs.end(); ++p) {
697 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
703 /** Supposing that we want to insert a Processor at a given Placement, return
704 * the processor to add the new one before (or 0 to add at the end).
706 boost::shared_ptr<Processor>
707 Route::before_processor_for_placement (Placement p)
709 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
711 ProcessorList::iterator loc;
714 /* generic pre-fader: insert immediately before the amp */
715 loc = find (_processors.begin(), _processors.end(), _amp);
717 /* generic post-fader: insert right before the main outs */
718 loc = find (_processors.begin(), _processors.end(), _main_outs);
721 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
724 /** Supposing that we want to insert a Processor at a given index, return
725 * the processor to add the new one before (or 0 to add at the end).
727 boost::shared_ptr<Processor>
728 Route::before_processor_for_index (int index)
731 return boost::shared_ptr<Processor> ();
734 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
736 ProcessorList::iterator i = _processors.begin ();
738 while (i != _processors.end() && j < index) {
739 if ((*i)->display_to_user()) {
746 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
749 /** Add a processor either pre- or post-fader
750 * @return 0 on success, non-0 on failure.
753 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
755 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
759 /** Add a processor to a route such that it ends up with a given index into the visible processors.
760 * @param index Index to add the processor at, or -1 to add at the end of the list.
761 * @return 0 on success, non-0 on failure.
764 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
766 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
769 /** Add a processor to the route.
770 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
771 * @return 0 on success, non-0 on failure.
774 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
776 assert (processor != _meter);
777 assert (processor != _main_outs);
779 DEBUG_TRACE (DEBUG::Processors, string_compose (
780 "%1 adding processor %2\n", name(), processor->name()));
784 pl.push_back (processor);
785 int rv = add_processors (pl, before, err);
791 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
792 processor->activate ();
799 Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
801 /* We cannot destruct the processor here (usually RT-thread
802 * with various locks held - in case of sends also io_locks).
803 * Queue for deletion in low-priority thread.
805 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
806 selfdestruct_sequence.push_back (wp);
810 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
812 XMLProperty const * prop;
815 boost::shared_ptr<Processor> processor;
817 /* bit of a hack: get the `placement' property from the <Redirect> tag here
818 so that we can add the processor in the right place (pre/post-fader)
821 XMLNodeList const & children = node.children ();
822 XMLNodeList::const_iterator i = children.begin ();
824 while (i != children.end() && (*i)->name() != X_("Redirect")) {
828 Placement placement = PreFader;
830 if (i != children.end()) {
831 if ((prop = (*i)->property (X_("placement"))) != 0) {
832 placement = Placement (string_2_enum (prop->value(), placement));
836 if (node.name() == "Insert") {
838 if ((prop = node.property ("type")) != 0) {
840 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
841 prop->value() == "lv2" ||
842 prop->value() == "windows-vst" ||
843 prop->value() == "mac-vst" ||
844 prop->value() == "lxvst" ||
845 prop->value() == "audiounit") {
847 if (_session.get_disable_all_loaded_plugins ()) {
848 processor.reset (new UnknownProcessor (_session, node));
850 processor.reset (new PluginInsert (_session));
851 processor->set_owner (this);
856 processor.reset (new PortInsert (_session, _pannable, _mute_master));
861 } else if (node.name() == "Send") {
863 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
864 processor.reset (new Send (_session, sendpan, _mute_master));
868 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
872 if (processor->set_state (node, version)) {
876 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
877 if (i != children.end()) {
878 if ((prop = (*i)->property (X_("active"))) != 0) {
879 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
880 processor->activate();
882 processor->deactivate();
886 return (add_processor (processor, placement, 0, false) == 0);
889 catch (failed_constructor &err) {
890 warning << _("processor could not be created. Ignored.") << endmsg;
896 inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
897 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
900 inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
901 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
905 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
907 ProcessorList::iterator loc;
910 loc = find(_processors.begin(), _processors.end(), before);
911 if (loc == _processors.end ()) {
915 /* nothing specified - at end */
916 loc = _processors.end ();
919 if (!AudioEngine::instance()->connected()) {
923 if (others.empty()) {
927 ProcessorList to_skip;
929 // check if there's an instrument to replace or configure
930 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
931 boost::shared_ptr<PluginInsert> pi;
932 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
935 if (!pi->plugin ()->get_info ()->is_instrument ()) {
938 boost::shared_ptr<Processor> instrument = the_instrument ();
939 ChanCount in (DataType::MIDI, 1);
940 ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
942 PluginSetupOptions flags = None;
945 in = instrument->input_streams ();
946 out = instrument->output_streams ();
948 if (pi->has_output_presets (in, out)) {
952 pi->set_strict_io (_strict_io);
954 PluginSetupOptions mask = None;
955 if (Config->get_ask_replace_instrument ()) {
958 if (Config->get_ask_setup_instrument ()) {
965 boost::optional<int> rv = PluginSetup (shared_from_this (), pi, flags); /* EMIT SIGNAL */
966 switch (rv.get_value_or (0)) {
968 to_skip.push_back (*i); // don't add this one;
971 replace_processor (instrument, *i, err);
972 to_skip.push_back (*i);
981 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
982 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
983 ProcessorState pstate (this);
985 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
990 ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
991 if (check != to_skip.end()) {
995 boost::shared_ptr<PluginInsert> pi;
997 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
998 pi->set_strict_io (_strict_io);
1002 /* Ensure that only one amp is in the list at any time */
1003 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
1004 if (check != _processors.end()) {
1005 if (before == _amp) {
1006 /* Already in position; all is well */
1009 _processors.erase (check);
1014 assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
1016 _processors.insert (loc, *i);
1017 (*i)->set_owner (this);
1020 if (configure_processors_unlocked (err, &lm)) {
1022 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
1027 if (pi && pi->has_sidechain ()) {
1028 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
1031 if ((*i)->active()) {
1032 // emit ActiveChanged() and latency_changed() if needed
1036 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1038 boost::shared_ptr<Send> send;
1039 if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
1040 send->SelfDestruct.connect_same_thread (*this,
1041 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
1045 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1046 boost::shared_ptr<PluginInsert> pi;
1048 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1049 if (pi->has_no_inputs ()) {
1050 _have_internal_generator = true;
1056 _output->set_user_latency (0);
1059 reset_instrument_info ();
1060 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1061 set_processor_positions ();
1067 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1069 if (p == PreFader) {
1070 start = _processors.begin();
1071 end = find(_processors.begin(), _processors.end(), _amp);
1073 start = find(_processors.begin(), _processors.end(), _amp);
1075 end = _processors.end();
1079 /** Turn off all processors with a given placement
1080 * @param p Placement of processors to disable
1083 Route::disable_processors (Placement p)
1085 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1087 ProcessorList::iterator start, end;
1088 placement_range(p, start, end);
1090 for (ProcessorList::iterator i = start; i != end; ++i) {
1091 (*i)->enable (false);
1094 _session.set_dirty ();
1097 /** Turn off all redirects
1100 Route::disable_processors ()
1102 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1104 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1105 (*i)->enable (false);
1108 _session.set_dirty ();
1111 /** Turn off all redirects with a given placement
1112 * @param p Placement of redirects to disable
1115 Route::disable_plugins (Placement p)
1117 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1119 ProcessorList::iterator start, end;
1120 placement_range(p, start, end);
1122 for (ProcessorList::iterator i = start; i != end; ++i) {
1123 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1124 (*i)->enable (false);
1128 _session.set_dirty ();
1131 /** Turn off all plugins
1134 Route::disable_plugins ()
1136 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1138 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1139 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1140 (*i)->enable (false);
1144 _session.set_dirty ();
1149 Route::ab_plugins (bool forward)
1151 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1155 /* forward = turn off all active redirects, and mark them so that the next time
1156 we go the other way, we will revert them
1159 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1160 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1164 if ((*i)->enabled ()) {
1165 (*i)->enable (false);
1166 (*i)->set_next_ab_is_active (true);
1168 (*i)->set_next_ab_is_active (false);
1174 /* backward = if the redirect was marked to go active on the next ab, do so */
1176 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1178 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1182 (*i)->enable ((*i)->get_next_ab_is_active ());
1186 _session.set_dirty ();
1190 /** Remove processors with a given placement.
1191 * @param p Placement of processors to remove.
1194 Route::clear_processors (Placement p)
1196 if (!_session.engine().connected()) {
1200 bool already_deleting = _session.deletion_in_progress();
1201 if (!already_deleting) {
1202 _session.set_deletion_in_progress();
1206 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1207 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1208 ProcessorList new_list;
1209 ProcessorStreams err;
1210 bool seen_amp = false;
1212 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1218 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1220 /* you can't remove these */
1222 new_list.push_back (*i);
1229 new_list.push_back (*i);
1232 (*i)->drop_references ();
1240 (*i)->drop_references ();
1243 new_list.push_back (*i);
1250 _processors = new_list;
1251 configure_processors_unlocked (&err, &lm); // this can't fail
1254 processor_max_streams.reset();
1255 _have_internal_generator = false;
1256 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1257 set_processor_positions ();
1259 reset_instrument_info ();
1261 if (!already_deleting) {
1262 _session.clear_deletion_in_progress();
1267 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1269 // TODO once the export point can be configured properly, do something smarter here
1270 if (processor == _capturing_processor) {
1271 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1272 if (need_process_lock) {
1276 _capturing_processor.reset();
1278 if (need_process_lock) {
1283 /* these can never be removed */
1285 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1289 if (!_session.engine().connected()) {
1293 processor_max_streams.reset();
1296 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1297 if (need_process_lock) {
1301 /* Caller must hold process lock */
1302 assert (!AudioEngine::instance()->process_lock().trylock());
1304 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1306 ProcessorState pstate (this);
1308 ProcessorList::iterator i;
1309 bool removed = false;
1311 for (i = _processors.begin(); i != _processors.end(); ) {
1312 if (*i == processor) {
1314 /* move along, see failure case for configure_processors()
1315 where we may need to reconfigure the processor.
1318 /* stop redirects that send signals to JACK ports
1319 from causing noise as a result of no longer being
1323 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1324 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
1328 iop = pi->sidechain();
1335 i = _processors.erase (i);
1343 _output->set_user_latency (0);
1351 if (configure_processors_unlocked (err, &lm)) {
1353 /* we know this will work, because it worked before :) */
1354 configure_processors_unlocked (0, &lm);
1358 _have_internal_generator = false;
1360 for (i = _processors.begin(); i != _processors.end(); ++i) {
1361 boost::shared_ptr<PluginInsert> pi;
1363 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1364 if (pi->has_no_inputs ()) {
1365 _have_internal_generator = true;
1370 if (need_process_lock) {
1375 reset_instrument_info ();
1376 processor->drop_references ();
1377 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1378 set_processor_positions ();
1384 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1386 /* these can never be removed */
1387 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1390 /* and can't be used as substitute, either */
1391 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1395 /* I/Os are out, too */
1396 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1400 /* this function cannot be used to swap/reorder processors */
1401 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1405 if (!AudioEngine::instance()->connected() || !old || !sub) {
1409 /* ensure that sub is not owned by another route */
1410 if (sub->owner ()) {
1415 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1416 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1417 ProcessorState pstate (this);
1419 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1421 ProcessorList::iterator i;
1422 bool replaced = false;
1423 bool enable = old->enabled ();
1425 for (i = _processors.begin(); i != _processors.end(); ) {
1427 i = _processors.erase (i);
1428 _processors.insert (i, sub);
1429 sub->set_owner (this);
1442 boost::shared_ptr<PluginInsert> pi;
1443 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1444 pi->set_strict_io (true);
1448 if (configure_processors_unlocked (err, &lm)) {
1450 configure_processors_unlocked (0, &lm);
1454 _have_internal_generator = false;
1456 for (i = _processors.begin(); i != _processors.end(); ++i) {
1457 boost::shared_ptr<PluginInsert> pi;
1458 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1459 if (pi->has_no_inputs ()) {
1460 _have_internal_generator = true;
1470 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1471 _output->set_user_latency (0);
1474 reset_instrument_info ();
1475 old->drop_references ();
1476 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1477 set_processor_positions ();
1482 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1484 ProcessorList deleted;
1486 if (!_session.engine().connected()) {
1490 processor_max_streams.reset();
1493 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1494 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1495 ProcessorState pstate (this);
1497 ProcessorList::iterator i;
1498 boost::shared_ptr<Processor> processor;
1500 for (i = _processors.begin(); i != _processors.end(); ) {
1504 /* these can never be removed */
1506 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1511 /* see if its in the list of processors to delete */
1513 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1518 /* stop IOProcessors that send to JACK ports
1519 from causing noise as a result of no longer being
1523 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
1524 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
1527 iop = pi->sidechain();
1534 deleted.push_back (processor);
1535 i = _processors.erase (i);
1538 if (deleted.empty()) {
1539 /* none of those in the requested list were found */
1543 _output->set_user_latency (0);
1545 if (configure_processors_unlocked (err, &lm)) {
1547 /* we know this will work, because it worked before :) */
1548 configure_processors_unlocked (0, &lm);
1553 _have_internal_generator = false;
1555 for (i = _processors.begin(); i != _processors.end(); ++i) {
1556 boost::shared_ptr<PluginInsert> pi;
1558 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1559 if (pi->has_no_inputs ()) {
1560 _have_internal_generator = true;
1567 /* now try to do what we need to so that those that were removed will be deleted */
1569 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1570 (*i)->drop_references ();
1573 reset_instrument_info ();
1574 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1575 set_processor_positions ();
1581 Route::reset_instrument_info ()
1583 boost::shared_ptr<Processor> instr = the_instrument();
1585 _instrument_info.set_internal_instrument (instr);
1589 /** Caller must hold process lock */
1591 Route::configure_processors (ProcessorStreams* err)
1593 #ifndef PLATFORM_WINDOWS
1594 assert (!AudioEngine::instance()->process_lock().trylock());
1597 if (!_in_configure_processors) {
1598 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1599 return configure_processors_unlocked (err, &lm);
1606 Route::input_streams () const
1608 return _input->n_ports ();
1611 list<pair<ChanCount, ChanCount> >
1612 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1614 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1616 return try_configure_processors_unlocked (in, err);
1619 list<pair<ChanCount, ChanCount> >
1620 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1622 // Check each processor in order to see if we can configure as requested
1624 list<pair<ChanCount, ChanCount> > configuration;
1627 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1628 DEBUG_TRACE (DEBUG::Processors, "{\n");
1630 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1632 if ((*p)->can_support_io_configuration(in, out)) {
1634 if (boost::dynamic_pointer_cast<Delivery> (*p)
1635 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
1637 && (is_monitor() || _strict_io || Profile->get_mixbus ())) {
1638 /* with strict I/O the panner + output are forced to
1639 * follow the last processor's output.
1641 * Delivery::can_support_io_configuration() will only add ports,
1642 * but not remove excess ports.
1644 * This works because the delivery only requires
1645 * as many outputs as there are inputs.
1646 * Delivery::configure_io() will do the actual removal
1647 * by calling _output->ensure_io()
1649 if (!is_master() && _session.master_out () && in.n_audio() > 0) {
1650 /* ..but at least as many as there are master-inputs, if
1651 * the delivery is dealing with audio */
1652 // XXX this may need special-casing for mixbus (master-outputs)
1653 // and should maybe be a preference anyway ?!
1654 out = ChanCount::max (in, _session.master_out ()->n_inputs ());
1660 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1661 configuration.push_back(make_pair(in, out));
1664 // restriction for Monitor Section Processors
1665 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
1666 /* do not allow to add/remove channels (for now)
1667 * The Monitor follows the master-bus and has no panner (unpan)
1668 * but do allow processors with midi-in to be added (e.g VSTs with control that
1669 * will remain unconnected)
1671 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration not allowed.\n");
1672 return list<pair<ChanCount, ChanCount> > ();
1674 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
1675 // internal sends make no sense, only feedback
1676 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1677 return list<pair<ChanCount, ChanCount> > ();
1679 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
1680 /* External Sends can be problematic. one can add/remove ports
1681 * there signal leaves the DAW to external monitors anyway, so there's
1682 * no real use for allowing them here anyway.
1684 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
1685 return list<pair<ChanCount, ChanCount> > ();
1687 if (boost::dynamic_pointer_cast<Send> (*p)) {
1689 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1690 return list<pair<ChanCount, ChanCount> > ();
1699 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1700 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1701 DEBUG_TRACE (DEBUG::Processors, "}\n");
1702 return list<pair<ChanCount, ChanCount> > ();
1706 DEBUG_TRACE (DEBUG::Processors, "}\n");
1708 return configuration;
1711 /** Set the input/output configuration of each processor in the processors list.
1712 * Caller must hold process lock.
1713 * Return 0 on success, otherwise configuration is impossible.
1716 Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
1718 #ifndef PLATFORM_WINDOWS
1719 assert (!AudioEngine::instance()->process_lock().trylock());
1722 if (_in_configure_processors) {
1726 /* put invisible processors where they should be */
1727 setup_invisible_processors ();
1729 _in_configure_processors = true;
1731 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1733 if (configuration.empty ()) {
1734 _in_configure_processors = false;
1739 bool seen_mains_out = false;
1740 processor_out_streams = _input->n_ports();
1741 processor_max_streams.reset();
1743 /* processor configure_io() may result in adding ports
1744 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
1746 * with jack2 adding ports results in a graph-order callback,
1747 * which calls Session::resort_routes() and eventually
1748 * Route::direct_feeds_according_to_reality()
1749 * which takes a ReaderLock (_processor_lock).
1751 * so we can't hold a WriterLock here until jack2 threading
1754 * NB. we still hold the process lock
1756 * (ardour's own engines do call graph-order from the
1757 * process-thread and hence do not have this issue; besides
1758 * merely adding ports won't trigger a graph-order, only
1759 * making connections does)
1763 // TODO check for a potential ReaderLock after ReaderLock ??
1764 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
1766 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1767 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1769 if (!(*p)->configure_io(c->first, c->second)) {
1770 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1771 _in_configure_processors = false;
1776 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1777 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1779 boost::shared_ptr<IOProcessor> iop;
1780 boost::shared_ptr<PluginInsert> pi;
1781 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1782 /* plugins connected via Split or Hide Match may have more channels.
1783 * route/scratch buffers are needed for all of them
1784 * The configuration may only be a subset (both input and output)
1786 processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
1788 else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
1789 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
1790 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
1794 if (boost::dynamic_pointer_cast<Delivery> (*p)
1795 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1796 /* main delivery will increase port count to match input.
1797 * the Delivery::Main is usually the last processor - followed only by
1800 seen_mains_out = true;
1802 if (!seen_mains_out) {
1803 processor_out_streams = out;
1812 _meter->set_max_channels (processor_max_streams);
1815 /* make sure we have sufficient scratch buffers to cope with the new processor
1818 _session.ensure_buffers (n_process_buffers ());
1820 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1822 _in_configure_processors = false;
1826 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1827 * @param state New active state for those processors.
1830 Route::all_visible_processors_active (bool state)
1832 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1834 if (_processors.empty()) {
1838 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1839 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1842 (*i)->enable (state);
1845 _session.set_dirty ();
1849 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1851 /* check if re-order requires re-configuration of any processors
1852 * -> compare channel configuration for all processors
1854 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1855 ChanCount c = input_streams ();
1857 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1859 if (c != (*j)->input_streams()) {
1862 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1865 if ((*i)->input_streams() != c) {
1868 c = (*i)->output_streams();
1880 __attribute__((annotate("realtime")))
1883 Route::apply_processor_order (const ProcessorList& new_order)
1885 /* need to hold processor_lock; either read or write lock
1886 * and the engine process_lock.
1887 * Due to r/w lock ambiguity we can only assert the latter
1889 assert (!AudioEngine::instance()->process_lock().trylock());
1892 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1893 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1894 * processors in the current actual processor list that are hidden. Any visible processors
1895 * in the current list but not in "new_order" will be assumed to be deleted.
1898 /* "as_it_will_be" and "_processors" are lists of shared pointers.
1899 * actual memory usage is small, but insert/erase is not actually rt-safe :(
1900 * (note though that ::processors_reorder_needs_configure() ensured that
1901 * this function will only ever be called from the rt-thread if no processor were removed)
1903 * either way, I can't proove it, but an x-run due to re-order here is less likley
1904 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
1907 ProcessorList as_it_will_be;
1908 ProcessorList::iterator oiter;
1909 ProcessorList::const_iterator niter;
1911 oiter = _processors.begin();
1912 niter = new_order.begin();
1914 while (niter != new_order.end()) {
1916 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1917 then append it to the temp list.
1919 Otherwise, see if the next processor in the old list is in the new list. if not,
1920 its been deleted. If its there, append it to the temp list.
1923 if (oiter == _processors.end()) {
1925 /* no more elements in the old list, so just stick the rest of
1926 the new order onto the temp list.
1929 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1930 while (niter != new_order.end()) {
1937 if (!(*oiter)->display_to_user()) {
1939 as_it_will_be.push_back (*oiter);
1943 /* visible processor: check that its in the new order */
1945 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1946 /* deleted: do nothing, shared_ptr<> will clean up */
1948 /* ignore this one, and add the next item from the new order instead */
1949 as_it_will_be.push_back (*niter);
1954 /* now remove from old order - its taken care of no matter what */
1955 oiter = _processors.erase (oiter);
1959 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1961 /* If the meter is in a custom position, find it and make a rough note of its position */
1962 maybe_note_meter_position ();
1966 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1968 // it a change is already queued, wait for it
1969 // (unless engine is stopped. apply immediately and proceed
1970 while (g_atomic_int_get (&_pending_process_reorder)) {
1971 if (!AudioEngine::instance()->running()) {
1972 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
1973 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1975 apply_processor_order(_pending_processor_order);
1976 setup_invisible_processors ();
1978 g_atomic_int_set (&_pending_process_reorder, 0);
1980 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1981 set_processor_positions ();
1983 // TODO rather use a semaphore or something.
1984 // but since ::reorder_processors() is called
1985 // from the GUI thread, this is fine..
1990 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
1992 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1993 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1994 ProcessorState pstate (this);
1996 apply_processor_order (new_order);
1998 if (configure_processors_unlocked (err, &lm)) {
2006 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2007 set_processor_positions ();
2010 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2011 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2013 // _pending_processor_order is protected by _processor_lock
2014 _pending_processor_order = new_order;
2015 g_atomic_int_set (&_pending_process_reorder, 1);
2022 Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
2024 boost::shared_ptr<PluginInsert> pi;
2025 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2029 if (pi->has_sidechain () == add) {
2030 return true; // ?? call failed, but result is as expected.
2034 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2035 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2036 if (i == _processors.end ()) {
2042 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
2043 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2044 PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
2046 lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
2048 if (!pi->add_sidechain ()) {
2052 if (!pi->del_sidechain ()) {
2058 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2063 pi->del_sidechain ();
2065 pi->add_sidechain ();
2066 // TODO restore side-chain's state.
2071 configure_processors_unlocked (0, &lm);
2074 if (pi->has_sidechain ()) {
2075 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2078 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2079 _session.set_dirty ();
2084 Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
2086 boost::shared_ptr<PluginInsert> pi;
2087 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2092 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2093 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2094 if (i == _processors.end ()) {
2100 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2101 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2103 const ChanCount& old (pi->preset_out ());
2104 if (!pi->set_preset_out (outs)) {
2105 return true; // no change, OK
2108 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2111 pi->set_preset_out (old);
2114 configure_processors_unlocked (0, &lm);
2117 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2118 _session.set_dirty ();
2123 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2126 return customize_plugin_insert (proc, 0, unused, unused);
2130 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
2132 boost::shared_ptr<PluginInsert> pi;
2133 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2138 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2139 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2140 if (i == _processors.end ()) {
2146 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2147 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2149 bool old_cust = pi->custom_cfg ();
2150 uint32_t old_cnt = pi->get_count ();
2151 ChanCount old_chan = pi->output_streams ();
2152 ChanCount old_sinks = pi->natural_input_streams ();
2155 pi->set_custom_cfg (false);
2157 pi->set_custom_cfg (true);
2158 pi->set_count (count);
2159 pi->set_outputs (outs);
2160 pi->set_sinks (sinks);
2163 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2167 pi->set_count (old_cnt);
2168 pi->set_sinks (old_sinks);
2169 pi->set_outputs (old_chan);
2170 pi->set_custom_cfg (old_cust);
2174 configure_processors_unlocked (0, &lm);
2177 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2178 _session.set_dirty ();
2183 Route::set_strict_io (const bool enable)
2185 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2187 if (_strict_io != enable) {
2188 _strict_io = enable;
2189 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2190 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2191 boost::shared_ptr<PluginInsert> pi;
2192 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2193 pi->set_strict_io (_strict_io);
2197 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2201 _strict_io = !enable; // restore old value
2202 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2203 boost::shared_ptr<PluginInsert> pi;
2204 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2205 pi->set_strict_io (_strict_io);
2212 configure_processors (0);
2215 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2216 _session.set_dirty ();
2228 Route::get_template()
2230 return state(false);
2234 Route::state(bool full_state)
2237 if (!_session._template_state_dir.empty()) {
2238 assert (!full_state); // only for templates
2239 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2242 XMLNode *node = new XMLNode("Route");
2243 ProcessorList::iterator i;
2246 id().print (buf, sizeof (buf));
2247 node->add_property("id", buf);
2248 node->add_property ("name", _name);
2249 node->add_property("default-type", _default_type.to_string());
2250 node->add_property ("strict-io", _strict_io);
2252 node->add_child_nocopy (_presentation_info.get_state());
2254 node->add_property("active", _active?"yes":"no");
2256 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2257 node->add_property("meter-point", enum_2_string (_meter_point));
2259 node->add_property("meter-type", enum_2_string (_meter_type));
2262 node->add_property("route-group", _route_group->name());
2265 node->add_child_nocopy (_solo_control->get_state ());
2266 node->add_child_nocopy (_solo_isolate_control->get_state ());
2267 node->add_child_nocopy (_solo_safe_control->get_state ());
2269 node->add_child_nocopy (_input->state (full_state));
2270 node->add_child_nocopy (_output->state (full_state));
2271 node->add_child_nocopy (_mute_master->get_state ());
2273 node->add_child_nocopy (_mute_control->get_state ());
2274 node->add_child_nocopy (_phase_control->get_state ());
2277 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2280 if (_comment.length()) {
2281 XMLNode *cmt = node->add_child ("Comment");
2282 cmt->add_content (_comment);
2286 node->add_child_nocopy (_pannable->state (full_state));
2290 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2291 for (i = _processors.begin(); i != _processors.end(); ++i) {
2293 /* template save: do not include internal sends functioning as
2294 aux sends because the chance of the target ID
2295 in the session where this template is used
2298 similarly, do not save listen sends which connect to
2299 the monitor section, because these will always be
2302 boost::shared_ptr<InternalSend> is;
2304 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2305 if (is->role() == Delivery::Listen) {
2310 node->add_child_nocopy((*i)->state (full_state));
2315 node->add_child_copy (*_extra_xml);
2318 if (_custom_meter_position_noted) {
2319 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2321 after->id().print (buf, sizeof (buf));
2322 node->add_property (X_("processor-after-last-custom-meter"), buf);
2326 if (!_session._template_state_dir.empty()) {
2327 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2330 node->add_child_copy (Slavable::get_state());
2336 Route::set_state (const XMLNode& node, int version)
2338 if (version < 3000) {
2339 return set_state_2X (node, version);
2343 XMLNodeConstIterator niter;
2345 XMLProperty const * prop;
2347 if (node.name() != "Route"){
2348 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2352 if ((prop = node.property (X_("name"))) != 0) {
2353 Route::set_name (prop->value());
2357 _initial_io_setup = true;
2359 Stripable::set_state (node, version);
2361 if ((prop = node.property (X_("strict-io"))) != 0) {
2362 _strict_io = string_is_affirmative (prop->value());
2366 /* monitor bus does not get a panner, but if (re)created
2367 via XML, it will already have one by the time we
2368 call ::set_state(). so ... remove it.
2373 /* add all processors (except amp, which is always present) */
2375 nlist = node.children();
2376 XMLNode processor_state (X_("processor_state"));
2378 Stateful::save_extra_xml (node);
2380 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2384 if (child->name() == IO::state_node_name) {
2385 if ((prop = child->property (X_("direction"))) == 0) {
2389 if (prop->value() == "Input") {
2390 _input->set_state (*child, version);
2391 } else if (prop->value() == "Output") {
2392 _output->set_state (*child, version);
2395 } else if (child->name() == X_("Processor")) {
2396 processor_state.add_child_copy (*child);
2397 } else if (child->name() == X_("Pannable")) {
2399 _pannable->set_state (*child, version);
2401 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2403 } else if (child->name() == Slavable::xml_node_name) {
2404 Slavable::set_state (*child, version);
2408 if ((prop = node.property (X_("meter-point"))) != 0) {
2409 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2410 set_meter_point (mp, true);
2412 _meter->set_display_to_user (_meter_point == MeterCustom);
2416 if ((prop = node.property (X_("meter-type"))) != 0) {
2417 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2420 _initial_io_setup = false;
2422 set_processor_state (processor_state);
2424 // this looks up the internal instrument in processors
2425 reset_instrument_info();
2427 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2428 set_denormal_protection (string_is_affirmative (prop->value()));
2431 if ((prop = node.property (X_("active"))) != 0) {
2432 bool yn = string_is_affirmative (prop->value());
2433 set_active (yn, this);
2436 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2437 PBD::ID id (prop->value ());
2438 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2439 ProcessorList::const_iterator i = _processors.begin ();
2440 while (i != _processors.end() && (*i)->id() != id) {
2444 if (i != _processors.end ()) {
2445 _processor_after_last_custom_meter = *i;
2446 _custom_meter_position_noted = true;
2450 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2453 if (child->name() == X_("Comment")) {
2455 /* XXX this is a terrible API design in libxml++ */
2457 XMLNode *cmt = *(child->children().begin());
2458 _comment = cmt->content();
2460 } else if (child->name() == Controllable::xml_node_name) {
2461 if ((prop = child->property (X_("name"))) == 0) {
2465 if (prop->value() == _gain_control->name()) {
2466 _gain_control->set_state (*child, version);
2467 } else if (prop->value() == _solo_control->name()) {
2468 _solo_control->set_state (*child, version);
2469 } else if (prop->value() == _solo_safe_control->name()) {
2470 _solo_safe_control->set_state (*child, version);
2471 } else if (prop->value() == _solo_isolate_control->name()) {
2472 _solo_isolate_control->set_state (*child, version);
2473 } else if (prop->value() == _mute_control->name()) {
2474 _mute_control->set_state (*child, version);
2475 } else if (prop->value() == _phase_control->name()) {
2476 _phase_control->set_state (*child, version);
2478 Evoral::Parameter p = EventTypeMap::instance().from_symbol (prop->value());
2479 if (p.type () >= MidiCCAutomation && p.type () < MidiSystemExclusiveAutomation) {
2480 boost::shared_ptr<AutomationControl> ac = automation_control (p, true);
2482 ac->set_state (*child, version);
2486 } else if (child->name() == MuteMaster::xml_node_name) {
2487 _mute_master->set_state (*child, version);
2489 } else if (child->name() == Automatable::xml_node_name) {
2490 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2498 Route::set_state_2X (const XMLNode& node, int version)
2502 XMLNodeConstIterator niter;
2504 XMLProperty const * prop;
2506 /* 2X things which still remain to be handled:
2512 if (node.name() != "Route") {
2513 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2517 Stripable::set_state (node, version);
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() == "mac-vst" ||
2776 prop->value() == "lxvst" ||
2777 prop->value() == "luaproc" ||
2778 prop->value() == "audiounit") {
2780 if (_session.get_disable_all_loaded_plugins ()) {
2781 processor.reset (new UnknownProcessor (_session, **niter));
2783 processor.reset (new PluginInsert (_session));
2784 processor->set_owner (this);
2786 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
2787 pi->set_strict_io (true);
2791 } else if (prop->value() == "port") {
2793 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2795 } else if (prop->value() == "send") {
2797 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2798 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
2799 send->SelfDestruct.connect_same_thread (*this,
2800 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
2803 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2807 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2808 /* This processor could not be configured. Turn it into a UnknownProcessor */
2809 processor.reset (new UnknownProcessor (_session, **niter));
2812 /* subscribe to Sidechain IO changes */
2813 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
2814 if (pi && pi->has_sidechain ()) {
2815 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2818 /* we have to note the monitor send here, otherwise a new one will be created
2819 and the state of this one will be lost.
2821 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2822 if (isend && isend->role() == Delivery::Listen) {
2823 _monitor_send = isend;
2826 /* it doesn't matter if invisible processors are added here, as they
2827 will be sorted out by setup_invisible_processors () shortly.
2830 new_order.push_back (processor);
2831 must_configure = true;
2837 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2838 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2839 /* re-assign _processors w/o process-lock.
2840 * if there's an IO-processor present in _processors but
2841 * not in new_order, it will be deleted and ~IO takes
2844 _processors = new_order;
2846 if (must_configure) {
2847 configure_processors_unlocked (0, &lm);
2850 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2852 (*i)->set_owner (this);
2853 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2855 boost::shared_ptr<PluginInsert> pi;
2857 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2858 if (pi->has_no_inputs ()) {
2859 _have_internal_generator = true;
2866 reset_instrument_info ();
2867 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2868 set_processor_positions ();
2872 Route::curve_reallocate ()
2874 // _gain_automation_curve.finish_resize ();
2875 // _pan_automation_curve.finish_resize ();
2879 Route::silence (framecnt_t nframes)
2881 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2886 silence_unlocked (nframes);
2890 Route::silence_unlocked (framecnt_t nframes)
2892 /* Must be called with the processor lock held */
2894 const framepos_t now = _session.transport_frame ();
2898 _output->silence (nframes);
2900 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2901 boost::shared_ptr<PluginInsert> pi;
2903 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2904 // skip plugins, they don't need anything when we're not active
2908 (*i)->silence (nframes, now);
2911 if (nframes == _session.get_block_size()) {
2918 Route::add_internal_return ()
2921 _intreturn.reset (new InternalReturn (_session));
2922 add_processor (_intreturn, PreFader);
2927 Route::add_send_to_internal_return (InternalSend* send)
2929 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2931 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2932 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2935 return d->add_send (send);
2941 Route::remove_send_from_internal_return (InternalSend* send)
2943 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2945 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2946 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2949 return d->remove_send (send);
2955 Route::enable_monitor_send ()
2957 /* Caller must hold process lock */
2958 assert (!AudioEngine::instance()->process_lock().trylock());
2960 /* master never sends to monitor section via the normal mechanism */
2961 assert (!is_master ());
2962 assert (!is_monitor ());
2964 /* make sure we have one */
2965 if (!_monitor_send) {
2966 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
2967 _monitor_send->set_display_to_user (false);
2971 configure_processors (0);
2974 /** Add an aux send to a route.
2975 * @param route route to send to.
2976 * @param before Processor to insert before, or 0 to insert at the end.
2979 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2981 assert (route != _session.monitor_out ());
2984 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2986 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2988 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2990 if (d && d->target_route() == route) {
2991 /* already listening via the specified IO: do nothing */
2999 boost::shared_ptr<InternalSend> listener;
3002 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3003 listener.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3006 add_processor (listener, before);
3008 } catch (failed_constructor& err) {
3016 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3018 ProcessorStreams err;
3019 ProcessorList::iterator tmp;
3022 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3024 /* have to do this early because otherwise processor reconfig
3025 * will put _monitor_send back in the list
3028 if (route == _session.monitor_out()) {
3029 _monitor_send.reset ();
3033 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3035 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3037 if (d && d->target_route() == route) {
3039 if (remove_processor (*x, &err, false) > 0) {
3045 /* list could have been demolished while we dropped the lock
3048 if (_session.engine().connected()) {
3049 /* i/o processors cannot be removed if the engine is not running
3050 * so don't live-loop in case the engine is N/A or dies
3060 Route::set_comment (string cmt, void *src)
3064 _session.set_dirty ();
3068 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3070 FeedRecord fr (other, via_sends_only);
3072 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3074 if (!result.second) {
3076 /* already a record for "other" - make sure sends-only information is correct */
3077 if (!via_sends_only && result.first->sends_only) {
3078 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3079 frp->sends_only = false;
3083 return result.second;
3087 Route::clear_fed_by ()
3093 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3095 const FedBy& fed_by (other->fed_by());
3097 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3098 boost::shared_ptr<Route> sr = f->r.lock();
3100 if (sr && (sr.get() == this)) {
3102 if (via_sends_only) {
3103 *via_sends_only = f->sends_only;
3114 Route::all_inputs () const
3116 /* TODO, if this works as expected,
3117 * cache the IOVector and maintain it via
3118 * input_change_handler(), sidechain_change_handler() etc
3121 ios.push_back (_input);
3123 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3124 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3126 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3127 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3130 iop = pi->sidechain();
3133 if (iop != 0 && iop->input()) {
3134 ios.push_back (iop->input());
3141 Route::all_outputs () const
3144 // _output is included via Delivery
3145 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3146 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3147 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3148 if (iop != 0 && iop->output()) {
3149 ios.push_back (iop->output());
3156 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3158 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3159 if (other->all_inputs().fed_by (_output)) {
3160 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3161 if (via_send_only) {
3162 *via_send_only = false;
3168 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3170 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3172 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3173 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3176 iop = pi->sidechain();
3180 boost::shared_ptr<const IO> iop_out = iop->output();
3181 if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
3182 // TODO this needs a delaylines in the Insert to align connections (!)
3183 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
3186 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3187 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3188 if (via_send_only) {
3189 *via_send_only = true;
3193 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3196 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3201 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3206 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3208 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3212 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3214 return _session._current_route_graph.feeds (shared_from_this (), other);
3217 /** Called from the (non-realtime) butler thread when the transport is stopped */
3219 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3221 framepos_t now = _session.transport_frame();
3224 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3226 Automatable::transport_stopped (now);
3228 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3230 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3234 (*i)->transport_stopped (now);
3238 _roll_delay = _initial_delay;
3242 Route::input_change_handler (IOChange change, void * /*src*/)
3244 if ((change.type & IOChange::ConfigurationChanged)) {
3245 /* This is called with the process lock held if change
3246 contains ConfigurationChanged
3248 configure_processors (0);
3249 _phase_control->resize (_input->n_ports().n_audio ());
3250 io_changed (); /* EMIT SIGNAL */
3253 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3256 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3257 if (_input->connected()) {
3258 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3259 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3263 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3264 if (does_feed && !sends_only) {
3265 if ((*i)->soloed()) {
3268 if ((*i)->solo_isolate_control()->solo_isolated()) {
3275 int delta = sbou - _solo_control->soloed_by_others_upstream();
3276 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3279 PBD::warning << string_compose (
3280 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3281 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3286 if (_solo_control->soloed_by_others_upstream()) {
3287 // ignore new connections (they're not propagated)
3289 _solo_control->mod_solo_by_others_upstream (delta);
3293 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3294 // solo-isolate currently only propagates downstream
3296 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3298 //_solo_isolated_by_upstream = ibou;
3301 // Session::route_solo_changed does not propagate indirect solo-changes
3302 // propagate downstream to tracks
3303 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3304 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3308 bool does_feed = feeds (*i, &sends_only);
3309 if (delta <= 0 && does_feed && !sends_only) {
3310 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3313 if (idelta < 0 && does_feed && !sends_only) {
3314 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3321 Route::output_change_handler (IOChange change, void * /*src*/)
3323 if (_initial_io_setup) {
3327 if ((change.type & IOChange::ConfigurationChanged)) {
3328 /* This is called with the process lock held if change
3329 contains ConfigurationChanged
3331 configure_processors (0);
3334 _session.reset_monitor_section();
3337 io_changed (); /* EMIT SIGNAL */
3340 if (_solo_control->soloed_by_others_downstream()) {
3342 /* checking all all downstream routes for
3343 * explicit of implict solo is a rather drastic measure,
3344 * ideally the input_change_handler() of the other route
3345 * would propagate the change to us.
3347 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3348 if (_output->connected()) {
3349 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3350 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3354 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3355 if (does_feed && !sends_only) {
3356 if ((*i)->soloed()) {
3363 int delta = sbod - _solo_control->soloed_by_others_downstream();
3365 // do not allow new connections to change implicit solo (no propagation)
3366 _solo_control->mod_solo_by_others_downstream (delta);
3367 // Session::route_solo_changed() does not propagate indirect solo-changes
3368 // propagate upstream to tracks
3369 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3370 if ((*i).get() == this || !can_solo()) {
3374 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3375 if (delta != 0 && does_feed && !sends_only) {
3376 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3385 Route::sidechain_change_handler (IOChange change, void* src)
3387 if (_initial_io_setup || _in_sidechain_setup) {
3391 input_change_handler (change, src);
3395 Route::pans_required () const
3397 if (n_outputs().n_audio() < 2) {
3401 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3405 Route::flush_processor_buffers_locked (framecnt_t nframes)
3407 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3408 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
3410 d->flush_buffers (nframes);
3412 boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
3414 p->flush_buffers (nframes);
3421 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3423 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3429 if (n_outputs().n_total() == 0) {
3433 if (!_active || n_inputs() == ChanCount::ZERO) {
3434 silence_unlocked (nframes);
3438 if (session_state_changing) {
3439 if (_session.transport_speed() != 0.0f) {
3440 /* we're rolling but some state is changing (e.g. our diskstream contents)
3441 so we cannot use them. Be silent till this is over.
3443 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3445 silence_unlocked (nframes);
3448 /* we're really not rolling, so we're either delivery silence or actually
3449 monitoring, both of which are safe to do while session_state_changing is true.
3453 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3455 fill_buffers_with_input (bufs, _input, nframes);
3457 if (_meter_point == MeterInput) {
3458 _meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
3461 _amp->apply_gain_automation (false);
3462 _trim->apply_gain_automation (false);
3463 passthru (bufs, start_frame, end_frame, nframes, 0);
3465 flush_processor_buffers_locked (nframes);
3471 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3473 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3478 if (n_outputs().n_total() == 0) {
3482 if (!_active || n_inputs().n_total() == 0) {
3483 silence_unlocked (nframes);
3487 framepos_t unused = 0;
3489 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3495 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3497 fill_buffers_with_input (bufs, _input, nframes);
3499 if (_meter_point == MeterInput) {
3500 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
3503 passthru (bufs, start_frame, end_frame, nframes, declick);
3505 flush_processor_buffers_locked (nframes);
3511 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3514 flush_processor_buffers_locked (nframes);
3519 Route::flush_processors ()
3521 /* XXX shouldn't really try to take this lock, since
3522 this is called from the RT audio thread.
3525 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3527 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3533 __attribute__((annotate("realtime")))
3536 Route::apply_processor_changes_rt ()
3538 int emissions = EmitNone;
3540 if (_pending_meter_point != _meter_point) {
3541 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3543 /* meters always have buffers for 'processor_max_streams'
3544 * they can be re-positioned without re-allocation */
3545 if (set_meter_point_unlocked()) {
3546 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3548 emissions |= EmitMeterChanged;
3553 bool changed = false;
3555 if (g_atomic_int_get (&_pending_process_reorder)) {
3556 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3558 apply_processor_order (_pending_processor_order);
3559 setup_invisible_processors ();
3561 g_atomic_int_set (&_pending_process_reorder, 0);
3562 emissions |= EmitRtProcessorChange;
3566 set_processor_positions ();
3568 if (emissions != 0) {
3569 g_atomic_int_set (&_pending_signals, emissions);
3572 return (!selfdestruct_sequence.empty ());
3576 Route::emit_pending_signals ()
3578 int sig = g_atomic_int_and (&_pending_signals, 0);
3579 if (sig & EmitMeterChanged) {
3580 _meter->emit_configuration_changed();
3581 meter_change (); /* EMIT SIGNAL */
3582 if (sig & EmitMeterVisibilityChange) {
3583 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3585 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3588 if (sig & EmitRtProcessorChange) {
3589 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3592 /* this would be a job for the butler.
3593 * Conceptually we should not take processe/processor locks here.
3594 * OTOH its more efficient (less overhead for summoning the butler and
3595 * telling her what do do) and signal emission is called
3596 * directly after the process callback, which decreases the chance
3597 * of x-runs when taking the locks.
3599 while (!selfdestruct_sequence.empty ()) {
3600 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3601 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3602 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3603 selfdestruct_sequence.pop_back ();
3606 remove_processor (proc);
3612 Route::set_meter_point (MeterPoint p, bool force)
3614 if (_pending_meter_point == p && !force) {
3618 if (force || !AudioEngine::instance()->running()) {
3619 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3620 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3621 _pending_meter_point = p;
3622 _meter->emit_configuration_changed();
3623 meter_change (); /* EMIT SIGNAL */
3624 if (set_meter_point_unlocked()) {
3625 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3627 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3630 _pending_meter_point = p;
3636 __attribute__((annotate("realtime")))
3639 Route::set_meter_point_unlocked ()
3642 /* Caller must hold process and processor write lock */
3643 assert (!AudioEngine::instance()->process_lock().trylock());
3644 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3645 assert (!lm.locked ());
3648 _meter_point = _pending_meter_point;
3650 bool meter_was_visible_to_user = _meter->display_to_user ();
3652 if (!_custom_meter_position_noted) {
3653 maybe_note_meter_position ();
3656 if (_meter_point != MeterCustom) {
3658 _meter->set_display_to_user (false);
3660 setup_invisible_processors ();
3663 _meter->set_display_to_user (true);
3665 /* If we have a previous position for the custom meter, try to put it there */
3666 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3668 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3669 if (i != _processors.end ()) {
3670 _processors.remove (_meter);
3671 _processors.insert (i, _meter);
3673 } else {// at end, right before the mains_out/panner
3674 _processors.remove (_meter);
3675 ProcessorList::iterator main = _processors.end();
3676 _processors.insert (--main, _meter);
3680 /* Set up the meter for its new position */
3682 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3686 if (loc == _processors.begin()) {
3687 m_in = _input->n_ports();
3689 ProcessorList::iterator before = loc;
3691 m_in = (*before)->output_streams ();
3694 _meter->reflect_inputs (m_in);
3696 /* we do not need to reconfigure the processors, because the meter
3697 (a) is always ready to handle processor_max_streams
3698 (b) is always an N-in/N-out processor, and thus moving
3699 it doesn't require any changes to the other processors.
3702 /* these should really be done after releasing the lock
3703 * but all those signals are subscribed to with gui_thread()
3706 return (_meter->display_to_user() != meter_was_visible_to_user);
3710 Route::listen_position_changed ()
3713 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3714 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3715 ProcessorState pstate (this);
3717 if (configure_processors_unlocked (0, &lm)) {
3718 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3720 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3725 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3726 _session.set_dirty ();
3729 boost::shared_ptr<CapturingProcessor>
3730 Route::add_export_point()
3732 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3733 if (!_capturing_processor) {
3735 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3736 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3738 // this aligns all tracks; but not tracks + busses
3739 assert (_session.worst_track_latency () >= _initial_delay);
3740 _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
3741 _capturing_processor->activate ();
3743 configure_processors_unlocked (0, &lw);
3747 return _capturing_processor;
3751 Route::update_signal_latency ()
3753 framecnt_t l = _output->user_latency();
3754 framecnt_t lamp = 0;
3755 bool before_amp = true;
3756 framecnt_t ltrim = 0;
3757 bool before_trim = true;
3759 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3760 if ((*i)->active ()) {
3761 l += (*i)->signal_latency ();
3766 if ((*i) == _trim) {
3777 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3779 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3780 _signal_latency_at_amp_position = lamp;
3781 _signal_latency_at_trim_position = ltrim;
3783 if (_signal_latency != l) {
3784 _signal_latency = l;
3785 signal_latency_changed (); /* EMIT SIGNAL */
3788 return _signal_latency;
3792 Route::set_user_latency (framecnt_t nframes)
3794 _output->set_user_latency (nframes);
3795 _session.update_latency_compensation ();
3799 Route::set_latency_compensation (framecnt_t longest_session_latency)
3801 framecnt_t old = _initial_delay;
3803 if (_signal_latency < longest_session_latency) {
3804 _initial_delay = longest_session_latency - _signal_latency;
3809 DEBUG_TRACE (DEBUG::Latency, string_compose (
3810 "%1: compensate for maximum latency of %2,"
3811 "given own latency of %3, using initial delay of %4\n",
3812 name(), longest_session_latency, _signal_latency, _initial_delay));
3814 if (_initial_delay != old) {
3815 initial_delay_changed (); /* EMIT SIGNAL */
3818 if (_session.transport_stopped()) {
3819 _roll_delay = _initial_delay;
3824 Route::set_block_size (pframes_t nframes)
3826 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3827 (*i)->set_block_size (nframes);
3830 _session.ensure_buffers (n_process_buffers ());
3834 Route::protect_automation ()
3836 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3837 (*i)->protect_automation();
3840 /** @param declick 1 to set a pending declick fade-in,
3841 * -1 to set a pending declick fade-out
3844 Route::set_pending_declick (int declick)
3847 /* this call is not allowed to turn off a pending declick */
3849 _pending_declick = declick;
3852 _pending_declick = 0;
3856 /** Shift automation forwards from a particular place, thereby inserting time.
3857 * Adds undo commands for any shifts that are performed.
3859 * @param pos Position to start shifting from.
3860 * @param frames Amount to shift forwards by.
3864 Route::shift (framepos_t pos, framecnt_t frames)
3866 /* gain automation */
3868 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3870 XMLNode &before = gc->alist()->get_state ();
3871 gc->alist()->shift (pos, frames);
3872 XMLNode &after = gc->alist()->get_state ();
3873 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3876 /* gain automation */
3878 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3880 XMLNode &before = gc->alist()->get_state ();
3881 gc->alist()->shift (pos, frames);
3882 XMLNode &after = gc->alist()->get_state ();
3883 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3886 // TODO mute automation ??
3888 /* pan automation */
3890 ControlSet::Controls& c (_pannable->controls());
3892 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3893 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3895 boost::shared_ptr<AutomationList> al = pc->alist();
3896 XMLNode& before = al->get_state ();
3897 al->shift (pos, frames);
3898 XMLNode& after = al->get_state ();
3899 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3904 /* redirect automation */
3906 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3907 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3909 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3911 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3912 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3914 boost::shared_ptr<AutomationList> al = ac->alist();
3915 XMLNode &before = al->get_state ();
3916 al->shift (pos, frames);
3917 XMLNode &after = al->get_state ();
3918 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3926 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
3928 boost::shared_ptr<Processor> processor (p.lock ());
3929 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
3933 pi->set_state_dir (d);
3937 Route::save_as_template (const string& path, const string& name)
3939 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
3940 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
3942 XMLNode& node (state (false));
3946 IO::set_name_in_state (*node.children().front(), name);
3948 tree.set_root (&node);
3950 /* return zero on success, non-zero otherwise */
3951 return !tree.write (path.c_str());
3956 Route::set_name (const string& str)
3958 if (str == name()) {
3962 string name = Route::ensure_track_or_route_name (str, _session);
3963 SessionObject::set_name (name);
3965 bool ret = (_input->set_name(name) && _output->set_name(name));
3968 /* rename the main outs. Leave other IO processors
3969 * with whatever name they already have, because its
3970 * just fine as it is (it will not contain the route
3971 * name if its a port insert, port send or port return).
3975 if (_main_outs->set_name (name)) {
3976 /* XXX returning false here is stupid because
3977 we already changed the route name.
3987 /** Set the name of a route in an XML description.
3988 * @param node XML <Route> node to set the name in.
3989 * @param name New name.
3992 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
3994 node.add_property (X_("name"), name);
3996 XMLNodeList children = node.children();
3997 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3999 if ((*i)->name() == X_("IO")) {
4001 IO::set_name_in_state (**i, name);
4003 } else if ((*i)->name() == X_("Processor")) {
4005 XMLProperty const * role = (*i)->property (X_("role"));
4006 if (role && role->value() == X_("Main")) {
4007 (*i)->add_property (X_("name"), name);
4010 } else if ((*i)->name() == X_("Diskstream")) {
4012 if (rename_playlist) {
4013 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4015 (*i)->add_property (X_("name"), name);
4021 boost::shared_ptr<Send>
4022 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4024 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4026 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4027 boost::shared_ptr<InternalSend> send;
4029 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4030 if (send->target_route() == target) {
4036 return boost::shared_ptr<Send>();
4040 Route::set_denormal_protection (bool yn)
4042 if (_denormal_protection != yn) {
4043 _denormal_protection = yn;
4044 denormal_protection_changed (); /* EMIT SIGNAL */
4049 Route::denormal_protection () const
4051 return _denormal_protection;
4055 Route::set_active (bool yn, void* src)
4057 if (_session.transport_rolling()) {
4061 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4062 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4066 if (_active != yn) {
4068 _input->set_active (yn);
4069 _output->set_active (yn);
4070 active_changed (); // EMIT SIGNAL
4071 _session.set_dirty ();
4075 boost::shared_ptr<Pannable>
4076 Route::pannable() const
4081 boost::shared_ptr<Panner>
4082 Route::panner() const
4085 return _main_outs->panner_shell()->panner();
4088 boost::shared_ptr<PannerShell>
4089 Route::panner_shell() const
4091 return _main_outs->panner_shell();
4094 boost::shared_ptr<GainControl>
4095 Route::gain_control() const
4097 return _gain_control;
4100 boost::shared_ptr<GainControl>
4101 Route::trim_control() const
4103 return _trim_control;
4106 boost::shared_ptr<PhaseControl>
4107 Route::phase_control() const
4109 return _phase_control;
4112 boost::shared_ptr<AutomationControl>
4113 Route::get_control (const Evoral::Parameter& param)
4115 /* either we own the control or .... */
4117 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4121 /* maybe one of our processors does or ... */
4123 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4124 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4125 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4133 /* nobody does so we'll make a new one */
4135 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4142 boost::shared_ptr<Processor>
4143 Route::nth_plugin (uint32_t n) const
4145 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4146 ProcessorList::const_iterator i;
4148 for (i = _processors.begin(); i != _processors.end(); ++i) {
4149 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4156 return boost::shared_ptr<Processor> ();
4159 boost::shared_ptr<Processor>
4160 Route::nth_send (uint32_t n) const
4162 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4163 ProcessorList::const_iterator i;
4165 for (i = _processors.begin(); i != _processors.end(); ++i) {
4166 if (boost::dynamic_pointer_cast<Send> (*i)) {
4168 if ((*i)->name().find (_("Monitor")) == 0) {
4169 /* send to monitor section is not considered
4170 to be an accessible send.
4181 return boost::shared_ptr<Processor> ();
4185 Route::has_io_processor_named (const string& name)
4187 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4188 ProcessorList::iterator i;
4190 for (i = _processors.begin(); i != _processors.end(); ++i) {
4191 if (boost::dynamic_pointer_cast<Send> (*i) ||
4192 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4193 if ((*i)->name() == name) {
4203 Route::set_processor_positions ()
4205 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4207 bool had_amp = false;
4208 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4209 (*i)->set_pre_fader (!had_amp);
4216 /** Called when there is a proposed change to the input port count */
4218 Route::input_port_count_changing (ChanCount to)
4220 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4222 /* The processors cannot be configured with the new input arrangement, so
4228 /* The change is ok */
4232 /** Called when there is a proposed change to the output port count */
4234 Route::output_port_count_changing (ChanCount to)
4236 if (_strict_io && !_in_configure_processors) {
4239 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4240 if (processor_out_streams.get(*t) > to.get(*t)) {
4244 /* The change is ok */
4249 Route::unknown_processors () const
4253 if (_session.get_disable_all_loaded_plugins ()) {
4254 // Do not list "missing plugins" if they are explicitly disabled
4258 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4259 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4260 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4261 p.push_back ((*i)->name ());
4270 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4272 /* we assume that all our input ports feed all our output ports. its not
4273 universally true, but the alternative is way too corner-case to worry about.
4276 LatencyRange all_connections;
4279 all_connections.min = 0;
4280 all_connections.max = 0;
4282 all_connections.min = ~((pframes_t) 0);
4283 all_connections.max = 0;
4285 /* iterate over all "from" ports and determine the latency range for all of their
4286 connections to the "outside" (outside of this Route).
4289 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4293 p->get_connected_latency_range (range, playback);
4295 all_connections.min = min (all_connections.min, range.min);
4296 all_connections.max = max (all_connections.max, range.max);
4300 /* set the "from" port latencies to the max/min range of all their connections */
4302 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4303 p->set_private_latency_range (all_connections, playback);
4306 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4308 all_connections.min += our_latency;
4309 all_connections.max += our_latency;
4311 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4312 p->set_private_latency_range (all_connections, playback);
4315 return all_connections.max;
4319 Route::set_private_port_latencies (bool playback) const
4321 framecnt_t own_latency = 0;
4323 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4324 OR LATENCY CALLBACK.
4326 This is called (early) from the latency callback. It computes the REAL
4327 latency associated with each port and stores the result as the "private"
4328 latency of the port. A later call to Route::set_public_port_latencies()
4329 sets all ports to the same value to reflect the fact that we do latency
4330 compensation and so all signals are delayed by the same amount as they
4331 flow through ardour.
4334 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4335 if ((*i)->active ()) {
4336 own_latency += (*i)->signal_latency ();
4341 /* playback: propagate latency from "outside the route" to outputs to inputs */
4342 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4344 /* capture: propagate latency from "outside the route" to inputs to outputs */
4345 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4350 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4352 /* this is called to set the JACK-visible port latencies, which take
4353 latency compensation into account.
4362 const PortSet& ports (_input->ports());
4363 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4364 p->set_public_latency_range (range, playback);
4369 const PortSet& ports (_output->ports());
4370 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4371 p->set_public_latency_range (range, playback);
4376 /** Put the invisible processors in the right place in _processors.
4377 * Must be called with a writer lock on _processor_lock held.
4380 __attribute__((annotate("realtime")))
4383 Route::setup_invisible_processors ()
4386 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4387 assert (!lm.locked ());
4391 /* too early to be doing this stuff */
4395 /* we'll build this new list here and then use it
4397 * TODO put the ProcessorList is on the stack for RT-safety.
4400 ProcessorList new_processors;
4402 /* find visible processors */
4404 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4405 if ((*i)->display_to_user ()) {
4406 new_processors.push_back (*i);
4412 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4414 if (amp == new_processors.end ()) {
4415 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4416 new_processors.push_front (_amp);
4417 amp = find (new_processors.begin(), new_processors.end(), _amp);
4420 /* and the processor after the amp */
4422 ProcessorList::iterator after_amp = amp;
4428 switch (_meter_point) {
4430 assert (!_meter->display_to_user ());
4431 new_processors.push_front (_meter);
4434 assert (!_meter->display_to_user ());
4435 new_processors.insert (amp, _meter);
4437 case MeterPostFader:
4438 /* do nothing here */
4441 /* do nothing here */
4444 /* the meter is visible, so we don't touch it here */
4451 assert (_main_outs);
4452 assert (!_main_outs->display_to_user ());
4453 new_processors.push_back (_main_outs);
4455 /* iterator for the main outs */
4457 ProcessorList::iterator main = new_processors.end();
4460 /* OUTPUT METERING */
4462 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4463 assert (!_meter->display_to_user ());
4465 /* add the processor just before or just after the main outs */
4467 ProcessorList::iterator meter_point = main;
4469 if (_meter_point == MeterOutput) {
4472 new_processors.insert (meter_point, _meter);
4477 if (_monitor_send && !is_monitor ()) {
4478 assert (!_monitor_send->display_to_user ());
4479 switch (Config->get_listen_position ()) {
4480 case PreFaderListen:
4481 switch (Config->get_pfl_position ()) {
4482 case PFLFromBeforeProcessors:
4483 new_processors.push_front (_monitor_send);
4485 case PFLFromAfterProcessors:
4486 new_processors.insert (amp, _monitor_send);
4489 _monitor_send->set_can_pan (false);
4491 case AfterFaderListen:
4492 switch (Config->get_afl_position ()) {
4493 case AFLFromBeforeProcessors:
4494 new_processors.insert (after_amp, _monitor_send);
4496 case AFLFromAfterProcessors:
4497 new_processors.insert (new_processors.end(), _monitor_send);
4500 _monitor_send->set_can_pan (true);
4505 #if 0 // not used - just yet
4506 if (!is_master() && !is_monitor() && !is_auditioner()) {
4507 new_processors.push_front (_delayline);
4511 /* MONITOR CONTROL */
4513 if (_monitor_control && is_monitor ()) {
4514 assert (!_monitor_control->display_to_user ());
4515 new_processors.insert (amp, _monitor_control);
4520 if (_trim && _trim->active()) {
4521 assert (!_trim->display_to_user ());
4522 new_processors.push_front (_trim);
4525 /* INTERNAL RETURN */
4527 /* doing this here means that any monitor control will come after
4528 the return and trim.
4532 assert (!_intreturn->display_to_user ());
4533 new_processors.push_front (_intreturn);
4536 /* EXPORT PROCESSOR */
4538 if (_capturing_processor) {
4539 assert (!_capturing_processor->display_to_user ());
4540 new_processors.push_front (_capturing_processor);
4543 _processors = new_processors;
4545 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4546 if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
4547 (*i)->enable (true);
4551 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4552 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4553 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4560 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4561 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4565 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4566 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4573 /** If the meter point is `Custom', make a note of where the meter is.
4574 * This is so that if the meter point is subsequently set to something else,
4575 * and then back to custom, we can put the meter back where it was last time
4576 * custom was enabled.
4578 * Must be called with the _processor_lock held.
4581 Route::maybe_note_meter_position ()
4583 if (_meter_point != MeterCustom) {
4587 _custom_meter_position_noted = true;
4588 /* custom meter points range from after trim to before panner/main_outs
4589 * this is a limitation by the current processor UI
4591 bool seen_trim = false;
4592 _processor_after_last_custom_meter.reset();
4593 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4594 if ((*i) == _trim) {
4597 if ((*i) == _main_outs) {
4598 _processor_after_last_custom_meter = *i;
4601 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4603 _processor_after_last_custom_meter = _trim;
4605 ProcessorList::iterator j = i;
4607 assert(j != _processors.end ()); // main_outs should be before
4608 _processor_after_last_custom_meter = *j;
4613 assert(_processor_after_last_custom_meter.lock());
4616 boost::shared_ptr<Processor>
4617 Route::processor_by_id (PBD::ID id) const
4619 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4620 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4621 if ((*i)->id() == id) {
4626 return boost::shared_ptr<Processor> ();
4629 /** @return the monitoring state, or in other words what data we are pushing
4630 * into the route (data from the inputs, data from disk or silence)
4633 Route::monitoring_state () const
4635 return MonitoringInput;
4638 /** @return what we should be metering; either the data coming from the input
4639 * IO or the data that is flowing through the route.
4642 Route::metering_state () const
4644 return MeteringRoute;
4648 Route::has_external_redirects () const
4650 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4652 /* ignore inactive processors and obviously ignore the main
4653 * outs since everything has them and we don't care.
4656 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4664 boost::shared_ptr<Processor>
4665 Route::the_instrument () const
4667 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4668 return the_instrument_unlocked ();
4671 boost::shared_ptr<Processor>
4672 Route::the_instrument_unlocked () const
4674 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4675 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4676 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4680 return boost::shared_ptr<Processor>();
4686 Route::non_realtime_locate (framepos_t pos)
4689 _pannable->transport_located (pos);
4692 if (_delayline.get()) {
4693 _delayline.get()->flush();
4697 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4698 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4700 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4701 (*i)->transport_located (pos);
4704 _roll_delay = _initial_delay;
4708 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4715 * We don't currently mix MIDI input together, so we don't need the
4716 * complex logic of the audio case.
4719 n_buffers = bufs.count().n_midi ();
4721 for (i = 0; i < n_buffers; ++i) {
4723 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4724 MidiBuffer& buf (bufs.get_midi (i));
4727 buf.copy (source_port->get_midi_buffer(nframes));
4729 buf.silence (nframes);
4735 n_buffers = bufs.count().n_audio();
4737 size_t n_ports = io->n_ports().n_audio();
4738 float scaling = 1.0f;
4740 if (n_ports > n_buffers) {
4741 scaling = ((float) n_buffers) / n_ports;
4744 for (i = 0; i < n_ports; ++i) {
4746 /* if there are more ports than buffers, map them onto buffers
4747 * in a round-robin fashion
4750 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4751 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4754 if (i < n_buffers) {
4756 /* first time through just copy a channel into
4760 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4762 if (scaling != 1.0f) {
4763 buf.apply_gain (scaling, nframes);
4768 /* on subsequent times around, merge data from
4769 * the port with what is already there
4772 if (scaling != 1.0f) {
4773 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4775 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4780 /* silence any remaining buffers */
4782 for (; i < n_buffers; ++i) {
4783 AudioBuffer& buf (bufs.get_audio (i));
4784 buf.silence (nframes);
4787 /* establish the initial setup of the buffer set, reflecting what was
4788 copied into it. unless, of course, we are the auditioner, in which
4789 case nothing was fed into it from the inputs at all.
4792 if (!is_auditioner()) {
4793 bufs.set_count (io->n_ports());
4797 boost::shared_ptr<AutomationControl>
4798 Route::pan_azimuth_control() const
4801 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4803 return boost::shared_ptr<AutomationControl>();
4805 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
4806 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4808 if (!_pannable || !panner()) {
4809 return boost::shared_ptr<AutomationControl>();
4811 return _pannable->pan_azimuth_control;
4815 boost::shared_ptr<AutomationControl>
4816 Route::pan_elevation_control() const
4818 if (Profile->get_mixbus() || !_pannable || !panner()) {
4819 return boost::shared_ptr<AutomationControl>();
4822 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4824 if (c.find (PanElevationAutomation) != c.end()) {
4825 return _pannable->pan_elevation_control;
4827 return boost::shared_ptr<AutomationControl>();
4830 boost::shared_ptr<AutomationControl>
4831 Route::pan_width_control() const
4833 if (Profile->get_mixbus() || !_pannable || !panner()) {
4834 return boost::shared_ptr<AutomationControl>();
4837 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4839 if (c.find (PanWidthAutomation) != c.end()) {
4840 return _pannable->pan_width_control;
4842 return boost::shared_ptr<AutomationControl>();
4845 boost::shared_ptr<AutomationControl>
4846 Route::pan_frontback_control() const
4848 if (Profile->get_mixbus() || !_pannable || !panner()) {
4849 return boost::shared_ptr<AutomationControl>();
4852 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4854 if (c.find (PanFrontBackAutomation) != c.end()) {
4855 return _pannable->pan_frontback_control;
4857 return boost::shared_ptr<AutomationControl>();
4860 boost::shared_ptr<AutomationControl>
4861 Route::pan_lfe_control() const
4863 if (Profile->get_mixbus() || !_pannable || !panner()) {
4864 return boost::shared_ptr<AutomationControl>();
4867 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4869 if (c.find (PanLFEAutomation) != c.end()) {
4870 return _pannable->pan_lfe_control;
4872 return boost::shared_ptr<AutomationControl>();
4877 Route::eq_band_cnt () const
4879 if (Profile->get_mixbus()) {
4882 /* Ardour has no well-known EQ object */
4887 boost::shared_ptr<AutomationControl>
4888 Route::eq_gain_controllable (uint32_t band) const
4891 boost::shared_ptr<PluginInsert> eq = ch_eq();
4894 return boost::shared_ptr<AutomationControl>();
4897 uint32_t port_number;
4900 if (is_master() || mixbus()) {
4907 if (is_master() || mixbus()) {
4914 if (is_master() || mixbus()) {
4921 return boost::shared_ptr<AutomationControl>();
4924 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4926 return boost::shared_ptr<AutomationControl>();
4929 boost::shared_ptr<AutomationControl>
4930 Route::eq_freq_controllable (uint32_t band) const
4934 if (mixbus() || is_master()) {
4935 /* no frequency controls for mixbusses or master */
4936 return boost::shared_ptr<AutomationControl>();
4939 boost::shared_ptr<PluginInsert> eq = ch_eq();
4942 return boost::shared_ptr<AutomationControl>();
4945 uint32_t port_number;
4957 return boost::shared_ptr<AutomationControl>();
4960 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4962 return boost::shared_ptr<AutomationControl>();
4966 boost::shared_ptr<AutomationControl>
4967 Route::eq_q_controllable (uint32_t band) const
4969 return boost::shared_ptr<AutomationControl>();
4972 boost::shared_ptr<AutomationControl>
4973 Route::eq_shape_controllable (uint32_t band) const
4975 return boost::shared_ptr<AutomationControl>();
4978 boost::shared_ptr<AutomationControl>
4979 Route::eq_enable_controllable () const
4982 boost::shared_ptr<PluginInsert> eq = ch_eq();
4985 return boost::shared_ptr<AutomationControl>();
4988 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
4990 return boost::shared_ptr<AutomationControl>();
4994 boost::shared_ptr<AutomationControl>
4995 Route::eq_hpf_controllable () const
4998 boost::shared_ptr<PluginInsert> eq = ch_eq();
5001 return boost::shared_ptr<AutomationControl>();
5004 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5006 return boost::shared_ptr<AutomationControl>();
5011 Route::eq_band_name (uint32_t band) const
5013 if (Profile->get_mixbus()) {
5029 boost::shared_ptr<AutomationControl>
5030 Route::comp_enable_controllable () const
5033 boost::shared_ptr<PluginInsert> comp = ch_comp();
5036 return boost::shared_ptr<AutomationControl>();
5039 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5041 return boost::shared_ptr<AutomationControl>();
5044 boost::shared_ptr<AutomationControl>
5045 Route::comp_threshold_controllable () const
5048 boost::shared_ptr<PluginInsert> comp = ch_comp();
5051 return boost::shared_ptr<AutomationControl>();
5054 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5057 return boost::shared_ptr<AutomationControl>();
5060 boost::shared_ptr<AutomationControl>
5061 Route::comp_speed_controllable () const
5064 boost::shared_ptr<PluginInsert> comp = ch_comp();
5067 return boost::shared_ptr<AutomationControl>();
5070 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5072 return boost::shared_ptr<AutomationControl>();
5075 boost::shared_ptr<AutomationControl>
5076 Route::comp_mode_controllable () const
5079 boost::shared_ptr<PluginInsert> comp = ch_comp();
5082 return boost::shared_ptr<AutomationControl>();
5085 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5087 return boost::shared_ptr<AutomationControl>();
5090 boost::shared_ptr<AutomationControl>
5091 Route::comp_makeup_controllable () const
5094 boost::shared_ptr<PluginInsert> comp = ch_comp();
5097 return boost::shared_ptr<AutomationControl>();
5100 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5102 return boost::shared_ptr<AutomationControl>();
5105 boost::shared_ptr<AutomationControl>
5106 Route::comp_redux_controllable () const
5109 boost::shared_ptr<PluginInsert> comp = ch_comp();
5112 return boost::shared_ptr<AutomationControl>();
5115 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5117 return boost::shared_ptr<AutomationControl>();
5122 Route::comp_mode_name (uint32_t mode) const
5127 return _("Leveler");
5129 return _("Compressor");
5131 return _("Limiter");
5133 return mixbus() ? _("Sidechain") : _("Limiter");
5143 Route::comp_speed_name (uint32_t mode) const
5161 boost::shared_ptr<AutomationControl>
5162 Route::send_level_controllable (uint32_t n) const
5165 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5167 return boost::shared_ptr<AutomationControl>();
5172 return boost::shared_ptr<AutomationControl>();
5175 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5176 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5178 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5180 return boost::shared_ptr<AutomationControl>();
5182 return s->gain_control ();
5186 boost::shared_ptr<AutomationControl>
5187 Route::send_enable_controllable (uint32_t n) const
5190 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5192 return boost::shared_ptr<AutomationControl>();
5197 return boost::shared_ptr<AutomationControl>();
5200 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5201 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5203 /* although Ardour sends have enable/disable as part of the Processor
5204 API, it is not exposed as a controllable.
5206 XXX: we should fix this.
5208 return boost::shared_ptr<AutomationControl>();
5213 Route::send_name (uint32_t n) const
5219 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5223 boost::shared_ptr<Processor> p = nth_send (n);
5232 boost::shared_ptr<AutomationControl>
5233 Route::master_send_enable_controllable () const
5236 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5238 return boost::shared_ptr<AutomationControl>();
5240 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5242 return boost::shared_ptr<AutomationControl>();
5247 Route::slaved () const
5249 if (!_gain_control) {
5252 /* just test one particular control, not all of them */
5253 return _gain_control->slaved ();
5257 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5259 if (!vca || !_gain_control) {
5263 /* just test one particular control, not all of them */
5265 return _gain_control->slaved_to (vca->gain_control());
5269 Route::muted_by_others_soloing () const
5271 if (!can_be_muted_by_others ()) {
5275 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5279 Route::clear_all_solo_state ()
5281 _solo_control->clear_all_solo_state ();