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));
1388 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1393 } else if (node.name() == "Send") {
1395 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1396 processor.reset (new Send (_session, sendpan, _mute_master));
1400 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1404 if (processor->set_state (node, version)) {
1408 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1409 if (i != children.end()) {
1410 if ((prop = (*i)->property (X_("active"))) != 0) {
1411 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1412 processor->activate();
1414 processor->deactivate();
1418 return (add_processor (processor, placement, 0, false) == 0);
1421 catch (failed_constructor &err) {
1422 warning << _("processor could not be created. Ignored.") << endmsg;
1428 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1430 /* NOTE: this is intended to be used ONLY when copying
1431 processors from another Route. Hence the subtle
1432 differences between this and ::add_processor()
1435 ProcessorList::iterator loc;
1438 loc = find(_processors.begin(), _processors.end(), before);
1440 /* nothing specified - at end */
1441 loc = _processors.end ();
1444 if (!_session.engine().connected()) {
1448 if (others.empty()) {
1453 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1454 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1455 ProcessorState pstate (this);
1457 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1463 boost::shared_ptr<PluginInsert> pi;
1465 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1466 pi->set_count (1); // why? configure_processors_unlocked() will re-do this
1467 pi->set_strict_io (_strict_io);
1470 _processors.insert (loc, *i);
1471 (*i)->set_owner (this);
1473 if ((*i)->active()) {
1477 /* Think: does this really need to be called for every processor in the loop? */
1479 if (configure_processors_unlocked (err)) {
1481 configure_processors_unlocked (0); // it worked before we tried to add it ...
1486 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1489 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1490 boost::shared_ptr<PluginInsert> pi;
1492 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1493 if (pi->has_no_inputs ()) {
1494 _have_internal_generator = true;
1500 _output->set_user_latency (0);
1503 reset_instrument_info ();
1504 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1505 set_processor_positions ();
1511 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1513 if (p == PreFader) {
1514 start = _processors.begin();
1515 end = find(_processors.begin(), _processors.end(), _amp);
1517 start = find(_processors.begin(), _processors.end(), _amp);
1519 end = _processors.end();
1523 /** Turn off all processors with a given placement
1524 * @param p Placement of processors to disable
1527 Route::disable_processors (Placement p)
1529 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1531 ProcessorList::iterator start, end;
1532 placement_range(p, start, end);
1534 for (ProcessorList::iterator i = start; i != end; ++i) {
1535 (*i)->deactivate ();
1538 _session.set_dirty ();
1541 /** Turn off all redirects
1544 Route::disable_processors ()
1546 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1548 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1549 (*i)->deactivate ();
1552 _session.set_dirty ();
1555 /** Turn off all redirects with a given placement
1556 * @param p Placement of redirects to disable
1559 Route::disable_plugins (Placement p)
1561 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1563 ProcessorList::iterator start, end;
1564 placement_range(p, start, end);
1566 for (ProcessorList::iterator i = start; i != end; ++i) {
1567 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1568 (*i)->deactivate ();
1572 _session.set_dirty ();
1575 /** Turn off all plugins
1578 Route::disable_plugins ()
1580 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1582 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1583 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1584 (*i)->deactivate ();
1588 _session.set_dirty ();
1593 Route::ab_plugins (bool forward)
1595 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1599 /* forward = turn off all active redirects, and mark them so that the next time
1600 we go the other way, we will revert them
1603 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1604 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1608 if ((*i)->active()) {
1609 (*i)->deactivate ();
1610 (*i)->set_next_ab_is_active (true);
1612 (*i)->set_next_ab_is_active (false);
1618 /* backward = if the redirect was marked to go active on the next ab, do so */
1620 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1622 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1626 if ((*i)->get_next_ab_is_active()) {
1629 (*i)->deactivate ();
1634 _session.set_dirty ();
1638 /** Remove processors with a given placement.
1639 * @param p Placement of processors to remove.
1642 Route::clear_processors (Placement p)
1644 if (!_session.engine().connected()) {
1648 bool already_deleting = _session.deletion_in_progress();
1649 if (!already_deleting) {
1650 _session.set_deletion_in_progress();
1654 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1655 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1656 ProcessorList new_list;
1657 ProcessorStreams err;
1658 bool seen_amp = false;
1660 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1666 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1668 /* you can't remove these */
1670 new_list.push_back (*i);
1677 new_list.push_back (*i);
1680 (*i)->drop_references ();
1688 (*i)->drop_references ();
1691 new_list.push_back (*i);
1698 _processors = new_list;
1699 configure_processors_unlocked (&err); // this can't fail
1702 processor_max_streams.reset();
1703 _have_internal_generator = false;
1704 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1705 set_processor_positions ();
1707 reset_instrument_info ();
1709 if (!already_deleting) {
1710 _session.clear_deletion_in_progress();
1715 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1717 // TODO once the export point can be configured properly, do something smarter here
1718 if (processor == _capturing_processor) {
1719 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1720 if (need_process_lock) {
1724 _capturing_processor.reset();
1726 if (need_process_lock) {
1731 /* these can never be removed */
1733 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1737 if (!_session.engine().connected()) {
1741 processor_max_streams.reset();
1744 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1745 if (need_process_lock) {
1749 /* Caller must hold process lock */
1750 assert (!AudioEngine::instance()->process_lock().trylock());
1752 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1754 ProcessorState pstate (this);
1756 ProcessorList::iterator i;
1757 bool removed = false;
1759 for (i = _processors.begin(); i != _processors.end(); ) {
1760 if (*i == processor) {
1762 /* move along, see failure case for configure_processors()
1763 where we may need to reconfigure the processor.
1766 /* stop redirects that send signals to JACK ports
1767 from causing noise as a result of no longer being
1771 boost::shared_ptr<IOProcessor> iop;
1773 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1777 i = _processors.erase (i);
1785 _output->set_user_latency (0);
1793 if (configure_processors_unlocked (err)) {
1795 /* we know this will work, because it worked before :) */
1796 configure_processors_unlocked (0);
1800 _have_internal_generator = false;
1802 for (i = _processors.begin(); i != _processors.end(); ++i) {
1803 boost::shared_ptr<PluginInsert> pi;
1805 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1806 if (pi->has_no_inputs ()) {
1807 _have_internal_generator = true;
1812 if (need_process_lock) {
1817 reset_instrument_info ();
1818 processor->drop_references ();
1819 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1820 set_processor_positions ();
1826 Route::replace_processor (boost::shared_ptr<Processor> old, boost::shared_ptr<Processor> sub, ProcessorStreams* err)
1828 /* these can never be removed */
1829 if (old == _amp || old == _meter || old == _main_outs || old == _delayline || old == _trim) {
1832 /* and can't be used as substitute, either */
1833 if (sub == _amp || sub == _meter || sub == _main_outs || sub == _delayline || sub == _trim) {
1837 /* I/Os are out, too */
1838 if (boost::dynamic_pointer_cast<IOProcessor> (old) || boost::dynamic_pointer_cast<IOProcessor> (sub)) {
1842 /* this function cannot be used to swap/reorder processors */
1843 if (find (_processors.begin(), _processors.end(), sub) != _processors.end ()) {
1847 if (!AudioEngine::instance()->connected() || !old || !sub) {
1851 /* ensure that sub is not owned by another route */
1852 if (sub->owner ()) {
1857 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1858 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1859 ProcessorState pstate (this);
1861 assert (find (_processors.begin(), _processors.end(), sub) == _processors.end ());
1863 ProcessorList::iterator i;
1864 bool replaced = false;
1865 bool enable = old->active ();
1867 for (i = _processors.begin(); i != _processors.end(); ) {
1869 i = _processors.erase (i);
1870 _processors.insert (i, sub);
1871 sub->set_owner (this);
1884 boost::shared_ptr<PluginInsert> pi;
1885 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(sub)) != 0) {
1886 pi->set_strict_io (true);
1890 if (configure_processors_unlocked (err)) {
1892 configure_processors_unlocked (0);
1896 _have_internal_generator = false;
1898 for (i = _processors.begin(); i != _processors.end(); ++i) {
1899 boost::shared_ptr<PluginInsert> pi;
1900 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1901 if (pi->has_no_inputs ()) {
1902 _have_internal_generator = true;
1912 sub->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1913 _output->set_user_latency (0);
1916 reset_instrument_info ();
1917 old->drop_references ();
1918 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1919 set_processor_positions ();
1924 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1926 ProcessorList deleted;
1928 if (!_session.engine().connected()) {
1932 processor_max_streams.reset();
1935 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1936 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1937 ProcessorState pstate (this);
1939 ProcessorList::iterator i;
1940 boost::shared_ptr<Processor> processor;
1942 for (i = _processors.begin(); i != _processors.end(); ) {
1946 /* these can never be removed */
1948 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1953 /* see if its in the list of processors to delete */
1955 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1960 /* stop IOProcessors that send to JACK ports
1961 from causing noise as a result of no longer being
1965 boost::shared_ptr<IOProcessor> iop;
1967 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1971 deleted.push_back (processor);
1972 i = _processors.erase (i);
1975 if (deleted.empty()) {
1976 /* none of those in the requested list were found */
1980 _output->set_user_latency (0);
1982 if (configure_processors_unlocked (err)) {
1984 /* we know this will work, because it worked before :) */
1985 configure_processors_unlocked (0);
1990 _have_internal_generator = false;
1992 for (i = _processors.begin(); i != _processors.end(); ++i) {
1993 boost::shared_ptr<PluginInsert> pi;
1995 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1996 if (pi->has_no_inputs ()) {
1997 _have_internal_generator = true;
2004 /* now try to do what we need to so that those that were removed will be deleted */
2006 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
2007 (*i)->drop_references ();
2010 reset_instrument_info ();
2011 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2012 set_processor_positions ();
2018 Route::reset_instrument_info ()
2020 boost::shared_ptr<Processor> instr = the_instrument();
2022 _instrument_info.set_internal_instrument (instr);
2026 /** Caller must hold process lock */
2028 Route::configure_processors (ProcessorStreams* err)
2030 #ifndef PLATFORM_WINDOWS
2031 assert (!AudioEngine::instance()->process_lock().trylock());
2034 if (!_in_configure_processors) {
2035 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2036 return configure_processors_unlocked (err);
2043 Route::input_streams () const
2045 return _input->n_ports ();
2048 list<pair<ChanCount, ChanCount> >
2049 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
2051 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2053 return try_configure_processors_unlocked (in, err);
2056 list<pair<ChanCount, ChanCount> >
2057 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
2059 // Check each processor in order to see if we can configure as requested
2061 list<pair<ChanCount, ChanCount> > configuration;
2064 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
2065 DEBUG_TRACE (DEBUG::Processors, "{\n");
2067 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
2069 if ((*p)->can_support_io_configuration(in, out)) {
2070 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
2071 configuration.push_back(make_pair(in, out));
2074 // restriction for Monitor Section Processors
2075 if (in.n_audio() != out.n_audio() || out.n_midi() > 0) {
2076 /* do not allow to add/remove channels (for now)
2077 * The Monitor follows the master-bus and has no panner (unpan)
2078 * but do allow processors with midi-in to be added (e.g VSTs with control that
2079 * will remain unconnected)
2081 DEBUG_TRACE (DEBUG::Processors, "Monitor: Channel configuration not allowed.\n");
2082 return list<pair<ChanCount, ChanCount> > ();
2084 if (boost::dynamic_pointer_cast<InternalSend> (*p)) {
2085 // internal sends make no sense, only feedback
2086 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
2087 return list<pair<ChanCount, ChanCount> > ();
2089 if (boost::dynamic_pointer_cast<PortInsert> (*p)) {
2090 /* External Sends can be problematic. one can add/remove ports
2091 * there signal leaves the DAW to external monitors anyway, so there's
2092 * no real use for allowing them here anyway.
2094 DEBUG_TRACE (DEBUG::Processors, "Monitor: No External Sends allowed.\n");
2095 return list<pair<ChanCount, ChanCount> > ();
2097 if (boost::dynamic_pointer_cast<Send> (*p)) {
2099 DEBUG_TRACE (DEBUG::Processors, "Monitor: No Sends allowed.\n");
2100 return list<pair<ChanCount, ChanCount> > ();
2109 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
2110 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
2111 DEBUG_TRACE (DEBUG::Processors, "}\n");
2112 return list<pair<ChanCount, ChanCount> > ();
2116 DEBUG_TRACE (DEBUG::Processors, "}\n");
2118 return configuration;
2121 /** Set the input/output configuration of each processor in the processors list.
2122 * Caller must hold process lock.
2123 * Return 0 on success, otherwise configuration is impossible.
2126 Route::configure_processors_unlocked (ProcessorStreams* err)
2128 #ifndef PLATFORM_WINDOWS
2129 assert (!AudioEngine::instance()->process_lock().trylock());
2132 if (_in_configure_processors) {
2136 /* put invisible processors where they should be */
2137 setup_invisible_processors ();
2139 _in_configure_processors = true;
2141 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
2143 if (configuration.empty ()) {
2144 _in_configure_processors = false;
2149 bool seen_mains_out = false;
2150 processor_out_streams = _input->n_ports();
2151 processor_max_streams.reset();
2153 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
2154 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
2156 if (!(*p)->configure_io(c->first, c->second)) {
2157 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
2158 _in_configure_processors = false;
2161 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
2162 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
2164 boost::shared_ptr<PluginInsert> pi;
2165 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2166 /* plugins connected via Split or Hide Match may have more channels.
2167 * route/scratch buffers are needed for all of them
2168 * The configuration may only be a subset (both input and output)
2170 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
2171 processor_max_streams = ChanCount::max(processor_max_streams, pi->output_streams());
2172 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams() * pi->get_count());
2173 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_output_streams() * pi->get_count());
2177 if (boost::dynamic_pointer_cast<Delivery> (*p)
2178 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
2179 /* main delivery will increase port count to match input.
2180 * the Delivery::Main is usually the last processor - followed only by
2183 seen_mains_out = true;
2185 if (!seen_mains_out) {
2186 processor_out_streams = out;
2192 _meter->set_max_channels (processor_max_streams);
2195 /* make sure we have sufficient scratch buffers to cope with the new processor
2198 _session.ensure_buffers (n_process_buffers ());
2200 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
2202 _in_configure_processors = false;
2206 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
2207 * @param state New active state for those processors.
2210 Route::all_visible_processors_active (bool state)
2212 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2214 if (_processors.empty()) {
2218 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2219 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2226 (*i)->deactivate ();
2230 _session.set_dirty ();
2234 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2236 /* check if re-order requires re-configuration of any processors
2237 * -> compare channel configuration for all processors
2239 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2240 ChanCount c = input_streams ();
2242 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2244 if (c != (*j)->input_streams()) {
2247 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2250 if ((*i)->input_streams() != c) {
2253 c = (*i)->output_streams();
2265 __attribute__((annotate("realtime")))
2268 Route::apply_processor_order (const ProcessorList& new_order)
2270 /* need to hold processor_lock; either read or write lock
2271 * and the engine process_lock.
2272 * Due to r/w lock ambiguity we can only assert the latter
2274 assert (!AudioEngine::instance()->process_lock().trylock());
2277 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2278 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2279 * processors in the current actual processor list that are hidden. Any visible processors
2280 * in the current list but not in "new_order" will be assumed to be deleted.
2283 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2284 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2285 * (note though that ::processors_reorder_needs_configure() ensured that
2286 * this function will only ever be called from the rt-thread if no processor were removed)
2288 * either way, I can't proove it, but an x-run due to re-order here is less likley
2289 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2292 ProcessorList as_it_will_be;
2293 ProcessorList::iterator oiter;
2294 ProcessorList::const_iterator niter;
2296 oiter = _processors.begin();
2297 niter = new_order.begin();
2299 while (niter != new_order.end()) {
2301 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2302 then append it to the temp list.
2304 Otherwise, see if the next processor in the old list is in the new list. if not,
2305 its been deleted. If its there, append it to the temp list.
2308 if (oiter == _processors.end()) {
2310 /* no more elements in the old list, so just stick the rest of
2311 the new order onto the temp list.
2314 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2315 while (niter != new_order.end()) {
2322 if (!(*oiter)->display_to_user()) {
2324 as_it_will_be.push_back (*oiter);
2328 /* visible processor: check that its in the new order */
2330 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2331 /* deleted: do nothing, shared_ptr<> will clean up */
2333 /* ignore this one, and add the next item from the new order instead */
2334 as_it_will_be.push_back (*niter);
2339 /* now remove from old order - its taken care of no matter what */
2340 oiter = _processors.erase (oiter);
2344 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2346 /* If the meter is in a custom position, find it and make a rough note of its position */
2347 maybe_note_meter_position ();
2351 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2353 // it a change is already queued, wait for it
2354 // (unless engine is stopped. apply immediately and proceed
2355 while (g_atomic_int_get (&_pending_process_reorder)) {
2356 if (!AudioEngine::instance()->running()) {
2357 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2358 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2360 apply_processor_order(_pending_processor_order);
2361 setup_invisible_processors ();
2363 g_atomic_int_set (&_pending_process_reorder, 0);
2365 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2366 set_processor_positions ();
2368 // TODO rather use a semaphore or something.
2369 // but since ::reorder_processors() is called
2370 // from the GUI thread, this is fine..
2375 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2377 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2378 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2379 ProcessorState pstate (this);
2381 apply_processor_order (new_order);
2383 if (configure_processors_unlocked (err)) {
2391 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2392 set_processor_positions ();
2395 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2396 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2398 // _pending_processor_order is protected by _processor_lock
2399 _pending_processor_order = new_order;
2400 g_atomic_int_set (&_pending_process_reorder, 1);
2407 Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
2410 return customize_plugin_insert (proc, 0, unused);
2414 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs)
2416 boost::shared_ptr<PluginInsert> pi;
2417 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
2423 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2424 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2436 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2437 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2438 ProcessorState pstate (this);
2440 bool old_cust = pi->custom_cfg ();
2441 uint32_t old_cnt = pi->get_count ();
2442 ChanCount old_chan = pi->output_streams ();
2445 pi->set_custom_cfg (false);
2447 pi->set_custom_cfg (true);
2448 pi->set_count (count);
2449 pi->set_outputs (outs);
2452 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2456 pi->set_count (old_cnt);
2457 pi->set_outputs (old_chan);
2458 pi->set_custom_cfg (old_cust);
2462 configure_processors_unlocked (0);
2465 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2466 _session.set_dirty ();
2471 Route::set_strict_io (const bool enable)
2473 if (_strict_io != enable) {
2474 _strict_io = enable;
2475 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2476 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2477 boost::shared_ptr<PluginInsert> pi;
2478 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2479 pi->set_strict_io (_strict_io);
2483 list<pair<ChanCount, ChanCount> > c = try_configure_processors_unlocked (n_inputs (), 0);
2487 _strict_io = !enable; // restore old value
2488 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
2489 boost::shared_ptr<PluginInsert> pi;
2490 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
2491 pi->set_strict_io (_strict_io);
2499 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2500 configure_processors (0);
2502 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2503 _session.set_dirty ();
2515 Route::get_template()
2517 return state(false);
2521 Route::state(bool full_state)
2523 if (!_session._template_state_dir.empty()) {
2524 assert (!full_state); // only for templates
2525 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), _session._template_state_dir));
2528 XMLNode *node = new XMLNode("Route");
2529 ProcessorList::iterator i;
2532 id().print (buf, sizeof (buf));
2533 node->add_property("id", buf);
2534 node->add_property ("name", _name);
2535 node->add_property("default-type", _default_type.to_string());
2536 node->add_property ("strict-io", _strict_io);
2539 node->add_property("flags", enum_2_string (_flags));
2542 node->add_property("active", _active?"yes":"no");
2544 boost::to_string (_phase_invert, p);
2545 node->add_property("phase-invert", p);
2546 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2547 node->add_property("meter-point", enum_2_string (_meter_point));
2549 node->add_property("meter-type", enum_2_string (_meter_type));
2552 node->add_property("route-group", _route_group->name());
2555 snprintf (buf, sizeof (buf), "%d", _order_key);
2556 node->add_property ("order-key", buf);
2557 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2558 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2559 node->add_property ("soloed-by-upstream", buf);
2560 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2561 node->add_property ("soloed-by-downstream", buf);
2562 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2563 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2565 node->add_child_nocopy (_input->state (full_state));
2566 node->add_child_nocopy (_output->state (full_state));
2567 node->add_child_nocopy (_solo_control->get_state ());
2568 node->add_child_nocopy (_mute_control->get_state ());
2569 node->add_child_nocopy (_mute_master->get_state ());
2572 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2575 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2576 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2577 remote_control_node->add_property (X_("id"), buf);
2578 node->add_child_nocopy (*remote_control_node);
2580 if (_comment.length()) {
2581 XMLNode *cmt = node->add_child ("Comment");
2582 cmt->add_content (_comment);
2586 node->add_child_nocopy (_pannable->state (full_state));
2589 for (i = _processors.begin(); i != _processors.end(); ++i) {
2591 /* template save: do not include internal sends functioning as
2592 aux sends because the chance of the target ID
2593 in the session where this template is used
2596 similarly, do not save listen sends which connect to
2597 the monitor section, because these will always be
2600 boost::shared_ptr<InternalSend> is;
2602 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2603 if (is->role() == Delivery::Listen) {
2608 node->add_child_nocopy((*i)->state (full_state));
2612 node->add_child_copy (*_extra_xml);
2615 if (_custom_meter_position_noted) {
2616 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2618 after->id().print (buf, sizeof (buf));
2619 node->add_property (X_("processor-after-last-custom-meter"), buf);
2623 if (!_session._template_state_dir.empty()) {
2624 foreach_processor (sigc::bind (sigc::mem_fun (*this, &Route::set_plugin_state_dir), ""));
2631 Route::set_state (const XMLNode& node, int version)
2633 if (version < 3000) {
2634 return set_state_2X (node, version);
2638 XMLNodeConstIterator niter;
2640 const XMLProperty *prop;
2642 if (node.name() != "Route"){
2643 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2647 if ((prop = node.property (X_("name"))) != 0) {
2648 Route::set_name (prop->value());
2652 _initial_io_setup = true;
2654 if ((prop = node.property (X_("flags"))) != 0) {
2655 _flags = Flag (string_2_enum (prop->value(), _flags));
2660 if ((prop = node.property (X_("strict-io"))) != 0) {
2661 _strict_io = string_is_affirmative (prop->value());
2664 if (is_master() || is_monitor() || is_auditioner()) {
2665 _mute_master->set_solo_ignore (true);
2669 /* monitor bus does not get a panner, but if (re)created
2670 via XML, it will already have one by the time we
2671 call ::set_state(). so ... remove it.
2676 /* add all processors (except amp, which is always present) */
2678 nlist = node.children();
2679 XMLNode processor_state (X_("processor_state"));
2681 Stateful::save_extra_xml (node);
2683 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2687 if (child->name() == IO::state_node_name) {
2688 if ((prop = child->property (X_("direction"))) == 0) {
2692 if (prop->value() == "Input") {
2693 _input->set_state (*child, version);
2694 } else if (prop->value() == "Output") {
2695 _output->set_state (*child, version);
2699 if (child->name() == X_("Processor")) {
2700 processor_state.add_child_copy (*child);
2703 if (child->name() == X_("Pannable")) {
2705 _pannable->set_state (*child, version);
2707 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2712 if ((prop = node.property (X_("meter-point"))) != 0) {
2713 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2714 set_meter_point (mp, true);
2716 _meter->set_display_to_user (_meter_point == MeterCustom);
2720 if ((prop = node.property (X_("meter-type"))) != 0) {
2721 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2724 _initial_io_setup = false;
2726 set_processor_state (processor_state);
2728 // this looks up the internal instrument in processors
2729 reset_instrument_info();
2731 if ((prop = node.property ("self-solo")) != 0) {
2732 set_self_solo (string_is_affirmative (prop->value()));
2735 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2736 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2737 mod_solo_by_others_upstream (atoi (prop->value()));
2740 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2741 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2742 mod_solo_by_others_downstream (atoi (prop->value()));
2745 if ((prop = node.property ("solo-isolated")) != 0) {
2746 set_solo_isolated (string_is_affirmative (prop->value()), Controllable::NoGroup);
2749 if ((prop = node.property ("solo-safe")) != 0) {
2750 set_solo_safe (string_is_affirmative (prop->value()), Controllable::NoGroup);
2753 if ((prop = node.property (X_("phase-invert"))) != 0) {
2754 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2757 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2758 set_denormal_protection (string_is_affirmative (prop->value()));
2761 if ((prop = node.property (X_("active"))) != 0) {
2762 bool yn = string_is_affirmative (prop->value());
2763 _active = !yn; // force switch
2764 set_active (yn, this);
2767 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2768 set_order_key (atoi(prop->value()));
2771 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2775 string::size_type colon, equal;
2776 string remaining = prop->value();
2778 while (remaining.length()) {
2780 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2781 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2784 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2785 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2788 string keyname = remaining.substr (0, equal);
2790 if ((keyname == "EditorSort") || (keyname == "editor")) {
2791 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2797 colon = remaining.find_first_of (':');
2799 if (colon != string::npos) {
2800 remaining = remaining.substr (colon+1);
2807 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2808 PBD::ID id (prop->value ());
2809 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2810 ProcessorList::const_iterator i = _processors.begin ();
2811 while (i != _processors.end() && (*i)->id() != id) {
2815 if (i != _processors.end ()) {
2816 _processor_after_last_custom_meter = *i;
2817 _custom_meter_position_noted = true;
2821 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2824 if (child->name() == X_("Comment")) {
2826 /* XXX this is a terrible API design in libxml++ */
2828 XMLNode *cmt = *(child->children().begin());
2829 _comment = cmt->content();
2831 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2832 if (prop->value() == "solo") {
2833 _solo_control->set_state (*child, version);
2834 } else if (prop->value() == "mute") {
2835 _mute_control->set_state (*child, version);
2838 } else if (child->name() == X_("RemoteControl")) {
2839 if ((prop = child->property (X_("id"))) != 0) {
2841 sscanf (prop->value().c_str(), "%d", &x);
2842 set_remote_control_id_internal (x);
2845 } else if (child->name() == X_("MuteMaster")) {
2846 _mute_master->set_state (*child, version);
2848 } else if (child->name() == Automatable::xml_node_name) {
2849 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2857 Route::set_state_2X (const XMLNode& node, int version)
2859 LocaleGuard lg (X_("C"));
2861 XMLNodeConstIterator niter;
2863 const XMLProperty *prop;
2865 /* 2X things which still remain to be handled:
2871 if (node.name() != "Route") {
2872 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2876 if ((prop = node.property (X_("flags"))) != 0) {
2877 string f = prop->value ();
2878 boost::replace_all (f, "ControlOut", "MonitorOut");
2879 _flags = Flag (string_2_enum (f, _flags));
2884 if (is_master() || is_monitor() || is_auditioner()) {
2885 _mute_master->set_solo_ignore (true);
2888 if ((prop = node.property (X_("phase-invert"))) != 0) {
2889 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2890 if (string_is_affirmative (prop->value ())) {
2893 set_phase_invert (p);
2896 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2897 set_denormal_protection (string_is_affirmative (prop->value()));
2900 if ((prop = node.property (X_("soloed"))) != 0) {
2901 bool yn = string_is_affirmative (prop->value());
2903 /* XXX force reset of solo status */
2908 if ((prop = node.property (X_("muted"))) != 0) {
2911 bool muted = string_is_affirmative (prop->value());
2917 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2919 if (string_is_affirmative (prop->value())){
2920 mute_point = mute_point + "PreFader";
2925 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2927 if (string_is_affirmative (prop->value())){
2930 mute_point = mute_point + ",";
2933 mute_point = mute_point + "PostFader";
2938 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2940 if (string_is_affirmative (prop->value())){
2943 mute_point = mute_point + ",";
2946 mute_point = mute_point + "Listen";
2951 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2953 if (string_is_affirmative (prop->value())){
2956 mute_point = mute_point + ",";
2959 mute_point = mute_point + "Main";
2963 _mute_master->set_mute_points (mute_point);
2964 _mute_master->set_muted_by_self (true);
2968 if ((prop = node.property (X_("meter-point"))) != 0) {
2969 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2972 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2973 don't mean the same thing.
2976 if ((prop = node.property (X_("order-keys"))) != 0) {
2980 string::size_type colon, equal;
2981 string remaining = prop->value();
2983 while (remaining.length()) {
2985 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2986 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2989 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2990 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2993 string keyname = remaining.substr (0, equal);
2995 if (keyname == "EditorSort" || keyname == "editor") {
2996 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
3002 colon = remaining.find_first_of (':');
3004 if (colon != string::npos) {
3005 remaining = remaining.substr (colon+1);
3014 nlist = node.children ();
3015 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
3019 if (child->name() == IO::state_node_name) {
3021 /* there is a note in IO::set_state_2X() about why we have to call
3025 _input->set_state_2X (*child, version, true);
3026 _output->set_state_2X (*child, version, false);
3028 if ((prop = child->property (X_("name"))) != 0) {
3029 Route::set_name (prop->value ());
3034 if ((prop = child->property (X_("active"))) != 0) {
3035 bool yn = string_is_affirmative (prop->value());
3036 _active = !yn; // force switch
3037 set_active (yn, this);
3040 if ((prop = child->property (X_("gain"))) != 0) {
3043 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
3044 _amp->gain_control()->set_value (val, Controllable::NoGroup);
3048 /* Set up Panners in the IO */
3049 XMLNodeList io_nlist = child->children ();
3051 XMLNodeConstIterator io_niter;
3054 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
3056 io_child = *io_niter;
3058 if (io_child->name() == X_("Panner")) {
3059 _main_outs->panner_shell()->set_state(*io_child, version);
3060 } else if (io_child->name() == X_("Automation")) {
3061 /* IO's automation is for the fader */
3062 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
3068 XMLNodeList redirect_nodes;
3070 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
3074 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
3075 redirect_nodes.push_back(child);
3080 set_processor_state_2X (redirect_nodes, version);
3082 Stateful::save_extra_xml (node);
3084 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
3087 if (child->name() == X_("Comment")) {
3089 /* XXX this is a terrible API design in libxml++ */
3091 XMLNode *cmt = *(child->children().begin());
3092 _comment = cmt->content();
3094 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
3095 if (prop->value() == X_("solo")) {
3096 _solo_control->set_state (*child, version);
3097 } else if (prop->value() == X_("mute")) {
3098 _mute_control->set_state (*child, version);
3101 } else if (child->name() == X_("RemoteControl")) {
3102 if ((prop = child->property (X_("id"))) != 0) {
3104 sscanf (prop->value().c_str(), "%d", &x);
3105 set_remote_control_id_internal (x);
3115 Route::get_processor_state ()
3117 XMLNode* root = new XMLNode (X_("redirects"));
3118 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3119 root->add_child_nocopy ((*i)->state (true));
3126 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
3128 /* We don't bother removing existing processors not in nList, as this
3129 method will only be called when creating a Route from scratch, not
3130 for undo purposes. Just put processors in at the appropriate place
3134 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
3135 add_processor_from_xml_2X (**i, version);
3140 Route::set_processor_state (const XMLNode& node)
3142 const XMLNodeList &nlist = node.children();
3143 XMLNodeConstIterator niter;
3144 ProcessorList new_order;
3145 bool must_configure = false;
3147 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
3149 XMLProperty* prop = (*niter)->property ("type");
3151 if (prop->value() == "amp") {
3152 _amp->set_state (**niter, Stateful::current_state_version);
3153 new_order.push_back (_amp);
3154 } else if (prop->value() == "trim") {
3155 _trim->set_state (**niter, Stateful::current_state_version);
3156 new_order.push_back (_trim);
3157 } else if (prop->value() == "meter") {
3158 _meter->set_state (**niter, Stateful::current_state_version);
3159 new_order.push_back (_meter);
3160 } else if (prop->value() == "delay") {
3162 _delayline->set_state (**niter, Stateful::current_state_version);
3163 new_order.push_back (_delayline);
3165 } else if (prop->value() == "main-outs") {
3166 _main_outs->set_state (**niter, Stateful::current_state_version);
3167 } else if (prop->value() == "intreturn") {
3169 _intreturn.reset (new InternalReturn (_session));
3170 must_configure = true;
3172 _intreturn->set_state (**niter, Stateful::current_state_version);
3173 } else if (is_monitor() && prop->value() == "monitor") {
3174 if (!_monitor_control) {
3175 _monitor_control.reset (new MonitorProcessor (_session));
3176 must_configure = true;
3178 _monitor_control->set_state (**niter, Stateful::current_state_version);
3179 } else if (prop->value() == "capture") {
3180 /* CapturingProcessor should never be restored, it's always
3181 added explicitly when needed */
3183 ProcessorList::iterator o;
3185 for (o = _processors.begin(); o != _processors.end(); ++o) {
3186 XMLProperty* id_prop = (*niter)->property(X_("id"));
3187 if (id_prop && (*o)->id() == id_prop->value()) {
3188 (*o)->set_state (**niter, Stateful::current_state_version);
3189 new_order.push_back (*o);
3194 // If the processor (*niter) is not on the route then create it
3196 if (o == _processors.end()) {
3198 boost::shared_ptr<Processor> processor;
3200 if (prop->value() == "intsend") {
3202 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
3204 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
3205 prop->value() == "lv2" ||
3206 prop->value() == "windows-vst" ||
3207 prop->value() == "lxvst" ||
3208 prop->value() == "luaproc" ||
3209 prop->value() == "audiounit") {
3211 if (_session.get_disable_all_loaded_plugins ()) {
3212 processor.reset (new UnknownProcessor (_session, **niter));
3214 processor.reset (new PluginInsert (_session));
3216 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert>(processor);
3217 pi->set_strict_io (true);
3221 } else if (prop->value() == "port") {
3223 processor.reset (new PortInsert (_session, _pannable, _mute_master));
3225 } else if (prop->value() == "send") {
3227 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
3230 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
3234 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
3235 /* This processor could not be configured. Turn it into a UnknownProcessor */
3236 processor.reset (new UnknownProcessor (_session, **niter));
3239 /* we have to note the monitor send here, otherwise a new one will be created
3240 and the state of this one will be lost.
3242 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
3243 if (isend && isend->role() == Delivery::Listen) {
3244 _monitor_send = isend;
3247 /* it doesn't matter if invisible processors are added here, as they
3248 will be sorted out by setup_invisible_processors () shortly.
3251 new_order.push_back (processor);
3252 must_configure = true;
3258 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3259 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3260 _processors = new_order;
3262 if (must_configure) {
3263 configure_processors_unlocked (0);
3266 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3268 (*i)->set_owner (this);
3269 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
3271 boost::shared_ptr<PluginInsert> pi;
3273 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
3274 if (pi->has_no_inputs ()) {
3275 _have_internal_generator = true;
3282 reset_instrument_info ();
3283 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3284 set_processor_positions ();
3288 Route::curve_reallocate ()
3290 // _gain_automation_curve.finish_resize ();
3291 // _pan_automation_curve.finish_resize ();
3295 Route::silence (framecnt_t nframes)
3297 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3302 silence_unlocked (nframes);
3306 Route::silence_unlocked (framecnt_t nframes)
3308 /* Must be called with the processor lock held */
3312 _output->silence (nframes);
3314 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3315 boost::shared_ptr<PluginInsert> pi;
3317 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
3318 // skip plugins, they don't need anything when we're not active
3322 (*i)->silence (nframes);
3325 if (nframes == _session.get_block_size()) {
3332 Route::add_internal_return ()
3335 _intreturn.reset (new InternalReturn (_session));
3336 add_processor (_intreturn, PreFader);
3341 Route::add_send_to_internal_return (InternalSend* send)
3343 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3345 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3346 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3349 return d->add_send (send);
3355 Route::remove_send_from_internal_return (InternalSend* send)
3357 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3359 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3360 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3363 return d->remove_send (send);
3369 Route::enable_monitor_send ()
3371 /* Caller must hold process lock */
3372 assert (!AudioEngine::instance()->process_lock().trylock());
3374 /* master never sends to monitor section via the normal mechanism */
3375 assert (!is_master ());
3376 assert (!is_monitor ());
3378 /* make sure we have one */
3379 if (!_monitor_send) {
3380 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3381 _monitor_send->set_display_to_user (false);
3385 configure_processors (0);
3388 /** Add an aux send to a route.
3389 * @param route route to send to.
3390 * @param before Processor to insert before, or 0 to insert at the end.
3393 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3395 assert (route != _session.monitor_out ());
3398 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3400 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3402 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3404 if (d && d->target_route() == route) {
3405 /* already listening via the specified IO: do nothing */
3413 boost::shared_ptr<InternalSend> listener;
3416 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3417 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3418 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3421 add_processor (listener, before);
3423 } catch (failed_constructor& err) {
3431 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3433 ProcessorStreams err;
3434 ProcessorList::iterator tmp;
3437 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3439 /* have to do this early because otherwise processor reconfig
3440 * will put _monitor_send back in the list
3443 if (route == _session.monitor_out()) {
3444 _monitor_send.reset ();
3448 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3450 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3452 if (d && d->target_route() == route) {
3454 if (remove_processor (*x, &err, false) > 0) {
3460 /* list could have been demolished while we dropped the lock
3463 if (_session.engine().connected()) {
3464 /* i/o processors cannot be removed if the engine is not running
3465 * so don't live-loop in case the engine is N/A or dies
3475 Route::set_comment (string cmt, void *src)
3479 _session.set_dirty ();
3483 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3485 FeedRecord fr (other, via_sends_only);
3487 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3489 if (!result.second) {
3491 /* already a record for "other" - make sure sends-only information is correct */
3492 if (!via_sends_only && result.first->sends_only) {
3493 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3494 frp->sends_only = false;
3498 return result.second;
3502 Route::clear_fed_by ()
3508 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3510 const FedBy& fed_by (other->fed_by());
3512 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3513 boost::shared_ptr<Route> sr = f->r.lock();
3515 if (sr && (sr.get() == this)) {
3517 if (via_sends_only) {
3518 *via_sends_only = f->sends_only;
3529 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3531 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3533 if (_output->connected_to (other->input())) {
3534 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3535 if (via_send_only) {
3536 *via_send_only = false;
3543 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3545 boost::shared_ptr<IOProcessor> iop;
3547 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3548 if (iop->feeds (other)) {
3549 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3550 if (via_send_only) {
3551 *via_send_only = true;
3555 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3558 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3563 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3568 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3570 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3573 /** Called from the (non-realtime) butler thread when the transport is stopped */
3575 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3577 framepos_t now = _session.transport_frame();
3580 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3582 Automatable::transport_stopped (now);
3584 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3586 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3590 (*i)->transport_stopped (now);
3594 _roll_delay = _initial_delay;
3598 Route::input_change_handler (IOChange change, void * /*src*/)
3600 if ((change.type & IOChange::ConfigurationChanged)) {
3601 /* This is called with the process lock held if change
3602 contains ConfigurationChanged
3604 configure_processors (0);
3605 _phase_invert.resize (_input->n_ports().n_audio ());
3606 io_changed (); /* EMIT SIGNAL */
3609 if (_soloed_by_others_upstream || _solo_isolated_by_upstream) {
3612 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3613 if (_input->connected()) {
3614 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3615 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3619 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3620 if (does_feed && !sends_only) {
3621 if ((*i)->soloed()) {
3624 if ((*i)->solo_isolated()) {
3631 int delta = sbou - _soloed_by_others_upstream;
3632 int idelta = ibou - _solo_isolated_by_upstream;
3635 PBD::warning << string_compose (
3636 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3637 _name, ibou, _solo_isolated_by_upstream, idelta)
3642 if (_soloed_by_others_upstream) {
3643 // ignore new connections (they're not propagated)
3645 mod_solo_by_others_upstream (delta);
3649 if (_solo_isolated_by_upstream) {
3650 // solo-isolate currently only propagates downstream
3652 mod_solo_isolated_by_upstream (false);
3654 // TODO think: mod_solo_isolated_by_upstream() does not take delta arg,
3655 // but idelta can't be smaller than -1, can it?
3656 //_solo_isolated_by_upstream = ibou;
3659 // Session::route_solo_changed does not propagate indirect solo-changes
3660 // propagate downstream to tracks
3661 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3662 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3666 bool does_feed = feeds (*i, &sends_only);
3667 if (delta <= 0 && does_feed && !sends_only) {
3668 (*i)->mod_solo_by_others_upstream (delta);
3671 if (idelta < 0 && does_feed && !sends_only) {
3672 (*i)->mod_solo_isolated_by_upstream (false);
3679 Route::output_change_handler (IOChange change, void * /*src*/)
3681 if (_initial_io_setup) {
3685 if ((change.type & IOChange::ConfigurationChanged)) {
3686 /* This is called with the process lock held if change
3687 contains ConfigurationChanged
3689 configure_processors (0);
3692 _session.reset_monitor_section();
3695 io_changed (); /* EMIT SIGNAL */
3698 if (_soloed_by_others_downstream) {
3700 /* checking all all downstream routes for
3701 * explicit of implict solo is a rather drastic measure,
3702 * ideally the input_change_handler() of the other route
3703 * would propagate the change to us.
3705 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3706 if (_output->connected()) {
3707 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3708 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3712 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3713 if (does_feed && !sends_only) {
3714 if ((*i)->soloed()) {
3721 int delta = sbod - _soloed_by_others_downstream;
3723 // do not allow new connections to change implicit solo (no propagation)
3724 mod_solo_by_others_downstream (delta);
3725 // Session::route_solo_changed() does not propagate indirect solo-changes
3726 // propagate upstream to tracks
3727 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3728 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3732 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3733 if (delta != 0 && does_feed && !sends_only) {
3734 (*i)->mod_solo_by_others_downstream (delta);
3743 Route::pans_required () const
3745 if (n_outputs().n_audio() < 2) {
3749 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3753 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3755 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3761 if (n_outputs().n_total() == 0) {
3765 if (!_active || n_inputs() == ChanCount::ZERO) {
3766 silence_unlocked (nframes);
3770 if (session_state_changing) {
3771 if (_session.transport_speed() != 0.0f) {
3772 /* we're rolling but some state is changing (e.g. our diskstream contents)
3773 so we cannot use them. Be silent till this is over.
3775 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3777 silence_unlocked (nframes);
3780 /* we're really not rolling, so we're either delivery silence or actually
3781 monitoring, both of which are safe to do while session_state_changing is true.
3785 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3787 fill_buffers_with_input (bufs, _input, nframes);
3789 if (_meter_point == MeterInput) {
3790 _meter->run (bufs, start_frame, end_frame, nframes, true);
3793 _amp->apply_gain_automation (false);
3794 _trim->apply_gain_automation (false);
3795 passthru (bufs, start_frame, end_frame, nframes, 0);
3801 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3803 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3808 if (n_outputs().n_total() == 0) {
3812 if (!_active || n_inputs().n_total() == 0) {
3813 silence_unlocked (nframes);
3817 framepos_t unused = 0;
3819 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3825 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3827 fill_buffers_with_input (bufs, _input, nframes);
3829 if (_meter_point == MeterInput) {
3830 _meter->run (bufs, start_frame, end_frame, nframes, true);
3833 passthru (bufs, start_frame, end_frame, nframes, declick);
3839 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3846 Route::flush_processors ()
3848 /* XXX shouldn't really try to take this lock, since
3849 this is called from the RT audio thread.
3852 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3854 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3860 __attribute__((annotate("realtime")))
3863 Route::apply_processor_changes_rt ()
3865 int emissions = EmitNone;
3867 if (_pending_meter_point != _meter_point) {
3868 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3870 /* meters always have buffers for 'processor_max_streams'
3871 * they can be re-positioned without re-allocation */
3872 if (set_meter_point_unlocked()) {
3873 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3875 emissions |= EmitMeterChanged;
3880 bool changed = false;
3882 if (g_atomic_int_get (&_pending_process_reorder)) {
3883 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3885 apply_processor_order (_pending_processor_order);
3886 setup_invisible_processors ();
3888 g_atomic_int_set (&_pending_process_reorder, 0);
3889 emissions |= EmitRtProcessorChange;
3893 set_processor_positions ();
3895 if (emissions != 0) {
3896 g_atomic_int_set (&_pending_signals, emissions);
3903 Route::emit_pending_signals ()
3906 int sig = g_atomic_int_and (&_pending_signals, 0);
3907 if (sig & EmitMeterChanged) {
3908 _meter->emit_configuration_changed();
3909 meter_change (); /* EMIT SIGNAL */
3910 if (sig & EmitMeterVisibilityChange) {
3911 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3913 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3916 if (sig & EmitRtProcessorChange) {
3917 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3922 Route::set_meter_point (MeterPoint p, bool force)
3924 if (_pending_meter_point == p && !force) {
3928 if (force || !AudioEngine::instance()->running()) {
3929 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3930 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3931 _pending_meter_point = p;
3932 _meter->emit_configuration_changed();
3933 meter_change (); /* EMIT SIGNAL */
3934 if (set_meter_point_unlocked()) {
3935 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3937 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3940 _pending_meter_point = p;
3946 __attribute__((annotate("realtime")))
3949 Route::set_meter_point_unlocked ()
3952 /* Caller must hold process and processor write lock */
3953 assert (!AudioEngine::instance()->process_lock().trylock());
3954 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3955 assert (!lm.locked ());
3958 _meter_point = _pending_meter_point;
3960 bool meter_was_visible_to_user = _meter->display_to_user ();
3962 if (!_custom_meter_position_noted) {
3963 maybe_note_meter_position ();
3966 if (_meter_point != MeterCustom) {
3968 _meter->set_display_to_user (false);
3970 setup_invisible_processors ();
3973 _meter->set_display_to_user (true);
3975 /* If we have a previous position for the custom meter, try to put it there */
3976 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3978 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3979 if (i != _processors.end ()) {
3980 _processors.remove (_meter);
3981 _processors.insert (i, _meter);
3983 } else {// at end, right before the mains_out/panner
3984 _processors.remove (_meter);
3985 ProcessorList::iterator main = _processors.end();
3986 _processors.insert (--main, _meter);
3990 /* Set up the meter for its new position */
3992 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3996 if (loc == _processors.begin()) {
3997 m_in = _input->n_ports();
3999 ProcessorList::iterator before = loc;
4001 m_in = (*before)->output_streams ();
4004 _meter->reflect_inputs (m_in);
4006 /* we do not need to reconfigure the processors, because the meter
4007 (a) is always ready to handle processor_max_streams
4008 (b) is always an N-in/N-out processor, and thus moving
4009 it doesn't require any changes to the other processors.
4012 /* these should really be done after releasing the lock
4013 * but all those signals are subscribed to with gui_thread()
4016 return (_meter->display_to_user() != meter_was_visible_to_user);
4020 Route::listen_position_changed ()
4023 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4024 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4025 ProcessorState pstate (this);
4027 if (configure_processors_unlocked (0)) {
4028 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
4030 configure_processors_unlocked (0); // it worked before we tried to add it ...
4035 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
4036 _session.set_dirty ();
4039 boost::shared_ptr<CapturingProcessor>
4040 Route::add_export_point()
4042 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4043 if (!_capturing_processor) {
4045 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4046 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
4048 _capturing_processor.reset (new CapturingProcessor (_session));
4049 _capturing_processor->activate ();
4051 configure_processors_unlocked (0);
4055 return _capturing_processor;
4059 Route::update_signal_latency ()
4061 framecnt_t l = _output->user_latency();
4062 framecnt_t lamp = 0;
4063 bool before_amp = true;
4064 framecnt_t ltrim = 0;
4065 bool before_trim = true;
4067 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4068 if ((*i)->active ()) {
4069 l += (*i)->signal_latency ();
4074 if ((*i) == _trim) {
4085 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
4087 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
4088 _signal_latency_at_amp_position = lamp;
4089 _signal_latency_at_trim_position = ltrim;
4091 if (_signal_latency != l) {
4092 _signal_latency = l;
4093 signal_latency_changed (); /* EMIT SIGNAL */
4096 return _signal_latency;
4100 Route::set_user_latency (framecnt_t nframes)
4102 _output->set_user_latency (nframes);
4103 _session.update_latency_compensation ();
4107 Route::set_latency_compensation (framecnt_t longest_session_latency)
4109 framecnt_t old = _initial_delay;
4111 if (_signal_latency < longest_session_latency) {
4112 _initial_delay = longest_session_latency - _signal_latency;
4117 DEBUG_TRACE (DEBUG::Latency, string_compose (
4118 "%1: compensate for maximum latency of %2,"
4119 "given own latency of %3, using initial delay of %4\n",
4120 name(), longest_session_latency, _signal_latency, _initial_delay));
4122 if (_initial_delay != old) {
4123 initial_delay_changed (); /* EMIT SIGNAL */
4126 if (_session.transport_stopped()) {
4127 _roll_delay = _initial_delay;
4132 Route::set_block_size (pframes_t nframes)
4134 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4135 (*i)->set_block_size (nframes);
4138 _session.ensure_buffers (n_process_buffers ());
4142 Route::protect_automation ()
4144 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
4145 (*i)->protect_automation();
4148 /** @param declick 1 to set a pending declick fade-in,
4149 * -1 to set a pending declick fade-out
4152 Route::set_pending_declick (int declick)
4155 /* this call is not allowed to turn off a pending declick */
4157 _pending_declick = declick;
4160 _pending_declick = 0;
4164 /** Shift automation forwards from a particular place, thereby inserting time.
4165 * Adds undo commands for any shifts that are performed.
4167 * @param pos Position to start shifting from.
4168 * @param frames Amount to shift forwards by.
4172 Route::shift (framepos_t pos, framecnt_t frames)
4174 /* gain automation */
4176 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
4178 XMLNode &before = gc->alist()->get_state ();
4179 gc->alist()->shift (pos, frames);
4180 XMLNode &after = gc->alist()->get_state ();
4181 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4184 /* gain automation */
4186 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
4188 XMLNode &before = gc->alist()->get_state ();
4189 gc->alist()->shift (pos, frames);
4190 XMLNode &after = gc->alist()->get_state ();
4191 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4194 // TODO mute automation ??
4196 /* pan automation */
4198 ControlSet::Controls& c (_pannable->controls());
4200 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
4201 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
4203 boost::shared_ptr<AutomationList> al = pc->alist();
4204 XMLNode& before = al->get_state ();
4205 al->shift (pos, frames);
4206 XMLNode& after = al->get_state ();
4207 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4212 /* redirect automation */
4214 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4215 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
4217 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
4219 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
4220 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
4222 boost::shared_ptr<AutomationList> al = ac->alist();
4223 XMLNode &before = al->get_state ();
4224 al->shift (pos, frames);
4225 XMLNode &after = al->get_state ();
4226 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4234 Route::set_plugin_state_dir (boost::weak_ptr<Processor> p, const std::string& d)
4236 boost::shared_ptr<Processor> processor (p.lock ());
4237 boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (processor);
4241 pi->set_state_dir (d);
4245 Route::save_as_template (const string& path, const string& name)
4247 std::string state_dir = path.substr (0, path.find_last_of ('.')); // strip template_suffix
4248 PBD::Unwinder<std::string> uw (_session._template_state_dir, state_dir);
4250 XMLNode& node (state (false));
4254 IO::set_name_in_state (*node.children().front(), name);
4256 tree.set_root (&node);
4258 /* return zero on success, non-zero otherwise */
4259 return !tree.write (path.c_str());
4264 Route::set_name (const string& str)
4266 if (str == name()) {
4270 string name = Route::ensure_track_or_route_name (str, _session);
4271 SessionObject::set_name (name);
4273 bool ret = (_input->set_name(name) && _output->set_name(name));
4276 /* rename the main outs. Leave other IO processors
4277 * with whatever name they already have, because its
4278 * just fine as it is (it will not contain the route
4279 * name if its a port insert, port send or port return).
4283 if (_main_outs->set_name (name)) {
4284 /* XXX returning false here is stupid because
4285 we already changed the route name.
4295 /** Set the name of a route in an XML description.
4296 * @param node XML <Route> node to set the name in.
4297 * @param name New name.
4300 Route::set_name_in_state (XMLNode& node, string const & name, bool rename_playlist)
4302 node.add_property (X_("name"), name);
4304 XMLNodeList children = node.children();
4305 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4307 if ((*i)->name() == X_("IO")) {
4309 IO::set_name_in_state (**i, name);
4311 } else if ((*i)->name() == X_("Processor")) {
4313 XMLProperty* role = (*i)->property (X_("role"));
4314 if (role && role->value() == X_("Main")) {
4315 (*i)->add_property (X_("name"), name);
4318 } else if ((*i)->name() == X_("Diskstream")) {
4320 if (rename_playlist) {
4321 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4323 (*i)->add_property (X_("name"), name);
4329 boost::shared_ptr<Send>
4330 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4332 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4334 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4335 boost::shared_ptr<InternalSend> send;
4337 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4338 if (send->target_route() == target) {
4344 return boost::shared_ptr<Send>();
4347 /** @param c Audio channel index.
4348 * @param yn true to invert phase, otherwise false.
4351 Route::set_phase_invert (uint32_t c, bool yn)
4353 if (_phase_invert[c] != yn) {
4354 _phase_invert[c] = yn;
4355 phase_invert_changed (); /* EMIT SIGNAL */
4356 _phase_control->Changed(); /* EMIT SIGNAL */
4357 _session.set_dirty ();
4362 Route::set_phase_invert (boost::dynamic_bitset<> p)
4364 if (_phase_invert != p) {
4366 phase_invert_changed (); /* EMIT SIGNAL */
4367 _session.set_dirty ();
4372 Route::phase_invert (uint32_t c) const
4374 return _phase_invert[c];
4377 boost::dynamic_bitset<>
4378 Route::phase_invert () const
4380 return _phase_invert;
4384 Route::set_denormal_protection (bool yn)
4386 if (_denormal_protection != yn) {
4387 _denormal_protection = yn;
4388 denormal_protection_changed (); /* EMIT SIGNAL */
4393 Route::denormal_protection () const
4395 return _denormal_protection;
4399 Route::set_active (bool yn, void* src)
4401 if (_session.transport_rolling()) {
4405 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4406 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4410 if (_active != yn) {
4412 _input->set_active (yn);
4413 _output->set_active (yn);
4414 active_changed (); // EMIT SIGNAL
4415 _session.set_dirty ();
4419 boost::shared_ptr<Pannable>
4420 Route::pannable() const
4425 boost::shared_ptr<Panner>
4426 Route::panner() const
4429 return _main_outs->panner_shell()->panner();
4432 boost::shared_ptr<PannerShell>
4433 Route::panner_shell() const
4435 return _main_outs->panner_shell();
4438 boost::shared_ptr<GainControl>
4439 Route::gain_control() const
4441 return _gain_control;
4444 boost::shared_ptr<GainControl>
4445 Route::trim_control() const
4447 return _trim_control;
4450 boost::shared_ptr<Route::PhaseControllable>
4451 Route::phase_control() const
4453 if (phase_invert().size()) {
4454 return _phase_control;
4456 return boost::shared_ptr<PhaseControllable>();
4460 boost::shared_ptr<AutomationControl>
4461 Route::get_control (const Evoral::Parameter& param)
4463 /* either we own the control or .... */
4465 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4469 /* maybe one of our processors does or ... */
4471 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4472 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4473 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4481 /* nobody does so we'll make a new one */
4483 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4490 boost::shared_ptr<Processor>
4491 Route::nth_plugin (uint32_t n) const
4493 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4494 ProcessorList::const_iterator i;
4496 for (i = _processors.begin(); i != _processors.end(); ++i) {
4497 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4504 return boost::shared_ptr<Processor> ();
4507 boost::shared_ptr<Processor>
4508 Route::nth_send (uint32_t n) const
4510 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4511 ProcessorList::const_iterator i;
4513 for (i = _processors.begin(); i != _processors.end(); ++i) {
4514 if (boost::dynamic_pointer_cast<Send> (*i)) {
4516 if ((*i)->name().find (_("Monitor")) == 0) {
4517 /* send to monitor section is not considered
4518 to be an accessible send.
4529 return boost::shared_ptr<Processor> ();
4533 Route::has_io_processor_named (const string& name)
4535 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4536 ProcessorList::iterator i;
4538 for (i = _processors.begin(); i != _processors.end(); ++i) {
4539 if (boost::dynamic_pointer_cast<Send> (*i) ||
4540 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4541 if ((*i)->name() == name) {
4550 MuteMaster::MutePoint
4551 Route::mute_points () const
4553 return _mute_master->mute_points ();
4557 Route::set_processor_positions ()
4559 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4561 bool had_amp = false;
4562 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4563 (*i)->set_pre_fader (!had_amp);
4570 /** Called when there is a proposed change to the input port count */
4572 Route::input_port_count_changing (ChanCount to)
4574 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4576 /* The processors cannot be configured with the new input arrangement, so
4582 /* The change is ok */
4586 /** Called when there is a proposed change to the output port count */
4588 Route::output_port_count_changing (ChanCount to)
4590 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4591 if (processor_out_streams.get(*t) > to.get(*t)) {
4595 /* The change is ok */
4600 Route::unknown_processors () const
4604 if (_session.get_disable_all_loaded_plugins ()) {
4605 // Do not list "missing plugins" if they are explicitly disabled
4609 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4610 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4611 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4612 p.push_back ((*i)->name ());
4621 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4623 /* we assume that all our input ports feed all our output ports. its not
4624 universally true, but the alternative is way too corner-case to worry about.
4627 LatencyRange all_connections;
4630 all_connections.min = 0;
4631 all_connections.max = 0;
4633 all_connections.min = ~((pframes_t) 0);
4634 all_connections.max = 0;
4636 /* iterate over all "from" ports and determine the latency range for all of their
4637 connections to the "outside" (outside of this Route).
4640 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4644 p->get_connected_latency_range (range, playback);
4646 all_connections.min = min (all_connections.min, range.min);
4647 all_connections.max = max (all_connections.max, range.max);
4651 /* set the "from" port latencies to the max/min range of all their connections */
4653 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4654 p->set_private_latency_range (all_connections, playback);
4657 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4659 all_connections.min += our_latency;
4660 all_connections.max += our_latency;
4662 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4663 p->set_private_latency_range (all_connections, playback);
4666 return all_connections.max;
4670 Route::set_private_port_latencies (bool playback) const
4672 framecnt_t own_latency = 0;
4674 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4675 OR LATENCY CALLBACK.
4677 This is called (early) from the latency callback. It computes the REAL
4678 latency associated with each port and stores the result as the "private"
4679 latency of the port. A later call to Route::set_public_port_latencies()
4680 sets all ports to the same value to reflect the fact that we do latency
4681 compensation and so all signals are delayed by the same amount as they
4682 flow through ardour.
4685 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4686 if ((*i)->active ()) {
4687 own_latency += (*i)->signal_latency ();
4692 /* playback: propagate latency from "outside the route" to outputs to inputs */
4693 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4695 /* capture: propagate latency from "outside the route" to inputs to outputs */
4696 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4701 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4703 /* this is called to set the JACK-visible port latencies, which take
4704 latency compensation into account.
4713 const PortSet& ports (_input->ports());
4714 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4715 p->set_public_latency_range (range, playback);
4720 const PortSet& ports (_output->ports());
4721 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4722 p->set_public_latency_range (range, playback);
4727 /** Put the invisible processors in the right place in _processors.
4728 * Must be called with a writer lock on _processor_lock held.
4731 __attribute__((annotate("realtime")))
4734 Route::setup_invisible_processors ()
4737 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4738 assert (!lm.locked ());
4742 /* too early to be doing this stuff */
4746 /* we'll build this new list here and then use it
4748 * TODO put the ProcessorList is on the stack for RT-safety.
4751 ProcessorList new_processors;
4753 /* find visible processors */
4755 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4756 if ((*i)->display_to_user ()) {
4757 new_processors.push_back (*i);
4763 ProcessorList::iterator amp = new_processors.begin ();
4764 while (amp != new_processors.end() && *amp != _amp) {
4768 assert (amp != new_processors.end ());
4770 /* and the processor after the amp */
4772 ProcessorList::iterator after_amp = amp;
4778 switch (_meter_point) {
4780 assert (!_meter->display_to_user ());
4781 new_processors.push_front (_meter);
4784 assert (!_meter->display_to_user ());
4785 new_processors.insert (amp, _meter);
4787 case MeterPostFader:
4788 /* do nothing here */
4791 /* do nothing here */
4794 /* the meter is visible, so we don't touch it here */
4801 assert (_main_outs);
4802 assert (!_main_outs->display_to_user ());
4803 new_processors.push_back (_main_outs);
4805 /* iterator for the main outs */
4807 ProcessorList::iterator main = new_processors.end();
4810 /* OUTPUT METERING */
4812 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4813 assert (!_meter->display_to_user ());
4815 /* add the processor just before or just after the main outs */
4817 ProcessorList::iterator meter_point = main;
4819 if (_meter_point == MeterOutput) {
4822 new_processors.insert (meter_point, _meter);
4827 if (_monitor_send && !is_monitor ()) {
4828 assert (!_monitor_send->display_to_user ());
4829 switch (Config->get_listen_position ()) {
4830 case PreFaderListen:
4831 switch (Config->get_pfl_position ()) {
4832 case PFLFromBeforeProcessors:
4833 new_processors.push_front (_monitor_send);
4835 case PFLFromAfterProcessors:
4836 new_processors.insert (amp, _monitor_send);
4839 _monitor_send->set_can_pan (false);
4841 case AfterFaderListen:
4842 switch (Config->get_afl_position ()) {
4843 case AFLFromBeforeProcessors:
4844 new_processors.insert (after_amp, _monitor_send);
4846 case AFLFromAfterProcessors:
4847 new_processors.insert (new_processors.end(), _monitor_send);
4850 _monitor_send->set_can_pan (true);
4855 #if 0 // not used - just yet
4856 if (!is_master() && !is_monitor() && !is_auditioner()) {
4857 new_processors.push_front (_delayline);
4861 /* MONITOR CONTROL */
4863 if (_monitor_control && is_monitor ()) {
4864 assert (!_monitor_control->display_to_user ());
4865 new_processors.insert (amp, _monitor_control);
4868 /* INTERNAL RETURN */
4870 /* doing this here means that any monitor control will come just after
4875 assert (!_intreturn->display_to_user ());
4876 new_processors.push_front (_intreturn);
4879 if (_trim && _trim->active()) {
4880 assert (!_trim->display_to_user ());
4881 new_processors.push_front (_trim);
4883 /* EXPORT PROCESSOR */
4885 if (_capturing_processor) {
4886 assert (!_capturing_processor->display_to_user ());
4887 new_processors.push_front (_capturing_processor);
4890 _processors = new_processors;
4892 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4893 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4898 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4899 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4900 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4907 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4908 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4912 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4913 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4920 /** If the meter point is `Custom', make a note of where the meter is.
4921 * This is so that if the meter point is subsequently set to something else,
4922 * and then back to custom, we can put the meter back where it was last time
4923 * custom was enabled.
4925 * Must be called with the _processor_lock held.
4928 Route::maybe_note_meter_position ()
4930 if (_meter_point != MeterCustom) {
4934 _custom_meter_position_noted = true;
4935 /* custom meter points range from after trim to before panner/main_outs
4936 * this is a limitation by the current processor UI
4938 bool seen_trim = false;
4939 _processor_after_last_custom_meter.reset();
4940 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4941 if ((*i) == _trim) {
4944 if ((*i) == _main_outs) {
4945 _processor_after_last_custom_meter = *i;
4948 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4950 _processor_after_last_custom_meter = _trim;
4952 ProcessorList::iterator j = i;
4954 assert(j != _processors.end ()); // main_outs should be before
4955 _processor_after_last_custom_meter = *j;
4960 assert(_processor_after_last_custom_meter.lock());
4963 boost::shared_ptr<Processor>
4964 Route::processor_by_id (PBD::ID id) const
4966 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4967 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4968 if ((*i)->id() == id) {
4973 return boost::shared_ptr<Processor> ();
4976 /** @return the monitoring state, or in other words what data we are pushing
4977 * into the route (data from the inputs, data from disk or silence)
4980 Route::monitoring_state () const
4982 return MonitoringInput;
4985 /** @return what we should be metering; either the data coming from the input
4986 * IO or the data that is flowing through the route.
4989 Route::metering_state () const
4991 return MeteringRoute;
4995 Route::has_external_redirects () const
4997 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4999 /* ignore inactive processors and obviously ignore the main
5000 * outs since everything has them and we don't care.
5003 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
5011 boost::shared_ptr<Processor>
5012 Route::the_instrument () const
5014 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
5015 return the_instrument_unlocked ();
5018 boost::shared_ptr<Processor>
5019 Route::the_instrument_unlocked () const
5021 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
5022 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
5023 if ((*i)->input_streams().n_midi() > 0 &&
5024 (*i)->output_streams().n_audio() > 0) {
5029 return boost::shared_ptr<Processor>();
5035 Route::non_realtime_locate (framepos_t pos)
5038 _pannable->transport_located (pos);
5041 if (_delayline.get()) {
5042 _delayline.get()->flush();
5046 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
5047 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
5049 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
5050 (*i)->transport_located (pos);
5053 _roll_delay = _initial_delay;
5057 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
5064 * We don't currently mix MIDI input together, so we don't need the
5065 * complex logic of the audio case.
5068 n_buffers = bufs.count().n_midi ();
5070 for (i = 0; i < n_buffers; ++i) {
5072 boost::shared_ptr<MidiPort> source_port = io->midi (i);
5073 MidiBuffer& buf (bufs.get_midi (i));
5076 buf.copy (source_port->get_midi_buffer(nframes));
5078 buf.silence (nframes);
5084 n_buffers = bufs.count().n_audio();
5086 size_t n_ports = io->n_ports().n_audio();
5087 float scaling = 1.0f;
5089 if (n_ports > n_buffers) {
5090 scaling = ((float) n_buffers) / n_ports;
5093 for (i = 0; i < n_ports; ++i) {
5095 /* if there are more ports than buffers, map them onto buffers
5096 * in a round-robin fashion
5099 boost::shared_ptr<AudioPort> source_port = io->audio (i);
5100 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
5103 if (i < n_buffers) {
5105 /* first time through just copy a channel into
5109 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
5111 if (scaling != 1.0f) {
5112 buf.apply_gain (scaling, nframes);
5117 /* on subsequent times around, merge data from
5118 * the port with what is already there
5121 if (scaling != 1.0f) {
5122 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
5124 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
5129 /* silence any remaining buffers */
5131 for (; i < n_buffers; ++i) {
5132 AudioBuffer& buf (bufs.get_audio (i));
5133 buf.silence (nframes);
5136 /* establish the initial setup of the buffer set, reflecting what was
5137 copied into it. unless, of course, we are the auditioner, in which
5138 case nothing was fed into it from the inputs at all.
5141 if (!is_auditioner()) {
5142 bufs.set_count (io->n_ports());
5146 boost::shared_ptr<AutomationControl>
5147 Route::pan_azimuth_control() const
5150 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5152 return boost::shared_ptr<AutomationControl>();
5154 const uint32_t port_channel_post_pan = 2; // gtk2_ardour/mixbus_ports.h
5155 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_pan)));
5157 if (!_pannable || !panner()) {
5158 return boost::shared_ptr<AutomationControl>();
5160 return _pannable->pan_azimuth_control;
5164 boost::shared_ptr<AutomationControl>
5165 Route::pan_elevation_control() const
5167 if (Profile->get_mixbus() || !_pannable || !panner()) {
5168 return boost::shared_ptr<AutomationControl>();
5171 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5173 if (c.find (PanElevationAutomation) != c.end()) {
5174 return _pannable->pan_elevation_control;
5176 return boost::shared_ptr<AutomationControl>();
5179 boost::shared_ptr<AutomationControl>
5180 Route::pan_width_control() const
5182 if (Profile->get_mixbus() || !_pannable || !panner()) {
5183 return boost::shared_ptr<AutomationControl>();
5186 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5188 if (c.find (PanWidthAutomation) != c.end()) {
5189 return _pannable->pan_width_control;
5191 return boost::shared_ptr<AutomationControl>();
5194 boost::shared_ptr<AutomationControl>
5195 Route::pan_frontback_control() const
5197 if (Profile->get_mixbus() || !_pannable || !panner()) {
5198 return boost::shared_ptr<AutomationControl>();
5201 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5203 if (c.find (PanFrontBackAutomation) != c.end()) {
5204 return _pannable->pan_frontback_control;
5206 return boost::shared_ptr<AutomationControl>();
5209 boost::shared_ptr<AutomationControl>
5210 Route::pan_lfe_control() const
5212 if (Profile->get_mixbus() || !_pannable || !panner()) {
5213 return boost::shared_ptr<AutomationControl>();
5216 set<Evoral::Parameter> c = panner()->what_can_be_automated ();
5218 if (c.find (PanLFEAutomation) != c.end()) {
5219 return _pannable->pan_lfe_control;
5221 return boost::shared_ptr<AutomationControl>();
5226 Route::eq_band_cnt () const
5228 if (Profile->get_mixbus()) {
5231 /* Ardour has no well-known EQ object */
5236 boost::shared_ptr<AutomationControl>
5237 Route::eq_gain_controllable (uint32_t band) const
5240 boost::shared_ptr<PluginInsert> eq = ch_eq();
5243 return boost::shared_ptr<AutomationControl>();
5246 uint32_t port_number;
5249 if (is_master() || mixbus()) {
5256 if (is_master() || mixbus()) {
5263 if (is_master() || mixbus()) {
5270 return boost::shared_ptr<AutomationControl>();
5273 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5275 return boost::shared_ptr<AutomationControl>();
5278 boost::shared_ptr<AutomationControl>
5279 Route::eq_freq_controllable (uint32_t band) const
5283 if (mixbus() || is_master()) {
5284 /* no frequency controls for mixbusses or master */
5285 return boost::shared_ptr<AutomationControl>();
5288 boost::shared_ptr<PluginInsert> eq = ch_eq();
5291 return boost::shared_ptr<AutomationControl>();
5294 uint32_t port_number;
5306 return boost::shared_ptr<AutomationControl>();
5309 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_number)));
5311 return boost::shared_ptr<AutomationControl>();
5315 boost::shared_ptr<AutomationControl>
5316 Route::eq_q_controllable (uint32_t band) const
5318 return boost::shared_ptr<AutomationControl>();
5321 boost::shared_ptr<AutomationControl>
5322 Route::eq_shape_controllable (uint32_t band) const
5324 return boost::shared_ptr<AutomationControl>();
5327 boost::shared_ptr<AutomationControl>
5328 Route::eq_enable_controllable () const
5331 boost::shared_ptr<PluginInsert> eq = ch_eq();
5334 return boost::shared_ptr<AutomationControl>();
5337 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5339 return boost::shared_ptr<AutomationControl>();
5343 boost::shared_ptr<AutomationControl>
5344 Route::eq_hpf_controllable () const
5347 boost::shared_ptr<PluginInsert> eq = ch_eq();
5350 return boost::shared_ptr<AutomationControl>();
5353 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (eq->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5355 return boost::shared_ptr<AutomationControl>();
5360 Route::eq_band_name (uint32_t band) const
5362 if (Profile->get_mixbus()) {
5378 boost::shared_ptr<AutomationControl>
5379 Route::comp_enable_controllable () const
5382 boost::shared_ptr<PluginInsert> comp = ch_comp();
5385 return boost::shared_ptr<AutomationControl>();
5388 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 1)));
5390 return boost::shared_ptr<AutomationControl>();
5393 boost::shared_ptr<AutomationControl>
5394 Route::comp_threshold_controllable () const
5397 boost::shared_ptr<PluginInsert> comp = ch_comp();
5400 return boost::shared_ptr<AutomationControl>();
5403 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 2)));
5406 return boost::shared_ptr<AutomationControl>();
5409 boost::shared_ptr<AutomationControl>
5410 Route::comp_speed_controllable () const
5413 boost::shared_ptr<PluginInsert> comp = ch_comp();
5416 return boost::shared_ptr<AutomationControl>();
5419 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 3)));
5421 return boost::shared_ptr<AutomationControl>();
5424 boost::shared_ptr<AutomationControl>
5425 Route::comp_mode_controllable () const
5428 boost::shared_ptr<PluginInsert> comp = ch_comp();
5431 return boost::shared_ptr<AutomationControl>();
5434 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 4)));
5436 return boost::shared_ptr<AutomationControl>();
5439 boost::shared_ptr<AutomationControl>
5440 Route::comp_makeup_controllable () const
5443 boost::shared_ptr<PluginInsert> comp = ch_comp();
5446 return boost::shared_ptr<AutomationControl>();
5449 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 5)));
5451 return boost::shared_ptr<AutomationControl>();
5454 boost::shared_ptr<AutomationControl>
5455 Route::comp_redux_controllable () const
5458 boost::shared_ptr<PluginInsert> comp = ch_comp();
5461 return boost::shared_ptr<AutomationControl>();
5464 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (comp->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, 6)));
5466 return boost::shared_ptr<AutomationControl>();
5471 Route::comp_mode_name (uint32_t mode) const
5476 return _("Leveler");
5478 return _("Compressor");
5480 return _("Limiter");
5482 return mixbus() ? _("Sidechain") : _("Limiter");
5492 Route::comp_speed_name (uint32_t mode) const
5510 boost::shared_ptr<AutomationControl>
5511 Route::send_level_controllable (uint32_t n) const
5514 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5516 return boost::shared_ptr<AutomationControl>();
5521 return boost::shared_ptr<AutomationControl>();
5524 const uint32_t port_id = port_channel_post_aux1_level + (2*n); // gtk2_ardour/mixbus_ports.h
5525 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5527 boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(nth_send (n));
5529 return boost::shared_ptr<AutomationControl>();
5531 return s->gain_control ();
5535 boost::shared_ptr<AutomationControl>
5536 Route::send_enable_controllable (uint32_t n) const
5539 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5541 return boost::shared_ptr<AutomationControl>();
5546 return boost::shared_ptr<AutomationControl>();
5549 const uint32_t port_id = port_channel_post_aux1_asgn + (2*n); // gtk2_ardour/mixbus_ports.h
5550 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_id)));
5552 /* although Ardour sends have enable/disable as part of the Processor
5553 API, it is not exposed as a controllable.
5555 XXX: we should fix this.
5557 return boost::shared_ptr<AutomationControl>();
5562 Route::send_name (uint32_t n) const
5568 boost::shared_ptr<Route> r = _session.get_mixbus (n);
5572 boost::shared_ptr<Processor> p = nth_send (n);
5581 boost::shared_ptr<AutomationControl>
5582 Route::master_send_enable_controllable () const
5585 boost::shared_ptr<ARDOUR::PluginInsert> plug = ch_post();
5587 return boost::shared_ptr<AutomationControl>();
5589 return boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (plug->control (Evoral::Parameter (ARDOUR::PluginAutomation, 0, port_channel_post_mstr_assign)));
5591 return boost::shared_ptr<AutomationControl>();