2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/unwind.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_track.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/boost_debug.h"
44 #include "ardour/buffer.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/capturing_processor.h"
47 #include "ardour/debug.h"
48 #include "ardour/delivery.h"
49 #include "ardour/gain_control.h"
50 #include "ardour/internal_return.h"
51 #include "ardour/internal_send.h"
52 #include "ardour/meter.h"
53 #include "ardour/delayline.h"
54 #include "ardour/midi_buffer.h"
55 #include "ardour/midi_port.h"
56 #include "ardour/monitor_processor.h"
57 #include "ardour/pannable.h"
58 #include "ardour/panner.h"
59 #include "ardour/panner_shell.h"
60 #include "ardour/parameter_descriptor.h"
61 #include "ardour/phase_control.h"
62 #include "ardour/plugin_insert.h"
63 #include "ardour/port.h"
64 #include "ardour/port_insert.h"
65 #include "ardour/processor.h"
66 #include "ardour/profile.h"
67 #include "ardour/route.h"
68 #include "ardour/route_group.h"
69 #include "ardour/send.h"
70 #include "ardour/session.h"
71 #include "ardour/solo_control.h"
72 #include "ardour/solo_isolate_control.h"
73 #include "ardour/unknown_processor.h"
74 #include "ardour/utils.h"
75 #include "ardour/vca.h"
80 using namespace ARDOUR;
83 PBD::Signal0<void> Route::SyncOrderKeys;
84 PBD::Signal0<void> Route::RemoteControlIDChange;
85 PBD::Signal3<int,boost::shared_ptr<Route>, boost::shared_ptr<PluginInsert>, Route::PluginSetupOptions > Route::PluginSetup;
87 /** Base class for all routable/mixable objects (tracks and busses) */
88 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
89 : GraphNode (sess._process_graph)
90 , Stripable (sess, name)
91 , Muteable (sess, name)
95 , _signal_latency_at_amp_position (0)
96 , _signal_latency_at_trim_position (0)
99 , _pending_process_reorder (0)
100 , _pending_signals (0)
102 , _pending_declick (true)
103 , _meter_point (MeterPostFader)
104 , _pending_meter_point (MeterPostFader)
105 , _meter_type (MeterPeak)
106 , _denormal_protection (false)
109 , _declickable (false)
110 , _have_internal_generator (false)
111 , _default_type (default_type)
113 , _has_order_key (false)
114 , _remote_control_id (0)
116 , _in_configure_processors (false)
117 , _initial_io_setup (false)
118 , _in_sidechain_setup (false)
120 , _custom_meter_position_noted (false)
123 processor_max_streams.reset();
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 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
149 add_control (_solo_control);
150 _solo_control->Changed.connect_same_thread (*this, boost::bind (&Route::solo_control_changed, this, _1, _2));
152 _mute_control.reset (new MuteControl (_session, X_("mute"), *this));
153 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
154 add_control (_mute_control);
156 _phase_control.reset (new PhaseControl (_session, X_("phase")));
157 add_control (_phase_control);
159 _solo_isolate_control.reset (new SoloIsolateControl (_session, X_("solo-iso"), *this, *this));
160 add_control (_solo_isolate_control);
162 _solo_safe_control.reset (new SoloSafeControl (_session, X_("solo-safe")));
163 add_control (_solo_safe_control);
167 if (!(_flags & Route::MonitorOut)) {
168 _pannable.reset (new Pannable (_session));
171 /* input and output objects */
173 _input.reset (new IO (_session, _name, IO::Input, _default_type));
174 _output.reset (new IO (_session, _name, IO::Output, _default_type));
176 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
177 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
179 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
180 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
182 /* add the amp/fader processor.
183 * it should be the first processor to be added on every route.
186 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
187 add_processor (_amp, PostFader);
190 _amp->set_display_name (_("Monitor"));
193 #if 0 // not used - just yet
194 if (!is_master() && !is_monitor() && !is_auditioner()) {
195 _delayline.reset (new DelayLine (_session, _name));
196 add_processor (_delayline, PreFader);
202 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
203 _trim->set_display_to_user (false);
205 if (dynamic_cast<AudioTrack*>(this)) {
206 /* we can't do this in the AudioTrack's constructor
207 * because _trim does not exit then
211 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
216 /* create standard processors: meter, main outs, monitor out;
217 they will be added to _processors by setup_invisible_processors ()
220 _meter.reset (new PeakMeter (_session, _name));
221 _meter->set_owner (this);
222 _meter->set_display_to_user (false);
225 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
226 _main_outs->activate ();
229 /* where we listen to tracks */
230 _intreturn.reset (new InternalReturn (_session));
231 _intreturn->activate ();
233 /* the thing that provides proper control over a control/monitor/listen bus
234 (such as per-channel cut, dim, solo, invert, etc).
236 _monitor_control.reset (new MonitorProcessor (_session));
237 _monitor_control->activate ();
240 if (is_master() || is_monitor() || is_auditioner()) {
241 _mute_master->set_solo_ignore (true);
244 /* now that we have _meter, its safe to connect to this */
247 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
248 configure_processors (0);
256 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
258 /* do this early so that we don't get incoming signals as we are going through destruction
263 /* don't use clear_processors here, as it depends on the session which may
264 be half-destroyed by now
267 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
268 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
269 (*i)->drop_references ();
272 _processors.clear ();
276 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
278 if (Config->get_remote_model() != UserOrdered) {
282 set_remote_control_id_internal (id, notify_class_listeners);
286 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
288 /* force IDs for master/monitor busses and prevent
289 any other route from accidentally getting these IDs
290 (i.e. legacy sessions)
293 if (is_master() && id != MasterBusRemoteControlID) {
294 id = MasterBusRemoteControlID;
297 if (is_monitor() && id != MonitorBusRemoteControlID) {
298 id = MonitorBusRemoteControlID;
305 /* don't allow it to collide */
307 if (!is_master () && !is_monitor() &&
308 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
309 id += MonitorBusRemoteControlID;
312 if (id != remote_control_id()) {
313 _remote_control_id = id;
314 RemoteControlIDChanged ();
316 if (notify_class_listeners) {
317 RemoteControlIDChange ();
323 Route::remote_control_id() const
326 return MasterBusRemoteControlID;
330 return MonitorBusRemoteControlID;
333 return _remote_control_id;
337 Route::has_order_key () const
339 return _has_order_key;
343 Route::order_key () const
349 Route::set_remote_control_id_explicit (uint32_t rid)
351 if (is_master() || is_monitor() || is_auditioner()) {
352 /* hard-coded remote IDs, or no remote ID */
356 if (_remote_control_id != rid) {
357 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
358 _remote_control_id = rid;
359 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
362 /* don't emit the class-level RID signal RemoteControlIDChange here,
363 leave that to the entity that changed the order key, so that we
364 don't get lots of emissions for no good reasons (e.g. when changing
365 all route order keys).
367 See Session::sync_remote_id_from_order_keys() for the (primary|only)
368 spot where that is emitted.
373 Route::set_order_key (uint32_t n)
375 _has_order_key = true;
377 if (_order_key == n) {
383 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
384 name(), order_key ()));
386 _session.set_dirty ();
390 Route::ensure_track_or_route_name(string name, Session &session)
392 string newname = name;
394 while (!session.io_name_is_legal (newname)) {
395 newname = bump_name_once (newname, ' ');
402 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
404 // TODO route group, see set_gain()
405 // _trim_control->route_set_value (val);
409 Route::maybe_declick (BufferSet&, framecnt_t, int)
411 /* this is the "bus" implementation and they never declick.
416 /** Process this route for one (sub) cycle (process thread)
418 * @param bufs Scratch buffers to use for the signal path
419 * @param start_frame Initial transport frame
420 * @param end_frame Final transport frame
421 * @param nframes Number of frames to output (to ports)
423 * Note that (end_frame - start_frame) may not be equal to nframes when the
424 * transport speed isn't 1.0 (eg varispeed).
427 Route::process_output_buffers (BufferSet& bufs,
428 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
429 int declick, bool gain_automation_ok)
431 /* Caller must hold process lock */
432 assert (!AudioEngine::instance()->process_lock().trylock());
434 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
436 // can this actually happen? functions calling process_output_buffers()
437 // already take a reader-lock.
438 bufs.silence (nframes, 0);
442 /* figure out if we're going to use gain automation */
443 if (gain_automation_ok) {
444 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
445 _amp->setup_gain_automation (
446 start_frame + _signal_latency_at_amp_position,
447 end_frame + _signal_latency_at_amp_position,
450 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
451 _trim->setup_gain_automation (
452 start_frame + _signal_latency_at_trim_position,
453 end_frame + _signal_latency_at_trim_position,
456 _amp->apply_gain_automation (false);
457 _trim->apply_gain_automation (false);
460 /* Tell main outs what to do about monitoring. We do this so that
461 on a transition between monitoring states we get a de-clicking gain
462 change in the _main_outs delivery, if config.get_use_monitor_fades()
465 We override this in the case where we have an internal generator.
467 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
469 _main_outs->no_outs_cuz_we_no_monitor (silence);
471 /* -------------------------------------------------------------------------------------------
472 GLOBAL DECLICK (for transport changes etc.)
473 ----------------------------------------------------------------------------------------- */
475 maybe_declick (bufs, nframes, declick);
476 _pending_declick = 0;
478 /* -------------------------------------------------------------------------------------------
479 DENORMAL CONTROL/PHASE INVERT
480 ----------------------------------------------------------------------------------------- */
482 if (!_phase_control->none()) {
486 if (_denormal_protection || Config->get_denormal_protection()) {
488 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
489 Sample* const sp = i->data();
491 if (_phase_control->inverted (chn)) {
492 for (pframes_t nx = 0; nx < nframes; ++nx) {
497 for (pframes_t nx = 0; nx < nframes; ++nx) {
505 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
506 Sample* const sp = i->data();
508 if (_phase_control->inverted (chn)) {
509 for (pframes_t nx = 0; nx < nframes; ++nx) {
518 if (_denormal_protection || Config->get_denormal_protection()) {
520 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
521 Sample* const sp = i->data();
522 for (pframes_t nx = 0; nx < nframes; ++nx) {
530 /* -------------------------------------------------------------------------------------------
532 ----------------------------------------------------------------------------------------- */
534 /* set this to be true if the meter will already have been ::run() earlier */
535 bool const meter_already_run = metering_state() == MeteringInput;
537 framecnt_t latency = 0;
539 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
541 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
542 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
547 /* if it has any inputs, make sure they match */
548 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
549 if (bufs.count() != (*i)->input_streams()) {
551 DEBUG::Processors, string_compose (
552 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
553 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
560 /* should we NOT run plugins here if the route is inactive?
561 do we catch route != active somewhere higher?
564 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
565 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
568 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
569 bufs.set_count ((*i)->output_streams());
571 if ((*i)->active ()) {
572 latency += (*i)->signal_latency ();
578 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
579 boost::shared_ptr<Processor> endpoint,
580 bool include_endpoint, bool for_export, bool for_freeze)
582 /* If no processing is required, there's no need to go any further. */
583 if (!endpoint && !include_endpoint) {
587 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
588 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
589 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
591 /* trim is always at the top, for bounce no latency compensation is needed */
592 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
593 _trim->setup_gain_automation (start, start + nframes, nframes);
596 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
598 if (!include_endpoint && (*i) == endpoint) {
602 /* if we're *not* exporting, stop processing if we come across a routing processor. */
603 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
606 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
610 /* special case the panner (export outputs)
611 * Ideally we'd only run the panner, not the delivery itself...
612 * but panners need separate input/output buffers and some context
613 * (panshell, panner type, etc). AFAICT there is no ill side effect
614 * of re-using the main delivery when freewheeling/exporting a region.
616 if ((*i) == _main_outs) {
617 assert ((*i)->does_routing());
618 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
619 buffers.set_count ((*i)->output_streams());
622 /* don't run any processors that do routing.
623 * Also don't bother with metering.
625 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
626 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
627 buffers.set_count ((*i)->output_streams());
628 latency += (*i)->signal_latency ();
631 if ((*i) == endpoint) {
638 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
639 bool include_endpoint, bool for_export, bool for_freeze) const
641 framecnt_t latency = 0;
642 if (!endpoint && !include_endpoint) {
646 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
647 if (!include_endpoint && (*i) == endpoint) {
650 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
653 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
656 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
657 latency += (*i)->signal_latency ();
659 if ((*i) == endpoint) {
667 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
668 bool include_endpoint, bool for_export, bool for_freeze) const
670 if (!endpoint && !include_endpoint) {
674 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
675 if (!include_endpoint && (*i) == endpoint) {
678 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
681 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
684 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
685 cc = (*i)->output_streams();
687 if ((*i) == endpoint) {
695 Route::n_process_buffers ()
697 return max (_input->n_ports(), processor_max_streams);
701 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
703 assert (is_monitor());
704 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
705 fill_buffers_with_input (bufs, _input, nframes);
706 passthru (bufs, start_frame, end_frame, nframes, declick);
710 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
714 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
716 /* control/monitor bus ignores input ports when something is
717 feeding the listen "stream". data will "arrive" into the
718 route from the intreturn processor element.
721 bufs.silence (nframes, 0);
724 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
725 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
729 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
731 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
733 bufs.set_count (_input->n_ports());
734 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
735 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
739 Route::set_listen (bool yn)
743 _monitor_send->activate ();
745 _monitor_send->deactivate ();
751 Route::solo_control_changed (bool, Controllable::GroupControlDisposition)
753 /* nothing to do if we're not using AFL/PFL. But if we are, we need
754 to alter the active state of the monitor send.
757 if (Config->get_solo_control_is_listen_control ()) {
758 set_listen (_solo_control->self_soloed() || _solo_control->get_masters_value());
763 Route::push_solo_isolate_upstream (int32_t delta)
765 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
767 boost::shared_ptr<RouteList> routes = _session.get_routes ();
768 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
770 if ((*i).get() == this || !(*i)->can_solo()) {
775 bool does_feed = feeds (*i, &sends_only);
777 if (does_feed && !sends_only) {
778 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (delta);
784 Route::push_solo_upstream (int delta)
786 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
787 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
791 boost::shared_ptr<Route> sr (i->r.lock());
793 sr->solo_control()->mod_solo_by_others_downstream (-delta);
800 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
802 cerr << name << " {" << endl;
803 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
804 p != procs.end(); ++p) {
805 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
811 /** Supposing that we want to insert a Processor at a given Placement, return
812 * the processor to add the new one before (or 0 to add at the end).
814 boost::shared_ptr<Processor>
815 Route::before_processor_for_placement (Placement p)
817 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
819 ProcessorList::iterator loc;
822 /* generic pre-fader: insert immediately before the amp */
823 loc = find (_processors.begin(), _processors.end(), _amp);
825 /* generic post-fader: insert right before the main outs */
826 loc = find (_processors.begin(), _processors.end(), _main_outs);
829 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
832 /** Supposing that we want to insert a Processor at a given index, return
833 * the processor to add the new one before (or 0 to add at the end).
835 boost::shared_ptr<Processor>
836 Route::before_processor_for_index (int index)
839 return boost::shared_ptr<Processor> ();
842 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
844 ProcessorList::iterator i = _processors.begin ();
846 while (i != _processors.end() && j < index) {
847 if ((*i)->display_to_user()) {
854 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
857 /** Add a processor either pre- or post-fader
858 * @return 0 on success, non-0 on failure.
861 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
863 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
867 /** Add a processor to a route such that it ends up with a given index into the visible processors.
868 * @param index Index to add the processor at, or -1 to add at the end of the list.
869 * @return 0 on success, non-0 on failure.
872 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
874 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
877 /** Add a processor to the route.
878 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
879 * @return 0 on success, non-0 on failure.
882 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
884 assert (processor != _meter);
885 assert (processor != _main_outs);
887 DEBUG_TRACE (DEBUG::Processors, string_compose (
888 "%1 adding processor %2\n", name(), processor->name()));
892 pl.push_back (processor);
893 int rv = add_processors (pl, before, err);
899 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
900 processor->activate ();
907 Route::processor_selfdestruct (boost::weak_ptr<Processor> wp)
909 /* We cannot destruct the processor here (usually RT-thread
910 * with various locks held - in case of sends also io_locks).
911 * Queue for deletion in low-priority thread.
913 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
914 selfdestruct_sequence.push_back (wp);
918 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
920 XMLProperty const * prop;
923 boost::shared_ptr<Processor> processor;
925 /* bit of a hack: get the `placement' property from the <Redirect> tag here
926 so that we can add the processor in the right place (pre/post-fader)
929 XMLNodeList const & children = node.children ();
930 XMLNodeList::const_iterator i = children.begin ();
932 while (i != children.end() && (*i)->name() != X_("Redirect")) {
936 Placement placement = PreFader;
938 if (i != children.end()) {
939 if ((prop = (*i)->property (X_("placement"))) != 0) {
940 placement = Placement (string_2_enum (prop->value(), placement));
944 if (node.name() == "Insert") {
946 if ((prop = node.property ("type")) != 0) {
948 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
949 prop->value() == "lv2" ||
950 prop->value() == "windows-vst" ||
951 prop->value() == "lxvst" ||
952 prop->value() == "audiounit") {
954 if (_session.get_disable_all_loaded_plugins ()) {
955 processor.reset (new UnknownProcessor (_session, node));
957 processor.reset (new PluginInsert (_session));
958 processor->set_owner (this);
963 processor.reset (new PortInsert (_session, _pannable, _mute_master));
968 } else if (node.name() == "Send") {
970 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
971 processor.reset (new Send (_session, sendpan, _mute_master));
975 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
979 if (processor->set_state (node, version)) {
983 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
984 if (i != children.end()) {
985 if ((prop = (*i)->property (X_("active"))) != 0) {
986 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
987 processor->activate();
989 processor->deactivate();
993 return (add_processor (processor, placement, 0, false) == 0);
996 catch (failed_constructor &err) {
997 warning << _("processor could not be created. Ignored.") << endmsg;
1003 inline Route::PluginSetupOptions operator|= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
1004 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) | static_cast<int> (b));
1007 inline Route::PluginSetupOptions operator&= (Route::PluginSetupOptions& a, const Route::PluginSetupOptions& b) {
1008 return a = static_cast<Route::PluginSetupOptions> (static_cast <int>(a) & static_cast<int> (b));
1012 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1014 ProcessorList::iterator loc;
1017 loc = find(_processors.begin(), _processors.end(), before);
1018 if (loc == _processors.end ()) {
1022 /* nothing specified - at end */
1023 loc = _processors.end ();
1026 if (!AudioEngine::instance()->connected()) {
1030 if (others.empty()) {
1034 ProcessorList to_skip;
1036 // check if there's an instrument to replace or configure
1037 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1038 boost::shared_ptr<PluginInsert> pi;
1039 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) == 0) {
1042 if (!pi->plugin ()->get_info ()->is_instrument ()) {
1045 boost::shared_ptr<Processor> instrument = the_instrument ();
1046 ChanCount in (DataType::MIDI, 1);
1047 ChanCount out (DataType::AUDIO, 2); // XXX route's out?!
1049 PluginSetupOptions flags = None;
1051 flags |= CanReplace;
1052 in = instrument->input_streams ();
1053 out = instrument->output_streams ();
1055 if (pi->has_output_presets (in, out)) {
1059 pi->set_strict_io (_strict_io);
1061 PluginSetupOptions mask = None;
1062 if (Config->get_ask_replace_instrument ()) {
1065 if (Config->get_ask_setup_instrument ()) {
1071 if (flags != None) {
1072 boost::optional<int> rv = PluginSetup (shared_from_this (), pi, flags); /* EMIT SIGNAL */
1073 switch (rv.get_value_or (0)) {
1075 to_skip.push_back (*i); // don't add this one;
1078 replace_processor (instrument, *i, err);
1079 to_skip.push_back (*i);
1088 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1089 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1090 ProcessorState pstate (this);
1092 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1097 ProcessorList::iterator check = find (to_skip.begin(), to_skip.end(), *i);
1098 if (check != to_skip.end()) {
1102 boost::shared_ptr<PluginInsert> pi;
1104 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1105 pi->set_strict_io (_strict_io);
1109 /* Ensure that only one amp is in the list at any time */
1110 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), *i);
1111 if (check != _processors.end()) {
1112 if (before == _amp) {
1113 /* Already in position; all is well */
1116 _processors.erase (check);
1121 assert (find (_processors.begin(), _processors.end(), *i) == _processors.end ());
1123 _processors.insert (loc, *i);
1124 (*i)->set_owner (this);
1127 if (configure_processors_unlocked (err, &lm)) {
1129 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
1134 if ((*i)->active()) {
1138 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1140 boost::shared_ptr<Send> send;
1141 if ((send = boost::dynamic_pointer_cast<Send> (*i))) {
1142 send->SelfDestruct.connect_same_thread (*this,
1143 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (*i)));
1147 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1148 boost::shared_ptr<PluginInsert> pi;
1150 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1151 if (pi->has_no_inputs ()) {
1152 _have_internal_generator = true;
1158 _output->set_user_latency (0);
1161 reset_instrument_info ();
1162 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1163 set_processor_positions ();
1169 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1171 if (p == PreFader) {
1172 start = _processors.begin();
1173 end = find(_processors.begin(), _processors.end(), _amp);
1175 start = find(_processors.begin(), _processors.end(), _amp);
1177 end = _processors.end();
1181 /** Turn off all processors with a given placement
1182 * @param p Placement of processors to disable
1185 Route::disable_processors (Placement p)
1187 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1189 ProcessorList::iterator start, end;
1190 placement_range(p, start, end);
1192 for (ProcessorList::iterator i = start; i != end; ++i) {
1193 (*i)->deactivate ();
1196 _session.set_dirty ();
1199 /** Turn off all redirects
1202 Route::disable_processors ()
1204 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1206 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1207 (*i)->deactivate ();
1210 _session.set_dirty ();
1213 /** Turn off all redirects with a given placement
1214 * @param p Placement of redirects to disable
1217 Route::disable_plugins (Placement p)
1219 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1221 ProcessorList::iterator start, end;
1222 placement_range(p, start, end);
1224 for (ProcessorList::iterator i = start; i != end; ++i) {
1225 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1226 (*i)->deactivate ();
1230 _session.set_dirty ();
1233 /** Turn off all plugins
1236 Route::disable_plugins ()
1238 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1240 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1241 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1242 (*i)->deactivate ();
1246 _session.set_dirty ();
1251 Route::ab_plugins (bool forward)
1253 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1257 /* forward = turn off all active redirects, and mark them so that the next time
1258 we go the other way, we will revert them
1261 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1262 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1266 if ((*i)->active()) {
1267 (*i)->deactivate ();
1268 (*i)->set_next_ab_is_active (true);
1270 (*i)->set_next_ab_is_active (false);
1276 /* backward = if the redirect was marked to go active on the next ab, do so */
1278 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1280 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1284 if ((*i)->get_next_ab_is_active()) {
1287 (*i)->deactivate ();
1292 _session.set_dirty ();
1296 /** Remove processors with a given placement.
1297 * @param p Placement of processors to remove.
1300 Route::clear_processors (Placement p)
1302 if (!_session.engine().connected()) {
1306 bool already_deleting = _session.deletion_in_progress();
1307 if (!already_deleting) {
1308 _session.set_deletion_in_progress();
1312 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1313 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1314 ProcessorList new_list;
1315 ProcessorStreams err;
1316 bool seen_amp = false;
1318 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1324 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1326 /* you can't remove these */
1328 new_list.push_back (*i);
1335 new_list.push_back (*i);
1338 (*i)->drop_references ();
1346 (*i)->drop_references ();
1349 new_list.push_back (*i);
1356 _processors = new_list;
1357 configure_processors_unlocked (&err, &lm); // this can't fail
1360 processor_max_streams.reset();
1361 _have_internal_generator = false;
1362 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1363 set_processor_positions ();
1365 reset_instrument_info ();
1367 if (!already_deleting) {
1368 _session.clear_deletion_in_progress();
1373 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1375 // TODO once the export point can be configured properly, do something smarter here
1376 if (processor == _capturing_processor) {
1377 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1378 if (need_process_lock) {
1382 _capturing_processor.reset();
1384 if (need_process_lock) {
1389 /* these can never be removed */
1391 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1395 if (!_session.engine().connected()) {
1399 processor_max_streams.reset();
1402 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1403 if (need_process_lock) {
1407 /* Caller must hold process lock */
1408 assert (!AudioEngine::instance()->process_lock().trylock());
1410 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1412 ProcessorState pstate (this);
1414 ProcessorList::iterator i;
1415 bool removed = false;
1417 for (i = _processors.begin(); i != _processors.end(); ) {
1418 if (*i == processor) {
1420 /* move along, see failure case for configure_processors()
1421 where we may need to reconfigure the processor.
1424 /* stop redirects that send signals to JACK ports
1425 from causing noise as a result of no longer being
1429 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1430 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
1434 iop = pi->sidechain();
1441 i = _processors.erase (i);
1449 _output->set_user_latency (0);
1457 if (configure_processors_unlocked (err, &lm)) {
1459 /* we know this will work, because it worked before :) */
1460 configure_processors_unlocked (0, &lm);
1464 _have_internal_generator = false;
1466 for (i = _processors.begin(); i != _processors.end(); ++i) {
1467 boost::shared_ptr<PluginInsert> pi;
1469 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1470 if (pi->has_no_inputs ()) {
1471 _have_internal_generator = true;
1476 if (need_process_lock) {
1481 reset_instrument_info ();
1482 processor->drop_references ();
1483 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1484 set_processor_positions ();
1490 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1492 /* these can never be removed */
1493 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1496 /* and can't be used as substitute, either */
1497 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1501 /* I/Os are out, too */
1502 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1506 /* this function cannot be used to swap/reorder processors */
1507 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1511 if (!AudioEngine::instance()->connected() || !old || !sub) {
1515 /* ensure that sub is not owned by another route */
1516 if (sub->owner ()) {
1521 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1522 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1523 ProcessorState pstate (this);
1525 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1527 ProcessorList::iterator i;
1528 bool replaced = false;
1529 bool enable = old->active ();
1531 for (i = _processors.begin(); i != _processors.end(); ) {
1533 i = _processors.erase (i);
1534 _processors.insert (i, sub);
1535 sub->set_owner (this);
1548 boost::shared_ptr<PluginInsert> pi;
1549 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1550 pi->set_strict_io (true);
1554 if (configure_processors_unlocked (err, &lm)) {
1556 configure_processors_unlocked (0, &lm);
1560 _have_internal_generator = false;
1562 for (i = _processors.begin(); i != _processors.end(); ++i) {
1563 boost::shared_ptr<PluginInsert> pi;
1564 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1565 if (pi->has_no_inputs ()) {
1566 _have_internal_generator = true;
1576 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1577 _output->set_user_latency (0);
1580 reset_instrument_info ();
1581 old->drop_references ();
1582 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1583 set_processor_positions ();
1588 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1590 ProcessorList deleted;
1592 if (!_session.engine().connected()) {
1596 processor_max_streams.reset();
1599 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1600 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1601 ProcessorState pstate (this);
1603 ProcessorList::iterator i;
1604 boost::shared_ptr<Processor> processor;
1606 for (i = _processors.begin(); i != _processors.end(); ) {
1610 /* these can never be removed */
1612 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1617 /* see if its in the list of processors to delete */
1619 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1624 /* stop IOProcessors that send to JACK ports
1625 from causing noise as a result of no longer being
1629 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(processor);
1630 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
1633 iop = pi->sidechain();
1640 deleted.push_back (processor);
1641 i = _processors.erase (i);
1644 if (deleted.empty()) {
1645 /* none of those in the requested list were found */
1649 _output->set_user_latency (0);
1651 if (configure_processors_unlocked (err, &lm)) {
1653 /* we know this will work, because it worked before :) */
1654 configure_processors_unlocked (0, &lm);
1659 _have_internal_generator = false;
1661 for (i = _processors.begin(); i != _processors.end(); ++i) {
1662 boost::shared_ptr<PluginInsert> pi;
1664 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1665 if (pi->has_no_inputs ()) {
1666 _have_internal_generator = true;
1673 /* now try to do what we need to so that those that were removed will be deleted */
1675 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1676 (*i)->drop_references ();
1679 reset_instrument_info ();
1680 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1681 set_processor_positions ();
1687 Route::reset_instrument_info ()
1689 boost::shared_ptr<Processor> instr = the_instrument();
1691 _instrument_info.set_internal_instrument (instr);
1695 /** Caller must hold process lock */
1697 Route::configure_processors (ProcessorStreams* err)
1699 #ifndef PLATFORM_WINDOWS
1700 assert (!AudioEngine::instance()->process_lock().trylock());
1703 if (!_in_configure_processors) {
1704 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1705 return configure_processors_unlocked (err, &lm);
1712 Route::input_streams () const
1714 return _input->n_ports ();
1717 list<pair<ChanCount, ChanCount> >
1718 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1720 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1722 return try_configure_processors_unlocked (in, err);
1725 list<pair<ChanCount, ChanCount> >
1726 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1728 // Check each processor in order to see if we can configure as requested
1730 list<pair<ChanCount, ChanCount> > configuration;
1733 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1734 DEBUG_TRACE (DEBUG::Processors, "{\n");
1736 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1738 if ((*p)->can_support_io_configuration(in, out)) {
1740 if (boost::dynamic_pointer_cast<Delivery> (*p)
1741 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main
1742 && !(is_monitor() || is_auditioner())
1743 && ( _strict_io || Profile->get_mixbus ())) {
1744 /* with strict I/O the panner + output are forced to
1745 * follow the last processor's output.
1747 * Delivery::can_support_io_configuration() will only add ports,
1748 * but not remove excess ports.
1750 * This works because the delivery only requires
1751 * as many outputs as there are inputs.
1752 * Delivery::configure_io() will do the actual removal
1753 * by calling _output->ensure_io()
1755 if (!is_master() && _session.master_out ()) {
1756 /* ..but at least as many as there are master-inputs */
1757 // XXX this may need special-casing for mixbus (master-outputs)
1758 // and should maybe be a preference anyway ?!
1759 out = ChanCount::max (in, _session.master_out ()->n_inputs ());
1765 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1766 configuration.push_back(make_pair(in, out));
1769 // restriction for Monitor Section Processors
1770 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
1771 /* do not allow to add/remove channels (for now)
1772 * The Monitor follows the master-bus and has no panner (unpan)
1773 * but do allow processors with midi-in to be added (e.g VSTs with control that
1774 * will remain unconnected)
1776 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration not allowed.\n");
1777 return list<pair<ChanCount, ChanCount> > ();
1779 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
1780 // internal sends make no sense, only feedback
1781 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1782 return list<pair<ChanCount, ChanCount> > ();
1784 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
1785 /* External Sends can be problematic. one can add/remove ports
1786 * there signal leaves the DAW to external monitors anyway, so there's
1787 * no real use for allowing them here anyway.
1789 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
1790 return list<pair<ChanCount, ChanCount> > ();
1792 if (boost::dynamic_pointer_cast<Send> (*p)) {
1794 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
1795 return list<pair<ChanCount, ChanCount> > ();
1804 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1805 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1806 DEBUG_TRACE (DEBUG::Processors, "}\n");
1807 return list<pair<ChanCount, ChanCount> > ();
1811 DEBUG_TRACE (DEBUG::Processors, "}\n");
1813 return configuration;
1816 /** Set the input/output configuration of each processor in the processors list.
1817 * Caller must hold process lock.
1818 * Return 0 on success, otherwise configuration is impossible.
1821 Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLock::WriterLock* lm)
1823 #ifndef PLATFORM_WINDOWS
1824 assert (!AudioEngine::instance()->process_lock().trylock());
1827 if (_in_configure_processors) {
1831 /* put invisible processors where they should be */
1832 setup_invisible_processors ();
1834 _in_configure_processors = true;
1836 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1838 if (configuration.empty ()) {
1839 _in_configure_processors = false;
1844 bool seen_mains_out = false;
1845 processor_out_streams = _input->n_ports();
1846 processor_max_streams.reset();
1848 /* processor configure_io() may result in adding ports
1849 * e.g. Delivery::configure_io -> ARDOUR::IO::ensure_io ()
1851 * with jack2 adding ports results in a graph-order callback,
1852 * which calls Session::resort_routes() and eventually
1853 * Route::direct_feeds_according_to_reality()
1854 * which takes a ReaderLock (_processor_lock).
1856 * so we can't hold a WriterLock here until jack2 threading
1859 * NB. we still hold the process lock
1861 * (ardour's own engines do call graph-order from the
1862 * process-thread and hence do not have this issue; besides
1863 * merely adding ports won't trigger a graph-order, only
1864 * making connections does)
1868 // TODO check for a potential ReaderLock after ReaderLock ??
1869 Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
1871 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1872 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1874 if (!(*p)->configure_io(c->first, c->second)) {
1875 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1876 _in_configure_processors = false;
1881 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1882 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1884 boost::shared_ptr<IOProcessor> iop;
1885 boost::shared_ptr<PluginInsert> pi;
1886 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1887 /* plugins connected via Split or Hide Match may have more channels.
1888 * route/scratch buffers are needed for all of them
1889 * The configuration may only be a subset (both input and output)
1891 processor_max_streams = ChanCount::max(processor_max_streams, pi->required_buffers());
1893 else if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*p)) != 0) {
1894 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_input_streams());
1895 processor_max_streams = ChanCount::max(processor_max_streams, iop->natural_output_streams());
1899 if (boost::dynamic_pointer_cast<Delivery> (*p)
1900 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1901 /* main delivery will increase port count to match input.
1902 * the Delivery::Main is usually the last processor - followed only by
1905 seen_mains_out = true;
1907 if (!seen_mains_out) {
1908 processor_out_streams = out;
1917 _meter->set_max_channels (processor_max_streams);
1920 /* make sure we have sufficient scratch buffers to cope with the new processor
1923 _session.ensure_buffers (n_process_buffers ());
1925 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1927 _in_configure_processors = false;
1931 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1932 * @param state New active state for those processors.
1935 Route::all_visible_processors_active (bool state)
1937 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1939 if (_processors.empty()) {
1943 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1944 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1951 (*i)->deactivate ();
1955 _session.set_dirty ();
1959 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1961 /* check if re-order requires re-configuration of any processors
1962 * -> compare channel configuration for all processors
1964 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1965 ChanCount c = input_streams ();
1967 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1969 if (c != (*j)->input_streams()) {
1972 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1975 if ((*i)->input_streams() != c) {
1978 c = (*i)->output_streams();
1990 __attribute__((annotate("realtime")))
1993 Route::apply_processor_order (const ProcessorList& new_order)
1995 /* need to hold processor_lock; either read or write lock
1996 * and the engine process_lock.
1997 * Due to r/w lock ambiguity we can only assert the latter
1999 assert (!AudioEngine::instance()->process_lock().trylock());
2002 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2003 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2004 * processors in the current actual processor list that are hidden. Any visible processors
2005 * in the current list but not in "new_order" will be assumed to be deleted.
2008 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2009 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2010 * (note though that ::processors_reorder_needs_configure() ensured that
2011 * this function will only ever be called from the rt-thread if no processor were removed)
2013 * either way, I can't proove it, but an x-run due to re-order here is less likley
2014 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2017 ProcessorList as_it_will_be;
2018 ProcessorList::iterator oiter;
2019 ProcessorList::const_iterator niter;
2021 oiter = _processors.begin();
2022 niter = new_order.begin();
2024 while (niter != new_order.end()) {
2026 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2027 then append it to the temp list.
2029 Otherwise, see if the next processor in the old list is in the new list. if not,
2030 its been deleted. If its there, append it to the temp list.
2033 if (oiter == _processors.end()) {
2035 /* no more elements in the old list, so just stick the rest of
2036 the new order onto the temp list.
2039 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2040 while (niter != new_order.end()) {
2047 if (!(*oiter)->display_to_user()) {
2049 as_it_will_be.push_back (*oiter);
2053 /* visible processor: check that its in the new order */
2055 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2056 /* deleted: do nothing, shared_ptr<> will clean up */
2058 /* ignore this one, and add the next item from the new order instead */
2059 as_it_will_be.push_back (*niter);
2064 /* now remove from old order - its taken care of no matter what */
2065 oiter = _processors.erase (oiter);
2069 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2071 /* If the meter is in a custom position, find it and make a rough note of its position */
2072 maybe_note_meter_position ();
2076 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2078 // it a change is already queued, wait for it
2079 // (unless engine is stopped. apply immediately and proceed
2080 while (g_atomic_int_get (&_pending_process_reorder)) {
2081 if (!AudioEngine::instance()->running()) {
2082 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2083 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2085 apply_processor_order(_pending_processor_order);
2086 setup_invisible_processors ();
2088 g_atomic_int_set (&_pending_process_reorder, 0);
2090 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2091 set_processor_positions ();
2093 // TODO rather use a semaphore or something.
2094 // but since ::reorder_processors() is called
2095 // from the GUI thread, this is fine..
2100 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2102 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2103 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2104 ProcessorState pstate (this);
2106 apply_processor_order (new_order);
2108 if (configure_processors_unlocked (err, &lm)) {
2116 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2117 set_processor_positions ();
2120 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2121 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2123 // _pending_processor_order is protected by _processor_lock
2124 _pending_processor_order = new_order;
2125 g_atomic_int_set (&_pending_process_reorder, 1);
2132 Route::add_remove_sidechain (boost::shared_ptr<Processor> proc, bool add)
2134 boost::shared_ptr<PluginInsert> pi;
2135 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2139 if (pi->has_sidechain () == add) {
2140 return true; // ?? call failed, but result is as expected.
2144 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2145 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2146 if (i == _processors.end ()) {
2152 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); // take before Writerlock to avoid deadlock
2153 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2154 PBD::Unwinder<bool> uw (_in_sidechain_setup, true);
2156 lx.release (); // IO::add_port() and ~IO takes process lock - XXX check if this is safe
2158 if (!pi->add_sidechain ()) {
2162 if (!pi->del_sidechain ()) {
2168 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2173 pi->del_sidechain ();
2175 pi->add_sidechain ();
2176 // TODO restore side-chain's state.
2181 configure_processors_unlocked (0, &lm);
2184 if (pi->has_sidechain ()) {
2185 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
2188 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2189 _session.set_dirty ();
2194 Route::plugin_preset_output (boost::shared_ptr<Processor> proc, ChanCount outs)
2196 boost::shared_ptr<PluginInsert> pi;
2197 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2202 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2203 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2204 if (i == _processors.end ()) {
2210 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2211 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2213 const ChanCount& old (pi->preset_out ());
2214 if (!pi->set_preset_out (outs)) {
2215 return true; // no change, OK
2218 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2221 pi->set_preset_out (old);
2224 configure_processors_unlocked (0, &lm);
2227 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2228 _session.set_dirty ();
2233 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2236 return customize_plugin_insert (proc, 0, unused, unused);
2240 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs, ChanCount sinks)
2242 boost::shared_ptr<PluginInsert> pi;
2243 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2248 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2249 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), proc);
2250 if (i == _processors.end ()) {
2256 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2257 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2259 bool old_cust = pi->custom_cfg ();
2260 uint32_t old_cnt = pi->get_count ();
2261 ChanCount old_chan = pi->output_streams ();
2262 ChanCount old_sinks = pi->natural_input_streams ();
2265 pi->set_custom_cfg (false);
2267 pi->set_custom_cfg (true);
2268 pi->set_count (count);
2269 pi->set_outputs (outs);
2270 pi->set_sinks (sinks);
2273 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2277 pi->set_count (old_cnt);
2278 pi->set_sinks (old_sinks);
2279 pi->set_outputs (old_chan);
2280 pi->set_custom_cfg (old_cust);
2284 configure_processors_unlocked (0, &lm);
2287 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2288 _session.set_dirty ();
2293 Route::set_strict_io (const bool enable)
2295 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2297 if (_strict_io != enable) {
2298 _strict_io = enable;
2299 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2300 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2301 boost::shared_ptr<PluginInsert> pi;
2302 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2303 pi->set_strict_io (_strict_io);
2307 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2311 _strict_io = !enable; // restore old value
2312 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2313 boost::shared_ptr<PluginInsert> pi;
2314 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2315 pi->set_strict_io (_strict_io);
2322 configure_processors (0);
2325 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2326 _session.set_dirty ();
2338 Route::get_template()
2340 return state(false);
2344 Route::state(bool full_state)
2347 if (!_session._template_state_dir.empty()) {
2348 assert (!full_state); // only for templates
2349 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2352 XMLNode *node = new XMLNode("Route");
2353 ProcessorList::iterator i;
2356 id().print (buf, sizeof (buf));
2357 node->add_property("id", buf);
2358 node->add_property ("name", _name);
2359 node->add_property("default-type", _default_type.to_string());
2360 node->add_property ("strict-io", _strict_io);
2363 node->add_property("flags", enum_2_string (_flags));
2366 node->add_property("active", _active?"yes":"no");
2368 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2369 node->add_property("meter-point", enum_2_string (_meter_point));
2371 node->add_property("meter-type", enum_2_string (_meter_type));
2374 node->add_property("route-group", _route_group->name());
2377 snprintf (buf, sizeof (buf), "%d", _order_key);
2378 node->add_property ("order-key", buf);
2380 node->add_child_nocopy (_solo_control->get_state ());
2381 node->add_child_nocopy (_solo_isolate_control->get_state ());
2382 node->add_child_nocopy (_solo_safe_control->get_state ());
2384 node->add_child_nocopy (_input->state (full_state));
2385 node->add_child_nocopy (_output->state (full_state));
2386 node->add_child_nocopy (_mute_master->get_state ());
2388 node->add_child_nocopy (_mute_control->get_state ());
2389 node->add_child_nocopy (_phase_control->get_state ());
2392 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2395 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2396 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2397 remote_control_node->add_property (X_("id"), buf);
2398 node->add_child_nocopy (*remote_control_node);
2400 if (_comment.length()) {
2401 XMLNode *cmt = node->add_child ("Comment");
2402 cmt->add_content (_comment);
2406 node->add_child_nocopy (_pannable->state (full_state));
2410 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2411 for (i = _processors.begin(); i != _processors.end(); ++i) {
2413 /* template save: do not include internal sends functioning as
2414 aux sends because the chance of the target ID
2415 in the session where this template is used
2418 similarly, do not save listen sends which connect to
2419 the monitor section, because these will always be
2422 boost::shared_ptr<InternalSend> is;
2424 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2425 if (is->role() == Delivery::Listen) {
2430 node->add_child_nocopy((*i)->state (full_state));
2435 node->add_child_copy (*_extra_xml);
2438 if (_custom_meter_position_noted) {
2439 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2441 after->id().print (buf, sizeof (buf));
2442 node->add_property (X_("processor-after-last-custom-meter"), buf);
2446 if (!_session._template_state_dir.empty()) {
2447 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2450 node->add_child_copy (Slavable::get_state());
2456 Route::set_state (const XMLNode& node, int version)
2458 if (version < 3000) {
2459 return set_state_2X (node, version);
2463 XMLNodeConstIterator niter;
2465 XMLProperty const * prop;
2467 if (node.name() != "Route"){
2468 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2472 if ((prop = node.property (X_("name"))) != 0) {
2473 Route::set_name (prop->value());
2477 _initial_io_setup = true;
2479 if ((prop = node.property (X_("flags"))) != 0) {
2480 _flags = Flag (string_2_enum (prop->value(), _flags));
2485 if ((prop = node.property (X_("strict-io"))) != 0) {
2486 _strict_io = string_is_affirmative (prop->value());
2490 _mute_master->set_solo_ignore (true);
2494 /* monitor bus does not get a panner, but if (re)created
2495 via XML, it will already have one by the time we
2496 call ::set_state(). so ... remove it.
2501 /* add all processors (except amp, which is always present) */
2503 nlist = node.children();
2504 XMLNode processor_state (X_("processor_state"));
2506 Stateful::save_extra_xml (node);
2508 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2512 if (child->name() == IO::state_node_name) {
2513 if ((prop = child->property (X_("direction"))) == 0) {
2517 if (prop->value() == "Input") {
2518 _input->set_state (*child, version);
2519 } else if (prop->value() == "Output") {
2520 _output->set_state (*child, version);
2523 } else if (child->name() == X_("Processor")) {
2524 processor_state.add_child_copy (*child);
2525 } else if (child->name() == X_("Pannable")) {
2527 _pannable->set_state (*child, version);
2529 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2531 } else if (child->name() == Controllable::xml_node_name) {
2532 if ((prop = child->property (X_("name"))) == 0) {
2536 if (prop->value() == _gain_control->name()) {
2537 _gain_control->set_state (*child, version);
2538 } else if (prop->value() == _solo_control->name()) {
2539 _solo_control->set_state (*child, version);
2540 } else if (prop->value() == _solo_safe_control->name()) {
2541 _solo_safe_control->set_state (*child, version);
2542 } else if (prop->value() == _solo_isolate_control->name()) {
2543 _solo_isolate_control->set_state (*child, version);
2544 } else if (prop->value() == _solo_control->name()) {
2545 _mute_control->set_state (*child, version);
2547 } else if (child->name() == Slavable::xml_node_name) {
2548 Slavable::set_state (*child, version);
2552 if ((prop = node.property (X_("meter-point"))) != 0) {
2553 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2554 set_meter_point (mp, true);
2556 _meter->set_display_to_user (_meter_point == MeterCustom);
2560 if ((prop = node.property (X_("meter-type"))) != 0) {
2561 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2564 _initial_io_setup = false;
2566 set_processor_state (processor_state);
2568 // this looks up the internal instrument in processors
2569 reset_instrument_info();
2571 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2572 set_denormal_protection (string_is_affirmative (prop->value()));
2575 if ((prop = node.property (X_("active"))) != 0) {
2576 bool yn = string_is_affirmative (prop->value());
2577 set_active (yn, this);
2580 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2581 set_order_key (atoi(prop->value()));
2584 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2588 string::size_type colon, equal;
2589 string remaining = prop->value();
2591 while (remaining.length()) {
2593 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2594 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2597 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2598 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2601 string keyname = remaining.substr (0, equal);
2603 if ((keyname == "EditorSort") || (keyname == "editor")) {
2604 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2610 colon = remaining.find_first_of (':');
2612 if (colon != string::npos) {
2613 remaining = remaining.substr (colon+1);
2620 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2621 PBD::ID id (prop->value ());
2622 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2623 ProcessorList::const_iterator i = _processors.begin ();
2624 while (i != _processors.end() && (*i)->id() != id) {
2628 if (i != _processors.end ()) {
2629 _processor_after_last_custom_meter = *i;
2630 _custom_meter_position_noted = true;
2634 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2637 if (child->name() == X_("Comment")) {
2639 /* XXX this is a terrible API design in libxml++ */
2641 XMLNode *cmt = *(child->children().begin());
2642 _comment = cmt->content();
2644 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2645 if (prop->value() == "solo") {
2646 _solo_control->set_state (*child, version);
2647 } else if (prop->value() == "mute") {
2648 _mute_control->set_state (*child, version);
2651 } else if (child->name() == X_("RemoteControl")) {
2652 if ((prop = child->property (X_("id"))) != 0) {
2654 sscanf (prop->value().c_str(), "%d", &x);
2655 set_remote_control_id_internal (x);
2658 } else if (child->name() == MuteMaster::xml_node_name) {
2659 _mute_master->set_state (*child, version);
2661 } else if (child->name() == Automatable::xml_node_name) {
2662 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2670 Route::set_state_2X (const XMLNode& node, int version)
2674 XMLNodeConstIterator niter;
2676 XMLProperty const * prop;
2678 /* 2X things which still remain to be handled:
2684 if (node.name() != "Route") {
2685 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2689 if ((prop = node.property (X_("flags"))) != 0) {
2690 string f = prop->value ();
2691 boost::replace_all (f, "ControlOut", "MonitorOut");
2692 _flags = Flag (string_2_enum (f, _flags));
2697 if (is_master() || is_monitor() || is_auditioner()) {
2698 _mute_master->set_solo_ignore (true);
2701 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2702 set_denormal_protection (string_is_affirmative (prop->value()));
2705 if ((prop = node.property (X_("muted"))) != 0) {
2708 bool muted = string_is_affirmative (prop->value());
2714 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2716 if (string_is_affirmative (prop->value())){
2717 mute_point = mute_point + "PreFader";
2722 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2724 if (string_is_affirmative (prop->value())){
2727 mute_point = mute_point + ",";
2730 mute_point = mute_point + "PostFader";
2735 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2737 if (string_is_affirmative (prop->value())){
2740 mute_point = mute_point + ",";
2743 mute_point = mute_point + "Listen";
2748 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2750 if (string_is_affirmative (prop->value())){
2753 mute_point = mute_point + ",";
2756 mute_point = mute_point + "Main";
2760 _mute_master->set_mute_points (mute_point);
2761 _mute_master->set_muted_by_self (true);
2765 if ((prop = node.property (X_("meter-point"))) != 0) {
2766 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2769 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2770 don't mean the same thing.
2773 if ((prop = node.property (X_("order-keys"))) != 0) {
2777 string::size_type colon, equal;
2778 string remaining = prop->value();
2780 while (remaining.length()) {
2782 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2783 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2786 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2787 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2790 string keyname = remaining.substr (0, equal);
2792 if (keyname == "EditorSort" || keyname == "editor") {
2793 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2799 colon = remaining.find_first_of (':');
2801 if (colon != string::npos) {
2802 remaining = remaining.substr (colon+1);
2811 nlist = node.children ();
2812 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2816 if (child->name() == IO::state_node_name) {
2818 /* there is a note in IO::set_state_2X() about why we have to call
2822 _input->set_state_2X (*child, version, true);
2823 _output->set_state_2X (*child, version, false);
2825 if ((prop = child->property (X_("name"))) != 0) {
2826 Route::set_name (prop->value ());
2831 if ((prop = child->property (X_("active"))) != 0) {
2832 bool yn = string_is_affirmative (prop->value());
2833 _active = !yn; // force switch
2834 set_active (yn, this);
2837 if ((prop = child->property (X_("gain"))) != 0) {
2840 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2841 _amp->gain_control()->set_value (val, Controllable::NoGroup);
2845 /* Set up Panners in the IO */
2846 XMLNodeList io_nlist = child->children ();
2848 XMLNodeConstIterator io_niter;
2851 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2853 io_child = *io_niter;
2855 if (io_child->name() == X_("Panner")) {
2856 _main_outs->panner_shell()->set_state(*io_child, version);
2857 } else if (io_child->name() == X_("Automation")) {
2858 /* IO's automation is for the fader */
2859 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2865 XMLNodeList redirect_nodes;
2867 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2871 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2872 redirect_nodes.push_back(child);
2877 set_processor_state_2X (redirect_nodes, version);
2879 Stateful::save_extra_xml (node);
2881 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2884 if (child->name() == X_("Comment")) {
2886 /* XXX this is a terrible API design in libxml++ */
2888 XMLNode *cmt = *(child->children().begin());
2889 _comment = cmt->content();
2891 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2892 if (prop->value() == X_("solo")) {
2893 _solo_control->set_state (*child, version);
2894 } else if (prop->value() == X_("mute")) {
2895 _mute_control->set_state (*child, version);
2898 } else if (child->name() == X_("RemoteControl")) {
2899 if ((prop = child->property (X_("id"))) != 0) {
2901 sscanf (prop->value().c_str(), "%d", &x);
2902 set_remote_control_id_internal (x);
2912 Route::get_processor_state ()
2914 XMLNode* root = new XMLNode (X_("redirects"));
2915 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2916 root->add_child_nocopy ((*i)->state (true));
2923 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2925 /* We don't bother removing existing processors not in nList, as this
2926 method will only be called when creating a Route from scratch, not
2927 for undo purposes. Just put processors in at the appropriate place
2931 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2932 add_processor_from_xml_2X (**i, version);
2937 Route::set_processor_state (const XMLNode& node)
2939 const XMLNodeList &nlist = node.children();
2940 XMLNodeConstIterator niter;
2941 ProcessorList new_order;
2942 bool must_configure = false;
2944 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2946 XMLProperty* prop = (*niter)->property ("type");
2948 if (prop->value() == "amp") {
2949 _amp->set_state (**niter, Stateful::current_state_version);
2950 new_order.push_back (_amp);
2951 } else if (prop->value() == "trim") {
2952 _trim->set_state (**niter, Stateful::current_state_version);
2953 new_order.push_back (_trim);
2954 } else if (prop->value() == "meter") {
2955 _meter->set_state (**niter, Stateful::current_state_version);
2956 new_order.push_back (_meter);
2957 } else if (prop->value() == "delay") {
2959 _delayline->set_state (**niter, Stateful::current_state_version);
2960 new_order.push_back (_delayline);
2962 } else if (prop->value() == "main-outs") {
2963 _main_outs->set_state (**niter, Stateful::current_state_version);
2964 } else if (prop->value() == "intreturn") {
2966 _intreturn.reset (new InternalReturn (_session));
2967 must_configure = true;
2969 _intreturn->set_state (**niter, Stateful::current_state_version);
2970 } else if (is_monitor() && prop->value() == "monitor") {
2971 if (!_monitor_control) {
2972 _monitor_control.reset (new MonitorProcessor (_session));
2973 must_configure = true;
2975 _monitor_control->set_state (**niter, Stateful::current_state_version);
2976 } else if (prop->value() == "capture") {
2977 /* CapturingProcessor should never be restored, it's always
2978 added explicitly when needed */
2980 ProcessorList::iterator o;
2982 for (o = _processors.begin(); o != _processors.end(); ++o) {
2983 XMLProperty const * id_prop = (*niter)->property(X_("id"));
2984 if (id_prop && (*o)->id() == id_prop->value()) {
2985 (*o)->set_state (**niter, Stateful::current_state_version);
2986 new_order.push_back (*o);
2991 // If the processor (*niter) is not on the route then create it
2993 if (o == _processors.end()) {
2995 boost::shared_ptr<Processor> processor;
2997 if (prop->value() == "intsend") {
2999 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
3001 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
3002 prop->value() == "lv2" ||
3003 prop->value() == "windows-vst" ||
3004 prop->value() == "lxvst" ||
3005 prop->value() == "luaproc" ||
3006 prop->value() == "audiounit") {
3008 if (_session.get_disable_all_loaded_plugins ()) {
3009 processor.reset (new UnknownProcessor (_session, **niter));
3011 processor.reset (new PluginInsert (_session));
3012 processor->set_owner (this);
3014 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
3015 pi->set_strict_io (true);
3019 } else if (prop->value() == "port") {
3021 processor.reset (new PortInsert (_session, _pannable, _mute_master));
3023 } else if (prop->value() == "send") {
3025 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
3026 boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (processor);
3027 send->SelfDestruct.connect_same_thread (*this,
3028 boost::bind (&Route::processor_selfdestruct, this, boost::weak_ptr<Processor> (processor)));
3031 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
3035 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
3036 /* This processor could not be configured. Turn it into a UnknownProcessor */
3037 processor.reset (new UnknownProcessor (_session, **niter));
3040 /* subscribe to Sidechain IO changes */
3041 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
3042 if (pi && pi->has_sidechain ()) {
3043 pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
3046 /* we have to note the monitor send here, otherwise a new one will be created
3047 and the state of this one will be lost.
3049 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
3050 if (isend && isend->role() == Delivery::Listen) {
3051 _monitor_send = isend;
3054 /* it doesn't matter if invisible processors are added here, as they
3055 will be sorted out by setup_invisible_processors () shortly.
3058 new_order.push_back (processor);
3059 must_configure = true;
3065 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3066 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3067 _processors = new_order;
3069 if (must_configure) {
3070 configure_processors_unlocked (0, &lm);
3073 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3075 (*i)->set_owner (this);
3076 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
3078 boost::shared_ptr<PluginInsert> pi;
3080 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
3081 if (pi->has_no_inputs ()) {
3082 _have_internal_generator = true;
3089 reset_instrument_info ();
3090 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3091 set_processor_positions ();
3095 Route::curve_reallocate ()
3097 // _gain_automation_curve.finish_resize ();
3098 // _pan_automation_curve.finish_resize ();
3102 Route::silence (framecnt_t nframes)
3104 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3109 silence_unlocked (nframes);
3113 Route::silence_unlocked (framecnt_t nframes)
3115 /* Must be called with the processor lock held */
3119 _output->silence (nframes);
3121 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3122 boost::shared_ptr<PluginInsert> pi;
3124 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
3125 // skip plugins, they don't need anything when we're not active
3129 (*i)->silence (nframes);
3132 if (nframes == _session.get_block_size()) {
3139 Route::add_internal_return ()
3142 _intreturn.reset (new InternalReturn (_session));
3143 add_processor (_intreturn, PreFader);
3148 Route::add_send_to_internal_return (InternalSend* send)
3150 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3152 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3153 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3156 return d->add_send (send);
3162 Route::remove_send_from_internal_return (InternalSend* send)
3164 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3166 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3167 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3170 return d->remove_send (send);
3176 Route::enable_monitor_send ()
3178 /* Caller must hold process lock */
3179 assert (!AudioEngine::instance()->process_lock().trylock());
3181 /* master never sends to monitor section via the normal mechanism */
3182 assert (!is_master ());
3183 assert (!is_monitor ());
3185 /* make sure we have one */
3186 if (!_monitor_send) {
3187 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3188 _monitor_send->set_display_to_user (false);
3192 configure_processors (0);
3195 /** Add an aux send to a route.
3196 * @param route route to send to.
3197 * @param before Processor to insert before, or 0 to insert at the end.
3200 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3202 assert (route != _session.monitor_out ());
3205 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3207 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3209 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3211 if (d && d->target_route() == route) {
3212 /* already listening via the specified IO: do nothing */
3220 boost::shared_ptr<InternalSend> listener;
3223 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3224 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3225 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3228 add_processor (listener, before);
3230 } catch (failed_constructor& err) {
3238 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3240 ProcessorStreams err;
3241 ProcessorList::iterator tmp;
3244 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3246 /* have to do this early because otherwise processor reconfig
3247 * will put _monitor_send back in the list
3250 if (route == _session.monitor_out()) {
3251 _monitor_send.reset ();
3255 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3257 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3259 if (d && d->target_route() == route) {
3261 if (remove_processor (*x, &err, false) > 0) {
3267 /* list could have been demolished while we dropped the lock
3270 if (_session.engine().connected()) {
3271 /* i/o processors cannot be removed if the engine is not running
3272 * so don't live-loop in case the engine is N/A or dies
3282 Route::set_comment (string cmt, void *src)
3286 _session.set_dirty ();
3290 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3292 FeedRecord fr (other, via_sends_only);
3294 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3296 if (!result.second) {
3298 /* already a record for "other" - make sure sends-only information is correct */
3299 if (!via_sends_only && result.first->sends_only) {
3300 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3301 frp->sends_only = false;
3305 return result.second;
3309 Route::clear_fed_by ()
3315 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3317 const FedBy& fed_by (other->fed_by());
3319 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3320 boost::shared_ptr<Route> sr = f->r.lock();
3322 if (sr && (sr.get() == this)) {
3324 if (via_sends_only) {
3325 *via_sends_only = f->sends_only;
3336 Route::all_inputs () const
3338 /* TODO, if this works as expected,
3339 * cache the IOVector and maintain it via
3340 * input_change_handler(), sidechain_change_handler() etc
3343 ios.push_back (_input);
3345 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3346 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3348 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3349 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3352 iop = pi->sidechain();
3355 if (iop != 0 && iop->input()) {
3356 ios.push_back (iop->input());
3363 Route::all_outputs () const
3366 // _output is included via Delivery
3367 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3368 for (ProcessorList::const_iterator r = _processors.begin(); r != _processors.end(); ++r) {
3369 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3370 if (iop != 0 && iop->output()) {
3371 ios.push_back (iop->output());
3378 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3380 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3381 if (other->all_inputs().fed_by (_output)) {
3382 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3383 if (via_send_only) {
3384 *via_send_only = false;
3390 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3392 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3394 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor>(*r);
3395 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*r);
3398 iop = pi->sidechain();
3402 boost::shared_ptr<const IO> iop_out = iop->output();
3403 if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
3404 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3405 if (via_send_only) {
3406 *via_send_only = true;
3410 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3413 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3418 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3423 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3425 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3429 Route::feeds_according_to_graph (boost::shared_ptr<Route> other)
3431 return _session._current_route_graph.feeds (shared_from_this (), other);
3434 /** Called from the (non-realtime) butler thread when the transport is stopped */
3436 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3438 framepos_t now = _session.transport_frame();
3441 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3443 Automatable::transport_stopped (now);
3445 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3447 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3451 (*i)->transport_stopped (now);
3455 _roll_delay = _initial_delay;
3459 Route::input_change_handler (IOChange change, void * /*src*/)
3461 if ((change.type & IOChange::ConfigurationChanged)) {
3462 /* This is called with the process lock held if change
3463 contains ConfigurationChanged
3465 configure_processors (0);
3466 _phase_control->resize (_input->n_ports().n_audio ());
3467 io_changed (); /* EMIT SIGNAL */
3470 if (_solo_control->soloed_by_others_upstream() || _solo_isolate_control->solo_isolated_by_upstream()) {
3473 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3474 if (_input->connected()) {
3475 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3476 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3480 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3481 if (does_feed && !sends_only) {
3482 if ((*i)->soloed()) {
3485 if ((*i)->solo_isolate_control()->solo_isolated()) {
3492 int delta = sbou - _solo_control->soloed_by_others_upstream();
3493 int idelta = ibou - _solo_isolate_control->solo_isolated_by_upstream();
3496 PBD::warning << string_compose (
3497 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3498 _name, ibou, _solo_isolate_control->solo_isolated_by_upstream(), idelta)
3503 if (_solo_control->soloed_by_others_upstream()) {
3504 // ignore new connections (they're not propagated)
3506 _solo_control->mod_solo_by_others_upstream (delta);
3510 if (_solo_isolate_control->solo_isolated_by_upstream()) {
3511 // solo-isolate currently only propagates downstream
3513 _solo_isolate_control->mod_solo_isolated_by_upstream (1);
3515 //_solo_isolated_by_upstream = ibou;
3518 // Session::route_solo_changed does not propagate indirect solo-changes
3519 // propagate downstream to tracks
3520 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3521 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3525 bool does_feed = feeds (*i, &sends_only);
3526 if (delta <= 0 && does_feed && !sends_only) {
3527 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3530 if (idelta < 0 && does_feed && !sends_only) {
3531 (*i)->solo_isolate_control()->mod_solo_isolated_by_upstream (-1);
3538 Route::output_change_handler (IOChange change, void * /*src*/)
3540 if (_initial_io_setup) {
3544 if ((change.type & IOChange::ConfigurationChanged)) {
3545 /* This is called with the process lock held if change
3546 contains ConfigurationChanged
3548 configure_processors (0);
3551 _session.reset_monitor_section();
3554 io_changed (); /* EMIT SIGNAL */
3557 if (_solo_control->soloed_by_others_downstream()) {
3559 /* checking all all downstream routes for
3560 * explicit of implict solo is a rather drastic measure,
3561 * ideally the input_change_handler() of the other route
3562 * would propagate the change to us.
3564 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3565 if (_output->connected()) {
3566 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3567 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3571 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3572 if (does_feed && !sends_only) {
3573 if ((*i)->soloed()) {
3580 int delta = sbod - _solo_control->soloed_by_others_downstream();
3582 // do not allow new connections to change implicit solo (no propagation)
3583 _solo_control->mod_solo_by_others_downstream (delta);
3584 // Session::route_solo_changed() does not propagate indirect solo-changes
3585 // propagate upstream to tracks
3586 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3587 if ((*i).get() == this || !can_solo()) {
3591 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3592 if (delta != 0 && does_feed && !sends_only) {
3593 (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3602 Route::sidechain_change_handler (IOChange change, void* src)
3604 if (_initial_io_setup || _in_sidechain_setup) {
3608 input_change_handler (change, src);
3612 Route::pans_required () const
3614 if (n_outputs().n_audio() < 2) {
3618 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3622 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3624 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3630 if (n_outputs().n_total() == 0) {
3634 if (!_active || n_inputs() == ChanCount::ZERO) {
3635 silence_unlocked (nframes);
3639 if (session_state_changing) {
3640 if (_session.transport_speed() != 0.0f) {
3641 /* we're rolling but some state is changing (e.g. our diskstream contents)
3642 so we cannot use them. Be silent till this is over.
3644 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3646 silence_unlocked (nframes);
3649 /* we're really not rolling, so we're either delivery silence or actually
3650 monitoring, both of which are safe to do while session_state_changing is true.
3654 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3656 fill_buffers_with_input (bufs, _input, nframes);
3658 if (_meter_point == MeterInput) {
3659 _meter->run (bufs, start_frame, end_frame, nframes, true);
3662 _amp->apply_gain_automation (false);
3663 _trim->apply_gain_automation (false);
3664 passthru (bufs, start_frame, end_frame, nframes, 0);
3670 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3672 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3677 if (n_outputs().n_total() == 0) {
3681 if (!_active || n_inputs().n_total() == 0) {
3682 silence_unlocked (nframes);
3686 framepos_t unused = 0;
3688 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3694 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3696 fill_buffers_with_input (bufs, _input, nframes);
3698 if (_meter_point == MeterInput) {
3699 _meter->run (bufs, start_frame, end_frame, nframes, true);
3702 passthru (bufs, start_frame, end_frame, nframes, declick);
3708 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3715 Route::flush_processors ()
3717 /* XXX shouldn't really try to take this lock, since
3718 this is called from the RT audio thread.
3721 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3723 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3729 __attribute__((annotate("realtime")))
3732 Route::apply_processor_changes_rt ()
3734 int emissions = EmitNone;
3736 if (_pending_meter_point != _meter_point) {
3737 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3739 /* meters always have buffers for 'processor_max_streams'
3740 * they can be re-positioned without re-allocation */
3741 if (set_meter_point_unlocked()) {
3742 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3744 emissions |= EmitMeterChanged;
3749 bool changed = false;
3751 if (g_atomic_int_get (&_pending_process_reorder)) {
3752 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3754 apply_processor_order (_pending_processor_order);
3755 setup_invisible_processors ();
3757 g_atomic_int_set (&_pending_process_reorder, 0);
3758 emissions |= EmitRtProcessorChange;
3762 set_processor_positions ();
3764 if (emissions != 0) {
3765 g_atomic_int_set (&_pending_signals, emissions);
3768 return (!selfdestruct_sequence.empty ());
3772 Route::emit_pending_signals ()
3774 int sig = g_atomic_int_and (&_pending_signals, 0);
3775 if (sig & EmitMeterChanged) {
3776 _meter->emit_configuration_changed();
3777 meter_change (); /* EMIT SIGNAL */
3778 if (sig & EmitMeterVisibilityChange) {
3779 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3781 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3784 if (sig & EmitRtProcessorChange) {
3785 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3788 /* this would be a job for the butler.
3789 * Conceptually we should not take processe/processor locks here.
3790 * OTOH its more efficient (less overhead for summoning the butler and
3791 * telling her what do do) and signal emission is called
3792 * directly after the process callback, which decreases the chance
3793 * of x-runs when taking the locks.
3795 while (!selfdestruct_sequence.empty ()) {
3796 Glib::Threads::Mutex::Lock lx (selfdestruct_lock);
3797 if (selfdestruct_sequence.empty ()) { break; } // re-check with lock
3798 boost::shared_ptr<Processor> proc = selfdestruct_sequence.back ().lock ();
3799 selfdestruct_sequence.pop_back ();
3802 remove_processor (proc);
3808 Route::set_meter_point (MeterPoint p, bool force)
3810 if (_pending_meter_point == p && !force) {
3814 if (force || !AudioEngine::instance()->running()) {
3815 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3816 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3817 _pending_meter_point = p;
3818 _meter->emit_configuration_changed();
3819 meter_change (); /* EMIT SIGNAL */
3820 if (set_meter_point_unlocked()) {
3821 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3823 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3826 _pending_meter_point = p;
3832 __attribute__((annotate("realtime")))
3835 Route::set_meter_point_unlocked ()
3838 /* Caller must hold process and processor write lock */
3839 assert (!AudioEngine::instance()->process_lock().trylock());
3840 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3841 assert (!lm.locked ());
3844 _meter_point = _pending_meter_point;
3846 bool meter_was_visible_to_user = _meter->display_to_user ();
3848 if (!_custom_meter_position_noted) {
3849 maybe_note_meter_position ();
3852 if (_meter_point != MeterCustom) {
3854 _meter->set_display_to_user (false);
3856 setup_invisible_processors ();
3859 _meter->set_display_to_user (true);
3861 /* If we have a previous position for the custom meter, try to put it there */
3862 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3864 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3865 if (i != _processors.end ()) {
3866 _processors.remove (_meter);
3867 _processors.insert (i, _meter);
3869 } else {// at end, right before the mains_out/panner
3870 _processors.remove (_meter);
3871 ProcessorList::iterator main = _processors.end();
3872 _processors.insert (--main, _meter);
3876 /* Set up the meter for its new position */
3878 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3882 if (loc == _processors.begin()) {
3883 m_in = _input->n_ports();
3885 ProcessorList::iterator before = loc;
3887 m_in = (*before)->output_streams ();
3890 _meter->reflect_inputs (m_in);
3892 /* we do not need to reconfigure the processors, because the meter
3893 (a) is always ready to handle processor_max_streams
3894 (b) is always an N-in/N-out processor, and thus moving
3895 it doesn't require any changes to the other processors.
3898 /* these should really be done after releasing the lock
3899 * but all those signals are subscribed to with gui_thread()
3902 return (_meter->display_to_user() != meter_was_visible_to_user);
3906 Route::listen_position_changed ()
3909 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3910 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3911 ProcessorState pstate (this);
3913 if (configure_processors_unlocked (0, &lm)) {
3914 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3916 configure_processors_unlocked (0, &lm); // it worked before we tried to add it ...
3921 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3922 _session.set_dirty ();
3925 boost::shared_ptr<CapturingProcessor>
3926 Route::add_export_point()
3928 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3929 if (!_capturing_processor) {
3931 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3932 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3934 _capturing_processor.reset (new CapturingProcessor (_session));
3935 _capturing_processor->activate ();
3937 configure_processors_unlocked (0, &lw);
3941 return _capturing_processor;
3945 Route::update_signal_latency ()
3947 framecnt_t l = _output->user_latency();
3948 framecnt_t lamp = 0;
3949 bool before_amp = true;
3950 framecnt_t ltrim = 0;
3951 bool before_trim = true;
3953 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3954 if ((*i)->active ()) {
3955 l += (*i)->signal_latency ();
3960 if ((*i) == _trim) {
3971 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3973 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3974 _signal_latency_at_amp_position = lamp;
3975 _signal_latency_at_trim_position = ltrim;
3977 if (_signal_latency != l) {
3978 _signal_latency = l;
3979 signal_latency_changed (); /* EMIT SIGNAL */
3982 return _signal_latency;
3986 Route::set_user_latency (framecnt_t nframes)
3988 _output->set_user_latency (nframes);
3989 _session.update_latency_compensation ();
3993 Route::set_latency_compensation (framecnt_t longest_session_latency)
3995 framecnt_t old = _initial_delay;
3997 if (_signal_latency < longest_session_latency) {
3998 _initial_delay = longest_session_latency - _signal_latency;
4003 DEBUG_TRACE (DEBUG::Latency, string_compose (
4004 "%1: compensate for maximum latency of %2,"
4005 "given own latency of %3, using initial delay of %4\n",
4006 name(), longest_session_latency, _signal_latency, _initial_delay));
4008 if (_initial_delay != old) {
4009 initial_delay_changed (); /* EMIT SIGNAL */
4012 if (_session.transport_stopped()) {
4013 _roll_delay = _initial_delay;
4018 Route::set_block_size (pframes_t nframes)
4020 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4021 (*i)->set_block_size (nframes);
4024 _session.ensure_buffers (n_process_buffers ());
4028 Route::protect_automation ()
4030 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
4031 (*i)->protect_automation();
4034 /** @param declick 1 to set a pending declick fade-in,
4035 * -1 to set a pending declick fade-out
4038 Route::set_pending_declick (int declick)
4041 /* this call is not allowed to turn off a pending declick */
4043 _pending_declick = declick;
4046 _pending_declick = 0;
4050 /** Shift automation forwards from a particular place, thereby inserting time.
4051 * Adds undo commands for any shifts that are performed.
4053 * @param pos Position to start shifting from.
4054 * @param frames Amount to shift forwards by.
4058 Route::shift (framepos_t pos, framecnt_t frames)
4060 /* gain automation */
4062 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
4064 XMLNode &before = gc->alist()->get_state ();
4065 gc->alist()->shift (pos, frames);
4066 XMLNode &after = gc->alist()->get_state ();
4067 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4070 /* gain automation */
4072 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
4074 XMLNode &before = gc->alist()->get_state ();
4075 gc->alist()->shift (pos, frames);
4076 XMLNode &after = gc->alist()->get_state ();
4077 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4080 // TODO mute automation ??
4082 /* pan automation */
4084 ControlSet::Controls& c (_pannable->controls());
4086 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
4087 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
4089 boost::shared_ptr<AutomationList> al = pc->alist();
4090 XMLNode& before = al->get_state ();
4091 al->shift (pos, frames);
4092 XMLNode& after = al->get_state ();
4093 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4098 /* redirect automation */
4100 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4101 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
4103 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
4105 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
4106 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
4108 boost::shared_ptr<AutomationList> al = ac->alist();
4109 XMLNode &before = al->get_state ();
4110 al->shift (pos, frames);
4111 XMLNode &after = al->get_state ();
4112 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4120 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
4122 boost::shared_ptr<Processor> processor (p.lock ());
4123 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
4127 pi->set_state_dir (d);
4131 Route::save_as_template (const string& path, const string& name)
4133 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
4134 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
4136 XMLNode& node (state (false));
4140 IO::set_name_in_state (*node.children().front(), name);
4142 tree.set_root (&node);
4144 /* return zero on success, non-zero otherwise */
4145 return !tree.write (path.c_str());
4150 Route::set_name (const string& str)
4152 if (str == name()) {
4156 string name = Route::ensure_track_or_route_name (str, _session);
4157 SessionObject::set_name (name);
4159 bool ret = (_input->set_name(name) && _output->set_name(name));
4162 /* rename the main outs. Leave other IO processors
4163 * with whatever name they already have, because its
4164 * just fine as it is (it will not contain the route
4165 * name if its a port insert, port send or port return).
4169 if (_main_outs->set_name (name)) {
4170 /* XXX returning false here is stupid because
4171 we already changed the route name.
4181 /** Set the name of a route in an XML description.
4182 * @param node XML <Route> node to set the name in.
4183 * @param name New name.
4186 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
4188 node.add_property (X_("name"), name);
4190 XMLNodeList children = node.children();
4191 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4193 if ((*i)->name() == X_("IO")) {
4195 IO::set_name_in_state (**i, name);
4197 } else if ((*i)->name() == X_("Processor")) {
4199 XMLProperty const * role = (*i)->property (X_("role"));
4200 if (role && role->value() == X_("Main")) {
4201 (*i)->add_property (X_("name"), name);
4204 } else if ((*i)->name() == X_("Diskstream")) {
4206 if (rename_playlist) {
4207 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4209 (*i)->add_property (X_("name"), name);
4215 boost::shared_ptr<Send>
4216 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4218 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4220 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4221 boost::shared_ptr<InternalSend> send;
4223 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4224 if (send->target_route() == target) {
4230 return boost::shared_ptr<Send>();
4234 Route::set_denormal_protection (bool yn)
4236 if (_denormal_protection != yn) {
4237 _denormal_protection = yn;
4238 denormal_protection_changed (); /* EMIT SIGNAL */
4243 Route::denormal_protection () const
4245 return _denormal_protection;
4249 Route::set_active (bool yn, void* src)
4251 if (_session.transport_rolling()) {
4255 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4256 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4260 if (_active != yn) {
4262 _input->set_active (yn);
4263 _output->set_active (yn);
4264 active_changed (); // EMIT SIGNAL
4265 _session.set_dirty ();
4269 boost::shared_ptr<Pannable>
4270 Route::pannable() const
4275 boost::shared_ptr<Panner>
4276 Route::panner() const
4279 return _main_outs->panner_shell()->panner();
4282 boost::shared_ptr<PannerShell>
4283 Route::panner_shell() const
4285 return _main_outs->panner_shell();
4288 boost::shared_ptr<GainControl>
4289 Route::gain_control() const
4291 return _gain_control;
4294 boost::shared_ptr<GainControl>
4295 Route::trim_control() const
4297 return _trim_control;
4300 boost::shared_ptr<PhaseControl>
4301 Route::phase_control() const
4303 return _phase_control;
4306 boost::shared_ptr<AutomationControl>
4307 Route::get_control (const Evoral::Parameter& param)
4309 /* either we own the control or .... */
4311 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4315 /* maybe one of our processors does or ... */
4317 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4318 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4319 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4327 /* nobody does so we'll make a new one */
4329 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4336 boost::shared_ptr<Processor>
4337 Route::nth_plugin (uint32_t n) const
4339 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4340 ProcessorList::const_iterator i;
4342 for (i = _processors.begin(); i != _processors.end(); ++i) {
4343 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4350 return boost::shared_ptr<Processor> ();
4353 boost::shared_ptr<Processor>
4354 Route::nth_send (uint32_t n) const
4356 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4357 ProcessorList::const_iterator i;
4359 for (i = _processors.begin(); i != _processors.end(); ++i) {
4360 if (boost::dynamic_pointer_cast<Send> (*i)) {
4362 if ((*i)->name().find (_("Monitor")) == 0) {
4363 /* send to monitor section is not considered
4364 to be an accessible send.
4375 return boost::shared_ptr<Processor> ();
4379 Route::has_io_processor_named (const string& name)
4381 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4382 ProcessorList::iterator i;
4384 for (i = _processors.begin(); i != _processors.end(); ++i) {
4385 if (boost::dynamic_pointer_cast<Send> (*i) ||
4386 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4387 if ((*i)->name() == name) {
4397 Route::set_processor_positions ()
4399 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4401 bool had_amp = false;
4402 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4403 (*i)->set_pre_fader (!had_amp);
4410 /** Called when there is a proposed change to the input port count */
4412 Route::input_port_count_changing (ChanCount to)
4414 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4416 /* The processors cannot be configured with the new input arrangement, so
4422 /* The change is ok */
4426 /** Called when there is a proposed change to the output port count */
4428 Route::output_port_count_changing (ChanCount to)
4430 if (_strict_io && !_in_configure_processors) {
4433 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4434 if (processor_out_streams.get(*t) > to.get(*t)) {
4438 /* The change is ok */
4443 Route::unknown_processors () const
4447 if (_session.get_disable_all_loaded_plugins ()) {
4448 // Do not list "missing plugins" if they are explicitly disabled
4452 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4453 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4454 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4455 p.push_back ((*i)->name ());
4464 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4466 /* we assume that all our input ports feed all our output ports. its not
4467 universally true, but the alternative is way too corner-case to worry about.
4470 LatencyRange all_connections;
4473 all_connections.min = 0;
4474 all_connections.max = 0;
4476 all_connections.min = ~((pframes_t) 0);
4477 all_connections.max = 0;
4479 /* iterate over all "from" ports and determine the latency range for all of their
4480 connections to the "outside" (outside of this Route).
4483 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4487 p->get_connected_latency_range (range, playback);
4489 all_connections.min = min (all_connections.min, range.min);
4490 all_connections.max = max (all_connections.max, range.max);
4494 /* set the "from" port latencies to the max/min range of all their connections */
4496 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4497 p->set_private_latency_range (all_connections, playback);
4500 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4502 all_connections.min += our_latency;
4503 all_connections.max += our_latency;
4505 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4506 p->set_private_latency_range (all_connections, playback);
4509 return all_connections.max;
4513 Route::set_private_port_latencies (bool playback) const
4515 framecnt_t own_latency = 0;
4517 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4518 OR LATENCY CALLBACK.
4520 This is called (early) from the latency callback. It computes the REAL
4521 latency associated with each port and stores the result as the "private"
4522 latency of the port. A later call to Route::set_public_port_latencies()
4523 sets all ports to the same value to reflect the fact that we do latency
4524 compensation and so all signals are delayed by the same amount as they
4525 flow through ardour.
4528 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4529 if ((*i)->active ()) {
4530 own_latency += (*i)->signal_latency ();
4535 /* playback: propagate latency from "outside the route" to outputs to inputs */
4536 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4538 /* capture: propagate latency from "outside the route" to inputs to outputs */
4539 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4544 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4546 /* this is called to set the JACK-visible port latencies, which take
4547 latency compensation into account.
4556 const PortSet& ports (_input->ports());
4557 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4558 p->set_public_latency_range (range, playback);
4563 const PortSet& ports (_output->ports());
4564 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4565 p->set_public_latency_range (range, playback);
4570 /** Put the invisible processors in the right place in _processors.
4571 * Must be called with a writer lock on _processor_lock held.
4574 __attribute__((annotate("realtime")))
4577 Route::setup_invisible_processors ()
4580 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4581 assert (!lm.locked ());
4585 /* too early to be doing this stuff */
4589 /* we'll build this new list here and then use it
4591 * TODO put the ProcessorList is on the stack for RT-safety.
4594 ProcessorList new_processors;
4596 /* find visible processors */
4598 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4599 if ((*i)->display_to_user ()) {
4600 new_processors.push_back (*i);
4606 ProcessorList::iterator amp = find (new_processors.begin(), new_processors.end(), _amp);
4608 if (amp == new_processors.end ()) {
4609 error << string_compose (_("Amp/Fader on Route '%1' went AWOL. Re-added."), name()) << endmsg;
4610 new_processors.push_front (_amp);
4611 amp = find (new_processors.begin(), new_processors.end(), _amp);
4614 /* and the processor after the amp */
4616 ProcessorList::iterator after_amp = amp;
4622 switch (_meter_point) {
4624 assert (!_meter->display_to_user ());
4625 new_processors.push_front (_meter);
4628 assert (!_meter->display_to_user ());
4629 new_processors.insert (amp, _meter);
4631 case MeterPostFader:
4632 /* do nothing here */
4635 /* do nothing here */
4638 /* the meter is visible, so we don't touch it here */
4645 assert (_main_outs);
4646 assert (!_main_outs->display_to_user ());
4647 new_processors.push_back (_main_outs);
4649 /* iterator for the main outs */
4651 ProcessorList::iterator main = new_processors.end();
4654 /* OUTPUT METERING */
4656 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4657 assert (!_meter->display_to_user ());
4659 /* add the processor just before or just after the main outs */
4661 ProcessorList::iterator meter_point = main;
4663 if (_meter_point == MeterOutput) {
4666 new_processors.insert (meter_point, _meter);
4671 if (_monitor_send && !is_monitor ()) {
4672 assert (!_monitor_send->display_to_user ());
4673 switch (Config->get_listen_position ()) {
4674 case PreFaderListen:
4675 switch (Config->get_pfl_position ()) {
4676 case PFLFromBeforeProcessors:
4677 new_processors.push_front (_monitor_send);
4679 case PFLFromAfterProcessors:
4680 new_processors.insert (amp, _monitor_send);
4683 _monitor_send->set_can_pan (false);
4685 case AfterFaderListen:
4686 switch (Config->get_afl_position ()) {
4687 case AFLFromBeforeProcessors:
4688 new_processors.insert (after_amp, _monitor_send);
4690 case AFLFromAfterProcessors:
4691 new_processors.insert (new_processors.end(), _monitor_send);
4694 _monitor_send->set_can_pan (true);
4699 #if 0 // not used - just yet
4700 if (!is_master() && !is_monitor() && !is_auditioner()) {
4701 new_processors.push_front (_delayline);
4705 /* MONITOR CONTROL */
4707 if (_monitor_control && is_monitor ()) {
4708 assert (!_monitor_control->display_to_user ());
4709 new_processors.insert (amp, _monitor_control);
4712 /* INTERNAL RETURN */
4714 /* doing this here means that any monitor control will come just after
4719 assert (!_intreturn->display_to_user ());
4720 new_processors.push_front (_intreturn);
4723 if (_trim && _trim->active()) {
4724 assert (!_trim->display_to_user ());
4725 new_processors.push_front (_trim);
4727 /* EXPORT PROCESSOR */
4729 if (_capturing_processor) {
4730 assert (!_capturing_processor->display_to_user ());
4731 new_processors.push_front (_capturing_processor);
4734 _processors = new_processors;
4736 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4737 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4742 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4743 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4744 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4751 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4752 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4756 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4757 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4764 /** If the meter point is `Custom', make a note of where the meter is.
4765 * This is so that if the meter point is subsequently set to something else,
4766 * and then back to custom, we can put the meter back where it was last time
4767 * custom was enabled.
4769 * Must be called with the _processor_lock held.
4772 Route::maybe_note_meter_position ()
4774 if (_meter_point != MeterCustom) {
4778 _custom_meter_position_noted = true;
4779 /* custom meter points range from after trim to before panner/main_outs
4780 * this is a limitation by the current processor UI
4782 bool seen_trim = false;
4783 _processor_after_last_custom_meter.reset();
4784 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4785 if ((*i) == _trim) {
4788 if ((*i) == _main_outs) {
4789 _processor_after_last_custom_meter = *i;
4792 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4794 _processor_after_last_custom_meter = _trim;
4796 ProcessorList::iterator j = i;
4798 assert(j != _processors.end ()); // main_outs should be before
4799 _processor_after_last_custom_meter = *j;
4804 assert(_processor_after_last_custom_meter.lock());
4807 boost::shared_ptr<Processor>
4808 Route::processor_by_id (PBD::ID id) const
4810 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4811 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4812 if ((*i)->id() == id) {
4817 return boost::shared_ptr<Processor> ();
4820 /** @return the monitoring state, or in other words what data we are pushing
4821 * into the route (data from the inputs, data from disk or silence)
4824 Route::monitoring_state () const
4826 return MonitoringInput;
4829 /** @return what we should be metering; either the data coming from the input
4830 * IO or the data that is flowing through the route.
4833 Route::metering_state () const
4835 return MeteringRoute;
4839 Route::has_external_redirects () const
4841 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4843 /* ignore inactive processors and obviously ignore the main
4844 * outs since everything has them and we don't care.
4847 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4855 boost::shared_ptr<Processor>
4856 Route::the_instrument () const
4858 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4859 return the_instrument_unlocked ();
4862 boost::shared_ptr<Processor>
4863 Route::the_instrument_unlocked () const
4865 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4866 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(*i);
4867 if (pi && pi->plugin ()->get_info ()->is_instrument ()) {
4871 return boost::shared_ptr<Processor>();
4877 Route::non_realtime_locate (framepos_t pos)
4880 _pannable->transport_located (pos);
4883 if (_delayline.get()) {
4884 _delayline.get()->flush();
4888 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4889 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4891 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4892 (*i)->transport_located (pos);
4895 _roll_delay = _initial_delay;
4899 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4906 * We don't currently mix MIDI input together, so we don't need the
4907 * complex logic of the audio case.
4910 n_buffers = bufs.count().n_midi ();
4912 for (i = 0; i < n_buffers; ++i) {
4914 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4915 MidiBuffer& buf (bufs.get_midi (i));
4918 buf.copy (source_port->get_midi_buffer(nframes));
4920 buf.silence (nframes);
4926 n_buffers = bufs.count().n_audio();
4928 size_t n_ports = io->n_ports().n_audio();
4929 float scaling = 1.0f;
4931 if (n_ports > n_buffers) {
4932 scaling = ((float) n_buffers) / n_ports;
4935 for (i = 0; i < n_ports; ++i) {
4937 /* if there are more ports than buffers, map them onto buffers
4938 * in a round-robin fashion
4941 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4942 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4945 if (i < n_buffers) {
4947 /* first time through just copy a channel into
4951 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4953 if (scaling != 1.0f) {
4954 buf.apply_gain (scaling, nframes);
4959 /* on subsequent times around, merge data from
4960 * the port with what is already there
4963 if (scaling != 1.0f) {
4964 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4966 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4971 /* silence any remaining buffers */
4973 for (; i < n_buffers; ++i) {
4974 AudioBuffer& buf (bufs.get_audio (i));
4975 buf.silence (nframes);
4978 /* establish the initial setup of the buffer set, reflecting what was
4979 copied into it. unless, of course, we are the auditioner, in which
4980 case nothing was fed into it from the inputs at all.
4983 if (!is_auditioner()) {
4984 bufs.set_count (io->n_ports());
4988 boost::shared_ptr<AutomationControl>
4989 Route::pan_azimuth_control() const
4992 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
4994 return boost::shared_ptr<AutomationControl>();
4996 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
4997 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
4999 if (!_pannable || !panner()) {
5000 return boost::shared_ptr<AutomationControl>();
5002 return _pannable->pan_azimuth_control;
5006 boost::shared_ptr<AutomationControl>
5007 Route::pan_elevation_control() const
5009 if (Profile->get_mixbus() || !_pannable || !panner()) {
5010 return boost::shared_ptr<AutomationControl>();
5013 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5015 if (c.find (PanElevationAutomation) != c.end()) {
5016 return _pannable->pan_elevation_control;
5018 return boost::shared_ptr<AutomationControl>();
5021 boost::shared_ptr<AutomationControl>
5022 Route::pan_width_control() const
5024 if (Profile->get_mixbus() || !_pannable || !panner()) {
5025 return boost::shared_ptr<AutomationControl>();
5028 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5030 if (c.find (PanWidthAutomation) != c.end()) {
5031 return _pannable->pan_width_control;
5033 return boost::shared_ptr<AutomationControl>();
5036 boost::shared_ptr<AutomationControl>
5037 Route::pan_frontback_control() const
5039 if (Profile->get_mixbus() || !_pannable || !panner()) {
5040 return boost::shared_ptr<AutomationControl>();
5043 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5045 if (c.find (PanFrontBackAutomation) != c.end()) {
5046 return _pannable->pan_frontback_control;
5048 return boost::shared_ptr<AutomationControl>();
5051 boost::shared_ptr<AutomationControl>
5052 Route::pan_lfe_control() const
5054 if (Profile->get_mixbus() || !_pannable || !panner()) {
5055 return boost::shared_ptr<AutomationControl>();
5058 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5060 if (c.find (PanLFEAutomation) != c.end()) {
5061 return _pannable->pan_lfe_control;
5063 return boost::shared_ptr<AutomationControl>();
5068 Route::eq_band_cnt () const
5070 if (Profile->get_mixbus()) {
5073 /* Ardour has no well-known EQ object */
5078 boost::shared_ptr<AutomationControl>
5079 Route::eq_gain_controllable (uint32_t band) const
5082 boost::shared_ptr<PluginInsert> eq = ch_eq();
5085 return boost::shared_ptr<AutomationControl>();
5088 uint32_t port_number;
5091 if (is_master() || mixbus()) {
5098 if (is_master() || mixbus()) {
5105 if (is_master() || mixbus()) {
5112 return boost::shared_ptr<AutomationControl>();
5115 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5117 return boost::shared_ptr<AutomationControl>();
5120 boost::shared_ptr<AutomationControl>
5121 Route::eq_freq_controllable (uint32_t band) const
5125 if (mixbus() || is_master()) {
5126 /* no frequency controls for mixbusses or master */
5127 return boost::shared_ptr<AutomationControl>();
5130 boost::shared_ptr<PluginInsert> eq = ch_eq();
5133 return boost::shared_ptr<AutomationControl>();
5136 uint32_t port_number;
5148 return boost::shared_ptr<AutomationControl>();
5151 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5153 return boost::shared_ptr<AutomationControl>();
5157 boost::shared_ptr<AutomationControl>
5158 Route::eq_q_controllable (uint32_t band) const
5160 return boost::shared_ptr<AutomationControl>();
5163 boost::shared_ptr<AutomationControl>
5164 Route::eq_shape_controllable (uint32_t band) const
5166 return boost::shared_ptr<AutomationControl>();
5169 boost::shared_ptr<AutomationControl>
5170 Route::eq_enable_controllable () const
5173 boost::shared_ptr<PluginInsert> eq = ch_eq();
5176 return boost::shared_ptr<AutomationControl>();
5179 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5181 return boost::shared_ptr<AutomationControl>();
5185 boost::shared_ptr<AutomationControl>
5186 Route::eq_hpf_controllable () const
5189 boost::shared_ptr<PluginInsert> eq = ch_eq();
5192 return boost::shared_ptr<AutomationControl>();
5195 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5197 return boost::shared_ptr<AutomationControl>();
5202 Route::eq_band_name (uint32_t band) const
5204 if (Profile->get_mixbus()) {
5220 boost::shared_ptr<AutomationControl>
5221 Route::comp_enable_controllable () const
5224 boost::shared_ptr<PluginInsert> comp = ch_comp();
5227 return boost::shared_ptr<AutomationControl>();
5230 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5232 return boost::shared_ptr<AutomationControl>();
5235 boost::shared_ptr<AutomationControl>
5236 Route::comp_threshold_controllable () const
5239 boost::shared_ptr<PluginInsert> comp = ch_comp();
5242 return boost::shared_ptr<AutomationControl>();
5245 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5248 return boost::shared_ptr<AutomationControl>();
5251 boost::shared_ptr<AutomationControl>
5252 Route::comp_speed_controllable () const
5255 boost::shared_ptr<PluginInsert> comp = ch_comp();
5258 return boost::shared_ptr<AutomationControl>();
5261 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5263 return boost::shared_ptr<AutomationControl>();
5266 boost::shared_ptr<AutomationControl>
5267 Route::comp_mode_controllable () const
5270 boost::shared_ptr<PluginInsert> comp = ch_comp();
5273 return boost::shared_ptr<AutomationControl>();
5276 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5278 return boost::shared_ptr<AutomationControl>();
5281 boost::shared_ptr<AutomationControl>
5282 Route::comp_makeup_controllable () const
5285 boost::shared_ptr<PluginInsert> comp = ch_comp();
5288 return boost::shared_ptr<AutomationControl>();
5291 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5293 return boost::shared_ptr<AutomationControl>();
5296 boost::shared_ptr<AutomationControl>
5297 Route::comp_redux_controllable () const
5300 boost::shared_ptr<PluginInsert> comp = ch_comp();
5303 return boost::shared_ptr<AutomationControl>();
5306 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5308 return boost::shared_ptr<AutomationControl>();
5313 Route::comp_mode_name (uint32_t mode) const
5318 return _("Leveler");
5320 return _("Compressor");
5322 return _("Limiter");
5324 return mixbus() ? _("Sidechain") : _("Limiter");
5334 Route::comp_speed_name (uint32_t mode) const
5352 boost::shared_ptr<AutomationControl>
5353 Route::send_level_controllable (uint32_t n) const
5356 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5358 return boost::shared_ptr<AutomationControl>();
5363 return boost::shared_ptr<AutomationControl>();
5366 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5367 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5369 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5371 return boost::shared_ptr<AutomationControl>();
5373 return s->gain_control ();
5377 boost::shared_ptr<AutomationControl>
5378 Route::send_enable_controllable (uint32_t n) const
5381 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5383 return boost::shared_ptr<AutomationControl>();
5388 return boost::shared_ptr<AutomationControl>();
5391 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5392 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5394 /* although Ardour sends have enable/disable as part of the Processor
5395 API, it is not exposed as a controllable.
5397 XXX: we should fix this.
5399 return boost::shared_ptr<AutomationControl>();
5404 Route::send_name (uint32_t n) const
5410 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5414 boost::shared_ptr<Processor> p = nth_send (n);
5423 boost::shared_ptr<AutomationControl>
5424 Route::master_send_enable_controllable () const
5427 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5429 return boost::shared_ptr<AutomationControl>();
5431 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5433 return boost::shared_ptr<AutomationControl>();
5438 Route::slaved_to (boost::shared_ptr<VCA> vca) const
5440 if (!vca || !_gain_control) {
5444 /* just test one particular control, not all of them */
5446 return _gain_control->slaved_to (vca->gain_control());
5450 Route::assign_controls (boost::shared_ptr<VCA> vca)
5452 _gain_control->add_master (vca->gain_control());
5453 _solo_control->add_master (vca->solo_control());
5454 _mute_control->add_master (vca->mute_control());
5460 Route::unassign_controls (boost::shared_ptr<VCA> vca)
5463 /* unassign from all */
5464 _gain_control->clear_masters ();
5465 _solo_control->clear_masters ();
5466 _mute_control->clear_masters ();
5468 _gain_control->remove_master (vca->gain_control());
5469 _solo_control->remove_master (vca->solo_control());
5470 _mute_control->remove_master (vca->mute_control());
5477 Route::muted_by_others_soloing () const
5479 if (!can_be_muted_by_others ()) {
5483 return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
5487 Route::clear_all_solo_state ()
5489 double v = _solo_safe_control->get_value ();
5491 _solo_control->clear_all_solo_state ();
5494 _solo_safe_control->set_value (v, Controllable::NoGroup);