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 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2241 XMLNode *node = new XMLNode("Route");
2242 ProcessorList::iterator i;
2245 id().print (buf, sizeof (buf));
2246 node->add_property("id", buf);
2247 node->add_property ("name", _name);
2248 node->add_property("default-type", _default_type.to_string());
2249 node->add_property ("strict-io", _strict_io);
2251 node->add_child_nocopy (_presentation_info.get_state());
2253 node->add_property("active", _active?"yes":"no");
2255 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2256 node->add_property("meter-point", enum_2_string (_meter_point));
2258 node->add_property("meter-type", enum_2_string (_meter_type));
2261 node->add_property("route-group", _route_group->name());
2264 node->add_child_nocopy (_solo_control->get_state ());
2265 node->add_child_nocopy (_solo_isolate_control->get_state ());
2266 node->add_child_nocopy (_solo_safe_control->get_state ());
2268 node->add_child_nocopy (_input->state (full_state));
2269 node->add_child_nocopy (_output->state (full_state));
2270 node->add_child_nocopy (_mute_master->get_state ());
2272 node->add_child_nocopy (_mute_control->get_state ());
2273 node->add_child_nocopy (_phase_control->get_state ());
2276 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2279 if (_comment.length()) {
2280 XMLNode *cmt = node->add_child ("Comment");
2281 cmt->add_content (_comment);
2285 node->add_child_nocopy (_pannable->state (full_state));
2289 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2290 for (i = _processors.begin(); i != _processors.end(); ++i) {
2292 /* template save: do not include internal sends functioning as
2293 aux sends because the chance of the target ID
2294 in the session where this template is used
2297 similarly, do not save listen sends which connect to
2298 the monitor section, because these will always be
2301 boost::shared_ptr<InternalSend> is;
2303 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2304 if (is->role() == Delivery::Listen) {
2309 node->add_child_nocopy((*i)->state (full_state));
2314 node->add_child_copy (*_extra_xml);
2317 if (_custom_meter_position_noted) {
2318 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2320 after->id().print (buf, sizeof (buf));
2321 node->add_property (X_("processor-after-last-custom-meter"), buf);
2325 if (!_session._template_state_dir.empty()) {
2326 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2329 node->add_child_copy (Slavable::get_state());
2335 Route::set_state (const XMLNode& node, int version)
2337 if (version < 3000) {
2338 return set_state_2X (node, version);
2342 XMLNodeConstIterator niter;
2344 XMLProperty const * prop;
2346 if (node.name() != "Route"){
2347 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2351 if ((prop = node.property (X_("name"))) != 0) {
2352 Route::set_name (prop->value());
2356 _initial_io_setup = true;
2358 Stripable::set_state (node, version);
2360 if ((prop = node.property (X_("strict-io"))) != 0) {
2361 _strict_io = string_is_affirmative (prop->value());
2365 /* monitor bus does not get a panner, but if (re)created
2366 via XML, it will already have one by the time we
2367 call ::set_state(). so ... remove it.
2372 /* add all processors (except amp, which is always present) */
2374 nlist = node.children();
2375 XMLNode processor_state (X_("processor_state"));
2377 Stateful::save_extra_xml (node);
2379 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2383 if (child->name() == IO::state_node_name) {
2384 if ((prop = child->property (X_("direction"))) == 0) {
2388 if (prop->value() == "Input") {
2389 _input->set_state (*child, version);
2390 } else if (prop->value() == "Output") {
2391 _output->set_state (*child, version);
2394 } else if (child->name() == X_("Processor")) {
2395 processor_state.add_child_copy (*child);
2396 } else if (child->name() == X_("Pannable")) {
2398 _pannable->set_state (*child, version);
2400 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2402 } else if (child->name() == Slavable::xml_node_name) {
2403 Slavable::set_state (*child, version);
2407 if ((prop = node.property (X_("meter-point"))) != 0) {
2408 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2409 set_meter_point (mp, true);
2411 _meter->set_display_to_user (_meter_point == MeterCustom);
2415 if ((prop = node.property (X_("meter-type"))) != 0) {
2416 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2419 _initial_io_setup = false;
2421 set_processor_state (processor_state);
2423 // this looks up the internal instrument in processors
2424 reset_instrument_info();
2426 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2427 set_denormal_protection (string_is_affirmative (prop->value()));
2430 if ((prop = node.property (X_("active"))) != 0) {
2431 bool yn = string_is_affirmative (prop->value());
2432 set_active (yn, this);
2435 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2436 PBD::ID id (prop->value ());
2437 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2438 ProcessorList::const_iterator i = _processors.begin ();
2439 while (i != _processors.end() && (*i)->id() != id) {
2443 if (i != _processors.end ()) {
2444 _processor_after_last_custom_meter = *i;
2445 _custom_meter_position_noted = true;
2449 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2452 if (child->name() == X_("Comment")) {
2454 /* XXX this is a terrible API design in libxml++ */
2456 XMLNode *cmt = *(child->children().begin());
2457 _comment = cmt->content();
2459 } else if (child->name() == Controllable::xml_node_name) {
2460 if ((prop = child->property (X_("name"))) == 0) {
2464 if (prop->value() == _gain_control->name()) {
2465 _gain_control->set_state (*child, version);
2466 } else if (prop->value() == _solo_control->name()) {
2467 _solo_control->set_state (*child, version);
2468 } else if (prop->value() == _solo_safe_control->name()) {
2469 _solo_safe_control->set_state (*child, version);
2470 } else if (prop->value() == _solo_isolate_control->name()) {
2471 _solo_isolate_control->set_state (*child, version);
2472 } else if (prop->value() == _mute_control->name()) {
2473 _mute_control->set_state (*child, version);
2474 } else if (prop->value() == _phase_control->name()) {
2475 _phase_control->set_state (*child, version);
2477 Evoral::Parameter p = EventTypeMap::instance().from_symbol (prop->value());
2478 if (p.type () >= MidiCCAutomation && p.type () < MidiSystemExclusiveAutomation) {
2479 boost::shared_ptr<AutomationControl> ac = automation_control (p, true);
2481 ac->set_state (*child, version);
2485 } else if (child->name() == MuteMaster::xml_node_name) {
2486 _mute_master->set_state (*child, version);
2488 } else if (child->name() == Automatable::xml_node_name) {
2489 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2497 Route::set_state_2X (const XMLNode& node, int version)
2501 XMLNodeConstIterator niter;
2503 XMLProperty const * prop;
2505 /* 2X things which still remain to be handled:
2511 if (node.name() != "Route") {
2512 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2516 Stripable::set_state (node, version);
2518 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2519 set_denormal_protection (string_is_affirmative (prop->value()));
2522 if ((prop = node.property (X_("muted"))) != 0) {
2525 bool muted = string_is_affirmative (prop->value());
2531 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2533 if (string_is_affirmative (prop->value())){
2534 mute_point = mute_point + "PreFader";
2539 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2541 if (string_is_affirmative (prop->value())){
2544 mute_point = mute_point + ",";
2547 mute_point = mute_point + "PostFader";
2552 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2554 if (string_is_affirmative (prop->value())){
2557 mute_point = mute_point + ",";
2560 mute_point = mute_point + "Listen";
2565 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2567 if (string_is_affirmative (prop->value())){
2570 mute_point = mute_point + ",";
2573 mute_point = mute_point + "Main";
2577 _mute_master->set_mute_points (mute_point);
2578 _mute_master->set_muted_by_self (true);
2582 if ((prop = node.property (X_("meter-point"))) != 0) {
2583 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2588 nlist = node.children ();
2589 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2593 if (child->name() == IO::state_node_name) {
2595 /* there is a note in IO::set_state_2X() about why we have to call
2599 _input->set_state_2X (*child, version, true);
2600 _output->set_state_2X (*child, version, false);
2602 if ((prop = child->property (X_("name"))) != 0) {
2603 Route::set_name (prop->value ());
2608 if ((prop = child->property (X_("active"))) != 0) {
2609 bool yn = string_is_affirmative (prop->value());
2610 _active = !yn; // force switch
2611 set_active (yn, this);
2614 if ((prop = child->property (X_("gain"))) != 0) {
2617 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2618 _amp->gain_control()->set_value (val, Controllable::NoGroup);
2622 /* Set up Panners in the IO */
2623 XMLNodeList io_nlist = child->children ();
2625 XMLNodeConstIterator io_niter;
2628 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2630 io_child = *io_niter;
2632 if (io_child->name() == X_("Panner")) {
2633 _main_outs->panner_shell()->set_state(*io_child, version);
2634 } else if (io_child->name() == X_("Automation")) {
2635 /* IO's automation is for the fader */
2636 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2642 XMLNodeList redirect_nodes;
2644 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2648 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2649 redirect_nodes.push_back(child);
2654 set_processor_state_2X (redirect_nodes, version);
2656 Stateful::save_extra_xml (node);
2658 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2661 if (child->name() == X_("Comment")) {
2663 /* XXX this is a terrible API design in libxml++ */
2665 XMLNode *cmt = *(child->children().begin());
2666 _comment = cmt->content();
2668 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2669 if (prop->value() == X_("solo")) {
2670 _solo_control->set_state (*child, version);
2671 } else if (prop->value() == X_("mute")) {
2672 _mute_control->set_state (*child, version);
2682 Route::get_processor_state ()
2684 XMLNode* root = new XMLNode (X_("redirects"));
2685 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2686 root->add_child_nocopy ((*i)->state (true));
2693 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2695 /* We don't bother removing existing processors not in nList, as this
2696 method will only be called when creating a Route from scratch, not
2697 for undo purposes. Just put processors in at the appropriate place
2701 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2702 add_processor_from_xml_2X (**i, version);
2707 Route::set_processor_state (const XMLNode& node)
2709 const XMLNodeList &nlist = node.children();
2710 XMLNodeConstIterator niter;
2711 ProcessorList new_order;
2712 bool must_configure = false;
2714 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2716 XMLProperty* prop = (*niter)->property ("type");
2718 if (prop->value() == "amp") {
2719 _amp->set_state (**niter, Stateful::current_state_version);
2720 new_order.push_back (_amp);
2721 } else if (prop->value() == "trim") {
2722 _trim->set_state (**niter, Stateful::current_state_version);
2723 new_order.push_back (_trim);
2724 } else if (prop->value() == "meter") {
2725 _meter->set_state (**niter, Stateful::current_state_version);
2726 new_order.push_back (_meter);
2727 } else if (prop->value() == "delay") {
2729 _delayline->set_state (**niter, Stateful::current_state_version);
2730 new_order.push_back (_delayline);
2732 } else if (prop->value() == "main-outs") {
2733 _main_outs->set_state (**niter, Stateful::current_state_version);
2734 } else if (prop->value() == "intreturn") {
2736 _intreturn.reset (new InternalReturn (_session));
2737 must_configure = true;
2739 _intreturn->set_state (**niter, Stateful::current_state_version);
2740 } else if (is_monitor() && prop->value() == "monitor") {
2741 if (!_monitor_control) {
2742 _monitor_control.reset (new MonitorProcessor (_session));
2743 must_configure = true;
2745 _monitor_control->set_state (**niter, Stateful::current_state_version);
2746 } else if (prop->value() == "capture") {
2747 /* CapturingProcessor should never be restored, it's always
2748 added explicitly when needed */
2750 ProcessorList::iterator o;
2752 for (o = _processors.begin(); o != _processors.end(); ++o) {
2753 XMLProperty const * id_prop = (*niter)->property(X_("id"));
2754 if (id_prop && (*o)->id() == id_prop->value()) {
2755 (*o)->set_state (**niter, Stateful::current_state_version);
2756 new_order.push_back (*o);
2761 // If the processor (*niter) is not on the route then create it
2763 if (o == _processors.end()) {
2765 boost::shared_ptr<Processor> processor;
2767 if (prop->value() == "intsend") {
2769 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2771 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2772 prop->value() == "lv2" ||
2773 prop->value() == "windows-vst" ||
2774 prop->value() == "mac-vst" ||
2775 prop->value() == "lxvst" ||
2776 prop->value() == "luaproc" ||
2777 prop->value() == "audiounit") {
2779 if (_session.get_disable_all_loaded_plugins ()) {
2780 processor.reset (new UnknownProcessor (_session, **niter));
2782 processor.reset (new PluginInsert (_session));
2783 processor->set_owner (this);
2785 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
2786 pi->set_strict_io (true);
2790 } else if (prop->value() == "port") {
2792 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2794 } else if (prop->value() == "send") {
2796 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2797 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
2798 send->SelfDestruct.connect_same_thread (*this,
2799 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
2802 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2806 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2807 /* This processor could not be configured. Turn it into a UnknownProcessor */
2808 processor.reset (new UnknownProcessor (_session, **niter));
2811 /* subscribe to Sidechain IO changes */
2812 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
2813 if (pi && pi->has_sidechain ()) {
2814 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2817 /* we have to note the monitor send here, otherwise a new one will be created
2818 and the state of this one will be lost.
2820 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2821 if (isend && isend->role() == Delivery::Listen) {
2822 _monitor_send = isend;
2825 /* it doesn't matter if invisible processors are added here, as they
2826 will be sorted out by setup_invisible_processors () shortly.
2829 new_order.push_back (processor);
2830 must_configure = true;
2836 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2837 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2838 /* re-assign _processors w/o process-lock.
2839 * if there's an IO-processor present in _processors but
2840 * not in new_order, it will be deleted and ~IO takes
2843 _processors = new_order;
2845 if (must_configure) {
2846 configure_processors_unlocked (0, &lm);
2849 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2851 (*i)->set_owner (this);
2852 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2854 boost::shared_ptr<PluginInsert> pi;
2856 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2857 if (pi->has_no_inputs ()) {
2858 _have_internal_generator = true;
2865 reset_instrument_info ();
2866 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2867 set_processor_positions ();
2871 Route::curve_reallocate ()
2873 // _gain_automation_curve.finish_resize ();
2874 // _pan_automation_curve.finish_resize ();
2878 Route::silence (framecnt_t nframes)
2880 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2885 silence_unlocked (nframes);
2889 Route::silence_unlocked (framecnt_t nframes)
2891 /* Must be called with the processor lock held */
2893 const framepos_t now = _session.transport_frame ();
2897 _output->silence (nframes);
2899 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2900 boost::shared_ptr<PluginInsert> pi;
2902 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2903 // skip plugins, they don't need anything when we're not active
2907 (*i)->silence (nframes, now);
2910 if (nframes == _session.get_block_size()) {
2917 Route::add_internal_return ()
2920 _intreturn.reset (new InternalReturn (_session));
2921 add_processor (_intreturn, PreFader);
2926 Route::add_send_to_internal_return (InternalSend* send)
2928 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2930 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2931 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2934 return d->add_send (send);
2940 Route::remove_send_from_internal_return (InternalSend* send)
2942 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2944 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2945 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2948 return d->remove_send (send);
2954 Route::enable_monitor_send ()
2956 /* Caller must hold process lock */
2957 assert (!AudioEngine::instance()->process_lock().trylock());
2959 /* master never sends to monitor section via the normal mechanism */
2960 assert (!is_master ());
2961 assert (!is_monitor ());
2963 /* make sure we have one */
2964 if (!_monitor_send) {
2965 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
2966 _monitor_send->set_display_to_user (false);
2970 configure_processors (0);
2973 /** Add an aux send to a route.
2974 * @param route route to send to.
2975 * @param before Processor to insert before, or 0 to insert at the end.
2978 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2980 assert (route != _session.monitor_out ());
2983 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2985 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2987 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2989 if (d && d->target_route() == route) {
2990 /* already listening via the specified IO: do nothing */
2998 boost::shared_ptr<InternalSend> listener;
3001 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3002 listener.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3005 add_processor (listener, before);
3007 } catch (failed_constructor& err) {
3015 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3017 ProcessorStreams err;
3018 ProcessorList::iterator tmp;
3021 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3023 /* have to do this early because otherwise processor reconfig
3024 * will put _monitor_send back in the list
3027 if (route == _session.monitor_out()) {
3028 _monitor_send.reset ();
3032 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3034 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3036 if (d && d->target_route() == route) {
3038 if (remove_processor (*x, &err, false) > 0) {
3044 /* list could have been demolished while we dropped the lock
3047 if (_session.engine().connected()) {
3048 /* i/o processors cannot be removed if the engine is not running
3049 * so don't live-loop in case the engine is N/A or dies
3059 Route::set_comment (string cmt, void *src)
3063 _session.set_dirty ();
3067 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3069 FeedRecord fr (other, via_sends_only);
3071 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3073 if (!result.second) {
3075 /* already a record for "other" - make sure sends-only information is correct */
3076 if (!via_sends_only && result.first->sends_only) {
3077 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3078 frp->sends_only = false;
3082 return result.second;
3086 Route::clear_fed_by ()
3092 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3094 const FedBy& fed_by (other->fed_by());
3096 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3097 boost::shared_ptr<Route> sr = f->r.lock();
3099 if (sr && (sr.get() == this)) {
3101 if (via_sends_only) {
3102 *via_sends_only = f->sends_only;
3113 Route::all_inputs () const
3115 /* TODO, if this works as expected,
3116 * cache the IOVector and maintain it via
3117 * input_change_handler(), sidechain_change_handler() etc
3120 ios.push_back (_input);
3122 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3123 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3125 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3126 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3129 iop = pi->sidechain();
3132 if (iop != 0 && iop->input()) {
3133 ios.push_back (iop->input());
3140 Route::all_outputs () const
3143 // _output is included via Delivery
3144 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3145 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3146 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3147 if (iop != 0 && iop->output()) {
3148 ios.push_back (iop->output());
3155 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3157 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3158 if (other->all_inputs().fed_by (_output)) {
3159 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3160 if (via_send_only) {
3161 *via_send_only = false;
3167 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3169 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3171 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3172 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3175 iop = pi->sidechain();
3179 boost::shared_ptr<const IO> iop_out = iop->output();
3180 if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
3181 // TODO this needs a delaylines in the Insert to align connections (!)
3182 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
3185 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3186 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3187 if (via_send_only) {
3188 *via_send_only = true;
3192 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3195 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3200 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3205 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3207 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3211 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3213 return _session._current_route_graph.feeds (shared_from_this (), other);
3216 /** Called from the (non-realtime) butler thread when the transport is stopped */
3218 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3220 framepos_t now = _session.transport_frame();
3223 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3225 Automatable::transport_stopped (now);
3227 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3229 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3233 (*i)->transport_stopped (now);
3237 _roll_delay = _initial_delay;
3241 Route::input_change_handler (IOChange change, void * /*src*/)
3243 if ((change.type & IOChange::ConfigurationChanged)) {
3244 /* This is called with the process lock held if change
3245 contains ConfigurationChanged
3247 configure_processors (0);
3248 _phase_control->resize (_input->n_ports().n_audio ());
3249 io_changed (); /* EMIT SIGNAL */
3252 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3255 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3256 if (_input->connected()) {
3257 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3258 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3262 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3263 if (does_feed && !sends_only) {
3264 if ((*i)->soloed()) {
3267 if ((*i)->solo_isolate_control()->solo_isolated()) {
3274 int delta = sbou - _solo_control->soloed_by_others_upstream();
3275 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3278 PBD::warning << string_compose (
3279 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3280 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3285 if (_solo_control->soloed_by_others_upstream()) {
3286 // ignore new connections (they're not propagated)
3288 _solo_control->mod_solo_by_others_upstream (delta);
3292 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3293 // solo-isolate currently only propagates downstream
3295 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3297 //_solo_isolated_by_upstream = ibou;
3300 // Session::route_solo_changed does not propagate indirect solo-changes
3301 // propagate downstream to tracks
3302 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3303 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3307 bool does_feed = feeds (*i, &sends_only);
3308 if (delta <= 0 && does_feed && !sends_only) {
3309 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3312 if (idelta < 0 && does_feed && !sends_only) {
3313 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3320 Route::output_change_handler (IOChange change, void * /*src*/)
3322 if (_initial_io_setup) {
3326 if ((change.type & IOChange::ConfigurationChanged)) {
3327 /* This is called with the process lock held if change
3328 contains ConfigurationChanged
3330 configure_processors (0);
3333 _session.reset_monitor_section();
3336 io_changed (); /* EMIT SIGNAL */
3339 if (_solo_control->soloed_by_others_downstream()) {
3341 /* checking all all downstream routes for
3342 * explicit of implict solo is a rather drastic measure,
3343 * ideally the input_change_handler() of the other route
3344 * would propagate the change to us.
3346 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3347 if (_output->connected()) {
3348 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3349 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3353 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3354 if (does_feed && !sends_only) {
3355 if ((*i)->soloed()) {
3362 int delta = sbod - _solo_control->soloed_by_others_downstream();
3364 // do not allow new connections to change implicit solo (no propagation)
3365 _solo_control->mod_solo_by_others_downstream (delta);
3366 // Session::route_solo_changed() does not propagate indirect solo-changes
3367 // propagate upstream to tracks
3368 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3369 if ((*i).get() == this || !can_solo()) {
3373 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3374 if (delta != 0 && does_feed && !sends_only) {
3375 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3384 Route::sidechain_change_handler (IOChange change, void* src)
3386 if (_initial_io_setup || _in_sidechain_setup) {
3390 input_change_handler (change, src);
3394 Route::pans_required () const
3396 if (n_outputs().n_audio() < 2) {
3400 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3404 Route::flush_processor_buffers_locked (framecnt_t nframes)
3406 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3407 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
3409 d->flush_buffers (nframes);
3411 boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
3413 p->flush_buffers (nframes);
3420 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3422 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3428 if (n_outputs().n_total() == 0) {
3432 if (!_active || n_inputs() == ChanCount::ZERO) {
3433 silence_unlocked (nframes);
3437 if (session_state_changing) {
3438 if (_session.transport_speed() != 0.0f) {
3439 /* we're rolling but some state is changing (e.g. our diskstream contents)
3440 so we cannot use them. Be silent till this is over.
3442 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3444 silence_unlocked (nframes);
3447 /* we're really not rolling, so we're either delivery silence or actually
3448 monitoring, both of which are safe to do while session_state_changing is true.
3452 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3454 fill_buffers_with_input (bufs, _input, nframes);
3456 if (_meter_point == MeterInput) {
3457 _meter->run (bufs, start_frame, end_frame, 0.0, nframes, true);
3460 _amp->apply_gain_automation (false);
3461 _trim->apply_gain_automation (false);
3462 passthru (bufs, start_frame, end_frame, nframes, 0);
3464 flush_processor_buffers_locked (nframes);
3470 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3472 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3477 if (n_outputs().n_total() == 0) {
3481 if (!_active || n_inputs().n_total() == 0) {
3482 silence_unlocked (nframes);
3486 framepos_t unused = 0;
3488 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3494 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3496 fill_buffers_with_input (bufs, _input, nframes);
3498 if (_meter_point == MeterInput) {
3499 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
3502 passthru (bufs, start_frame, end_frame, nframes, declick);
3504 flush_processor_buffers_locked (nframes);
3510 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3513 flush_processor_buffers_locked (nframes);
3518 Route::flush_processors ()
3520 /* XXX shouldn't really try to take this lock, since
3521 this is called from the RT audio thread.
3524 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3526 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3532 __attribute__((annotate("realtime")))
3535 Route::apply_processor_changes_rt ()
3537 int emissions = EmitNone;
3539 if (_pending_meter_point != _meter_point) {
3540 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3542 /* meters always have buffers for 'processor_max_streams'
3543 * they can be re-positioned without re-allocation */
3544 if (set_meter_point_unlocked()) {
3545 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3547 emissions |= EmitMeterChanged;
3552 bool changed = false;
3554 if (g_atomic_int_get (&_pending_process_reorder)) {
3555 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3557 apply_processor_order (_pending_processor_order);
3558 setup_invisible_processors ();
3560 g_atomic_int_set (&_pending_process_reorder, 0);
3561 emissions |= EmitRtProcessorChange;
3565 set_processor_positions ();
3567 if (emissions != 0) {
3568 g_atomic_int_set (&_pending_signals, emissions);
3571 return (!selfdestruct_sequence.empty ());
3575 Route::emit_pending_signals ()
3577 int sig = g_atomic_int_and (&_pending_signals, 0);
3578 if (sig & EmitMeterChanged) {
3579 _meter->emit_configuration_changed();
3580 meter_change (); /* EMIT SIGNAL */
3581 if (sig & EmitMeterVisibilityChange) {
3582 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3584 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3587 if (sig & EmitRtProcessorChange) {
3588 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3591 /* this would be a job for the butler.
3592 * Conceptually we should not take processe/processor locks here.
3593 * OTOH its more efficient (less overhead for summoning the butler and
3594 * telling her what do do) and signal emission is called
3595 * directly after the process callback, which decreases the chance
3596 * of x-runs when taking the locks.
3598 while (!selfdestruct_sequence.empty ()) {
3599 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3600 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3601 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3602 selfdestruct_sequence.pop_back ();
3605 remove_processor (proc);
3611 Route::set_meter_point (MeterPoint p, bool force)
3613 if (_pending_meter_point == p && !force) {
3617 if (force || !AudioEngine::instance()->running()) {
3618 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3619 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3620 _pending_meter_point = p;
3621 _meter->emit_configuration_changed();
3622 meter_change (); /* EMIT SIGNAL */
3623 if (set_meter_point_unlocked()) {
3624 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3626 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3629 _pending_meter_point = p;
3635 __attribute__((annotate("realtime")))
3638 Route::set_meter_point_unlocked ()
3641 /* Caller must hold process and processor write lock */
3642 assert (!AudioEngine::instance()->process_lock().trylock());
3643 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3644 assert (!lm.locked ());
3647 _meter_point = _pending_meter_point;
3649 bool meter_was_visible_to_user = _meter->display_to_user ();
3651 if (!_custom_meter_position_noted) {
3652 maybe_note_meter_position ();
3655 if (_meter_point != MeterCustom) {
3657 _meter->set_display_to_user (false);
3659 setup_invisible_processors ();
3662 _meter->set_display_to_user (true);
3664 /* If we have a previous position for the custom meter, try to put it there */
3665 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3667 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3668 if (i != _processors.end ()) {
3669 _processors.remove (_meter);
3670 _processors.insert (i, _meter);
3672 } else {// at end, right before the mains_out/panner
3673 _processors.remove (_meter);
3674 ProcessorList::iterator main = _processors.end();
3675 _processors.insert (--main, _meter);
3679 /* Set up the meter for its new position */
3681 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3685 if (loc == _processors.begin()) {
3686 m_in = _input->n_ports();
3688 ProcessorList::iterator before = loc;
3690 m_in = (*before)->output_streams ();
3693 _meter->reflect_inputs (m_in);
3695 /* we do not need to reconfigure the processors, because the meter
3696 (a) is always ready to handle processor_max_streams
3697 (b) is always an N-in/N-out processor, and thus moving
3698 it doesn't require any changes to the other processors.
3701 /* these should really be done after releasing the lock
3702 * but all those signals are subscribed to with gui_thread()
3705 return (_meter->display_to_user() != meter_was_visible_to_user);
3709 Route::listen_position_changed ()
3712 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3713 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3714 ProcessorState pstate (this);
3716 if (configure_processors_unlocked (0, &lm)) {
3717 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3719 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3724 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3725 _session.set_dirty ();
3728 boost::shared_ptr<CapturingProcessor>
3729 Route::add_export_point()
3731 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3732 if (!_capturing_processor) {
3734 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3735 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3737 // this aligns all tracks; but not tracks + busses
3738 assert (_session.worst_track_latency () >= _initial_delay);
3739 _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
3740 _capturing_processor->activate ();
3742 configure_processors_unlocked (0, &lw);
3746 return _capturing_processor;
3750 Route::update_signal_latency ()
3752 framecnt_t l = _output->user_latency();
3753 framecnt_t lamp = 0;
3754 bool before_amp = true;
3755 framecnt_t ltrim = 0;
3756 bool before_trim = true;
3758 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3759 if ((*i)->active ()) {
3760 l += (*i)->signal_latency ();
3765 if ((*i) == _trim) {
3776 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3778 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3779 _signal_latency_at_amp_position = lamp;
3780 _signal_latency_at_trim_position = ltrim;
3782 if (_signal_latency != l) {
3783 _signal_latency = l;
3784 signal_latency_changed (); /* EMIT SIGNAL */
3787 return _signal_latency;
3791 Route::set_user_latency (framecnt_t nframes)
3793 _output->set_user_latency (nframes);
3794 _session.update_latency_compensation ();
3798 Route::set_latency_compensation (framecnt_t longest_session_latency)
3800 framecnt_t old = _initial_delay;
3802 if (_signal_latency < longest_session_latency) {
3803 _initial_delay = longest_session_latency - _signal_latency;
3808 DEBUG_TRACE (DEBUG::Latency, string_compose (
3809 "%1: compensate for maximum latency of %2,"
3810 "given own latency of %3, using initial delay of %4\n",
3811 name(), longest_session_latency, _signal_latency, _initial_delay));
3813 if (_initial_delay != old) {
3814 initial_delay_changed (); /* EMIT SIGNAL */
3817 if (_session.transport_stopped()) {
3818 _roll_delay = _initial_delay;
3823 Route::set_block_size (pframes_t nframes)
3825 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3826 (*i)->set_block_size (nframes);
3829 _session.ensure_buffers (n_process_buffers ());
3833 Route::protect_automation ()
3835 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3836 (*i)->protect_automation();
3839 /** @param declick 1 to set a pending declick fade-in,
3840 * -1 to set a pending declick fade-out
3843 Route::set_pending_declick (int declick)
3846 /* this call is not allowed to turn off a pending declick */
3848 _pending_declick = declick;
3851 _pending_declick = 0;
3855 /** Shift automation forwards from a particular place, thereby inserting time.
3856 * Adds undo commands for any shifts that are performed.
3858 * @param pos Position to start shifting from.
3859 * @param frames Amount to shift forwards by.
3863 Route::shift (framepos_t pos, framecnt_t frames)
3865 /* gain automation */
3867 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3869 XMLNode &before = gc->alist()->get_state ();
3870 gc->alist()->shift (pos, frames);
3871 XMLNode &after = gc->alist()->get_state ();
3872 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3875 /* gain automation */
3877 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3879 XMLNode &before = gc->alist()->get_state ();
3880 gc->alist()->shift (pos, frames);
3881 XMLNode &after = gc->alist()->get_state ();
3882 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3885 // TODO mute automation ??
3887 /* pan automation */
3889 ControlSet::Controls& c (_pannable->controls());
3891 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3892 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3894 boost::shared_ptr<AutomationList> al = pc->alist();
3895 XMLNode& before = al->get_state ();
3896 al->shift (pos, frames);
3897 XMLNode& after = al->get_state ();
3898 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3903 /* redirect automation */
3905 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3906 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3908 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3910 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3911 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3913 boost::shared_ptr<AutomationList> al = ac->alist();
3914 XMLNode &before = al->get_state ();
3915 al->shift (pos, frames);
3916 XMLNode &after = al->get_state ();
3917 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3925 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
3927 boost::shared_ptr<Processor> processor (p.lock ());
3928 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
3932 pi->set_state_dir (d);
3936 Route::save_as_template (const string& path, const string& name)
3938 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
3939 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
3941 XMLNode& node (state (false));
3945 IO::set_name_in_state (*node.children().front(), name);
3947 tree.set_root (&node);
3949 /* return zero on success, non-zero otherwise */
3950 return !tree.write (path.c_str());
3955 Route::set_name (const string& str)
3957 if (str == name()) {
3961 string name = Route::ensure_track_or_route_name (str, _session);
3962 SessionObject::set_name (name);
3964 bool ret = (_input->set_name(name) && _output->set_name(name));
3967 /* rename the main outs. Leave other IO processors
3968 * with whatever name they already have, because its
3969 * just fine as it is (it will not contain the route
3970 * name if its a port insert, port send or port return).
3974 if (_main_outs->set_name (name)) {
3975 /* XXX returning false here is stupid because
3976 we already changed the route name.
3986 /** Set the name of a route in an XML description.
3987 * @param node XML <Route> node to set the name in.
3988 * @param name New name.
3991 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
3993 node.add_property (X_("name"), name);
3995 XMLNodeList children = node.children();
3996 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3998 if ((*i)->name() == X_("IO")) {
4000 IO::set_name_in_state (**i, name);
4002 } else if ((*i)->name() == X_("Processor")) {
4004 XMLProperty const * role = (*i)->property (X_("role"));
4005 if (role && role->value() == X_("Main")) {
4006 (*i)->add_property (X_("name"), name);
4009 } else if ((*i)->name() == X_("Diskstream")) {
4011 if (rename_playlist) {
4012 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4014 (*i)->add_property (X_("name"), name);
4020 boost::shared_ptr<Send>
4021 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4023 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4025 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4026 boost::shared_ptr<InternalSend> send;
4028 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4029 if (send->target_route() == target) {
4035 return boost::shared_ptr<Send>();
4039 Route::set_denormal_protection (bool yn)
4041 if (_denormal_protection != yn) {
4042 _denormal_protection = yn;
4043 denormal_protection_changed (); /* EMIT SIGNAL */
4048 Route::denormal_protection () const
4050 return _denormal_protection;
4054 Route::set_active (bool yn, void* src)
4056 if (_session.transport_rolling()) {
4060 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4061 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4065 if (_active != yn) {
4067 _input->set_active (yn);
4068 _output->set_active (yn);
4069 active_changed (); // EMIT SIGNAL
4070 _session.set_dirty ();
4074 boost::shared_ptr<Pannable>
4075 Route::pannable() const
4080 boost::shared_ptr<Panner>
4081 Route::panner() const
4084 return _main_outs->panner_shell()->panner();
4087 boost::shared_ptr<PannerShell>
4088 Route::panner_shell() const
4090 return _main_outs->panner_shell();
4093 boost::shared_ptr<GainControl>
4094 Route::gain_control() const
4096 return _gain_control;
4099 boost::shared_ptr<GainControl>
4100 Route::trim_control() const
4102 return _trim_control;
4105 boost::shared_ptr<PhaseControl>
4106 Route::phase_control() const
4108 return _phase_control;
4111 boost::shared_ptr<AutomationControl>
4112 Route::get_control (const Evoral::Parameter& param)
4114 /* either we own the control or .... */
4116 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4120 /* maybe one of our processors does or ... */
4122 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4123 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4124 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4132 /* nobody does so we'll make a new one */
4134 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4141 boost::shared_ptr<Processor>
4142 Route::nth_plugin (uint32_t n) const
4144 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4145 ProcessorList::const_iterator i;
4147 for (i = _processors.begin(); i != _processors.end(); ++i) {
4148 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4155 return boost::shared_ptr<Processor> ();
4158 boost::shared_ptr<Processor>
4159 Route::nth_send (uint32_t n) const
4161 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4162 ProcessorList::const_iterator i;
4164 for (i = _processors.begin(); i != _processors.end(); ++i) {
4165 if (boost::dynamic_pointer_cast<Send> (*i)) {
4167 if ((*i)->name().find (_("Monitor")) == 0) {
4168 /* send to monitor section is not considered
4169 to be an accessible send.
4180 return boost::shared_ptr<Processor> ();
4184 Route::has_io_processor_named (const string& name)
4186 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4187 ProcessorList::iterator i;
4189 for (i = _processors.begin(); i != _processors.end(); ++i) {
4190 if (boost::dynamic_pointer_cast<Send> (*i) ||
4191 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4192 if ((*i)->name() == name) {
4202 Route::set_processor_positions ()
4204 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4206 bool had_amp = false;
4207 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4208 (*i)->set_pre_fader (!had_amp);
4215 /** Called when there is a proposed change to the input port count */
4217 Route::input_port_count_changing (ChanCount to)
4219 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4221 /* The processors cannot be configured with the new input arrangement, so
4227 /* The change is ok */
4231 /** Called when there is a proposed change to the output port count */
4233 Route::output_port_count_changing (ChanCount to)
4235 if (_strict_io && !_in_configure_processors) {
4238 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4239 if (processor_out_streams.get(*t) > to.get(*t)) {
4243 /* The change is ok */
4248 Route::unknown_processors () const
4252 if (_session.get_disable_all_loaded_plugins ()) {
4253 // Do not list "missing plugins" if they are explicitly disabled
4257 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4258 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4259 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4260 p.push_back ((*i)->name ());
4269 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4271 /* we assume that all our input ports feed all our output ports. its not
4272 universally true, but the alternative is way too corner-case to worry about.
4275 LatencyRange all_connections;
4278 all_connections.min = 0;
4279 all_connections.max = 0;
4281 all_connections.min = ~((pframes_t) 0);
4282 all_connections.max = 0;
4284 /* iterate over all "from" ports and determine the latency range for all of their
4285 connections to the "outside" (outside of this Route).
4288 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4292 p->get_connected_latency_range (range, playback);
4294 all_connections.min = min (all_connections.min, range.min);
4295 all_connections.max = max (all_connections.max, range.max);
4299 /* set the "from" port latencies to the max/min range of all their connections */
4301 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4302 p->set_private_latency_range (all_connections, playback);
4305 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4307 all_connections.min += our_latency;
4308 all_connections.max += our_latency;
4310 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4311 p->set_private_latency_range (all_connections, playback);
4314 return all_connections.max;
4318 Route::set_private_port_latencies (bool playback) const
4320 framecnt_t own_latency = 0;
4322 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4323 OR LATENCY CALLBACK.
4325 This is called (early) from the latency callback. It computes the REAL
4326 latency associated with each port and stores the result as the "private"
4327 latency of the port. A later call to Route::set_public_port_latencies()
4328 sets all ports to the same value to reflect the fact that we do latency
4329 compensation and so all signals are delayed by the same amount as they
4330 flow through ardour.
4333 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4334 if ((*i)->active ()) {
4335 own_latency += (*i)->signal_latency ();
4340 /* playback: propagate latency from "outside the route" to outputs to inputs */
4341 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4343 /* capture: propagate latency from "outside the route" to inputs to outputs */
4344 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4349 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4351 /* this is called to set the JACK-visible port latencies, which take
4352 latency compensation into account.
4361 const PortSet& ports (_input->ports());
4362 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4363 p->set_public_latency_range (range, playback);
4368 const PortSet& ports (_output->ports());
4369 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4370 p->set_public_latency_range (range, playback);
4375 /** Put the invisible processors in the right place in _processors.
4376 * Must be called with a writer lock on _processor_lock held.
4379 __attribute__((annotate("realtime")))
4382 Route::setup_invisible_processors ()
4385 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4386 assert (!lm.locked ());
4390 /* too early to be doing this stuff */
4394 /* we'll build this new list here and then use it
4396 * TODO put the ProcessorList is on the stack for RT-safety.
4399 ProcessorList new_processors;
4401 /* find visible processors */
4403 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4404 if ((*i)->display_to_user ()) {
4405 new_processors.push_back (*i);
4411 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4413 if (amp == new_processors.end ()) {
4414 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4415 new_processors.push_front (_amp);
4416 amp = find (new_processors.begin(), new_processors.end(), _amp);
4419 /* and the processor after the amp */
4421 ProcessorList::iterator after_amp = amp;
4427 switch (_meter_point) {
4429 assert (!_meter->display_to_user ());
4430 new_processors.push_front (_meter);
4433 assert (!_meter->display_to_user ());
4434 new_processors.insert (amp, _meter);
4436 case MeterPostFader:
4437 /* do nothing here */
4440 /* do nothing here */
4443 /* the meter is visible, so we don't touch it here */
4450 assert (_main_outs);
4451 assert (!_main_outs->display_to_user ());
4452 new_processors.push_back (_main_outs);
4454 /* iterator for the main outs */
4456 ProcessorList::iterator main = new_processors.end();
4459 /* OUTPUT METERING */
4461 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4462 assert (!_meter->display_to_user ());
4464 /* add the processor just before or just after the main outs */
4466 ProcessorList::iterator meter_point = main;
4468 if (_meter_point == MeterOutput) {
4471 new_processors.insert (meter_point, _meter);
4476 if (_monitor_send && !is_monitor ()) {
4477 assert (!_monitor_send->display_to_user ());
4478 switch (Config->get_listen_position ()) {
4479 case PreFaderListen:
4480 switch (Config->get_pfl_position ()) {
4481 case PFLFromBeforeProcessors:
4482 new_processors.push_front (_monitor_send);
4484 case PFLFromAfterProcessors:
4485 new_processors.insert (amp, _monitor_send);
4488 _monitor_send->set_can_pan (false);
4490 case AfterFaderListen:
4491 switch (Config->get_afl_position ()) {
4492 case AFLFromBeforeProcessors:
4493 new_processors.insert (after_amp, _monitor_send);
4495 case AFLFromAfterProcessors:
4496 new_processors.insert (new_processors.end(), _monitor_send);
4499 _monitor_send->set_can_pan (true);
4504 #if 0 // not used - just yet
4505 if (!is_master() && !is_monitor() && !is_auditioner()) {
4506 new_processors.push_front (_delayline);
4510 /* MONITOR CONTROL */
4512 if (_monitor_control && is_monitor ()) {
4513 assert (!_monitor_control->display_to_user ());
4514 new_processors.insert (amp, _monitor_control);
4519 if (_trim && _trim->active()) {
4520 assert (!_trim->display_to_user ());
4521 new_processors.push_front (_trim);
4524 /* INTERNAL RETURN */
4526 /* doing this here means that any monitor control will come after
4527 the return and trim.
4531 assert (!_intreturn->display_to_user ());
4532 new_processors.push_front (_intreturn);
4535 /* EXPORT PROCESSOR */
4537 if (_capturing_processor) {
4538 assert (!_capturing_processor->display_to_user ());
4539 new_processors.push_front (_capturing_processor);
4542 _processors = new_processors;
4544 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4545 if (!(*i)->display_to_user () && !(*i)->enabled () && (*i) != _monitor_send) {
4546 (*i)->enable (true);
4550 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4551 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4552 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4559 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4560 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4564 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4565 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4572 /** If the meter point is `Custom', make a note of where the meter is.
4573 * This is so that if the meter point is subsequently set to something else,
4574 * and then back to custom, we can put the meter back where it was last time
4575 * custom was enabled.
4577 * Must be called with the _processor_lock held.
4580 Route::maybe_note_meter_position ()
4582 if (_meter_point != MeterCustom) {
4586 _custom_meter_position_noted = true;
4587 /* custom meter points range from after trim to before panner/main_outs
4588 * this is a limitation by the current processor UI
4590 bool seen_trim = false;
4591 _processor_after_last_custom_meter.reset();
4592 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4593 if ((*i) == _trim) {
4596 if ((*i) == _main_outs) {
4597 _processor_after_last_custom_meter = *i;
4600 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4602 _processor_after_last_custom_meter = _trim;
4604 ProcessorList::iterator j = i;
4606 assert(j != _processors.end ()); // main_outs should be before
4607 _processor_after_last_custom_meter = *j;
4612 assert(_processor_after_last_custom_meter.lock());
4615 boost::shared_ptr<Processor>
4616 Route::processor_by_id (PBD::ID id) const
4618 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4619 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4620 if ((*i)->id() == id) {
4625 return boost::shared_ptr<Processor> ();
4628 /** @return the monitoring state, or in other words what data we are pushing
4629 * into the route (data from the inputs, data from disk or silence)
4632 Route::monitoring_state () const
4634 return MonitoringInput;
4637 /** @return what we should be metering; either the data coming from the input
4638 * IO or the data that is flowing through the route.
4641 Route::metering_state () const
4643 return MeteringRoute;
4647 Route::has_external_redirects () const
4649 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4651 /* ignore inactive processors and obviously ignore the main
4652 * outs since everything has them and we don't care.
4655 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4663 boost::shared_ptr<Processor>
4664 Route::the_instrument () const
4666 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4667 return the_instrument_unlocked ();
4670 boost::shared_ptr<Processor>
4671 Route::the_instrument_unlocked () const
4673 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4674 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4675 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4679 return boost::shared_ptr<Processor>();
4685 Route::non_realtime_locate (framepos_t pos)
4688 _pannable->transport_located (pos);
4691 if (_delayline.get()) {
4692 _delayline.get()->flush();
4696 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4697 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4699 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4700 (*i)->transport_located (pos);
4703 _roll_delay = _initial_delay;
4707 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4714 * We don't currently mix MIDI input together, so we don't need the
4715 * complex logic of the audio case.
4718 n_buffers = bufs.count().n_midi ();
4720 for (i = 0; i < n_buffers; ++i) {
4722 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4723 MidiBuffer& buf (bufs.get_midi (i));
4726 buf.copy (source_port->get_midi_buffer(nframes));
4728 buf.silence (nframes);
4734 n_buffers = bufs.count().n_audio();
4736 size_t n_ports = io->n_ports().n_audio();
4737 float scaling = 1.0f;
4739 if (n_ports > n_buffers) {
4740 scaling = ((float) n_buffers) / n_ports;
4743 for (i = 0; i < n_ports; ++i) {
4745 /* if there are more ports than buffers, map them onto buffers
4746 * in a round-robin fashion
4749 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4750 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4753 if (i < n_buffers) {
4755 /* first time through just copy a channel into
4759 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4761 if (scaling != 1.0f) {
4762 buf.apply_gain (scaling, nframes);
4767 /* on subsequent times around, merge data from
4768 * the port with what is already there
4771 if (scaling != 1.0f) {
4772 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4774 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4779 /* silence any remaining buffers */
4781 for (; i < n_buffers; ++i) {
4782 AudioBuffer& buf (bufs.get_audio (i));
4783 buf.silence (nframes);
4786 /* establish the initial setup of the buffer set, reflecting what was
4787 copied into it. unless, of course, we are the auditioner, in which
4788 case nothing was fed into it from the inputs at all.
4791 if (!is_auditioner()) {
4792 bufs.set_count (io->n_ports());
4796 boost::shared_ptr<AutomationControl>
4797 Route::pan_azimuth_control() const
4800 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4802 return boost::shared_ptr<AutomationControl>();
4804 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
4805 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4807 if (!_pannable || !panner()) {
4808 return boost::shared_ptr<AutomationControl>();
4810 return _pannable->pan_azimuth_control;
4814 boost::shared_ptr<AutomationControl>
4815 Route::pan_elevation_control() const
4817 if (Profile->get_mixbus() || !_pannable || !panner()) {
4818 return boost::shared_ptr<AutomationControl>();
4821 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4823 if (c.find (PanElevationAutomation) != c.end()) {
4824 return _pannable->pan_elevation_control;
4826 return boost::shared_ptr<AutomationControl>();
4829 boost::shared_ptr<AutomationControl>
4830 Route::pan_width_control() const
4832 if (Profile->get_mixbus() || !_pannable || !panner()) {
4833 return boost::shared_ptr<AutomationControl>();
4836 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4838 if (c.find (PanWidthAutomation) != c.end()) {
4839 return _pannable->pan_width_control;
4841 return boost::shared_ptr<AutomationControl>();
4844 boost::shared_ptr<AutomationControl>
4845 Route::pan_frontback_control() const
4847 if (Profile->get_mixbus() || !_pannable || !panner()) {
4848 return boost::shared_ptr<AutomationControl>();
4851 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4853 if (c.find (PanFrontBackAutomation) != c.end()) {
4854 return _pannable->pan_frontback_control;
4856 return boost::shared_ptr<AutomationControl>();
4859 boost::shared_ptr<AutomationControl>
4860 Route::pan_lfe_control() const
4862 if (Profile->get_mixbus() || !_pannable || !panner()) {
4863 return boost::shared_ptr<AutomationControl>();
4866 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
4868 if (c.find (PanLFEAutomation) != c.end()) {
4869 return _pannable->pan_lfe_control;
4871 return boost::shared_ptr<AutomationControl>();
4876 Route::eq_band_cnt () const
4878 if (Profile->get_mixbus()) {
4881 /* Ardour has no well-known EQ object */
4886 boost::shared_ptr<AutomationControl>
4887 Route::eq_gain_controllable (uint32_t band) const
4890 boost::shared_ptr<PluginInsert> eq = ch_eq();
4893 return boost::shared_ptr<AutomationControl>();
4896 uint32_t port_number;
4899 if (is_master() || mixbus()) {
4906 if (is_master() || mixbus()) {
4913 if (is_master() || mixbus()) {
4920 return boost::shared_ptr<AutomationControl>();
4923 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4925 return boost::shared_ptr<AutomationControl>();
4928 boost::shared_ptr<AutomationControl>
4929 Route::eq_freq_controllable (uint32_t band) const
4933 if (mixbus() || is_master()) {
4934 /* no frequency controls for mixbusses or master */
4935 return boost::shared_ptr<AutomationControl>();
4938 boost::shared_ptr<PluginInsert> eq = ch_eq();
4941 return boost::shared_ptr<AutomationControl>();
4944 uint32_t port_number;
4956 return boost::shared_ptr<AutomationControl>();
4959 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
4961 return boost::shared_ptr<AutomationControl>();
4965 boost::shared_ptr<AutomationControl>
4966 Route::eq_q_controllable (uint32_t band) const
4968 return boost::shared_ptr<AutomationControl>();
4971 boost::shared_ptr<AutomationControl>
4972 Route::eq_shape_controllable (uint32_t band) const
4974 return boost::shared_ptr<AutomationControl>();
4977 boost::shared_ptr<AutomationControl>
4978 Route::eq_enable_controllable () const
4981 boost::shared_ptr<PluginInsert> eq = ch_eq();
4984 return boost::shared_ptr<AutomationControl>();
4987 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
4989 return boost::shared_ptr<AutomationControl>();
4993 boost::shared_ptr<AutomationControl>
4994 Route::eq_hpf_controllable () const
4997 boost::shared_ptr<PluginInsert> eq = ch_eq();
5000 return boost::shared_ptr<AutomationControl>();
5003 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5005 return boost::shared_ptr<AutomationControl>();
5010 Route::eq_band_name (uint32_t band) const
5012 if (Profile->get_mixbus()) {
5028 boost::shared_ptr<AutomationControl>
5029 Route::comp_enable_controllable () const
5032 boost::shared_ptr<PluginInsert> comp = ch_comp();
5035 return boost::shared_ptr<AutomationControl>();
5038 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5040 return boost::shared_ptr<AutomationControl>();
5043 boost::shared_ptr<AutomationControl>
5044 Route::comp_threshold_controllable () const
5047 boost::shared_ptr<PluginInsert> comp = ch_comp();
5050 return boost::shared_ptr<AutomationControl>();
5053 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5056 return boost::shared_ptr<AutomationControl>();
5059 boost::shared_ptr<AutomationControl>
5060 Route::comp_speed_controllable () const
5063 boost::shared_ptr<PluginInsert> comp = ch_comp();
5066 return boost::shared_ptr<AutomationControl>();
5069 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5071 return boost::shared_ptr<AutomationControl>();
5074 boost::shared_ptr<AutomationControl>
5075 Route::comp_mode_controllable () const
5078 boost::shared_ptr<PluginInsert> comp = ch_comp();
5081 return boost::shared_ptr<AutomationControl>();
5084 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5086 return boost::shared_ptr<AutomationControl>();
5089 boost::shared_ptr<AutomationControl>
5090 Route::comp_makeup_controllable () const
5093 boost::shared_ptr<PluginInsert> comp = ch_comp();
5096 return boost::shared_ptr<AutomationControl>();
5099 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5101 return boost::shared_ptr<AutomationControl>();
5104 boost::shared_ptr<AutomationControl>
5105 Route::comp_redux_controllable () const
5108 boost::shared_ptr<PluginInsert> comp = ch_comp();
5111 return boost::shared_ptr<AutomationControl>();
5114 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5116 return boost::shared_ptr<AutomationControl>();
5121 Route::comp_mode_name (uint32_t mode) const
5126 return _("Leveler");
5128 return _("Compressor");
5130 return _("Limiter");
5132 return mixbus() ? _("Sidechain") : _("Limiter");
5142 Route::comp_speed_name (uint32_t mode) const
5160 boost::shared_ptr<AutomationControl>
5161 Route::send_level_controllable (uint32_t n) const
5164 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5166 return boost::shared_ptr<AutomationControl>();
5171 return boost::shared_ptr<AutomationControl>();
5174 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5175 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5177 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5179 return boost::shared_ptr<AutomationControl>();
5181 return s->gain_control ();
5185 boost::shared_ptr<AutomationControl>
5186 Route::send_enable_controllable (uint32_t n) const
5189 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5191 return boost::shared_ptr<AutomationControl>();
5196 return boost::shared_ptr<AutomationControl>();
5199 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5200 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5202 /* although Ardour sends have enable/disable as part of the Processor
5203 API, it is not exposed as a controllable.
5205 XXX: we should fix this.
5207 return boost::shared_ptr<AutomationControl>();
5212 Route::send_name (uint32_t n) const
5218 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5222 boost::shared_ptr<Processor> p = nth_send (n);
5231 boost::shared_ptr<AutomationControl>
5232 Route::master_send_enable_controllable () const
5235 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5237 return boost::shared_ptr<AutomationControl>();
5239 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5241 return boost::shared_ptr<AutomationControl>();
5246 Route::slaved () const
5248 if (!_gain_control) {
5251 /* just test one particular control, not all of them */
5252 return _gain_control->slaved ();
5256 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5258 if (!vca || !_gain_control) {
5262 /* just test one particular control, not all of them */
5264 return _gain_control->slaved_to (vca->gain_control());
5268 Route::muted_by_others_soloing () const
5270 if (!can_be_muted_by_others ()) {
5274 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5278 Route::clear_all_solo_state ()
5280 _solo_control->clear_all_solo_state ();