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/boost_debug.h"
37 #include "pbd/unwind.h"
39 #include "ardour/amp.h"
40 #include "ardour/audio_buffer.h"
41 #include "ardour/audio_track.h"
42 #include "ardour/audio_port.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/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/plugin_insert.h"
62 #include "ardour/port.h"
63 #include "ardour/port_insert.h"
64 #include "ardour/processor.h"
65 #include "ardour/profile.h"
66 #include "ardour/route.h"
67 #include "ardour/route_group.h"
68 #include "ardour/send.h"
69 #include "ardour/session.h"
70 #include "ardour/unknown_processor.h"
71 #include "ardour/utils.h"
76 using namespace ARDOUR;
79 PBD::Signal0<void> Route::SyncOrderKeys;
80 PBD::Signal0<void> Route::RemoteControlIDChange;
82 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
83 : SessionObject (sess, name)
85 , GraphNode (sess._process_graph)
88 , _signal_latency_at_amp_position (0)
89 , _signal_latency_at_trim_position (0)
92 , _pending_process_reorder (0)
93 , _pending_signals (0)
95 , _pending_declick (true)
96 , _meter_point (MeterPostFader)
97 , _pending_meter_point (MeterPostFader)
98 , _meter_type (MeterPeak)
100 , _soloed_by_others_upstream (0)
101 , _soloed_by_others_downstream (0)
102 , _solo_isolated (false)
103 , _solo_isolated_by_upstream (0)
104 , _denormal_protection (false)
107 , _declickable (false)
108 , _mute_master (new MuteMaster (sess, name))
109 , _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)
119 , _custom_meter_position_noted (false)
121 processor_max_streams.reset();
127 /* set default meter type */
129 _meter_type = Config->get_meter_type_master ();
131 else if (dynamic_cast<Track*>(this)) {
132 _meter_type = Config->get_meter_type_track ();
134 _meter_type = Config->get_meter_type_bus ();
137 /* add standard controls */
139 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
140 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
141 _phase_control.reset (new PhaseControllable (X_("phase"), shared_from_this ()));
143 _solo_isolate_control.reset (new SoloIsolateControllable (X_("solo-iso"), shared_from_this ()));
144 _solo_safe_control.reset (new SoloSafeControllable (X_("solo-safe"), shared_from_this ()));
146 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
147 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
148 _phase_control->set_flags (Controllable::Flag (_phase_control->flags() | Controllable::Toggle));
150 add_control (_solo_control);
151 add_control (_mute_control);
152 add_control (_phase_control);
156 if (!(_flags & Route::MonitorOut)) {
157 _pannable.reset (new Pannable (_session));
160 /* input and output objects */
162 _input.reset (new IO (_session, _name, IO::Input, _default_type));
163 _output.reset (new IO (_session, _name, IO::Output, _default_type));
165 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
166 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
168 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
169 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
171 #if 0 // not used - just yet
172 if (!is_master() && !is_monitor() && !is_auditioner()) {
173 _delayline.reset (new DelayLine (_session, _name));
174 add_processor (_delayline, PreFader);
178 /* add amp processor */
180 _gain_control = boost::shared_ptr<GainControllable> (new GainControllable (_session, GainAutomation, shared_from_this ()));
181 add_control (_gain_control);
183 _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true));
184 add_processor (_amp, PostFader);
187 _amp->set_display_name (_("Monitor"));
192 _trim_control = boost::shared_ptr<GainControllable> (new GainControllable (_session, TrimAutomation, shared_from_this ()));
193 add_control (_trim_control);
195 _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false));
196 _trim->set_display_to_user (false);
198 if (dynamic_cast<AudioTrack*>(this)) {
199 /* we can't do this in the AudioTrack's constructor
200 * because _trim does not exit then
204 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
209 /* create standard processors: meter, main outs, monitor out;
210 they will be added to _processors by setup_invisible_processors ()
213 _meter.reset (new PeakMeter (_session, _name));
214 _meter->set_owner (this);
215 _meter->set_display_to_user (false);
218 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
219 _main_outs->activate ();
222 /* where we listen to tracks */
223 _intreturn.reset (new InternalReturn (_session));
224 _intreturn->activate ();
226 /* the thing that provides proper control over a control/monitor/listen bus
227 (such as per-channel cut, dim, solo, invert, etc).
229 _monitor_control.reset (new MonitorProcessor (_session));
230 _monitor_control->activate ();
233 if (is_master() || is_monitor() || is_auditioner()) {
234 _mute_master->set_solo_ignore (true);
237 /* now that we have _meter, its safe to connect to this */
240 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
241 configure_processors (0);
249 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
251 /* do this early so that we don't get incoming signals as we are going through destruction
256 /* don't use clear_processors here, as it depends on the session which may
257 be half-destroyed by now
260 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
261 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
262 (*i)->drop_references ();
265 _processors.clear ();
269 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
271 if (Config->get_remote_model() != UserOrdered) {
275 set_remote_control_id_internal (id, notify_class_listeners);
279 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
281 /* force IDs for master/monitor busses and prevent
282 any other route from accidentally getting these IDs
283 (i.e. legacy sessions)
286 if (is_master() && id != MasterBusRemoteControlID) {
287 id = MasterBusRemoteControlID;
290 if (is_monitor() && id != MonitorBusRemoteControlID) {
291 id = MonitorBusRemoteControlID;
298 /* don't allow it to collide */
300 if (!is_master () && !is_monitor() &&
301 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
302 id += MonitorBusRemoteControlID;
305 if (id != remote_control_id()) {
306 _remote_control_id = id;
307 RemoteControlIDChanged ();
309 if (notify_class_listeners) {
310 RemoteControlIDChange ();
316 Route::remote_control_id() const
319 return MasterBusRemoteControlID;
323 return MonitorBusRemoteControlID;
326 return _remote_control_id;
330 Route::has_order_key () const
332 return _has_order_key;
336 Route::order_key () const
342 Route::set_remote_control_id_explicit (uint32_t rid)
344 if (is_master() || is_monitor() || is_auditioner()) {
345 /* hard-coded remote IDs, or no remote ID */
349 if (_remote_control_id != rid) {
350 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
351 _remote_control_id = rid;
352 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
355 /* don't emit the class-level RID signal RemoteControlIDChange here,
356 leave that to the entity that changed the order key, so that we
357 don't get lots of emissions for no good reasons (e.g. when changing
358 all route order keys).
360 See Session::sync_remote_id_from_order_keys() for the (primary|only)
361 spot where that is emitted.
366 Route::set_order_key (uint32_t n)
368 _has_order_key = true;
370 if (_order_key == n) {
376 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
377 name(), order_key ()));
379 _session.set_dirty ();
383 Route::ensure_track_or_route_name(string name, Session &session)
385 string newname = name;
387 while (!session.io_name_is_legal (newname)) {
388 newname = bump_name_once (newname, ' ');
395 Route::inc_gain (gain_t factor)
397 /* To be used ONLY when doing group-relative gain adjustment, from
401 float desired_gain = _gain_control->user_double();
403 if (fabsf (desired_gain) < GAIN_COEFF_SMALL) {
404 // really?! what's the idea here?
405 _gain_control->route_set_value (0.000001f + (0.000001f * factor));
407 _gain_control->route_set_value (desired_gain + (desired_gain * factor));
412 Route::set_gain (gain_t val, Controllable::GroupControlDisposition group_override)
414 if (use_group (group_override, &RouteGroup::is_gain)) {
416 if (_route_group->is_relative()) {
418 gain_t usable_gain = _gain_control->get_value();
419 if (usable_gain < 0.000001f) {
420 usable_gain = 0.000001f;
424 if (delta < 0.000001f) {
428 delta -= usable_gain;
433 gain_t factor = delta / usable_gain;
436 factor = _route_group->get_max_factor(factor);
437 if (factor == 0.0f) {
438 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
442 factor = _route_group->get_min_factor(factor);
443 if (factor == 0.0f) {
444 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
449 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor));
453 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, Controllable::NoGroup));
459 if (val == _gain_control->get_value()) {
463 _gain_control->route_set_value (val);
467 Route::set_trim (gain_t val, Controllable::GroupControlDisposition /* group override */)
469 // TODO route group, see set_gain()
470 _trim_control->route_set_value (val);
474 Route::maybe_declick (BufferSet&, framecnt_t, int)
476 /* this is the "bus" implementation and they never declick.
481 /** Process this route for one (sub) cycle (process thread)
483 * @param bufs Scratch buffers to use for the signal path
484 * @param start_frame Initial transport frame
485 * @param end_frame Final transport frame
486 * @param nframes Number of frames to output (to ports)
488 * Note that (end_frame - start_frame) may not be equal to nframes when the
489 * transport speed isn't 1.0 (eg varispeed).
492 Route::process_output_buffers (BufferSet& bufs,
493 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
494 int declick, bool gain_automation_ok)
496 /* Caller must hold process lock */
497 assert (!AudioEngine::instance()->process_lock().trylock());
499 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
501 // can this actually happen? functions calling process_output_buffers()
502 // already take a reader-lock.
503 bufs.silence (nframes, 0);
507 /* figure out if we're going to use gain automation */
508 if (gain_automation_ok) {
509 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
510 _amp->setup_gain_automation (
511 start_frame + _signal_latency_at_amp_position,
512 end_frame + _signal_latency_at_amp_position,
515 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
516 _trim->setup_gain_automation (
517 start_frame + _signal_latency_at_trim_position,
518 end_frame + _signal_latency_at_trim_position,
521 _amp->apply_gain_automation (false);
522 _trim->apply_gain_automation (false);
525 /* Tell main outs what to do about monitoring. We do this so that
526 on a transition between monitoring states we get a de-clicking gain
527 change in the _main_outs delivery, if config.get_use_monitor_fades()
530 We override this in the case where we have an internal generator.
532 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
534 _main_outs->no_outs_cuz_we_no_monitor (silence);
536 /* -------------------------------------------------------------------------------------------
537 GLOBAL DECLICK (for transport changes etc.)
538 ----------------------------------------------------------------------------------------- */
540 maybe_declick (bufs, nframes, declick);
541 _pending_declick = 0;
543 /* -------------------------------------------------------------------------------------------
544 DENORMAL CONTROL/PHASE INVERT
545 ----------------------------------------------------------------------------------------- */
547 if (_phase_invert.any ()) {
551 if (_denormal_protection || Config->get_denormal_protection()) {
553 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
554 Sample* const sp = i->data();
556 if (_phase_invert[chn]) {
557 for (pframes_t nx = 0; nx < nframes; ++nx) {
562 for (pframes_t nx = 0; nx < nframes; ++nx) {
570 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
571 Sample* const sp = i->data();
573 if (_phase_invert[chn]) {
574 for (pframes_t nx = 0; nx < nframes; ++nx) {
583 if (_denormal_protection || Config->get_denormal_protection()) {
585 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
586 Sample* const sp = i->data();
587 for (pframes_t nx = 0; nx < nframes; ++nx) {
595 /* -------------------------------------------------------------------------------------------
597 ----------------------------------------------------------------------------------------- */
599 /* set this to be true if the meter will already have been ::run() earlier */
600 bool const meter_already_run = metering_state() == MeteringInput;
602 framecnt_t latency = 0;
604 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
606 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
607 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
612 /* if it has any inputs, make sure they match */
613 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
614 if (bufs.count() != (*i)->input_streams()) {
616 DEBUG::Processors, string_compose (
617 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
618 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
625 /* should we NOT run plugins here if the route is inactive?
626 do we catch route != active somewhere higher?
629 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
630 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
633 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
634 bufs.set_count ((*i)->output_streams());
636 if ((*i)->active ()) {
637 latency += (*i)->signal_latency ();
643 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
644 boost::shared_ptr<Processor> endpoint,
645 bool include_endpoint, bool for_export, bool for_freeze)
647 /* If no processing is required, there's no need to go any further. */
648 if (!endpoint && !include_endpoint) {
652 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
653 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
654 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
656 /* trim is always at the top, for bounce no latency compensation is needed */
657 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
658 _trim->setup_gain_automation (start, start + nframes, nframes);
661 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
663 if (!include_endpoint && (*i) == endpoint) {
667 /* if we're *not* exporting, stop processing if we come across a routing processor. */
668 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
671 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
675 /* special case the panner (export outputs)
676 * Ideally we'd only run the panner, not the delivery itself...
677 * but panners need separate input/output buffers and some context
678 * (panshell, panner type, etc). AFAICT there is no ill side effect
679 * of re-using the main delivery when freewheeling/exporting a region.
681 if ((*i) == _main_outs) {
682 assert ((*i)->does_routing());
683 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
684 buffers.set_count ((*i)->output_streams());
687 /* don't run any processors that do routing.
688 * Also don't bother with metering.
690 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
691 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
692 buffers.set_count ((*i)->output_streams());
693 latency += (*i)->signal_latency ();
696 if ((*i) == endpoint) {
703 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
704 bool include_endpoint, bool for_export, bool for_freeze) const
706 framecnt_t latency = 0;
707 if (!endpoint && !include_endpoint) {
711 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
712 if (!include_endpoint && (*i) == endpoint) {
715 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
718 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
721 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
722 latency += (*i)->signal_latency ();
724 if ((*i) == endpoint) {
732 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
733 bool include_endpoint, bool for_export, bool for_freeze) const
735 if (!endpoint && !include_endpoint) {
739 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
740 if (!include_endpoint && (*i) == endpoint) {
743 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
746 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
749 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
750 cc = (*i)->output_streams();
752 if ((*i) == endpoint) {
760 Route::n_process_buffers ()
762 return max (_input->n_ports(), processor_max_streams);
766 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
768 assert (is_monitor());
769 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
770 fill_buffers_with_input (bufs, _input, nframes);
771 passthru (bufs, start_frame, end_frame, nframes, declick);
775 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
779 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
781 /* control/monitor bus ignores input ports when something is
782 feeding the listen "stream". data will "arrive" into the
783 route from the intreturn processor element.
786 bufs.silence (nframes, 0);
789 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
790 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
794 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
796 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
798 bufs.set_count (_input->n_ports());
799 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
800 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
804 Route::set_listen (bool yn, Controllable::GroupControlDisposition group_override)
810 if (use_group (group_override, &RouteGroup::is_solo)) {
811 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, Controllable::ForGroup));
816 if (yn != _monitor_send->active()) {
818 _monitor_send->activate ();
819 _mute_master->set_soloed_by_self (true);
821 _monitor_send->deactivate ();
822 _mute_master->set_soloed_by_self (false);
824 _mute_master->set_soloed_by_others (false);
826 listen_changed (group_override); /* EMIT SIGNAL */
832 Route::listening_via_monitor () const
835 return _monitor_send->active ();
842 Route::set_solo_safe (bool yn, Controllable::GroupControlDisposition /* group_override */)
844 if (_solo_safe != yn) {
846 solo_safe_changed (); /* EMIT SIGNAL */
847 _solo_safe_control->Changed(); /* EMIT SIGNAL */
852 Route::solo_safe() const
858 Route::clear_all_solo_state ()
860 // ideally this function will never do anything, it only exists to forestall Murphy
861 bool emit_changed = false;
864 // these are really debug messages, but of possible interest.
866 PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
868 if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
869 PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
870 name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
874 if (!_self_solo && (_soloed_by_others_upstream || _soloed_by_others_downstream)) {
875 // if self-soled, set_solo() will do signal emission
879 _soloed_by_others_upstream = 0;
880 _soloed_by_others_downstream = 0;
883 PBD::Unwinder<bool> uw (_solo_safe, false);
884 set_solo (false, Controllable::NoGroup);
888 set_mute_master_solo ();
889 solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
894 Route::set_solo (bool yn, Controllable::GroupControlDisposition group_override)
896 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, grp ? %3 currently self-soloed ? %4\n",
897 name(), yn, enum_2_string(group_override), self_soloed()));
900 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
904 if (is_master() || is_monitor() || is_auditioner()) {
905 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
909 if (use_group (group_override, &RouteGroup::is_solo)) {
910 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, Controllable::ForGroup));
914 if (self_soloed() != yn) {
916 solo_changed (true, group_override); /* EMIT SIGNAL */
917 _solo_control->Changed (); /* EMIT SIGNAL */
920 assert (Config->get_solo_control_is_listen_control() || !_monitor_send || !_monitor_send->active());
922 /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
923 Config->get_solo_mute_overrride().
926 if (yn && Profile->get_trx()) {
927 set_mute (false, Controllable::UseGroup);
932 Route::set_self_solo (bool yn)
934 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
936 set_mute_master_solo ();
940 Route::mod_solo_by_others_upstream (int32_t delta)
942 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
943 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
945 uint32_t old_sbu = _soloed_by_others_upstream;
948 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
949 _soloed_by_others_upstream += delta;
951 _soloed_by_others_upstream = 0;
954 _soloed_by_others_upstream += delta;
957 DEBUG_TRACE (DEBUG::Solo, string_compose (
958 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
959 name(), delta, _soloed_by_others_upstream, old_sbu,
960 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
962 /* push the inverse solo change to everything that feeds us.
964 This is important for solo-within-group. When we solo 1 track out of N that
965 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
966 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
967 tracks that feed it. This will silence them if they were audible because
968 of a bus solo, but the newly soloed track will still be audible (because
971 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
975 if ((_self_solo || _soloed_by_others_downstream) &&
976 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
977 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
979 if (delta > 0 || !Config->get_exclusive_solo()) {
980 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
981 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
985 boost::shared_ptr<Route> sr = i->r.lock();
987 sr->mod_solo_by_others_downstream (-delta);
993 set_mute_master_solo ();
994 solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
998 Route::mod_solo_by_others_downstream (int32_t delta)
1000 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
1001 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
1004 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
1005 _soloed_by_others_downstream += delta;
1007 _soloed_by_others_downstream = 0;
1010 _soloed_by_others_downstream += delta;
1013 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
1015 set_mute_master_solo ();
1016 solo_changed (false, Controllable::UseGroup); /* EMIT SIGNAL */
1020 Route::set_mute_master_solo ()
1022 _mute_master->set_soloed_by_self (self_soloed());
1023 _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
1027 Route::mod_solo_isolated_by_upstream (bool yn)
1029 bool old = solo_isolated ();
1030 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
1031 name(), _solo_isolated_by_upstream, yn ? "+1" : "-1"));
1034 if (_solo_isolated_by_upstream >= 1) {
1035 _solo_isolated_by_upstream--;
1037 _solo_isolated_by_upstream = 0;
1040 _solo_isolated_by_upstream++;
1043 if (solo_isolated() != old) {
1044 /* solo isolated status changed */
1045 _mute_master->set_solo_ignore (solo_isolated());
1046 solo_isolated_changed (); /* EMIT SIGNAL */
1051 Route::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override)
1053 if (is_master() || is_monitor() || is_auditioner()) {
1057 if (use_group (group_override, &RouteGroup::is_solo)) {
1058 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, Controllable::ForGroup));
1062 bool changed = false;
1065 if (_solo_isolated == false) {
1066 _mute_master->set_solo_ignore (true);
1069 _solo_isolated = true;
1071 if (_solo_isolated == true) {
1072 _solo_isolated = false;
1073 _mute_master->set_solo_ignore (false);
1083 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1085 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1086 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1088 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1093 bool does_feed = feeds (*i, &sends_only);
1095 if (does_feed && !sends_only) {
1096 (*i)->mod_solo_isolated_by_upstream (yn);
1100 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1102 solo_isolated_changed (); /* EMIT SIGNAL */
1103 _solo_isolate_control->Changed(); /* EMIT SIGNAL */
1107 Route::solo_isolated () const
1109 return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
1113 Route::set_mute_points (MuteMaster::MutePoint mp)
1115 _mute_master->set_mute_points (mp);
1116 mute_points_changed (); /* EMIT SIGNAL */
1118 if (_mute_master->muted_by_self()) {
1119 mute_changed (); /* EMIT SIGNAL */
1120 _mute_control->Changed (); /* EMIT SIGNAL */
1125 Route::set_mute (bool yn, Controllable::GroupControlDisposition group_override)
1127 if (use_group (group_override, &RouteGroup::is_mute)) {
1128 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, Controllable::ForGroup));
1132 if (muted() != yn) {
1133 _mute_master->set_muted_by_self (yn);
1134 /* allow any derived classes to respond to the mute change
1135 before anybody else knows about it.
1138 /* tell everyone else */
1139 mute_changed (); /* EMIT SIGNAL */
1140 _mute_control->Changed (); /* EMIT SIGNAL */
1145 Route::muted () const
1147 return _mute_master->muted_by_self();
1151 Route::muted_by_others () const
1153 // This method is only used by route_ui for display state.
1154 // The real thing is MuteMaster::muted_by_others_at()
1156 //master is never muted by others
1160 //now check to see if something is soloed (and I am not)
1161 //see also MuteMaster::mute_gain_at()
1162 return (_session.soloing() && !soloed() && !solo_isolated());
1167 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1169 cerr << name << " {" << endl;
1170 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1171 p != procs.end(); ++p) {
1172 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1174 cerr << "}" << endl;
1178 /** Supposing that we want to insert a Processor at a given Placement, return
1179 * the processor to add the new one before (or 0 to add at the end).
1181 boost::shared_ptr<Processor>
1182 Route::before_processor_for_placement (Placement p)
1184 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1186 ProcessorList::iterator loc;
1188 if (p == PreFader) {
1189 /* generic pre-fader: insert immediately before the amp */
1190 loc = find (_processors.begin(), _processors.end(), _amp);
1192 /* generic post-fader: insert right before the main outs */
1193 loc = find (_processors.begin(), _processors.end(), _main_outs);
1196 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1199 /** Supposing that we want to insert a Processor at a given index, return
1200 * the processor to add the new one before (or 0 to add at the end).
1202 boost::shared_ptr<Processor>
1203 Route::before_processor_for_index (int index)
1206 return boost::shared_ptr<Processor> ();
1209 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1211 ProcessorList::iterator i = _processors.begin ();
1213 while (i != _processors.end() && j < index) {
1214 if ((*i)->display_to_user()) {
1221 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1224 /** Add a processor either pre- or post-fader
1225 * @return 0 on success, non-0 on failure.
1228 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1230 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1234 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1235 * @param index Index to add the processor at, or -1 to add at the end of the list.
1236 * @return 0 on success, non-0 on failure.
1239 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1241 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1244 /** Add a processor to the route.
1245 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1246 * @return 0 on success, non-0 on failure.
1249 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1251 assert (processor != _meter);
1252 assert (processor != _main_outs);
1254 DEBUG_TRACE (DEBUG::Processors, string_compose (
1255 "%1 adding processor %2\n", name(), processor->name()));
1257 if (!AudioEngine::instance()->connected() || !processor) {
1262 boost::shared_ptr<PluginInsert> pi;
1263 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1264 pi->set_strict_io (true);
1269 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1270 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1271 ProcessorState pstate (this);
1273 boost::shared_ptr<PluginInsert> pi;
1274 boost::shared_ptr<PortInsert> porti;
1276 if (processor == _amp) {
1277 /* Ensure that only one amp is in the list at any time */
1278 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1279 if (check != _processors.end()) {
1280 if (before == _amp) {
1281 /* Already in position; all is well */
1284 _processors.erase (check);
1289 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1291 ProcessorList::iterator loc;
1293 /* inserting before a processor; find it */
1294 loc = find (_processors.begin(), _processors.end(), before);
1295 if (loc == _processors.end ()) {
1300 /* inserting at end */
1301 loc = _processors.end ();
1304 _processors.insert (loc, processor);
1305 processor->set_owner (this);
1307 // Set up processor list channels. This will set processor->[input|output]_streams(),
1308 // configure redirect ports properly, etc.
1311 if (configure_processors_unlocked (err)) {
1313 configure_processors_unlocked (0); // it worked before we tried to add it ...
1318 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1320 if (pi->has_no_inputs ()) {
1321 /* generator plugin */
1322 _have_internal_generator = true;
1327 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
1328 processor->activate ();
1331 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1333 _output->set_user_latency (0);
1336 reset_instrument_info ();
1337 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1338 set_processor_positions ();
1344 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1346 const XMLProperty *prop;
1349 boost::shared_ptr<Processor> processor;
1351 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1352 so that we can add the processor in the right place (pre/post-fader)
1355 XMLNodeList const & children = node.children ();
1356 XMLNodeList::const_iterator i = children.begin ();
1358 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1362 Placement placement = PreFader;
1364 if (i != children.end()) {
1365 if ((prop = (*i)->property (X_("placement"))) != 0) {
1366 placement = Placement (string_2_enum (prop->value(), placement));
1370 if (node.name() == "Insert") {
1372 if ((prop = node.property ("type")) != 0) {
1374 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1375 prop->value() == "lv2" ||
1376 prop->value() == "windows-vst" ||
1377 prop->value() == "lxvst" ||
1378 prop->value() == "audiounit") {
1380 if (_session.get_disable_all_loaded_plugins ()) {
1381 processor.reset (new UnknownProcessor (_session, node));
1383 processor.reset (new PluginInsert (_session));
1384 processor->set_owner (this);
1389 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1394 } else if (node.name() == "Send") {
1396 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1397 processor.reset (new Send (_session, sendpan, _mute_master));
1401 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1405 if (processor->set_state (node, version)) {
1409 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1410 if (i != children.end()) {
1411 if ((prop = (*i)->property (X_("active"))) != 0) {
1412 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1413 processor->activate();
1415 processor->deactivate();
1419 return (add_processor (processor, placement, 0, false) == 0);
1422 catch (failed_constructor &err) {
1423 warning << _("processor could not be created. Ignored.") << endmsg;
1429 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1431 /* NOTE: this is intended to be used ONLY when copying
1432 processors from another Route. Hence the subtle
1433 differences between this and ::add_processor()
1436 ProcessorList::iterator loc;
1439 loc = find(_processors.begin(), _processors.end(), before);
1441 /* nothing specified - at end */
1442 loc = _processors.end ();
1445 if (!_session.engine().connected()) {
1449 if (others.empty()) {
1454 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1455 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1456 ProcessorState pstate (this);
1458 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1464 boost::shared_ptr<PluginInsert> pi;
1466 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1467 pi->set_count (1); // why? configure_processors_unlocked() will re-do this
1468 pi->set_strict_io (_strict_io);
1471 _processors.insert (loc, *i);
1472 (*i)->set_owner (this);
1474 if ((*i)->active()) {
1478 /* Think: does this really need to be called for every processor in the loop? */
1480 if (configure_processors_unlocked (err)) {
1482 configure_processors_unlocked (0); // it worked before we tried to add it ...
1487 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1490 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1491 boost::shared_ptr<PluginInsert> pi;
1493 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1494 if (pi->has_no_inputs ()) {
1495 _have_internal_generator = true;
1501 _output->set_user_latency (0);
1504 reset_instrument_info ();
1505 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1506 set_processor_positions ();
1512 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1514 if (p == PreFader) {
1515 start = _processors.begin();
1516 end = find(_processors.begin(), _processors.end(), _amp);
1518 start = find(_processors.begin(), _processors.end(), _amp);
1520 end = _processors.end();
1524 /** Turn off all processors with a given placement
1525 * @param p Placement of processors to disable
1528 Route::disable_processors (Placement p)
1530 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1532 ProcessorList::iterator start, end;
1533 placement_range(p, start, end);
1535 for (ProcessorList::iterator i = start; i != end; ++i) {
1536 (*i)->deactivate ();
1539 _session.set_dirty ();
1542 /** Turn off all redirects
1545 Route::disable_processors ()
1547 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1549 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1550 (*i)->deactivate ();
1553 _session.set_dirty ();
1556 /** Turn off all redirects with a given placement
1557 * @param p Placement of redirects to disable
1560 Route::disable_plugins (Placement p)
1562 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1564 ProcessorList::iterator start, end;
1565 placement_range(p, start, end);
1567 for (ProcessorList::iterator i = start; i != end; ++i) {
1568 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1569 (*i)->deactivate ();
1573 _session.set_dirty ();
1576 /** Turn off all plugins
1579 Route::disable_plugins ()
1581 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1583 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1584 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1585 (*i)->deactivate ();
1589 _session.set_dirty ();
1594 Route::ab_plugins (bool forward)
1596 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1600 /* forward = turn off all active redirects, and mark them so that the next time
1601 we go the other way, we will revert them
1604 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1605 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1609 if ((*i)->active()) {
1610 (*i)->deactivate ();
1611 (*i)->set_next_ab_is_active (true);
1613 (*i)->set_next_ab_is_active (false);
1619 /* backward = if the redirect was marked to go active on the next ab, do so */
1621 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1623 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1627 if ((*i)->get_next_ab_is_active()) {
1630 (*i)->deactivate ();
1635 _session.set_dirty ();
1639 /** Remove processors with a given placement.
1640 * @param p Placement of processors to remove.
1643 Route::clear_processors (Placement p)
1645 if (!_session.engine().connected()) {
1649 bool already_deleting = _session.deletion_in_progress();
1650 if (!already_deleting) {
1651 _session.set_deletion_in_progress();
1655 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1656 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1657 ProcessorList new_list;
1658 ProcessorStreams err;
1659 bool seen_amp = false;
1661 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1667 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1669 /* you can't remove these */
1671 new_list.push_back (*i);
1678 new_list.push_back (*i);
1681 (*i)->drop_references ();
1689 (*i)->drop_references ();
1692 new_list.push_back (*i);
1699 _processors = new_list;
1700 configure_processors_unlocked (&err); // this can't fail
1703 processor_max_streams.reset();
1704 _have_internal_generator = false;
1705 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1706 set_processor_positions ();
1708 reset_instrument_info ();
1710 if (!already_deleting) {
1711 _session.clear_deletion_in_progress();
1716 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1718 // TODO once the export point can be configured properly, do something smarter here
1719 if (processor == _capturing_processor) {
1720 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1721 if (need_process_lock) {
1725 _capturing_processor.reset();
1727 if (need_process_lock) {
1732 /* these can never be removed */
1734 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1738 if (!_session.engine().connected()) {
1742 processor_max_streams.reset();
1745 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1746 if (need_process_lock) {
1750 /* Caller must hold process lock */
1751 assert (!AudioEngine::instance()->process_lock().trylock());
1753 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1755 ProcessorState pstate (this);
1757 ProcessorList::iterator i;
1758 bool removed = false;
1760 for (i = _processors.begin(); i != _processors.end(); ) {
1761 if (*i == processor) {
1763 /* move along, see failure case for configure_processors()
1764 where we may need to reconfigure the processor.
1767 /* stop redirects that send signals to JACK ports
1768 from causing noise as a result of no longer being
1772 boost::shared_ptr<IOProcessor> iop;
1774 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1778 i = _processors.erase (i);
1786 _output->set_user_latency (0);
1794 if (configure_processors_unlocked (err)) {
1796 /* we know this will work, because it worked before :) */
1797 configure_processors_unlocked (0);
1801 _have_internal_generator = false;
1803 for (i = _processors.begin(); i != _processors.end(); ++i) {
1804 boost::shared_ptr<PluginInsert> pi;
1806 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1807 if (pi->has_no_inputs ()) {
1808 _have_internal_generator = true;
1813 if (need_process_lock) {
1818 reset_instrument_info ();
1819 processor->drop_references ();
1820 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1821 set_processor_positions ();
1827 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1829 /* these can never be removed */
1830 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1833 /* and can't be used as substitute, either */
1834 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1838 /* I/Os are out, too */
1839 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1843 /* this function cannot be used to swap/reorder processors */
1844 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1848 if (!AudioEngine::instance()->connected() || !old || !sub) {
1852 /* ensure that sub is not owned by another route */
1853 if (sub->owner ()) {
1858 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1859 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1860 ProcessorState pstate (this);
1862 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1864 ProcessorList::iterator i;
1865 bool replaced = false;
1866 bool enable = old->active ();
1868 for (i = _processors.begin(); i != _processors.end(); ) {
1870 i = _processors.erase (i);
1871 _processors.insert (i, sub);
1872 sub->set_owner (this);
1885 boost::shared_ptr<PluginInsert> pi;
1886 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1887 pi->set_strict_io (true);
1891 if (configure_processors_unlocked (err)) {
1893 configure_processors_unlocked (0);
1897 _have_internal_generator = false;
1899 for (i = _processors.begin(); i != _processors.end(); ++i) {
1900 boost::shared_ptr<PluginInsert> pi;
1901 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1902 if (pi->has_no_inputs ()) {
1903 _have_internal_generator = true;
1913 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1914 _output->set_user_latency (0);
1917 reset_instrument_info ();
1918 old->drop_references ();
1919 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1920 set_processor_positions ();
1925 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1927 ProcessorList deleted;
1929 if (!_session.engine().connected()) {
1933 processor_max_streams.reset();
1936 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1937 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1938 ProcessorState pstate (this);
1940 ProcessorList::iterator i;
1941 boost::shared_ptr<Processor> processor;
1943 for (i = _processors.begin(); i != _processors.end(); ) {
1947 /* these can never be removed */
1949 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1954 /* see if its in the list of processors to delete */
1956 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1961 /* stop IOProcessors that send to JACK ports
1962 from causing noise as a result of no longer being
1966 boost::shared_ptr<IOProcessor> iop;
1968 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1972 deleted.push_back (processor);
1973 i = _processors.erase (i);
1976 if (deleted.empty()) {
1977 /* none of those in the requested list were found */
1981 _output->set_user_latency (0);
1983 if (configure_processors_unlocked (err)) {
1985 /* we know this will work, because it worked before :) */
1986 configure_processors_unlocked (0);
1991 _have_internal_generator = false;
1993 for (i = _processors.begin(); i != _processors.end(); ++i) {
1994 boost::shared_ptr<PluginInsert> pi;
1996 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1997 if (pi->has_no_inputs ()) {
1998 _have_internal_generator = true;
2005 /* now try to do what we need to so that those that were removed will be deleted */
2007 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
2008 (*i)->drop_references ();
2011 reset_instrument_info ();
2012 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2013 set_processor_positions ();
2019 Route::reset_instrument_info ()
2021 boost::shared_ptr<Processor> instr = the_instrument();
2023 _instrument_info.set_internal_instrument (instr);
2027 /** Caller must hold process lock */
2029 Route::configure_processors (ProcessorStreams* err)
2031 #ifndef PLATFORM_WINDOWS
2032 assert (!AudioEngine::instance()->process_lock().trylock());
2035 if (!_in_configure_processors) {
2036 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2037 return configure_processors_unlocked (err);
2044 Route::input_streams () const
2046 return _input->n_ports ();
2049 list<pair<ChanCount, ChanCount> >
2050 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
2052 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2054 return try_configure_processors_unlocked (in, err);
2057 list<pair<ChanCount, ChanCount> >
2058 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
2060 // Check each processor in order to see if we can configure as requested
2062 list<pair<ChanCount, ChanCount> > configuration;
2065 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
2066 DEBUG_TRACE (DEBUG::Processors, "{\n");
2068 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
2070 if ((*p)->can_support_io_configuration(in, out)) {
2071 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
2072 configuration.push_back(make_pair(in, out));
2075 // restriction for Monitor Section Processors
2076 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
2077 /* do not allow to add/remove channels (for now)
2078 * The Monitor follows the master-bus and has no panner (unpan)
2079 * but do allow processors with midi-in to be added (e.g VSTs with control that
2080 * will remain unconnected)
2082 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration not allowed.\n");
2083 return list<pair<ChanCount, ChanCount> > ();
2085 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
2086 // internal sends make no sense, only feedback
2087 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
2088 return list<pair<ChanCount, ChanCount> > ();
2090 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
2091 /* External Sends can be problematic. one can add/remove ports
2092 * there signal leaves the DAW to external monitors anyway, so there's
2093 * no real use for allowing them here anyway.
2095 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
2096 return list<pair<ChanCount, ChanCount> > ();
2098 if (boost::dynamic_pointer_cast<Send> (*p)) {
2100 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
2101 return list<pair<ChanCount, ChanCount> > ();
2110 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
2111 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
2112 DEBUG_TRACE (DEBUG::Processors, "}\n");
2113 return list<pair<ChanCount, ChanCount> > ();
2117 DEBUG_TRACE (DEBUG::Processors, "}\n");
2119 return configuration;
2122 /** Set the input/output configuration of each processor in the processors list.
2123 * Caller must hold process lock.
2124 * Return 0 on success, otherwise configuration is impossible.
2127 Route::configure_processors_unlocked (ProcessorStreams* err)
2129 #ifndef PLATFORM_WINDOWS
2130 assert (!AudioEngine::instance()->process_lock().trylock());
2133 if (_in_configure_processors) {
2137 /* put invisible processors where they should be */
2138 setup_invisible_processors ();
2140 _in_configure_processors = true;
2142 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
2144 if (configuration.empty ()) {
2145 _in_configure_processors = false;
2150 bool seen_mains_out = false;
2151 processor_out_streams = _input->n_ports();
2152 processor_max_streams.reset();
2154 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
2155 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
2157 if (!(*p)->configure_io(c->first, c->second)) {
2158 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
2159 _in_configure_processors = false;
2162 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
2163 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
2165 boost::shared_ptr<PluginInsert> pi;
2166 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2167 /* plugins connected via Split or Hide Match may have more channels.
2168 * route/scratch buffers are needed for all of them
2169 * The configuration may only be a subset (both input and output)
2171 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
2172 processor_max_streams = ChanCount::max(processor_max_streams, pi->output_streams());
2173 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams() * pi->get_count());
2174 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_output_streams() * pi->get_count());
2178 if (boost::dynamic_pointer_cast<Delivery> (*p)
2179 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
2180 /* main delivery will increase port count to match input.
2181 * the Delivery::Main is usually the last processor - followed only by
2184 seen_mains_out = true;
2186 if (!seen_mains_out) {
2187 processor_out_streams = out;
2193 _meter->set_max_channels (processor_max_streams);
2196 /* make sure we have sufficient scratch buffers to cope with the new processor
2199 _session.ensure_buffers (n_process_buffers ());
2201 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
2203 _in_configure_processors = false;
2207 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
2208 * @param state New active state for those processors.
2211 Route::all_visible_processors_active (bool state)
2213 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2215 if (_processors.empty()) {
2219 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2220 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2227 (*i)->deactivate ();
2231 _session.set_dirty ();
2235 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2237 /* check if re-order requires re-configuration of any processors
2238 * -> compare channel configuration for all processors
2240 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2241 ChanCount c = input_streams ();
2243 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2245 if (c != (*j)->input_streams()) {
2248 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2251 if ((*i)->input_streams() != c) {
2254 c = (*i)->output_streams();
2266 __attribute__((annotate("realtime")))
2269 Route::apply_processor_order (const ProcessorList& new_order)
2271 /* need to hold processor_lock; either read or write lock
2272 * and the engine process_lock.
2273 * Due to r/w lock ambiguity we can only assert the latter
2275 assert (!AudioEngine::instance()->process_lock().trylock());
2278 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2279 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2280 * processors in the current actual processor list that are hidden. Any visible processors
2281 * in the current list but not in "new_order" will be assumed to be deleted.
2284 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2285 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2286 * (note though that ::processors_reorder_needs_configure() ensured that
2287 * this function will only ever be called from the rt-thread if no processor were removed)
2289 * either way, I can't proove it, but an x-run due to re-order here is less likley
2290 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2293 ProcessorList as_it_will_be;
2294 ProcessorList::iterator oiter;
2295 ProcessorList::const_iterator niter;
2297 oiter = _processors.begin();
2298 niter = new_order.begin();
2300 while (niter != new_order.end()) {
2302 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2303 then append it to the temp list.
2305 Otherwise, see if the next processor in the old list is in the new list. if not,
2306 its been deleted. If its there, append it to the temp list.
2309 if (oiter == _processors.end()) {
2311 /* no more elements in the old list, so just stick the rest of
2312 the new order onto the temp list.
2315 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2316 while (niter != new_order.end()) {
2323 if (!(*oiter)->display_to_user()) {
2325 as_it_will_be.push_back (*oiter);
2329 /* visible processor: check that its in the new order */
2331 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2332 /* deleted: do nothing, shared_ptr<> will clean up */
2334 /* ignore this one, and add the next item from the new order instead */
2335 as_it_will_be.push_back (*niter);
2340 /* now remove from old order - its taken care of no matter what */
2341 oiter = _processors.erase (oiter);
2345 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2347 /* If the meter is in a custom position, find it and make a rough note of its position */
2348 maybe_note_meter_position ();
2352 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2354 // it a change is already queued, wait for it
2355 // (unless engine is stopped. apply immediately and proceed
2356 while (g_atomic_int_get (&_pending_process_reorder)) {
2357 if (!AudioEngine::instance()->running()) {
2358 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2359 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2361 apply_processor_order(_pending_processor_order);
2362 setup_invisible_processors ();
2364 g_atomic_int_set (&_pending_process_reorder, 0);
2366 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2367 set_processor_positions ();
2369 // TODO rather use a semaphore or something.
2370 // but since ::reorder_processors() is called
2371 // from the GUI thread, this is fine..
2376 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2378 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2379 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2380 ProcessorState pstate (this);
2382 apply_processor_order (new_order);
2384 if (configure_processors_unlocked (err)) {
2392 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2393 set_processor_positions ();
2396 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2397 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2399 // _pending_processor_order is protected by _processor_lock
2400 _pending_processor_order = new_order;
2401 g_atomic_int_set (&_pending_process_reorder, 1);
2408 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2411 return customize_plugin_insert (proc, 0, unused);
2415 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs)
2417 boost::shared_ptr<PluginInsert> pi;
2418 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2424 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2425 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2437 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2438 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2439 ProcessorState pstate (this);
2441 bool old_cust = pi->custom_cfg ();
2442 uint32_t old_cnt = pi->get_count ();
2443 ChanCount old_chan = pi->output_streams ();
2446 pi->set_custom_cfg (false);
2448 pi->set_custom_cfg (true);
2449 pi->set_count (count);
2450 pi->set_outputs (outs);
2453 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2457 pi->set_count (old_cnt);
2458 pi->set_outputs (old_chan);
2459 pi->set_custom_cfg (old_cust);
2463 configure_processors_unlocked (0);
2466 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2467 _session.set_dirty ();
2472 Route::set_strict_io (const bool enable)
2474 if (_strict_io != enable) {
2475 _strict_io = enable;
2476 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2477 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2478 boost::shared_ptr<PluginInsert> pi;
2479 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2480 pi->set_strict_io (_strict_io);
2484 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2488 _strict_io = !enable; // restore old value
2489 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2490 boost::shared_ptr<PluginInsert> pi;
2491 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2492 pi->set_strict_io (_strict_io);
2500 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2501 configure_processors (0);
2503 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2504 _session.set_dirty ();
2516 Route::get_template()
2518 return state(false);
2522 Route::state(bool full_state)
2524 if (!_session._template_state_dir.empty()) {
2525 assert (!full_state); // only for templates
2526 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2529 XMLNode *node = new XMLNode("Route");
2530 ProcessorList::iterator i;
2533 id().print (buf, sizeof (buf));
2534 node->add_property("id", buf);
2535 node->add_property ("name", _name);
2536 node->add_property("default-type", _default_type.to_string());
2537 node->add_property ("strict-io", _strict_io);
2540 node->add_property("flags", enum_2_string (_flags));
2543 node->add_property("active", _active?"yes":"no");
2545 boost::to_string (_phase_invert, p);
2546 node->add_property("phase-invert", p);
2547 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2548 node->add_property("meter-point", enum_2_string (_meter_point));
2550 node->add_property("meter-type", enum_2_string (_meter_type));
2553 node->add_property("route-group", _route_group->name());
2556 snprintf (buf, sizeof (buf), "%d", _order_key);
2557 node->add_property ("order-key", buf);
2558 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2559 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2560 node->add_property ("soloed-by-upstream", buf);
2561 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2562 node->add_property ("soloed-by-downstream", buf);
2563 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2564 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2566 node->add_child_nocopy (_input->state (full_state));
2567 node->add_child_nocopy (_output->state (full_state));
2568 node->add_child_nocopy (_solo_control->get_state ());
2569 node->add_child_nocopy (_mute_control->get_state ());
2570 node->add_child_nocopy (_mute_master->get_state ());
2573 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2576 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2577 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2578 remote_control_node->add_property (X_("id"), buf);
2579 node->add_child_nocopy (*remote_control_node);
2581 if (_comment.length()) {
2582 XMLNode *cmt = node->add_child ("Comment");
2583 cmt->add_content (_comment);
2587 node->add_child_nocopy (_pannable->state (full_state));
2590 for (i = _processors.begin(); i != _processors.end(); ++i) {
2592 /* template save: do not include internal sends functioning as
2593 aux sends because the chance of the target ID
2594 in the session where this template is used
2597 similarly, do not save listen sends which connect to
2598 the monitor section, because these will always be
2601 boost::shared_ptr<InternalSend> is;
2603 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2604 if (is->role() == Delivery::Listen) {
2609 node->add_child_nocopy((*i)->state (full_state));
2613 node->add_child_copy (*_extra_xml);
2616 if (_custom_meter_position_noted) {
2617 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2619 after->id().print (buf, sizeof (buf));
2620 node->add_property (X_("processor-after-last-custom-meter"), buf);
2624 if (!_session._template_state_dir.empty()) {
2625 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2632 Route::set_state (const XMLNode& node, int version)
2634 if (version < 3000) {
2635 return set_state_2X (node, version);
2639 XMLNodeConstIterator niter;
2641 const XMLProperty *prop;
2643 if (node.name() != "Route"){
2644 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2648 if ((prop = node.property (X_("name"))) != 0) {
2649 Route::set_name (prop->value());
2653 _initial_io_setup = true;
2655 if ((prop = node.property (X_("flags"))) != 0) {
2656 _flags = Flag (string_2_enum (prop->value(), _flags));
2661 if ((prop = node.property (X_("strict-io"))) != 0) {
2662 _strict_io = string_is_affirmative (prop->value());
2665 if (is_master() || is_monitor() || is_auditioner()) {
2666 _mute_master->set_solo_ignore (true);
2670 /* monitor bus does not get a panner, but if (re)created
2671 via XML, it will already have one by the time we
2672 call ::set_state(). so ... remove it.
2677 /* add all processors (except amp, which is always present) */
2679 nlist = node.children();
2680 XMLNode processor_state (X_("processor_state"));
2682 Stateful::save_extra_xml (node);
2684 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2688 if (child->name() == IO::state_node_name) {
2689 if ((prop = child->property (X_("direction"))) == 0) {
2693 if (prop->value() == "Input") {
2694 _input->set_state (*child, version);
2695 } else if (prop->value() == "Output") {
2696 _output->set_state (*child, version);
2700 if (child->name() == X_("Processor")) {
2701 processor_state.add_child_copy (*child);
2704 if (child->name() == X_("Pannable")) {
2706 _pannable->set_state (*child, version);
2708 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2713 if ((prop = node.property (X_("meter-point"))) != 0) {
2714 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2715 set_meter_point (mp, true);
2717 _meter->set_display_to_user (_meter_point == MeterCustom);
2721 if ((prop = node.property (X_("meter-type"))) != 0) {
2722 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2725 _initial_io_setup = false;
2727 set_processor_state (processor_state);
2729 // this looks up the internal instrument in processors
2730 reset_instrument_info();
2732 if ((prop = node.property ("self-solo")) != 0) {
2733 set_self_solo (string_is_affirmative (prop->value()));
2736 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2737 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2738 mod_solo_by_others_upstream (atoi (prop->value()));
2741 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2742 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2743 mod_solo_by_others_downstream (atoi (prop->value()));
2746 if ((prop = node.property ("solo-isolated")) != 0) {
2747 set_solo_isolated (string_is_affirmative (prop->value()), Controllable::NoGroup);
2750 if ((prop = node.property ("solo-safe")) != 0) {
2751 set_solo_safe (string_is_affirmative (prop->value()), Controllable::NoGroup);
2754 if ((prop = node.property (X_("phase-invert"))) != 0) {
2755 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2758 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2759 set_denormal_protection (string_is_affirmative (prop->value()));
2762 if ((prop = node.property (X_("active"))) != 0) {
2763 bool yn = string_is_affirmative (prop->value());
2764 _active = !yn; // force switch
2765 set_active (yn, this);
2768 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2769 set_order_key (atoi(prop->value()));
2772 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2776 string::size_type colon, equal;
2777 string remaining = prop->value();
2779 while (remaining.length()) {
2781 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2782 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2785 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2786 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2789 string keyname = remaining.substr (0, equal);
2791 if ((keyname == "EditorSort") || (keyname == "editor")) {
2792 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2798 colon = remaining.find_first_of (':');
2800 if (colon != string::npos) {
2801 remaining = remaining.substr (colon+1);
2808 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2809 PBD::ID id (prop->value ());
2810 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2811 ProcessorList::const_iterator i = _processors.begin ();
2812 while (i != _processors.end() && (*i)->id() != id) {
2816 if (i != _processors.end ()) {
2817 _processor_after_last_custom_meter = *i;
2818 _custom_meter_position_noted = true;
2822 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2825 if (child->name() == X_("Comment")) {
2827 /* XXX this is a terrible API design in libxml++ */
2829 XMLNode *cmt = *(child->children().begin());
2830 _comment = cmt->content();
2832 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2833 if (prop->value() == "solo") {
2834 _solo_control->set_state (*child, version);
2835 } else if (prop->value() == "mute") {
2836 _mute_control->set_state (*child, version);
2839 } else if (child->name() == X_("RemoteControl")) {
2840 if ((prop = child->property (X_("id"))) != 0) {
2842 sscanf (prop->value().c_str(), "%d", &x);
2843 set_remote_control_id_internal (x);
2846 } else if (child->name() == X_("MuteMaster")) {
2847 _mute_master->set_state (*child, version);
2849 } else if (child->name() == Automatable::xml_node_name) {
2850 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2858 Route::set_state_2X (const XMLNode& node, int version)
2860 LocaleGuard lg (X_("C"));
2862 XMLNodeConstIterator niter;
2864 const XMLProperty *prop;
2866 /* 2X things which still remain to be handled:
2872 if (node.name() != "Route") {
2873 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2877 if ((prop = node.property (X_("flags"))) != 0) {
2878 string f = prop->value ();
2879 boost::replace_all (f, "ControlOut", "MonitorOut");
2880 _flags = Flag (string_2_enum (f, _flags));
2885 if (is_master() || is_monitor() || is_auditioner()) {
2886 _mute_master->set_solo_ignore (true);
2889 if ((prop = node.property (X_("phase-invert"))) != 0) {
2890 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2891 if (string_is_affirmative (prop->value ())) {
2894 set_phase_invert (p);
2897 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2898 set_denormal_protection (string_is_affirmative (prop->value()));
2901 if ((prop = node.property (X_("soloed"))) != 0) {
2902 bool yn = string_is_affirmative (prop->value());
2904 /* XXX force reset of solo status */
2909 if ((prop = node.property (X_("muted"))) != 0) {
2912 bool muted = string_is_affirmative (prop->value());
2918 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2920 if (string_is_affirmative (prop->value())){
2921 mute_point = mute_point + "PreFader";
2926 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2928 if (string_is_affirmative (prop->value())){
2931 mute_point = mute_point + ",";
2934 mute_point = mute_point + "PostFader";
2939 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2941 if (string_is_affirmative (prop->value())){
2944 mute_point = mute_point + ",";
2947 mute_point = mute_point + "Listen";
2952 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2954 if (string_is_affirmative (prop->value())){
2957 mute_point = mute_point + ",";
2960 mute_point = mute_point + "Main";
2964 _mute_master->set_mute_points (mute_point);
2965 _mute_master->set_muted_by_self (true);
2969 if ((prop = node.property (X_("meter-point"))) != 0) {
2970 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2973 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2974 don't mean the same thing.
2977 if ((prop = node.property (X_("order-keys"))) != 0) {
2981 string::size_type colon, equal;
2982 string remaining = prop->value();
2984 while (remaining.length()) {
2986 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2987 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2990 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2991 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2994 string keyname = remaining.substr (0, equal);
2996 if (keyname == "EditorSort" || keyname == "editor") {
2997 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
3003 colon = remaining.find_first_of (':');
3005 if (colon != string::npos) {
3006 remaining = remaining.substr (colon+1);
3015 nlist = node.children ();
3016 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
3020 if (child->name() == IO::state_node_name) {
3022 /* there is a note in IO::set_state_2X() about why we have to call
3026 _input->set_state_2X (*child, version, true);
3027 _output->set_state_2X (*child, version, false);
3029 if ((prop = child->property (X_("name"))) != 0) {
3030 Route::set_name (prop->value ());
3035 if ((prop = child->property (X_("active"))) != 0) {
3036 bool yn = string_is_affirmative (prop->value());
3037 _active = !yn; // force switch
3038 set_active (yn, this);
3041 if ((prop = child->property (X_("gain"))) != 0) {
3044 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
3045 _amp->gain_control()->set_value (val, Controllable::NoGroup);
3049 /* Set up Panners in the IO */
3050 XMLNodeList io_nlist = child->children ();
3052 XMLNodeConstIterator io_niter;
3055 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
3057 io_child = *io_niter;
3059 if (io_child->name() == X_("Panner")) {
3060 _main_outs->panner_shell()->set_state(*io_child, version);
3061 } else if (io_child->name() == X_("Automation")) {
3062 /* IO's automation is for the fader */
3063 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
3069 XMLNodeList redirect_nodes;
3071 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
3075 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
3076 redirect_nodes.push_back(child);
3081 set_processor_state_2X (redirect_nodes, version);
3083 Stateful::save_extra_xml (node);
3085 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
3088 if (child->name() == X_("Comment")) {
3090 /* XXX this is a terrible API design in libxml++ */
3092 XMLNode *cmt = *(child->children().begin());
3093 _comment = cmt->content();
3095 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
3096 if (prop->value() == X_("solo")) {
3097 _solo_control->set_state (*child, version);
3098 } else if (prop->value() == X_("mute")) {
3099 _mute_control->set_state (*child, version);
3102 } else if (child->name() == X_("RemoteControl")) {
3103 if ((prop = child->property (X_("id"))) != 0) {
3105 sscanf (prop->value().c_str(), "%d", &x);
3106 set_remote_control_id_internal (x);
3116 Route::get_processor_state ()
3118 XMLNode* root = new XMLNode (X_("redirects"));
3119 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3120 root->add_child_nocopy ((*i)->state (true));
3127 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
3129 /* We don't bother removing existing processors not in nList, as this
3130 method will only be called when creating a Route from scratch, not
3131 for undo purposes. Just put processors in at the appropriate place
3135 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
3136 add_processor_from_xml_2X (**i, version);
3141 Route::set_processor_state (const XMLNode& node)
3143 const XMLNodeList &nlist = node.children();
3144 XMLNodeConstIterator niter;
3145 ProcessorList new_order;
3146 bool must_configure = false;
3148 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
3150 XMLProperty* prop = (*niter)->property ("type");
3152 if (prop->value() == "amp") {
3153 _amp->set_state (**niter, Stateful::current_state_version);
3154 new_order.push_back (_amp);
3155 } else if (prop->value() == "trim") {
3156 _trim->set_state (**niter, Stateful::current_state_version);
3157 new_order.push_back (_trim);
3158 } else if (prop->value() == "meter") {
3159 _meter->set_state (**niter, Stateful::current_state_version);
3160 new_order.push_back (_meter);
3161 } else if (prop->value() == "delay") {
3163 _delayline->set_state (**niter, Stateful::current_state_version);
3164 new_order.push_back (_delayline);
3166 } else if (prop->value() == "main-outs") {
3167 _main_outs->set_state (**niter, Stateful::current_state_version);
3168 } else if (prop->value() == "intreturn") {
3170 _intreturn.reset (new InternalReturn (_session));
3171 must_configure = true;
3173 _intreturn->set_state (**niter, Stateful::current_state_version);
3174 } else if (is_monitor() && prop->value() == "monitor") {
3175 if (!_monitor_control) {
3176 _monitor_control.reset (new MonitorProcessor (_session));
3177 must_configure = true;
3179 _monitor_control->set_state (**niter, Stateful::current_state_version);
3180 } else if (prop->value() == "capture") {
3181 /* CapturingProcessor should never be restored, it's always
3182 added explicitly when needed */
3184 ProcessorList::iterator o;
3186 for (o = _processors.begin(); o != _processors.end(); ++o) {
3187 XMLProperty* id_prop = (*niter)->property(X_("id"));
3188 if (id_prop && (*o)->id() == id_prop->value()) {
3189 (*o)->set_state (**niter, Stateful::current_state_version);
3190 new_order.push_back (*o);
3195 // If the processor (*niter) is not on the route then create it
3197 if (o == _processors.end()) {
3199 boost::shared_ptr<Processor> processor;
3201 if (prop->value() == "intsend") {
3203 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
3205 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
3206 prop->value() == "lv2" ||
3207 prop->value() == "windows-vst" ||
3208 prop->value() == "lxvst" ||
3209 prop->value() == "luaproc" ||
3210 prop->value() == "audiounit") {
3212 if (_session.get_disable_all_loaded_plugins ()) {
3213 processor.reset (new UnknownProcessor (_session, **niter));
3215 processor.reset (new PluginInsert (_session));
3216 processor->set_owner (this);
3218 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
3219 pi->set_strict_io (true);
3223 } else if (prop->value() == "port") {
3225 processor.reset (new PortInsert (_session, _pannable, _mute_master));
3227 } else if (prop->value() == "send") {
3229 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
3232 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
3236 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
3237 /* This processor could not be configured. Turn it into a UnknownProcessor */
3238 processor.reset (new UnknownProcessor (_session, **niter));
3241 /* we have to note the monitor send here, otherwise a new one will be created
3242 and the state of this one will be lost.
3244 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
3245 if (isend && isend->role() == Delivery::Listen) {
3246 _monitor_send = isend;
3249 /* it doesn't matter if invisible processors are added here, as they
3250 will be sorted out by setup_invisible_processors () shortly.
3253 new_order.push_back (processor);
3254 must_configure = true;
3260 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3261 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3262 _processors = new_order;
3264 if (must_configure) {
3265 configure_processors_unlocked (0);
3268 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3270 (*i)->set_owner (this);
3271 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
3273 boost::shared_ptr<PluginInsert> pi;
3275 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
3276 if (pi->has_no_inputs ()) {
3277 _have_internal_generator = true;
3284 reset_instrument_info ();
3285 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3286 set_processor_positions ();
3290 Route::curve_reallocate ()
3292 // _gain_automation_curve.finish_resize ();
3293 // _pan_automation_curve.finish_resize ();
3297 Route::silence (framecnt_t nframes)
3299 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3304 silence_unlocked (nframes);
3308 Route::silence_unlocked (framecnt_t nframes)
3310 /* Must be called with the processor lock held */
3314 _output->silence (nframes);
3316 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3317 boost::shared_ptr<PluginInsert> pi;
3319 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
3320 // skip plugins, they don't need anything when we're not active
3324 (*i)->silence (nframes);
3327 if (nframes == _session.get_block_size()) {
3334 Route::add_internal_return ()
3337 _intreturn.reset (new InternalReturn (_session));
3338 add_processor (_intreturn, PreFader);
3343 Route::add_send_to_internal_return (InternalSend* send)
3345 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3347 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3348 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3351 return d->add_send (send);
3357 Route::remove_send_from_internal_return (InternalSend* send)
3359 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3361 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3362 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3365 return d->remove_send (send);
3371 Route::enable_monitor_send ()
3373 /* Caller must hold process lock */
3374 assert (!AudioEngine::instance()->process_lock().trylock());
3376 /* master never sends to monitor section via the normal mechanism */
3377 assert (!is_master ());
3378 assert (!is_monitor ());
3380 /* make sure we have one */
3381 if (!_monitor_send) {
3382 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3383 _monitor_send->set_display_to_user (false);
3387 configure_processors (0);
3390 /** Add an aux send to a route.
3391 * @param route route to send to.
3392 * @param before Processor to insert before, or 0 to insert at the end.
3395 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3397 assert (route != _session.monitor_out ());
3400 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3402 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3404 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3406 if (d && d->target_route() == route) {
3407 /* already listening via the specified IO: do nothing */
3415 boost::shared_ptr<InternalSend> listener;
3418 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3419 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3420 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3423 add_processor (listener, before);
3425 } catch (failed_constructor& err) {
3433 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3435 ProcessorStreams err;
3436 ProcessorList::iterator tmp;
3439 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3441 /* have to do this early because otherwise processor reconfig
3442 * will put _monitor_send back in the list
3445 if (route == _session.monitor_out()) {
3446 _monitor_send.reset ();
3450 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3452 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3454 if (d && d->target_route() == route) {
3456 if (remove_processor (*x, &err, false) > 0) {
3462 /* list could have been demolished while we dropped the lock
3465 if (_session.engine().connected()) {
3466 /* i/o processors cannot be removed if the engine is not running
3467 * so don't live-loop in case the engine is N/A or dies
3477 Route::set_comment (string cmt, void *src)
3481 _session.set_dirty ();
3485 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3487 FeedRecord fr (other, via_sends_only);
3489 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3491 if (!result.second) {
3493 /* already a record for "other" - make sure sends-only information is correct */
3494 if (!via_sends_only && result.first->sends_only) {
3495 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3496 frp->sends_only = false;
3500 return result.second;
3504 Route::clear_fed_by ()
3510 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3512 const FedBy& fed_by (other->fed_by());
3514 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3515 boost::shared_ptr<Route> sr = f->r.lock();
3517 if (sr && (sr.get() == this)) {
3519 if (via_sends_only) {
3520 *via_sends_only = f->sends_only;
3531 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3533 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3535 if (_output->connected_to (other->input())) {
3536 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3537 if (via_send_only) {
3538 *via_send_only = false;
3545 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3547 boost::shared_ptr<IOProcessor> iop;
3549 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3550 if (iop->feeds (other)) {
3551 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3552 if (via_send_only) {
3553 *via_send_only = true;
3557 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3560 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3565 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3570 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3572 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3575 /** Called from the (non-realtime) butler thread when the transport is stopped */
3577 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3579 framepos_t now = _session.transport_frame();
3582 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3584 Automatable::transport_stopped (now);
3586 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3588 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3592 (*i)->transport_stopped (now);
3596 _roll_delay = _initial_delay;
3600 Route::input_change_handler (IOChange change, void * /*src*/)
3602 if ((change.type & IOChange::ConfigurationChanged)) {
3603 /* This is called with the process lock held if change
3604 contains ConfigurationChanged
3606 configure_processors (0);
3607 _phase_invert.resize (_input->n_ports().n_audio ());
3608 io_changed (); /* EMIT SIGNAL */
3611 if (_soloed_by_others_upstream || _solo_isolated_by_upstream) {
3614 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3615 if (_input->connected()) {
3616 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3617 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3621 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3622 if (does_feed && !sends_only) {
3623 if ((*i)->soloed()) {
3626 if ((*i)->solo_isolated()) {
3633 int delta = sbou - _soloed_by_others_upstream;
3634 int idelta = ibou - _solo_isolated_by_upstream;
3637 PBD::warning << string_compose (
3638 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3639 _name, ibou, _solo_isolated_by_upstream, idelta)
3644 if (_soloed_by_others_upstream) {
3645 // ignore new connections (they're not propagated)
3647 mod_solo_by_others_upstream (delta);
3651 if (_solo_isolated_by_upstream) {
3652 // solo-isolate currently only propagates downstream
3654 mod_solo_isolated_by_upstream (false);
3656 // TODO think: mod_solo_isolated_by_upstream() does not take delta arg,
3657 // but idelta can't be smaller than -1, can it?
3658 //_solo_isolated_by_upstream = ibou;
3661 // Session::route_solo_changed does not propagate indirect solo-changes
3662 // propagate downstream to tracks
3663 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3664 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3668 bool does_feed = feeds (*i, &sends_only);
3669 if (delta <= 0 && does_feed && !sends_only) {
3670 (*i)->mod_solo_by_others_upstream (delta);
3673 if (idelta < 0 && does_feed && !sends_only) {
3674 (*i)->mod_solo_isolated_by_upstream (false);
3681 Route::output_change_handler (IOChange change, void * /*src*/)
3683 if (_initial_io_setup) {
3687 if ((change.type & IOChange::ConfigurationChanged)) {
3688 /* This is called with the process lock held if change
3689 contains ConfigurationChanged
3691 configure_processors (0);
3694 _session.reset_monitor_section();
3697 io_changed (); /* EMIT SIGNAL */
3700 if (_soloed_by_others_downstream) {
3702 /* checking all all downstream routes for
3703 * explicit of implict solo is a rather drastic measure,
3704 * ideally the input_change_handler() of the other route
3705 * would propagate the change to us.
3707 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3708 if (_output->connected()) {
3709 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3710 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3714 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3715 if (does_feed && !sends_only) {
3716 if ((*i)->soloed()) {
3723 int delta = sbod - _soloed_by_others_downstream;
3725 // do not allow new connections to change implicit solo (no propagation)
3726 mod_solo_by_others_downstream (delta);
3727 // Session::route_solo_changed() does not propagate indirect solo-changes
3728 // propagate upstream to tracks
3729 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3730 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3734 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3735 if (delta != 0 && does_feed && !sends_only) {
3736 (*i)->mod_solo_by_others_downstream (delta);
3745 Route::pans_required () const
3747 if (n_outputs().n_audio() < 2) {
3751 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3755 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3757 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3763 if (n_outputs().n_total() == 0) {
3767 if (!_active || n_inputs() == ChanCount::ZERO) {
3768 silence_unlocked (nframes);
3772 if (session_state_changing) {
3773 if (_session.transport_speed() != 0.0f) {
3774 /* we're rolling but some state is changing (e.g. our diskstream contents)
3775 so we cannot use them. Be silent till this is over.
3777 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3779 silence_unlocked (nframes);
3782 /* we're really not rolling, so we're either delivery silence or actually
3783 monitoring, both of which are safe to do while session_state_changing is true.
3787 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3789 fill_buffers_with_input (bufs, _input, nframes);
3791 if (_meter_point == MeterInput) {
3792 _meter->run (bufs, start_frame, end_frame, nframes, true);
3795 _amp->apply_gain_automation (false);
3796 _trim->apply_gain_automation (false);
3797 passthru (bufs, start_frame, end_frame, nframes, 0);
3803 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3805 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3810 if (n_outputs().n_total() == 0) {
3814 if (!_active || n_inputs().n_total() == 0) {
3815 silence_unlocked (nframes);
3819 framepos_t unused = 0;
3821 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3827 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3829 fill_buffers_with_input (bufs, _input, nframes);
3831 if (_meter_point == MeterInput) {
3832 _meter->run (bufs, start_frame, end_frame, nframes, true);
3835 passthru (bufs, start_frame, end_frame, nframes, declick);
3841 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3848 Route::flush_processors ()
3850 /* XXX shouldn't really try to take this lock, since
3851 this is called from the RT audio thread.
3854 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3856 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3862 __attribute__((annotate("realtime")))
3865 Route::apply_processor_changes_rt ()
3867 int emissions = EmitNone;
3869 if (_pending_meter_point != _meter_point) {
3870 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3872 /* meters always have buffers for 'processor_max_streams'
3873 * they can be re-positioned without re-allocation */
3874 if (set_meter_point_unlocked()) {
3875 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3877 emissions |= EmitMeterChanged;
3882 bool changed = false;
3884 if (g_atomic_int_get (&_pending_process_reorder)) {
3885 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3887 apply_processor_order (_pending_processor_order);
3888 setup_invisible_processors ();
3890 g_atomic_int_set (&_pending_process_reorder, 0);
3891 emissions |= EmitRtProcessorChange;
3895 set_processor_positions ();
3897 if (emissions != 0) {
3898 g_atomic_int_set (&_pending_signals, emissions);
3905 Route::emit_pending_signals ()
3908 int sig = g_atomic_int_and (&_pending_signals, 0);
3909 if (sig & EmitMeterChanged) {
3910 _meter->emit_configuration_changed();
3911 meter_change (); /* EMIT SIGNAL */
3912 if (sig & EmitMeterVisibilityChange) {
3913 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3915 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3918 if (sig & EmitRtProcessorChange) {
3919 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3924 Route::set_meter_point (MeterPoint p, bool force)
3926 if (_pending_meter_point == p && !force) {
3930 if (force || !AudioEngine::instance()->running()) {
3931 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3932 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3933 _pending_meter_point = p;
3934 _meter->emit_configuration_changed();
3935 meter_change (); /* EMIT SIGNAL */
3936 if (set_meter_point_unlocked()) {
3937 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3939 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3942 _pending_meter_point = p;
3948 __attribute__((annotate("realtime")))
3951 Route::set_meter_point_unlocked ()
3954 /* Caller must hold process and processor write lock */
3955 assert (!AudioEngine::instance()->process_lock().trylock());
3956 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3957 assert (!lm.locked ());
3960 _meter_point = _pending_meter_point;
3962 bool meter_was_visible_to_user = _meter->display_to_user ();
3964 if (!_custom_meter_position_noted) {
3965 maybe_note_meter_position ();
3968 if (_meter_point != MeterCustom) {
3970 _meter->set_display_to_user (false);
3972 setup_invisible_processors ();
3975 _meter->set_display_to_user (true);
3977 /* If we have a previous position for the custom meter, try to put it there */
3978 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3980 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3981 if (i != _processors.end ()) {
3982 _processors.remove (_meter);
3983 _processors.insert (i, _meter);
3985 } else {// at end, right before the mains_out/panner
3986 _processors.remove (_meter);
3987 ProcessorList::iterator main = _processors.end();
3988 _processors.insert (--main, _meter);
3992 /* Set up the meter for its new position */
3994 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3998 if (loc == _processors.begin()) {
3999 m_in = _input->n_ports();
4001 ProcessorList::iterator before = loc;
4003 m_in = (*before)->output_streams ();
4006 _meter->reflect_inputs (m_in);
4008 /* we do not need to reconfigure the processors, because the meter
4009 (a) is always ready to handle processor_max_streams
4010 (b) is always an N-in/N-out processor, and thus moving
4011 it doesn't require any changes to the other processors.
4014 /* these should really be done after releasing the lock
4015 * but all those signals are subscribed to with gui_thread()
4018 return (_meter->display_to_user() != meter_was_visible_to_user);
4022 Route::listen_position_changed ()
4025 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4026 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4027 ProcessorState pstate (this);
4029 if (configure_processors_unlocked (0)) {
4030 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
4032 configure_processors_unlocked (0); // it worked before we tried to add it ...
4037 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
4038 _session.set_dirty ();
4041 boost::shared_ptr<CapturingProcessor>
4042 Route::add_export_point()
4044 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4045 if (!_capturing_processor) {
4047 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4048 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
4050 _capturing_processor.reset (new CapturingProcessor (_session));
4051 _capturing_processor->activate ();
4053 configure_processors_unlocked (0);
4057 return _capturing_processor;
4061 Route::update_signal_latency ()
4063 framecnt_t l = _output->user_latency();
4064 framecnt_t lamp = 0;
4065 bool before_amp = true;
4066 framecnt_t ltrim = 0;
4067 bool before_trim = true;
4069 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4070 if ((*i)->active ()) {
4071 l += (*i)->signal_latency ();
4076 if ((*i) == _trim) {
4087 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
4089 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
4090 _signal_latency_at_amp_position = lamp;
4091 _signal_latency_at_trim_position = ltrim;
4093 if (_signal_latency != l) {
4094 _signal_latency = l;
4095 signal_latency_changed (); /* EMIT SIGNAL */
4098 return _signal_latency;
4102 Route::set_user_latency (framecnt_t nframes)
4104 _output->set_user_latency (nframes);
4105 _session.update_latency_compensation ();
4109 Route::set_latency_compensation (framecnt_t longest_session_latency)
4111 framecnt_t old = _initial_delay;
4113 if (_signal_latency < longest_session_latency) {
4114 _initial_delay = longest_session_latency - _signal_latency;
4119 DEBUG_TRACE (DEBUG::Latency, string_compose (
4120 "%1: compensate for maximum latency of %2,"
4121 "given own latency of %3, using initial delay of %4\n",
4122 name(), longest_session_latency, _signal_latency, _initial_delay));
4124 if (_initial_delay != old) {
4125 initial_delay_changed (); /* EMIT SIGNAL */
4128 if (_session.transport_stopped()) {
4129 _roll_delay = _initial_delay;
4134 Route::set_block_size (pframes_t nframes)
4136 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4137 (*i)->set_block_size (nframes);
4140 _session.ensure_buffers (n_process_buffers ());
4144 Route::protect_automation ()
4146 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
4147 (*i)->protect_automation();
4150 /** @param declick 1 to set a pending declick fade-in,
4151 * -1 to set a pending declick fade-out
4154 Route::set_pending_declick (int declick)
4157 /* this call is not allowed to turn off a pending declick */
4159 _pending_declick = declick;
4162 _pending_declick = 0;
4166 /** Shift automation forwards from a particular place, thereby inserting time.
4167 * Adds undo commands for any shifts that are performed.
4169 * @param pos Position to start shifting from.
4170 * @param frames Amount to shift forwards by.
4174 Route::shift (framepos_t pos, framecnt_t frames)
4176 /* gain automation */
4178 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
4180 XMLNode &before = gc->alist()->get_state ();
4181 gc->alist()->shift (pos, frames);
4182 XMLNode &after = gc->alist()->get_state ();
4183 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4186 /* gain automation */
4188 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
4190 XMLNode &before = gc->alist()->get_state ();
4191 gc->alist()->shift (pos, frames);
4192 XMLNode &after = gc->alist()->get_state ();
4193 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4196 // TODO mute automation ??
4198 /* pan automation */
4200 ControlSet::Controls& c (_pannable->controls());
4202 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
4203 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
4205 boost::shared_ptr<AutomationList> al = pc->alist();
4206 XMLNode& before = al->get_state ();
4207 al->shift (pos, frames);
4208 XMLNode& after = al->get_state ();
4209 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4214 /* redirect automation */
4216 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4217 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
4219 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
4221 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
4222 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
4224 boost::shared_ptr<AutomationList> al = ac->alist();
4225 XMLNode &before = al->get_state ();
4226 al->shift (pos, frames);
4227 XMLNode &after = al->get_state ();
4228 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4236 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
4238 boost::shared_ptr<Processor> processor (p.lock ());
4239 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
4243 pi->set_state_dir (d);
4247 Route::save_as_template (const string& path, const string& name)
4249 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
4250 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
4252 XMLNode& node (state (false));
4256 IO::set_name_in_state (*node.children().front(), name);
4258 tree.set_root (&node);
4260 /* return zero on success, non-zero otherwise */
4261 return !tree.write (path.c_str());
4266 Route::set_name (const string& str)
4268 if (str == name()) {
4272 string name = Route::ensure_track_or_route_name (str, _session);
4273 SessionObject::set_name (name);
4275 bool ret = (_input->set_name(name) && _output->set_name(name));
4278 /* rename the main outs. Leave other IO processors
4279 * with whatever name they already have, because its
4280 * just fine as it is (it will not contain the route
4281 * name if its a port insert, port send or port return).
4285 if (_main_outs->set_name (name)) {
4286 /* XXX returning false here is stupid because
4287 we already changed the route name.
4297 /** Set the name of a route in an XML description.
4298 * @param node XML <Route> node to set the name in.
4299 * @param name New name.
4302 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
4304 node.add_property (X_("name"), name);
4306 XMLNodeList children = node.children();
4307 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4309 if ((*i)->name() == X_("IO")) {
4311 IO::set_name_in_state (**i, name);
4313 } else if ((*i)->name() == X_("Processor")) {
4315 XMLProperty* role = (*i)->property (X_("role"));
4316 if (role && role->value() == X_("Main")) {
4317 (*i)->add_property (X_("name"), name);
4320 } else if ((*i)->name() == X_("Diskstream")) {
4322 if (rename_playlist) {
4323 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4325 (*i)->add_property (X_("name"), name);
4331 boost::shared_ptr<Send>
4332 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4334 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4336 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4337 boost::shared_ptr<InternalSend> send;
4339 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4340 if (send->target_route() == target) {
4346 return boost::shared_ptr<Send>();
4349 /** @param c Audio channel index.
4350 * @param yn true to invert phase, otherwise false.
4353 Route::set_phase_invert (uint32_t c, bool yn)
4355 if (_phase_invert[c] != yn) {
4356 _phase_invert[c] = yn;
4357 phase_invert_changed (); /* EMIT SIGNAL */
4358 _phase_control->Changed(); /* EMIT SIGNAL */
4359 _session.set_dirty ();
4364 Route::set_phase_invert (boost::dynamic_bitset<> p)
4366 if (_phase_invert != p) {
4368 phase_invert_changed (); /* EMIT SIGNAL */
4369 _session.set_dirty ();
4374 Route::phase_invert (uint32_t c) const
4376 return _phase_invert[c];
4379 boost::dynamic_bitset<>
4380 Route::phase_invert () const
4382 return _phase_invert;
4386 Route::set_denormal_protection (bool yn)
4388 if (_denormal_protection != yn) {
4389 _denormal_protection = yn;
4390 denormal_protection_changed (); /* EMIT SIGNAL */
4395 Route::denormal_protection () const
4397 return _denormal_protection;
4401 Route::set_active (bool yn, void* src)
4403 if (_session.transport_rolling()) {
4407 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4408 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4412 if (_active != yn) {
4414 _input->set_active (yn);
4415 _output->set_active (yn);
4416 active_changed (); // EMIT SIGNAL
4417 _session.set_dirty ();
4421 boost::shared_ptr<Pannable>
4422 Route::pannable() const
4427 boost::shared_ptr<Panner>
4428 Route::panner() const
4431 return _main_outs->panner_shell()->panner();
4434 boost::shared_ptr<PannerShell>
4435 Route::panner_shell() const
4437 return _main_outs->panner_shell();
4440 boost::shared_ptr<GainControl>
4441 Route::gain_control() const
4443 return _gain_control;
4446 boost::shared_ptr<GainControl>
4447 Route::trim_control() const
4449 return _trim_control;
4452 boost::shared_ptr<Route::PhaseControllable>
4453 Route::phase_control() const
4455 if (phase_invert().size()) {
4456 return _phase_control;
4458 return boost::shared_ptr<PhaseControllable>();
4462 boost::shared_ptr<AutomationControl>
4463 Route::get_control (const Evoral::Parameter& param)
4465 /* either we own the control or .... */
4467 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4471 /* maybe one of our processors does or ... */
4473 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4474 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4475 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4483 /* nobody does so we'll make a new one */
4485 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4492 boost::shared_ptr<Processor>
4493 Route::nth_plugin (uint32_t n) const
4495 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4496 ProcessorList::const_iterator i;
4498 for (i = _processors.begin(); i != _processors.end(); ++i) {
4499 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4506 return boost::shared_ptr<Processor> ();
4509 boost::shared_ptr<Processor>
4510 Route::nth_send (uint32_t n) const
4512 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4513 ProcessorList::const_iterator i;
4515 for (i = _processors.begin(); i != _processors.end(); ++i) {
4516 if (boost::dynamic_pointer_cast<Send> (*i)) {
4518 if ((*i)->name().find (_("Monitor")) == 0) {
4519 /* send to monitor section is not considered
4520 to be an accessible send.
4531 return boost::shared_ptr<Processor> ();
4535 Route::has_io_processor_named (const string& name)
4537 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4538 ProcessorList::iterator i;
4540 for (i = _processors.begin(); i != _processors.end(); ++i) {
4541 if (boost::dynamic_pointer_cast<Send> (*i) ||
4542 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4543 if ((*i)->name() == name) {
4552 MuteMaster::MutePoint
4553 Route::mute_points () const
4555 return _mute_master->mute_points ();
4559 Route::set_processor_positions ()
4561 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4563 bool had_amp = false;
4564 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4565 (*i)->set_pre_fader (!had_amp);
4572 /** Called when there is a proposed change to the input port count */
4574 Route::input_port_count_changing (ChanCount to)
4576 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4578 /* The processors cannot be configured with the new input arrangement, so
4584 /* The change is ok */
4588 /** Called when there is a proposed change to the output port count */
4590 Route::output_port_count_changing (ChanCount to)
4592 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4593 if (processor_out_streams.get(*t) > to.get(*t)) {
4597 /* The change is ok */
4602 Route::unknown_processors () const
4606 if (_session.get_disable_all_loaded_plugins ()) {
4607 // Do not list "missing plugins" if they are explicitly disabled
4611 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4612 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4613 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4614 p.push_back ((*i)->name ());
4623 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4625 /* we assume that all our input ports feed all our output ports. its not
4626 universally true, but the alternative is way too corner-case to worry about.
4629 LatencyRange all_connections;
4632 all_connections.min = 0;
4633 all_connections.max = 0;
4635 all_connections.min = ~((pframes_t) 0);
4636 all_connections.max = 0;
4638 /* iterate over all "from" ports and determine the latency range for all of their
4639 connections to the "outside" (outside of this Route).
4642 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4646 p->get_connected_latency_range (range, playback);
4648 all_connections.min = min (all_connections.min, range.min);
4649 all_connections.max = max (all_connections.max, range.max);
4653 /* set the "from" port latencies to the max/min range of all their connections */
4655 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4656 p->set_private_latency_range (all_connections, playback);
4659 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4661 all_connections.min += our_latency;
4662 all_connections.max += our_latency;
4664 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4665 p->set_private_latency_range (all_connections, playback);
4668 return all_connections.max;
4672 Route::set_private_port_latencies (bool playback) const
4674 framecnt_t own_latency = 0;
4676 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4677 OR LATENCY CALLBACK.
4679 This is called (early) from the latency callback. It computes the REAL
4680 latency associated with each port and stores the result as the "private"
4681 latency of the port. A later call to Route::set_public_port_latencies()
4682 sets all ports to the same value to reflect the fact that we do latency
4683 compensation and so all signals are delayed by the same amount as they
4684 flow through ardour.
4687 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4688 if ((*i)->active ()) {
4689 own_latency += (*i)->signal_latency ();
4694 /* playback: propagate latency from "outside the route" to outputs to inputs */
4695 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4697 /* capture: propagate latency from "outside the route" to inputs to outputs */
4698 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4703 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4705 /* this is called to set the JACK-visible port latencies, which take
4706 latency compensation into account.
4715 const PortSet& ports (_input->ports());
4716 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4717 p->set_public_latency_range (range, playback);
4722 const PortSet& ports (_output->ports());
4723 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4724 p->set_public_latency_range (range, playback);
4729 /** Put the invisible processors in the right place in _processors.
4730 * Must be called with a writer lock on _processor_lock held.
4733 __attribute__((annotate("realtime")))
4736 Route::setup_invisible_processors ()
4739 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4740 assert (!lm.locked ());
4744 /* too early to be doing this stuff */
4748 /* we'll build this new list here and then use it
4750 * TODO put the ProcessorList is on the stack for RT-safety.
4753 ProcessorList new_processors;
4755 /* find visible processors */
4757 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4758 if ((*i)->display_to_user ()) {
4759 new_processors.push_back (*i);
4765 ProcessorList::iterator amp = new_processors.begin ();
4766 while (amp != new_processors.end() && *amp != _amp) {
4770 assert (amp != new_processors.end ());
4772 /* and the processor after the amp */
4774 ProcessorList::iterator after_amp = amp;
4780 switch (_meter_point) {
4782 assert (!_meter->display_to_user ());
4783 new_processors.push_front (_meter);
4786 assert (!_meter->display_to_user ());
4787 new_processors.insert (amp, _meter);
4789 case MeterPostFader:
4790 /* do nothing here */
4793 /* do nothing here */
4796 /* the meter is visible, so we don't touch it here */
4803 assert (_main_outs);
4804 assert (!_main_outs->display_to_user ());
4805 new_processors.push_back (_main_outs);
4807 /* iterator for the main outs */
4809 ProcessorList::iterator main = new_processors.end();
4812 /* OUTPUT METERING */
4814 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4815 assert (!_meter->display_to_user ());
4817 /* add the processor just before or just after the main outs */
4819 ProcessorList::iterator meter_point = main;
4821 if (_meter_point == MeterOutput) {
4824 new_processors.insert (meter_point, _meter);
4829 if (_monitor_send && !is_monitor ()) {
4830 assert (!_monitor_send->display_to_user ());
4831 switch (Config->get_listen_position ()) {
4832 case PreFaderListen:
4833 switch (Config->get_pfl_position ()) {
4834 case PFLFromBeforeProcessors:
4835 new_processors.push_front (_monitor_send);
4837 case PFLFromAfterProcessors:
4838 new_processors.insert (amp, _monitor_send);
4841 _monitor_send->set_can_pan (false);
4843 case AfterFaderListen:
4844 switch (Config->get_afl_position ()) {
4845 case AFLFromBeforeProcessors:
4846 new_processors.insert (after_amp, _monitor_send);
4848 case AFLFromAfterProcessors:
4849 new_processors.insert (new_processors.end(), _monitor_send);
4852 _monitor_send->set_can_pan (true);
4857 #if 0 // not used - just yet
4858 if (!is_master() && !is_monitor() && !is_auditioner()) {
4859 new_processors.push_front (_delayline);
4863 /* MONITOR CONTROL */
4865 if (_monitor_control && is_monitor ()) {
4866 assert (!_monitor_control->display_to_user ());
4867 new_processors.insert (amp, _monitor_control);
4870 /* INTERNAL RETURN */
4872 /* doing this here means that any monitor control will come just after
4877 assert (!_intreturn->display_to_user ());
4878 new_processors.push_front (_intreturn);
4881 if (_trim && _trim->active()) {
4882 assert (!_trim->display_to_user ());
4883 new_processors.push_front (_trim);
4885 /* EXPORT PROCESSOR */
4887 if (_capturing_processor) {
4888 assert (!_capturing_processor->display_to_user ());
4889 new_processors.push_front (_capturing_processor);
4892 _processors = new_processors;
4894 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4895 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4900 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4901 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4902 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4909 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4910 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4914 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4915 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4922 /** If the meter point is `Custom', make a note of where the meter is.
4923 * This is so that if the meter point is subsequently set to something else,
4924 * and then back to custom, we can put the meter back where it was last time
4925 * custom was enabled.
4927 * Must be called with the _processor_lock held.
4930 Route::maybe_note_meter_position ()
4932 if (_meter_point != MeterCustom) {
4936 _custom_meter_position_noted = true;
4937 /* custom meter points range from after trim to before panner/main_outs
4938 * this is a limitation by the current processor UI
4940 bool seen_trim = false;
4941 _processor_after_last_custom_meter.reset();
4942 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4943 if ((*i) == _trim) {
4946 if ((*i) == _main_outs) {
4947 _processor_after_last_custom_meter = *i;
4950 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4952 _processor_after_last_custom_meter = _trim;
4954 ProcessorList::iterator j = i;
4956 assert(j != _processors.end ()); // main_outs should be before
4957 _processor_after_last_custom_meter = *j;
4962 assert(_processor_after_last_custom_meter.lock());
4965 boost::shared_ptr<Processor>
4966 Route::processor_by_id (PBD::ID id) const
4968 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4969 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4970 if ((*i)->id() == id) {
4975 return boost::shared_ptr<Processor> ();
4978 /** @return the monitoring state, or in other words what data we are pushing
4979 * into the route (data from the inputs, data from disk or silence)
4982 Route::monitoring_state () const
4984 return MonitoringInput;
4987 /** @return what we should be metering; either the data coming from the input
4988 * IO or the data that is flowing through the route.
4991 Route::metering_state () const
4993 return MeteringRoute;
4997 Route::has_external_redirects () const
4999 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
5001 /* ignore inactive processors and obviously ignore the main
5002 * outs since everything has them and we don't care.
5005 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
5013 boost::shared_ptr<Processor>
5014 Route::the_instrument () const
5016 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
5017 return the_instrument_unlocked ();
5020 boost::shared_ptr<Processor>
5021 Route::the_instrument_unlocked () const
5023 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
5024 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
5025 if ((*i)->input_streams().n_midi() > 0 &&
5026 (*i)->output_streams().n_audio() > 0) {
5031 return boost::shared_ptr<Processor>();
5037 Route::non_realtime_locate (framepos_t pos)
5040 _pannable->transport_located (pos);
5043 if (_delayline.get()) {
5044 _delayline.get()->flush();
5048 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
5049 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
5051 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
5052 (*i)->transport_located (pos);
5055 _roll_delay = _initial_delay;
5059 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
5066 * We don't currently mix MIDI input together, so we don't need the
5067 * complex logic of the audio case.
5070 n_buffers = bufs.count().n_midi ();
5072 for (i = 0; i < n_buffers; ++i) {
5074 boost::shared_ptr<MidiPort> source_port = io->midi (i);
5075 MidiBuffer& buf (bufs.get_midi (i));
5078 buf.copy (source_port->get_midi_buffer(nframes));
5080 buf.silence (nframes);
5086 n_buffers = bufs.count().n_audio();
5088 size_t n_ports = io->n_ports().n_audio();
5089 float scaling = 1.0f;
5091 if (n_ports > n_buffers) {
5092 scaling = ((float) n_buffers) / n_ports;
5095 for (i = 0; i < n_ports; ++i) {
5097 /* if there are more ports than buffers, map them onto buffers
5098 * in a round-robin fashion
5101 boost::shared_ptr<AudioPort> source_port = io->audio (i);
5102 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
5105 if (i < n_buffers) {
5107 /* first time through just copy a channel into
5111 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
5113 if (scaling != 1.0f) {
5114 buf.apply_gain (scaling, nframes);
5119 /* on subsequent times around, merge data from
5120 * the port with what is already there
5123 if (scaling != 1.0f) {
5124 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
5126 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
5131 /* silence any remaining buffers */
5133 for (; i < n_buffers; ++i) {
5134 AudioBuffer& buf (bufs.get_audio (i));
5135 buf.silence (nframes);
5138 /* establish the initial setup of the buffer set, reflecting what was
5139 copied into it. unless, of course, we are the auditioner, in which
5140 case nothing was fed into it from the inputs at all.
5143 if (!is_auditioner()) {
5144 bufs.set_count (io->n_ports());
5148 boost::shared_ptr<AutomationControl>
5149 Route::pan_azimuth_control() const
5152 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5154 return boost::shared_ptr<AutomationControl>();
5156 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
5157 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
5159 if (!_pannable || !panner()) {
5160 return boost::shared_ptr<AutomationControl>();
5162 return _pannable->pan_azimuth_control;
5166 boost::shared_ptr<AutomationControl>
5167 Route::pan_elevation_control() const
5169 if (Profile->get_mixbus() || !_pannable || !panner()) {
5170 return boost::shared_ptr<AutomationControl>();
5173 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5175 if (c.find (PanElevationAutomation) != c.end()) {
5176 return _pannable->pan_elevation_control;
5178 return boost::shared_ptr<AutomationControl>();
5181 boost::shared_ptr<AutomationControl>
5182 Route::pan_width_control() const
5184 if (Profile->get_mixbus() || !_pannable || !panner()) {
5185 return boost::shared_ptr<AutomationControl>();
5188 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5190 if (c.find (PanWidthAutomation) != c.end()) {
5191 return _pannable->pan_width_control;
5193 return boost::shared_ptr<AutomationControl>();
5196 boost::shared_ptr<AutomationControl>
5197 Route::pan_frontback_control() const
5199 if (Profile->get_mixbus() || !_pannable || !panner()) {
5200 return boost::shared_ptr<AutomationControl>();
5203 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5205 if (c.find (PanFrontBackAutomation) != c.end()) {
5206 return _pannable->pan_frontback_control;
5208 return boost::shared_ptr<AutomationControl>();
5211 boost::shared_ptr<AutomationControl>
5212 Route::pan_lfe_control() const
5214 if (Profile->get_mixbus() || !_pannable || !panner()) {
5215 return boost::shared_ptr<AutomationControl>();
5218 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5220 if (c.find (PanLFEAutomation) != c.end()) {
5221 return _pannable->pan_lfe_control;
5223 return boost::shared_ptr<AutomationControl>();
5228 Route::eq_band_cnt () const
5230 if (Profile->get_mixbus()) {
5233 /* Ardour has no well-known EQ object */
5238 boost::shared_ptr<AutomationControl>
5239 Route::eq_gain_controllable (uint32_t band) const
5242 boost::shared_ptr<PluginInsert> eq = ch_eq();
5245 return boost::shared_ptr<AutomationControl>();
5248 uint32_t port_number;
5251 if (is_master() || mixbus()) {
5258 if (is_master() || mixbus()) {
5265 if (is_master() || mixbus()) {
5272 return boost::shared_ptr<AutomationControl>();
5275 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5277 return boost::shared_ptr<AutomationControl>();
5280 boost::shared_ptr<AutomationControl>
5281 Route::eq_freq_controllable (uint32_t band) const
5285 if (mixbus() || is_master()) {
5286 /* no frequency controls for mixbusses or master */
5287 return boost::shared_ptr<AutomationControl>();
5290 boost::shared_ptr<PluginInsert> eq = ch_eq();
5293 return boost::shared_ptr<AutomationControl>();
5296 uint32_t port_number;
5308 return boost::shared_ptr<AutomationControl>();
5311 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5313 return boost::shared_ptr<AutomationControl>();
5317 boost::shared_ptr<AutomationControl>
5318 Route::eq_q_controllable (uint32_t band) const
5320 return boost::shared_ptr<AutomationControl>();
5323 boost::shared_ptr<AutomationControl>
5324 Route::eq_shape_controllable (uint32_t band) const
5326 return boost::shared_ptr<AutomationControl>();
5329 boost::shared_ptr<AutomationControl>
5330 Route::eq_enable_controllable () const
5333 boost::shared_ptr<PluginInsert> eq = ch_eq();
5336 return boost::shared_ptr<AutomationControl>();
5339 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5341 return boost::shared_ptr<AutomationControl>();
5345 boost::shared_ptr<AutomationControl>
5346 Route::eq_hpf_controllable () const
5349 boost::shared_ptr<PluginInsert> eq = ch_eq();
5352 return boost::shared_ptr<AutomationControl>();
5355 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5357 return boost::shared_ptr<AutomationControl>();
5362 Route::eq_band_name (uint32_t band) const
5364 if (Profile->get_mixbus()) {
5380 boost::shared_ptr<AutomationControl>
5381 Route::comp_enable_controllable () const
5384 boost::shared_ptr<PluginInsert> comp = ch_comp();
5387 return boost::shared_ptr<AutomationControl>();
5390 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5392 return boost::shared_ptr<AutomationControl>();
5395 boost::shared_ptr<AutomationControl>
5396 Route::comp_threshold_controllable () const
5399 boost::shared_ptr<PluginInsert> comp = ch_comp();
5402 return boost::shared_ptr<AutomationControl>();
5405 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5408 return boost::shared_ptr<AutomationControl>();
5411 boost::shared_ptr<AutomationControl>
5412 Route::comp_speed_controllable () const
5415 boost::shared_ptr<PluginInsert> comp = ch_comp();
5418 return boost::shared_ptr<AutomationControl>();
5421 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5423 return boost::shared_ptr<AutomationControl>();
5426 boost::shared_ptr<AutomationControl>
5427 Route::comp_mode_controllable () const
5430 boost::shared_ptr<PluginInsert> comp = ch_comp();
5433 return boost::shared_ptr<AutomationControl>();
5436 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5438 return boost::shared_ptr<AutomationControl>();
5441 boost::shared_ptr<AutomationControl>
5442 Route::comp_makeup_controllable () const
5445 boost::shared_ptr<PluginInsert> comp = ch_comp();
5448 return boost::shared_ptr<AutomationControl>();
5451 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5453 return boost::shared_ptr<AutomationControl>();
5456 boost::shared_ptr<AutomationControl>
5457 Route::comp_redux_controllable () const
5460 boost::shared_ptr<PluginInsert> comp = ch_comp();
5463 return boost::shared_ptr<AutomationControl>();
5466 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5468 return boost::shared_ptr<AutomationControl>();
5473 Route::comp_mode_name (uint32_t mode) const
5478 return _("Leveler");
5480 return _("Compressor");
5482 return _("Limiter");
5484 return mixbus() ? _("Sidechain") : _("Limiter");
5494 Route::comp_speed_name (uint32_t mode) const
5512 boost::shared_ptr<AutomationControl>
5513 Route::send_level_controllable (uint32_t n) const
5516 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5518 return boost::shared_ptr<AutomationControl>();
5523 return boost::shared_ptr<AutomationControl>();
5526 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5527 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5529 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5531 return boost::shared_ptr<AutomationControl>();
5533 return s->gain_control ();
5537 boost::shared_ptr<AutomationControl>
5538 Route::send_enable_controllable (uint32_t n) const
5541 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5543 return boost::shared_ptr<AutomationControl>();
5548 return boost::shared_ptr<AutomationControl>();
5551 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5552 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5554 /* although Ardour sends have enable/disable as part of the Processor
5555 API, it is not exposed as a controllable.
5557 XXX: we should fix this.
5559 return boost::shared_ptr<AutomationControl>();
5564 Route::send_name (uint32_t n) const
5570 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5574 boost::shared_ptr<Processor> p = nth_send (n);
5583 boost::shared_ptr<AutomationControl>
5584 Route::master_send_enable_controllable () const
5587 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5589 return boost::shared_ptr<AutomationControl>();
5591 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5593 return boost::shared_ptr<AutomationControl>();