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/internal_return.h"
50 #include "ardour/internal_send.h"
51 #include "ardour/meter.h"
52 #include "ardour/delayline.h"
53 #include "ardour/midi_buffer.h"
54 #include "ardour/midi_port.h"
55 #include "ardour/monitor_processor.h"
56 #include "ardour/pannable.h"
57 #include "ardour/panner.h"
58 #include "ardour/panner_shell.h"
59 #include "ardour/plugin_insert.h"
60 #include "ardour/port.h"
61 #include "ardour/port_insert.h"
62 #include "ardour/processor.h"
63 #include "ardour/profile.h"
64 #include "ardour/route.h"
65 #include "ardour/route_group.h"
66 #include "ardour/send.h"
67 #include "ardour/session.h"
68 #include "ardour/unknown_processor.h"
69 #include "ardour/utils.h"
74 using namespace ARDOUR;
77 PBD::Signal0<void> Route::SyncOrderKeys;
78 PBD::Signal0<void> Route::RemoteControlIDChange;
80 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
81 : SessionObject (sess, name)
83 , GraphNode (sess._process_graph)
86 , _signal_latency_at_amp_position (0)
87 , _signal_latency_at_trim_position (0)
90 , _pending_process_reorder (0)
91 , _pending_signals (0)
93 , _pending_declick (true)
94 , _meter_point (MeterPostFader)
95 , _pending_meter_point (MeterPostFader)
96 , _meter_type (MeterPeak)
98 , _soloed_by_others_upstream (0)
99 , _soloed_by_others_downstream (0)
100 , _solo_isolated (false)
101 , _solo_isolated_by_upstream (0)
102 , _denormal_protection (false)
105 , _declickable (false)
106 , _mute_master (new MuteMaster (sess, name))
107 , _have_internal_generator (false)
109 , _default_type (default_type)
111 , _has_order_key (false)
112 , _remote_control_id (0)
114 , _in_configure_processors (false)
115 , _initial_io_setup (false)
116 , _custom_meter_position_noted (false)
118 processor_max_streams.reset();
124 /* set default meter type */
126 _meter_type = Config->get_meter_type_master ();
128 else if (dynamic_cast<Track*>(this)) {
129 _meter_type = Config->get_meter_type_track ();
131 _meter_type = Config->get_meter_type_bus ();
134 /* add standard controls */
136 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
137 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
139 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
140 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
142 add_control (_solo_control);
143 add_control (_mute_control);
147 if (!(_flags & Route::MonitorOut)) {
148 _pannable.reset (new Pannable (_session));
151 /* input and output objects */
153 _input.reset (new IO (_session, _name, IO::Input, _default_type));
154 _output.reset (new IO (_session, _name, IO::Output, _default_type));
156 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
157 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
159 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
160 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
162 #if 0 // not used - just yet
163 if (!is_master() && !is_monitor() && !is_auditioner()) {
164 _delayline.reset (new DelayLine (_session, _name));
165 add_processor (_delayline, PreFader);
169 /* add amp processor */
171 _amp.reset (new Amp (_session));
172 add_processor (_amp, PostFader);
175 _trim.reset (new Amp (_session, "trim"));
176 _trim->set_display_to_user (false);
178 if (dynamic_cast<AudioTrack*>(this)) {
179 /* we can't do this in the AudioTrack's constructor
180 * because _trim does not exit then
184 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
189 /* create standard processors: meter, main outs, monitor out;
190 they will be added to _processors by setup_invisible_processors ()
193 _meter.reset (new PeakMeter (_session, _name));
194 _meter->set_owner (this);
195 _meter->set_display_to_user (false);
198 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
199 _main_outs->activate ();
202 /* where we listen to tracks */
203 _intreturn.reset (new InternalReturn (_session));
204 _intreturn->activate ();
206 /* the thing that provides proper control over a control/monitor/listen bus
207 (such as per-channel cut, dim, solo, invert, etc).
209 _monitor_control.reset (new MonitorProcessor (_session));
210 _monitor_control->activate ();
213 if (is_master() || is_monitor() || is_auditioner()) {
214 _mute_master->set_solo_ignore (true);
217 /* now that we have _meter, its safe to connect to this */
220 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
221 configure_processors (0);
229 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
231 /* do this early so that we don't get incoming signals as we are going through destruction
236 /* don't use clear_processors here, as it depends on the session which may
237 be half-destroyed by now
240 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
241 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
242 (*i)->drop_references ();
245 _processors.clear ();
249 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
251 if (Config->get_remote_model() != UserOrdered) {
255 set_remote_control_id_internal (id, notify_class_listeners);
259 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
261 /* force IDs for master/monitor busses and prevent
262 any other route from accidentally getting these IDs
263 (i.e. legacy sessions)
266 if (is_master() && id != MasterBusRemoteControlID) {
267 id = MasterBusRemoteControlID;
270 if (is_monitor() && id != MonitorBusRemoteControlID) {
271 id = MonitorBusRemoteControlID;
278 /* don't allow it to collide */
280 if (!is_master () && !is_monitor() &&
281 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
282 id += MonitorBusRemoteControlID;
285 if (id != remote_control_id()) {
286 _remote_control_id = id;
287 RemoteControlIDChanged ();
289 if (notify_class_listeners) {
290 RemoteControlIDChange ();
296 Route::remote_control_id() const
299 return MasterBusRemoteControlID;
303 return MonitorBusRemoteControlID;
306 return _remote_control_id;
310 Route::has_order_key () const
312 return _has_order_key;
316 Route::order_key () const
322 Route::set_remote_control_id_explicit (uint32_t rid)
324 if (is_master() || is_monitor() || is_auditioner()) {
325 /* hard-coded remote IDs, or no remote ID */
329 if (_remote_control_id != rid) {
330 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
331 _remote_control_id = rid;
332 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
335 /* don't emit the class-level RID signal RemoteControlIDChange here,
336 leave that to the entity that changed the order key, so that we
337 don't get lots of emissions for no good reasons (e.g. when changing
338 all route order keys).
340 See Session::sync_remote_id_from_order_keys() for the (primary|only)
341 spot where that is emitted.
346 Route::set_order_key (uint32_t n)
348 _has_order_key = true;
350 if (_order_key == n) {
356 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
357 name(), order_key ()));
359 _session.set_dirty ();
363 Route::ensure_track_or_route_name(string name, Session &session)
365 string newname = name;
367 while (!session.io_name_is_legal (newname)) {
368 newname = bump_name_once (newname, ' ');
375 Route::inc_gain (gain_t fraction, void *src)
377 _amp->inc_gain (fraction, src);
381 Route::set_gain (gain_t val, void *src)
383 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
385 if (_route_group->is_relative()) {
387 gain_t usable_gain = _amp->gain();
388 if (usable_gain < 0.000001f) {
389 usable_gain = 0.000001f;
393 if (delta < 0.000001f) {
397 delta -= usable_gain;
402 gain_t factor = delta / usable_gain;
405 factor = _route_group->get_max_factor(factor);
406 if (factor == 0.0f) {
407 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
411 factor = _route_group->get_min_factor(factor);
412 if (factor == 0.0f) {
413 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
418 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
422 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
428 if (val == _amp->gain()) {
432 _amp->set_gain (val, src);
436 Route::inc_trim (gain_t fraction, void *src)
438 _trim->inc_gain (fraction, src);
442 Route::set_trim (gain_t val, void * /* src */)
444 // TODO route group, see set_gain()
445 _trim->set_gain (val, 0);
449 Route::maybe_declick (BufferSet&, framecnt_t, int)
451 /* this is the "bus" implementation and they never declick.
456 /** Process this route for one (sub) cycle (process thread)
458 * @param bufs Scratch buffers to use for the signal path
459 * @param start_frame Initial transport frame
460 * @param end_frame Final transport frame
461 * @param nframes Number of frames to output (to ports)
463 * Note that (end_frame - start_frame) may not be equal to nframes when the
464 * transport speed isn't 1.0 (eg varispeed).
467 Route::process_output_buffers (BufferSet& bufs,
468 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
469 int declick, bool gain_automation_ok)
471 /* Caller must hold process lock */
472 assert (!AudioEngine::instance()->process_lock().trylock());
474 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
476 // can this actually happen? functions calling process_output_buffers()
477 // already take a reader-lock.
478 bufs.silence (nframes, 0);
482 /* figure out if we're going to use gain automation */
483 if (gain_automation_ok) {
484 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
485 _amp->setup_gain_automation (
486 start_frame + _signal_latency_at_amp_position,
487 end_frame + _signal_latency_at_amp_position,
490 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
491 _trim->setup_gain_automation (
492 start_frame + _signal_latency_at_trim_position,
493 end_frame + _signal_latency_at_trim_position,
496 _amp->apply_gain_automation (false);
497 _trim->apply_gain_automation (false);
500 /* Tell main outs what to do about monitoring. We do this so that
501 on a transition between monitoring states we get a de-clicking gain
502 change in the _main_outs delivery, if config.get_use_monitor_fades()
505 We override this in the case where we have an internal generator.
507 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
509 _main_outs->no_outs_cuz_we_no_monitor (silence);
511 /* -------------------------------------------------------------------------------------------
512 GLOBAL DECLICK (for transport changes etc.)
513 ----------------------------------------------------------------------------------------- */
515 maybe_declick (bufs, nframes, declick);
516 _pending_declick = 0;
518 /* -------------------------------------------------------------------------------------------
519 DENORMAL CONTROL/PHASE INVERT
520 ----------------------------------------------------------------------------------------- */
522 if (_phase_invert.any ()) {
526 if (_denormal_protection || Config->get_denormal_protection()) {
528 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
529 Sample* const sp = i->data();
531 if (_phase_invert[chn]) {
532 for (pframes_t nx = 0; nx < nframes; ++nx) {
537 for (pframes_t nx = 0; nx < nframes; ++nx) {
545 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
546 Sample* const sp = i->data();
548 if (_phase_invert[chn]) {
549 for (pframes_t nx = 0; nx < nframes; ++nx) {
558 if (_denormal_protection || Config->get_denormal_protection()) {
560 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
561 Sample* const sp = i->data();
562 for (pframes_t nx = 0; nx < nframes; ++nx) {
570 /* -------------------------------------------------------------------------------------------
572 ----------------------------------------------------------------------------------------- */
574 /* set this to be true if the meter will already have been ::run() earlier */
575 bool const meter_already_run = metering_state() == MeteringInput;
577 framecnt_t latency = 0;
579 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
581 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
582 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
587 /* if it has any inputs, make sure they match */
588 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
589 if (bufs.count() != (*i)->input_streams()) {
591 DEBUG::Processors, string_compose (
592 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
593 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
600 /* should we NOT run plugins here if the route is inactive?
601 do we catch route != active somewhere higher?
604 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
605 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
608 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
609 bufs.set_count ((*i)->output_streams());
611 if ((*i)->active ()) {
612 latency += (*i)->signal_latency ();
618 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
619 boost::shared_ptr<Processor> endpoint,
620 bool include_endpoint, bool for_export, bool for_freeze)
622 /* If no processing is required, there's no need to go any further. */
623 if (!endpoint && !include_endpoint) {
627 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
628 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
629 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
631 /* trim is always at the top, for bounce no latency compensation is needed */
632 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
633 _trim->setup_gain_automation (start, start + nframes, nframes);
636 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
638 if (!include_endpoint && (*i) == endpoint) {
642 /* if we're not exporting, stop processing if we come across a routing processor. */
643 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
646 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
650 /* don't run any processors that does routing.
651 * oh, and don't bother with the peak meter either.
653 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
654 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
655 buffers.set_count ((*i)->output_streams());
656 latency += (*i)->signal_latency ();
659 if ((*i) == endpoint) {
666 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
667 bool include_endpoint, bool for_export, bool for_freeze) const
669 framecnt_t latency = 0;
670 if (!endpoint && !include_endpoint) {
674 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
675 if (!include_endpoint && (*i) == endpoint) {
678 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
681 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
684 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
685 latency += (*i)->signal_latency ();
687 if ((*i) == endpoint) {
695 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
696 bool include_endpoint, bool for_export, bool for_freeze) const
698 if (!endpoint && !include_endpoint) {
702 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
703 if (!include_endpoint && (*i) == endpoint) {
706 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
709 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
712 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
713 cc = (*i)->output_streams();
715 if ((*i) == endpoint) {
723 Route::n_process_buffers ()
725 return max (_input->n_ports(), processor_max_streams);
729 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
731 assert (is_monitor());
732 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
733 fill_buffers_with_input (bufs, _input, nframes);
734 passthru (bufs, start_frame, end_frame, nframes, declick);
738 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
742 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
744 /* control/monitor bus ignores input ports when something is
745 feeding the listen "stream". data will "arrive" into the
746 route from the intreturn processor element.
749 bufs.silence (nframes, 0);
752 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
753 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
757 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
759 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
761 bufs.set_count (_input->n_ports());
762 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
763 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
767 Route::set_listen (bool yn, void* src, bool group_override)
773 bool group_active = _route_group && _route_group->is_active() && _route_group->is_solo();
774 if (group_override && _route_group) {
775 group_active = !group_active;
778 if (_route_group && src != _route_group && group_active) {
779 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group, group_override));
784 if (yn != _monitor_send->active()) {
786 _monitor_send->activate ();
787 _mute_master->set_soloed_by_self (true);
789 _monitor_send->deactivate ();
790 _mute_master->set_soloed_by_self (false);
792 _mute_master->set_soloed_by_others (false);
794 listen_changed (src, group_active); /* EMIT SIGNAL */
800 Route::listening_via_monitor () const
803 return _monitor_send->active ();
810 Route::set_solo_safe (bool yn, void *src)
812 if (_solo_safe != yn) {
814 solo_safe_changed (src);
819 Route::solo_safe() const
825 Route::clear_all_solo_state ()
827 // ideally this function will never do anything, it only exists to forestall Murphy
828 bool emit_changed = false;
831 // these are really debug messages, but of possible interest.
833 PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
835 if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
836 PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
837 name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
841 if (!_self_solo && (_soloed_by_others_upstream || _soloed_by_others_downstream)) {
842 // if self-soled, set_solo() will do signal emission
846 _soloed_by_others_upstream = 0;
847 _soloed_by_others_downstream = 0;
850 PBD::Unwinder<bool> uw (_solo_safe, false);
851 set_solo (false, this);
855 set_mute_master_solo ();
856 solo_changed (false, this, false); /* EMIT SIGNAL */
861 Route::set_solo (bool yn, void *src, bool group_override)
864 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
868 if (is_master() || is_monitor() || is_auditioner()) {
869 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
874 bool group_active = _route_group && _route_group->is_active() && _route_group->is_solo();
875 if (group_override && _route_group) {
876 group_active = !group_active;
878 if (_route_group && src != _route_group && group_active) {
879 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group, group_override));
883 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
884 name(), yn, src, (src == _route_group), self_soloed()));
886 if (self_soloed() != yn) {
888 set_mute_master_solo ();
889 solo_changed (true, src, group_active); /* EMIT SIGNAL */
890 _solo_control->Changed (); /* EMIT SIGNAL */
893 assert (Config->get_solo_control_is_listen_control() || !_monitor_send || !_monitor_send->active());
895 /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
896 Config->get_solo_mute_overrride().
899 if (yn && Profile->get_trx()) {
900 set_mute (false, src);
905 Route::set_self_solo (bool yn)
907 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
912 Route::mod_solo_by_others_upstream (int32_t delta)
914 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
915 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
917 uint32_t old_sbu = _soloed_by_others_upstream;
920 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
921 _soloed_by_others_upstream += delta;
923 _soloed_by_others_upstream = 0;
926 _soloed_by_others_upstream += delta;
929 DEBUG_TRACE (DEBUG::Solo, string_compose (
930 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
931 name(), delta, _soloed_by_others_upstream, old_sbu,
932 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
934 /* push the inverse solo change to everything that feeds us.
936 This is important for solo-within-group. When we solo 1 track out of N that
937 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
938 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
939 tracks that feed it. This will silence them if they were audible because
940 of a bus solo, but the newly soloed track will still be audible (because
943 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
947 if ((_self_solo || _soloed_by_others_downstream) &&
948 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
949 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
951 if (delta > 0 || !Config->get_exclusive_solo()) {
952 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
953 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
957 boost::shared_ptr<Route> sr = i->r.lock();
959 sr->mod_solo_by_others_downstream (-delta);
965 set_mute_master_solo ();
966 solo_changed (false, this, false); /* EMIT SIGNAL */
970 Route::mod_solo_by_others_downstream (int32_t delta)
972 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
973 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
976 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
977 _soloed_by_others_downstream += delta;
979 _soloed_by_others_downstream = 0;
982 _soloed_by_others_downstream += delta;
985 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
987 set_mute_master_solo ();
988 solo_changed (false, this, false); /* EMIT SIGNAL */
992 Route::set_mute_master_solo ()
994 _mute_master->set_soloed_by_self (self_soloed());
995 _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
999 Route::mod_solo_isolated_by_upstream (bool yn, void* src)
1001 bool old = solo_isolated ();
1002 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
1003 name(), _solo_isolated_by_upstream, yn ? "+1" : "-1"));
1006 if (_solo_isolated_by_upstream >= 1) {
1007 _solo_isolated_by_upstream--;
1009 _solo_isolated_by_upstream = 0;
1012 _solo_isolated_by_upstream++;
1015 if (solo_isolated() != old) {
1016 /* solo isolated status changed */
1017 _mute_master->set_solo_ignore (solo_isolated());
1018 solo_isolated_changed (src); /* EMIT SIGNAL */
1023 Route::set_solo_isolated (bool yn, void *src)
1025 if (is_master() || is_monitor() || is_auditioner()) {
1029 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
1030 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
1034 bool changed = false;
1037 if (_solo_isolated == false) {
1038 _mute_master->set_solo_ignore (true);
1041 _solo_isolated = true;
1043 if (_solo_isolated == true) {
1044 _solo_isolated = false;
1045 _mute_master->set_solo_ignore (false);
1055 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1057 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1058 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1060 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1065 bool does_feed = feeds (*i, &sends_only);
1067 if (does_feed && !sends_only) {
1068 (*i)->mod_solo_isolated_by_upstream (yn, src);
1072 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1074 solo_isolated_changed (src); /* EMIT SIGNAL */
1078 Route::solo_isolated () const
1080 return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
1084 Route::set_mute_points (MuteMaster::MutePoint mp)
1086 _mute_master->set_mute_points (mp);
1087 mute_points_changed (); /* EMIT SIGNAL */
1089 if (_mute_master->muted_by_self()) {
1090 mute_changed (this); /* EMIT SIGNAL */
1091 _mute_control->Changed (); /* EMIT SIGNAL */
1096 Route::set_mute (bool yn, void *src)
1098 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1099 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1103 if (muted() != yn) {
1104 _mute_master->set_muted_by_self (yn);
1105 /* allow any derived classes to respond to the mute change
1106 before anybody else knows about it.
1109 /* tell everyone else */
1110 mute_changed (src); /* EMIT SIGNAL */
1111 _mute_control->Changed (); /* EMIT SIGNAL */
1116 Route::muted () const
1118 return _mute_master->muted_by_self();
1122 Route::muted_by_others () const
1124 // This method is only used by route_ui for display state.
1125 // The real thing is MuteMaster::muted_by_others_at()
1127 //master is never muted by others
1131 //now check to see if something is soloed (and I am not)
1132 //see also MuteMaster::mute_gain_at()
1133 return (_session.soloing() && !soloed() && !solo_isolated());
1138 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1140 cerr << name << " {" << endl;
1141 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1142 p != procs.end(); ++p) {
1143 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1145 cerr << "}" << endl;
1149 /** Supposing that we want to insert a Processor at a given Placement, return
1150 * the processor to add the new one before (or 0 to add at the end).
1152 boost::shared_ptr<Processor>
1153 Route::before_processor_for_placement (Placement p)
1155 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1157 ProcessorList::iterator loc;
1159 if (p == PreFader) {
1160 /* generic pre-fader: insert immediately before the amp */
1161 loc = find (_processors.begin(), _processors.end(), _amp);
1163 /* generic post-fader: insert right before the main outs */
1164 loc = find (_processors.begin(), _processors.end(), _main_outs);
1167 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1170 /** Supposing that we want to insert a Processor at a given index, return
1171 * the processor to add the new one before (or 0 to add at the end).
1173 boost::shared_ptr<Processor>
1174 Route::before_processor_for_index (int index)
1177 return boost::shared_ptr<Processor> ();
1180 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1182 ProcessorList::iterator i = _processors.begin ();
1184 while (i != _processors.end() && j < index) {
1185 if ((*i)->display_to_user()) {
1192 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1195 /** Add a processor either pre- or post-fader
1196 * @return 0 on success, non-0 on failure.
1199 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1201 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1205 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1206 * @param index Index to add the processor at, or -1 to add at the end of the list.
1207 * @return 0 on success, non-0 on failure.
1210 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1212 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1215 /** Add a processor to the route.
1216 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1217 * @return 0 on success, non-0 on failure.
1220 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1222 assert (processor != _meter);
1223 assert (processor != _main_outs);
1225 DEBUG_TRACE (DEBUG::Processors, string_compose (
1226 "%1 adding processor %2\n", name(), processor->name()));
1228 if (!AudioEngine::instance()->connected() || !processor) {
1233 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1234 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1235 ProcessorState pstate (this);
1237 boost::shared_ptr<PluginInsert> pi;
1238 boost::shared_ptr<PortInsert> porti;
1240 if (processor == _amp) {
1241 /* Ensure that only one amp is in the list at any time */
1242 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1243 if (check != _processors.end()) {
1244 if (before == _amp) {
1245 /* Already in position; all is well */
1248 _processors.erase (check);
1253 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1255 ProcessorList::iterator loc;
1257 /* inserting before a processor; find it */
1258 loc = find (_processors.begin(), _processors.end(), before);
1259 if (loc == _processors.end ()) {
1264 /* inserting at end */
1265 loc = _processors.end ();
1268 _processors.insert (loc, processor);
1269 processor->set_owner (this);
1271 // Set up processor list channels. This will set processor->[input|output]_streams(),
1272 // configure redirect ports properly, etc.
1275 if (configure_processors_unlocked (err)) {
1277 configure_processors_unlocked (0); // it worked before we tried to add it ...
1282 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1284 if (pi->has_no_inputs ()) {
1285 /* generator plugin */
1286 _have_internal_generator = true;
1291 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
1292 processor->activate ();
1295 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1297 _output->set_user_latency (0);
1300 reset_instrument_info ();
1301 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1302 set_processor_positions ();
1308 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1310 const XMLProperty *prop;
1313 boost::shared_ptr<Processor> processor;
1315 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1316 so that we can add the processor in the right place (pre/post-fader)
1319 XMLNodeList const & children = node.children ();
1320 XMLNodeList::const_iterator i = children.begin ();
1322 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1326 Placement placement = PreFader;
1328 if (i != children.end()) {
1329 if ((prop = (*i)->property (X_("placement"))) != 0) {
1330 placement = Placement (string_2_enum (prop->value(), placement));
1334 if (node.name() == "Insert") {
1336 if ((prop = node.property ("type")) != 0) {
1338 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1339 prop->value() == "lv2" ||
1340 prop->value() == "windows-vst" ||
1341 prop->value() == "lxvst" ||
1342 prop->value() == "audiounit") {
1344 if (_session.get_disable_all_loaded_plugins ()) {
1345 processor.reset (new UnknownProcessor (_session, node));
1347 processor.reset (new PluginInsert (_session));
1352 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1357 } else if (node.name() == "Send") {
1359 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1360 processor.reset (new Send (_session, sendpan, _mute_master));
1364 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1368 if (processor->set_state (node, version)) {
1372 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1373 if (i != children.end()) {
1374 if ((prop = (*i)->property (X_("active"))) != 0) {
1375 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1376 processor->activate();
1378 processor->deactivate();
1382 return (add_processor (processor, placement, 0, false) == 0);
1385 catch (failed_constructor &err) {
1386 warning << _("processor could not be created. Ignored.") << endmsg;
1392 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1394 /* NOTE: this is intended to be used ONLY when copying
1395 processors from another Route. Hence the subtle
1396 differences between this and ::add_processor()
1399 ProcessorList::iterator loc;
1402 loc = find(_processors.begin(), _processors.end(), before);
1404 /* nothing specified - at end */
1405 loc = _processors.end ();
1408 if (!_session.engine().connected()) {
1412 if (others.empty()) {
1417 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1418 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1419 ProcessorState pstate (this);
1421 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1427 boost::shared_ptr<PluginInsert> pi;
1429 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1433 _processors.insert (loc, *i);
1434 (*i)->set_owner (this);
1436 if ((*i)->active()) {
1440 /* Think: does this really need to be called for every processor in the loop? */
1442 if (configure_processors_unlocked (err)) {
1444 configure_processors_unlocked (0); // it worked before we tried to add it ...
1449 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1452 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1453 boost::shared_ptr<PluginInsert> pi;
1455 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1456 if (pi->has_no_inputs ()) {
1457 _have_internal_generator = true;
1463 _output->set_user_latency (0);
1466 reset_instrument_info ();
1467 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1468 set_processor_positions ();
1474 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1476 if (p == PreFader) {
1477 start = _processors.begin();
1478 end = find(_processors.begin(), _processors.end(), _amp);
1480 start = find(_processors.begin(), _processors.end(), _amp);
1482 end = _processors.end();
1486 /** Turn off all processors with a given placement
1487 * @param p Placement of processors to disable
1490 Route::disable_processors (Placement p)
1492 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1494 ProcessorList::iterator start, end;
1495 placement_range(p, start, end);
1497 for (ProcessorList::iterator i = start; i != end; ++i) {
1498 (*i)->deactivate ();
1501 _session.set_dirty ();
1504 /** Turn off all redirects
1507 Route::disable_processors ()
1509 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1511 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1512 (*i)->deactivate ();
1515 _session.set_dirty ();
1518 /** Turn off all redirects with a given placement
1519 * @param p Placement of redirects to disable
1522 Route::disable_plugins (Placement p)
1524 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1526 ProcessorList::iterator start, end;
1527 placement_range(p, start, end);
1529 for (ProcessorList::iterator i = start; i != end; ++i) {
1530 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1531 (*i)->deactivate ();
1535 _session.set_dirty ();
1538 /** Turn off all plugins
1541 Route::disable_plugins ()
1543 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1545 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1546 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1547 (*i)->deactivate ();
1551 _session.set_dirty ();
1556 Route::ab_plugins (bool forward)
1558 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1562 /* forward = turn off all active redirects, and mark them so that the next time
1563 we go the other way, we will revert them
1566 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1567 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1571 if ((*i)->active()) {
1572 (*i)->deactivate ();
1573 (*i)->set_next_ab_is_active (true);
1575 (*i)->set_next_ab_is_active (false);
1581 /* backward = if the redirect was marked to go active on the next ab, do so */
1583 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1585 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1589 if ((*i)->get_next_ab_is_active()) {
1592 (*i)->deactivate ();
1597 _session.set_dirty ();
1601 /** Remove processors with a given placement.
1602 * @param p Placement of processors to remove.
1605 Route::clear_processors (Placement p)
1607 if (!_session.engine().connected()) {
1611 bool already_deleting = _session.deletion_in_progress();
1612 if (!already_deleting) {
1613 _session.set_deletion_in_progress();
1617 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1618 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1619 ProcessorList new_list;
1620 ProcessorStreams err;
1621 bool seen_amp = false;
1623 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1629 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1631 /* you can't remove these */
1633 new_list.push_back (*i);
1640 new_list.push_back (*i);
1643 (*i)->drop_references ();
1651 (*i)->drop_references ();
1654 new_list.push_back (*i);
1661 _processors = new_list;
1662 configure_processors_unlocked (&err); // this can't fail
1665 processor_max_streams.reset();
1666 _have_internal_generator = false;
1667 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1668 set_processor_positions ();
1670 reset_instrument_info ();
1672 if (!already_deleting) {
1673 _session.clear_deletion_in_progress();
1678 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1680 // TODO once the export point can be configured properly, do something smarter here
1681 if (processor == _capturing_processor) {
1682 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1683 if (need_process_lock) {
1687 _capturing_processor.reset();
1689 if (need_process_lock) {
1694 /* these can never be removed */
1696 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1700 if (!_session.engine().connected()) {
1704 processor_max_streams.reset();
1707 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1708 if (need_process_lock) {
1712 /* Caller must hold process lock */
1713 assert (!AudioEngine::instance()->process_lock().trylock());
1715 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1717 ProcessorState pstate (this);
1719 ProcessorList::iterator i;
1720 bool removed = false;
1722 for (i = _processors.begin(); i != _processors.end(); ) {
1723 if (*i == processor) {
1725 /* move along, see failure case for configure_processors()
1726 where we may need to reconfigure the processor.
1729 /* stop redirects that send signals to JACK ports
1730 from causing noise as a result of no longer being
1734 boost::shared_ptr<IOProcessor> iop;
1736 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1740 i = _processors.erase (i);
1748 _output->set_user_latency (0);
1756 if (configure_processors_unlocked (err)) {
1758 /* we know this will work, because it worked before :) */
1759 configure_processors_unlocked (0);
1763 _have_internal_generator = false;
1765 for (i = _processors.begin(); i != _processors.end(); ++i) {
1766 boost::shared_ptr<PluginInsert> pi;
1768 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1769 if (pi->has_no_inputs ()) {
1770 _have_internal_generator = true;
1775 if (need_process_lock) {
1780 reset_instrument_info ();
1781 processor->drop_references ();
1782 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1783 set_processor_positions ();
1789 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1791 ProcessorList deleted;
1793 if (!_session.engine().connected()) {
1797 processor_max_streams.reset();
1800 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1801 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1802 ProcessorState pstate (this);
1804 ProcessorList::iterator i;
1805 boost::shared_ptr<Processor> processor;
1807 for (i = _processors.begin(); i != _processors.end(); ) {
1811 /* these can never be removed */
1813 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1818 /* see if its in the list of processors to delete */
1820 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1825 /* stop IOProcessors that send to JACK ports
1826 from causing noise as a result of no longer being
1830 boost::shared_ptr<IOProcessor> iop;
1832 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1836 deleted.push_back (processor);
1837 i = _processors.erase (i);
1840 if (deleted.empty()) {
1841 /* none of those in the requested list were found */
1845 _output->set_user_latency (0);
1847 if (configure_processors_unlocked (err)) {
1849 /* we know this will work, because it worked before :) */
1850 configure_processors_unlocked (0);
1855 _have_internal_generator = false;
1857 for (i = _processors.begin(); i != _processors.end(); ++i) {
1858 boost::shared_ptr<PluginInsert> pi;
1860 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1861 if (pi->has_no_inputs ()) {
1862 _have_internal_generator = true;
1869 /* now try to do what we need to so that those that were removed will be deleted */
1871 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1872 (*i)->drop_references ();
1875 reset_instrument_info ();
1876 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1877 set_processor_positions ();
1883 Route::reset_instrument_info ()
1885 boost::shared_ptr<Processor> instr = the_instrument();
1887 _instrument_info.set_internal_instrument (instr);
1891 /** Caller must hold process lock */
1893 Route::configure_processors (ProcessorStreams* err)
1895 #ifndef PLATFORM_WINDOWS
1896 assert (!AudioEngine::instance()->process_lock().trylock());
1899 if (!_in_configure_processors) {
1900 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1901 return configure_processors_unlocked (err);
1908 Route::input_streams () const
1910 return _input->n_ports ();
1913 list<pair<ChanCount, ChanCount> >
1914 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1916 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1918 return try_configure_processors_unlocked (in, err);
1921 list<pair<ChanCount, ChanCount> >
1922 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1924 // Check each processor in order to see if we can configure as requested
1926 list<pair<ChanCount, ChanCount> > configuration;
1929 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1930 DEBUG_TRACE (DEBUG::Processors, "{\n");
1932 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1934 if ((*p)->can_support_io_configuration(in, out)) {
1935 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1936 configuration.push_back(make_pair(in, out));
1943 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1944 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1945 DEBUG_TRACE (DEBUG::Processors, "}\n");
1946 return list<pair<ChanCount, ChanCount> > ();
1950 DEBUG_TRACE (DEBUG::Processors, "}\n");
1952 return configuration;
1955 /** Set the input/output configuration of each processor in the processors list.
1956 * Caller must hold process lock.
1957 * Return 0 on success, otherwise configuration is impossible.
1960 Route::configure_processors_unlocked (ProcessorStreams* err)
1962 #ifndef PLATFORM_WINDOWS
1963 assert (!AudioEngine::instance()->process_lock().trylock());
1966 if (_in_configure_processors) {
1970 /* put invisible processors where they should be */
1971 setup_invisible_processors ();
1973 _in_configure_processors = true;
1975 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1977 if (configuration.empty ()) {
1978 _in_configure_processors = false;
1983 bool seen_mains_out = false;
1984 processor_out_streams = _input->n_ports();
1985 processor_max_streams.reset();
1987 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1988 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1990 if (!(*p)->configure_io(c->first, c->second)) {
1991 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1993 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1994 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1996 boost::shared_ptr<PluginInsert> pi;
1997 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1998 /* plugins connected via Split Match may have more channels.
1999 * route/scratch buffers are needed for all of them*/
2000 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
2001 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
2005 if (boost::dynamic_pointer_cast<Delivery> (*p)
2006 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
2007 /* main delivery will increase port count to match input.
2008 * the Delivery::Main is usually the last processor - followed only by
2011 seen_mains_out = true;
2013 if (!seen_mains_out) {
2014 processor_out_streams = out;
2020 _meter->set_max_channels (processor_max_streams);
2023 /* make sure we have sufficient scratch buffers to cope with the new processor
2026 _session.ensure_buffers (n_process_buffers ());
2028 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
2030 _in_configure_processors = false;
2034 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
2035 * @param state New active state for those processors.
2038 Route::all_visible_processors_active (bool state)
2040 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2042 if (_processors.empty()) {
2046 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2047 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2054 (*i)->deactivate ();
2058 _session.set_dirty ();
2062 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2064 /* check if re-order requires re-configuration of any processors
2065 * -> compare channel configuration for all processors
2067 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2068 ChanCount c = input_streams ();
2070 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2072 if (c != (*j)->input_streams()) {
2075 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2078 if ((*i)->input_streams() != c) {
2081 c = (*i)->output_streams();
2093 __attribute__((annotate("realtime")))
2096 Route::apply_processor_order (const ProcessorList& new_order)
2098 /* need to hold processor_lock; either read or write lock
2099 * and the engine process_lock.
2100 * Due to r/w lock ambiguity we can only assert the latter
2102 assert (!AudioEngine::instance()->process_lock().trylock());
2105 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2106 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2107 * processors in the current actual processor list that are hidden. Any visible processors
2108 * in the current list but not in "new_order" will be assumed to be deleted.
2111 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2112 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2113 * (note though that ::processors_reorder_needs_configure() ensured that
2114 * this function will only ever be called from the rt-thread if no processor were removed)
2116 * either way, I can't proove it, but an x-run due to re-order here is less likley
2117 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2120 ProcessorList as_it_will_be;
2121 ProcessorList::iterator oiter;
2122 ProcessorList::const_iterator niter;
2124 oiter = _processors.begin();
2125 niter = new_order.begin();
2127 while (niter != new_order.end()) {
2129 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2130 then append it to the temp list.
2132 Otherwise, see if the next processor in the old list is in the new list. if not,
2133 its been deleted. If its there, append it to the temp list.
2136 if (oiter == _processors.end()) {
2138 /* no more elements in the old list, so just stick the rest of
2139 the new order onto the temp list.
2142 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2143 while (niter != new_order.end()) {
2150 if (!(*oiter)->display_to_user()) {
2152 as_it_will_be.push_back (*oiter);
2156 /* visible processor: check that its in the new order */
2158 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2159 /* deleted: do nothing, shared_ptr<> will clean up */
2161 /* ignore this one, and add the next item from the new order instead */
2162 as_it_will_be.push_back (*niter);
2167 /* now remove from old order - its taken care of no matter what */
2168 oiter = _processors.erase (oiter);
2172 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2174 /* If the meter is in a custom position, find it and make a rough note of its position */
2175 maybe_note_meter_position ();
2179 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2181 // it a change is already queued, wait for it
2182 // (unless engine is stopped. apply immediately and proceed
2183 while (g_atomic_int_get (&_pending_process_reorder)) {
2184 if (!AudioEngine::instance()->running()) {
2185 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2186 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2188 apply_processor_order(_pending_processor_order);
2189 setup_invisible_processors ();
2191 g_atomic_int_set (&_pending_process_reorder, 0);
2193 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2194 set_processor_positions ();
2196 // TODO rather use a semaphore or something.
2197 // but since ::reorder_processors() is called
2198 // from the GUI thread, this is fine..
2203 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2205 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2206 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2207 ProcessorState pstate (this);
2209 apply_processor_order (new_order);
2211 if (configure_processors_unlocked (err)) {
2219 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2220 set_processor_positions ();
2223 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2224 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2226 // _pending_processor_order is protected by _processor_lock
2227 _pending_processor_order = new_order;
2228 g_atomic_int_set (&_pending_process_reorder, 1);
2241 Route::get_template()
2243 return state(false);
2247 Route::state(bool full_state)
2249 XMLNode *node = new XMLNode("Route");
2250 ProcessorList::iterator i;
2253 id().print (buf, sizeof (buf));
2254 node->add_property("id", buf);
2255 node->add_property ("name", _name);
2256 node->add_property("default-type", _default_type.to_string());
2259 node->add_property("flags", enum_2_string (_flags));
2262 node->add_property("active", _active?"yes":"no");
2264 boost::to_string (_phase_invert, p);
2265 node->add_property("phase-invert", p);
2266 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2267 node->add_property("meter-point", enum_2_string (_meter_point));
2269 node->add_property("meter-type", enum_2_string (_meter_type));
2272 node->add_property("route-group", _route_group->name());
2275 snprintf (buf, sizeof (buf), "%d", _order_key);
2276 node->add_property ("order-key", buf);
2277 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2278 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2279 node->add_property ("soloed-by-upstream", buf);
2280 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2281 node->add_property ("soloed-by-downstream", buf);
2282 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2283 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2285 node->add_child_nocopy (_input->state (full_state));
2286 node->add_child_nocopy (_output->state (full_state));
2287 node->add_child_nocopy (_solo_control->get_state ());
2288 node->add_child_nocopy (_mute_control->get_state ());
2289 node->add_child_nocopy (_mute_master->get_state ());
2292 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2295 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2296 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2297 remote_control_node->add_property (X_("id"), buf);
2298 node->add_child_nocopy (*remote_control_node);
2300 if (_comment.length()) {
2301 XMLNode *cmt = node->add_child ("Comment");
2302 cmt->add_content (_comment);
2306 node->add_child_nocopy (_pannable->state (full_state));
2309 for (i = _processors.begin(); i != _processors.end(); ++i) {
2311 /* template save: do not include internal sends functioning as
2312 aux sends because the chance of the target ID
2313 in the session where this template is used
2316 similarly, do not save listen sends which connect to
2317 the monitor section, because these will always be
2320 boost::shared_ptr<InternalSend> is;
2322 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2323 if (is->role() == Delivery::Listen) {
2328 node->add_child_nocopy((*i)->state (full_state));
2332 node->add_child_copy (*_extra_xml);
2335 if (_custom_meter_position_noted) {
2336 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2338 after->id().print (buf, sizeof (buf));
2339 node->add_property (X_("processor-after-last-custom-meter"), buf);
2347 Route::set_state (const XMLNode& node, int version)
2349 if (version < 3000) {
2350 return set_state_2X (node, version);
2354 XMLNodeConstIterator niter;
2356 const XMLProperty *prop;
2358 if (node.name() != "Route"){
2359 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2363 if ((prop = node.property (X_("name"))) != 0) {
2364 Route::set_name (prop->value());
2368 _initial_io_setup = true;
2370 if ((prop = node.property (X_("flags"))) != 0) {
2371 _flags = Flag (string_2_enum (prop->value(), _flags));
2376 if (is_master() || is_monitor() || is_auditioner()) {
2377 _mute_master->set_solo_ignore (true);
2381 /* monitor bus does not get a panner, but if (re)created
2382 via XML, it will already have one by the time we
2383 call ::set_state(). so ... remove it.
2388 /* add all processors (except amp, which is always present) */
2390 nlist = node.children();
2391 XMLNode processor_state (X_("processor_state"));
2393 Stateful::save_extra_xml (node);
2395 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2399 if (child->name() == IO::state_node_name) {
2400 if ((prop = child->property (X_("direction"))) == 0) {
2404 if (prop->value() == "Input") {
2405 _input->set_state (*child, version);
2406 } else if (prop->value() == "Output") {
2407 _output->set_state (*child, version);
2411 if (child->name() == X_("Processor")) {
2412 processor_state.add_child_copy (*child);
2415 if (child->name() == X_("Pannable")) {
2417 _pannable->set_state (*child, version);
2419 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2424 if ((prop = node.property (X_("meter-point"))) != 0) {
2425 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2426 set_meter_point (mp, true);
2428 _meter->set_display_to_user (_meter_point == MeterCustom);
2432 if ((prop = node.property (X_("meter-type"))) != 0) {
2433 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2436 _initial_io_setup = false;
2438 set_processor_state (processor_state);
2440 // this looks up the internal instrument in processors
2441 reset_instrument_info();
2443 if ((prop = node.property ("self-solo")) != 0) {
2444 set_self_solo (string_is_affirmative (prop->value()));
2447 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2448 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2449 mod_solo_by_others_upstream (atoi (prop->value()));
2452 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2453 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2454 mod_solo_by_others_downstream (atoi (prop->value()));
2457 if ((prop = node.property ("solo-isolated")) != 0) {
2458 set_solo_isolated (string_is_affirmative (prop->value()), this);
2461 if ((prop = node.property ("solo-safe")) != 0) {
2462 set_solo_safe (string_is_affirmative (prop->value()), this);
2465 if ((prop = node.property (X_("phase-invert"))) != 0) {
2466 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2469 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2470 set_denormal_protection (string_is_affirmative (prop->value()));
2473 if ((prop = node.property (X_("active"))) != 0) {
2474 bool yn = string_is_affirmative (prop->value());
2475 _active = !yn; // force switch
2476 set_active (yn, this);
2479 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2480 set_order_key (atoi(prop->value()));
2483 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2487 string::size_type colon, equal;
2488 string remaining = prop->value();
2490 while (remaining.length()) {
2492 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2493 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2496 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2497 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2500 string keyname = remaining.substr (0, equal);
2502 if ((keyname == "EditorSort") || (keyname == "editor")) {
2503 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2509 colon = remaining.find_first_of (':');
2511 if (colon != string::npos) {
2512 remaining = remaining.substr (colon+1);
2519 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2520 PBD::ID id (prop->value ());
2521 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2522 ProcessorList::const_iterator i = _processors.begin ();
2523 while (i != _processors.end() && (*i)->id() != id) {
2527 if (i != _processors.end ()) {
2528 _processor_after_last_custom_meter = *i;
2529 _custom_meter_position_noted = true;
2533 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2536 if (child->name() == X_("Comment")) {
2538 /* XXX this is a terrible API design in libxml++ */
2540 XMLNode *cmt = *(child->children().begin());
2541 _comment = cmt->content();
2543 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2544 if (prop->value() == "solo") {
2545 _solo_control->set_state (*child, version);
2546 } else if (prop->value() == "mute") {
2547 _mute_control->set_state (*child, version);
2550 } else if (child->name() == X_("RemoteControl")) {
2551 if ((prop = child->property (X_("id"))) != 0) {
2553 sscanf (prop->value().c_str(), "%d", &x);
2554 set_remote_control_id_internal (x);
2557 } else if (child->name() == X_("MuteMaster")) {
2558 _mute_master->set_state (*child, version);
2560 } else if (child->name() == Automatable::xml_node_name) {
2561 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2569 Route::set_state_2X (const XMLNode& node, int version)
2571 LocaleGuard lg (X_("C"));
2573 XMLNodeConstIterator niter;
2575 const XMLProperty *prop;
2577 /* 2X things which still remain to be handled:
2583 if (node.name() != "Route") {
2584 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2588 if ((prop = node.property (X_("flags"))) != 0) {
2589 string f = prop->value ();
2590 boost::replace_all (f, "ControlOut", "MonitorOut");
2591 _flags = Flag (string_2_enum (f, _flags));
2596 if (is_master() || is_monitor() || is_auditioner()) {
2597 _mute_master->set_solo_ignore (true);
2600 if ((prop = node.property (X_("phase-invert"))) != 0) {
2601 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2602 if (string_is_affirmative (prop->value ())) {
2605 set_phase_invert (p);
2608 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2609 set_denormal_protection (string_is_affirmative (prop->value()));
2612 if ((prop = node.property (X_("soloed"))) != 0) {
2613 bool yn = string_is_affirmative (prop->value());
2615 /* XXX force reset of solo status */
2617 set_solo (yn, this);
2620 if ((prop = node.property (X_("muted"))) != 0) {
2623 bool muted = string_is_affirmative (prop->value());
2629 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2631 if (string_is_affirmative (prop->value())){
2632 mute_point = mute_point + "PreFader";
2637 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2639 if (string_is_affirmative (prop->value())){
2642 mute_point = mute_point + ",";
2645 mute_point = mute_point + "PostFader";
2650 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2652 if (string_is_affirmative (prop->value())){
2655 mute_point = mute_point + ",";
2658 mute_point = mute_point + "Listen";
2663 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2665 if (string_is_affirmative (prop->value())){
2668 mute_point = mute_point + ",";
2671 mute_point = mute_point + "Main";
2675 _mute_master->set_mute_points (mute_point);
2676 _mute_master->set_muted_by_self (true);
2680 if ((prop = node.property (X_("meter-point"))) != 0) {
2681 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2684 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2685 don't mean the same thing.
2688 if ((prop = node.property (X_("order-keys"))) != 0) {
2692 string::size_type colon, equal;
2693 string remaining = prop->value();
2695 while (remaining.length()) {
2697 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2698 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2701 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2702 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2705 string keyname = remaining.substr (0, equal);
2707 if (keyname == "EditorSort" || keyname == "editor") {
2708 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2714 colon = remaining.find_first_of (':');
2716 if (colon != string::npos) {
2717 remaining = remaining.substr (colon+1);
2726 nlist = node.children ();
2727 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2731 if (child->name() == IO::state_node_name) {
2733 /* there is a note in IO::set_state_2X() about why we have to call
2737 _input->set_state_2X (*child, version, true);
2738 _output->set_state_2X (*child, version, false);
2740 if ((prop = child->property (X_("name"))) != 0) {
2741 Route::set_name (prop->value ());
2746 if ((prop = child->property (X_("active"))) != 0) {
2747 bool yn = string_is_affirmative (prop->value());
2748 _active = !yn; // force switch
2749 set_active (yn, this);
2752 if ((prop = child->property (X_("gain"))) != 0) {
2755 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2756 _amp->gain_control()->set_value (val);
2760 /* Set up Panners in the IO */
2761 XMLNodeList io_nlist = child->children ();
2763 XMLNodeConstIterator io_niter;
2766 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2768 io_child = *io_niter;
2770 if (io_child->name() == X_("Panner")) {
2771 _main_outs->panner_shell()->set_state(*io_child, version);
2772 } else if (io_child->name() == X_("Automation")) {
2773 /* IO's automation is for the fader */
2774 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2780 XMLNodeList redirect_nodes;
2782 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2786 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2787 redirect_nodes.push_back(child);
2792 set_processor_state_2X (redirect_nodes, version);
2794 Stateful::save_extra_xml (node);
2796 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2799 if (child->name() == X_("Comment")) {
2801 /* XXX this is a terrible API design in libxml++ */
2803 XMLNode *cmt = *(child->children().begin());
2804 _comment = cmt->content();
2806 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2807 if (prop->value() == X_("solo")) {
2808 _solo_control->set_state (*child, version);
2809 } else if (prop->value() == X_("mute")) {
2810 _mute_control->set_state (*child, version);
2813 } else if (child->name() == X_("RemoteControl")) {
2814 if ((prop = child->property (X_("id"))) != 0) {
2816 sscanf (prop->value().c_str(), "%d", &x);
2817 set_remote_control_id_internal (x);
2827 Route::get_processor_state ()
2829 XMLNode* root = new XMLNode (X_("redirects"));
2830 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2831 root->add_child_nocopy ((*i)->state (true));
2838 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2840 /* We don't bother removing existing processors not in nList, as this
2841 method will only be called when creating a Route from scratch, not
2842 for undo purposes. Just put processors in at the appropriate place
2846 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2847 add_processor_from_xml_2X (**i, version);
2852 Route::set_processor_state (const XMLNode& node)
2854 const XMLNodeList &nlist = node.children();
2855 XMLNodeConstIterator niter;
2856 ProcessorList new_order;
2857 bool must_configure = false;
2859 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2861 XMLProperty* prop = (*niter)->property ("type");
2863 if (prop->value() == "amp") {
2864 _amp->set_state (**niter, Stateful::current_state_version);
2865 new_order.push_back (_amp);
2866 } else if (prop->value() == "trim") {
2867 _trim->set_state (**niter, Stateful::current_state_version);
2868 new_order.push_back (_trim);
2869 } else if (prop->value() == "meter") {
2870 _meter->set_state (**niter, Stateful::current_state_version);
2871 new_order.push_back (_meter);
2872 } else if (prop->value() == "delay") {
2874 _delayline->set_state (**niter, Stateful::current_state_version);
2875 new_order.push_back (_delayline);
2877 } else if (prop->value() == "main-outs") {
2878 _main_outs->set_state (**niter, Stateful::current_state_version);
2879 } else if (prop->value() == "intreturn") {
2881 _intreturn.reset (new InternalReturn (_session));
2882 must_configure = true;
2884 _intreturn->set_state (**niter, Stateful::current_state_version);
2885 } else if (is_monitor() && prop->value() == "monitor") {
2886 if (!_monitor_control) {
2887 _monitor_control.reset (new MonitorProcessor (_session));
2888 must_configure = true;
2890 _monitor_control->set_state (**niter, Stateful::current_state_version);
2891 } else if (prop->value() == "capture") {
2892 /* CapturingProcessor should never be restored, it's always
2893 added explicitly when needed */
2895 ProcessorList::iterator o;
2897 for (o = _processors.begin(); o != _processors.end(); ++o) {
2898 XMLProperty* id_prop = (*niter)->property(X_("id"));
2899 if (id_prop && (*o)->id() == id_prop->value()) {
2900 (*o)->set_state (**niter, Stateful::current_state_version);
2901 new_order.push_back (*o);
2906 // If the processor (*niter) is not on the route then create it
2908 if (o == _processors.end()) {
2910 boost::shared_ptr<Processor> processor;
2912 if (prop->value() == "intsend") {
2914 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2916 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2917 prop->value() == "lv2" ||
2918 prop->value() == "windows-vst" ||
2919 prop->value() == "lxvst" ||
2920 prop->value() == "audiounit") {
2922 if (_session.get_disable_all_loaded_plugins ()) {
2923 processor.reset (new UnknownProcessor (_session, **niter));
2925 processor.reset (new PluginInsert (_session));
2927 } else if (prop->value() == "port") {
2929 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2931 } else if (prop->value() == "send") {
2933 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2936 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2940 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2941 /* This processor could not be configured. Turn it into a UnknownProcessor */
2942 processor.reset (new UnknownProcessor (_session, **niter));
2945 /* we have to note the monitor send here, otherwise a new one will be created
2946 and the state of this one will be lost.
2948 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2949 if (isend && isend->role() == Delivery::Listen) {
2950 _monitor_send = isend;
2953 /* it doesn't matter if invisible processors are added here, as they
2954 will be sorted out by setup_invisible_processors () shortly.
2957 new_order.push_back (processor);
2958 must_configure = true;
2964 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2965 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2966 _processors = new_order;
2968 if (must_configure) {
2969 configure_processors_unlocked (0);
2972 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2974 (*i)->set_owner (this);
2975 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2977 boost::shared_ptr<PluginInsert> pi;
2979 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2980 if (pi->has_no_inputs ()) {
2981 _have_internal_generator = true;
2988 reset_instrument_info ();
2989 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2990 set_processor_positions ();
2994 Route::curve_reallocate ()
2996 // _gain_automation_curve.finish_resize ();
2997 // _pan_automation_curve.finish_resize ();
3001 Route::silence (framecnt_t nframes)
3003 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3008 silence_unlocked (nframes);
3012 Route::silence_unlocked (framecnt_t nframes)
3014 /* Must be called with the processor lock held */
3018 _output->silence (nframes);
3020 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3021 boost::shared_ptr<PluginInsert> pi;
3023 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
3024 // skip plugins, they don't need anything when we're not active
3028 (*i)->silence (nframes);
3031 if (nframes == _session.get_block_size()) {
3038 Route::add_internal_return ()
3041 _intreturn.reset (new InternalReturn (_session));
3042 add_processor (_intreturn, PreFader);
3047 Route::add_send_to_internal_return (InternalSend* send)
3049 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3051 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3052 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3055 return d->add_send (send);
3061 Route::remove_send_from_internal_return (InternalSend* send)
3063 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3065 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3066 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3069 return d->remove_send (send);
3075 Route::enable_monitor_send ()
3077 /* Caller must hold process lock */
3078 assert (!AudioEngine::instance()->process_lock().trylock());
3080 /* master never sends to monitor section via the normal mechanism */
3081 assert (!is_master ());
3082 assert (!is_monitor ());
3084 /* make sure we have one */
3085 if (!_monitor_send) {
3086 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3087 _monitor_send->set_display_to_user (false);
3091 configure_processors (0);
3094 /** Add an aux send to a route.
3095 * @param route route to send to.
3096 * @param before Processor to insert before, or 0 to insert at the end.
3099 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3101 assert (route != _session.monitor_out ());
3104 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3106 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3108 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3110 if (d && d->target_route() == route) {
3111 /* already listening via the specified IO: do nothing */
3119 boost::shared_ptr<InternalSend> listener;
3122 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3123 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3124 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3127 add_processor (listener, before);
3129 } catch (failed_constructor& err) {
3137 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3139 ProcessorStreams err;
3140 ProcessorList::iterator tmp;
3143 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3145 /* have to do this early because otherwise processor reconfig
3146 * will put _monitor_send back in the list
3149 if (route == _session.monitor_out()) {
3150 _monitor_send.reset ();
3154 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3156 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3158 if (d && d->target_route() == route) {
3160 if (remove_processor (*x, &err, false) > 0) {
3166 /* list could have been demolished while we dropped the lock
3169 if (_session.engine().connected()) {
3170 /* i/o processors cannot be removed if the engine is not running
3171 * so don't live-loop in case the engine is N/A or dies
3181 Route::set_comment (string cmt, void *src)
3184 comment_changed (src);
3185 _session.set_dirty ();
3189 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3191 FeedRecord fr (other, via_sends_only);
3193 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3195 if (!result.second) {
3197 /* already a record for "other" - make sure sends-only information is correct */
3198 if (!via_sends_only && result.first->sends_only) {
3199 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3200 frp->sends_only = false;
3204 return result.second;
3208 Route::clear_fed_by ()
3214 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3216 const FedBy& fed_by (other->fed_by());
3218 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3219 boost::shared_ptr<Route> sr = f->r.lock();
3221 if (sr && (sr.get() == this)) {
3223 if (via_sends_only) {
3224 *via_sends_only = f->sends_only;
3235 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3237 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3239 if (_output->connected_to (other->input())) {
3240 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3241 if (via_send_only) {
3242 *via_send_only = false;
3249 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3251 boost::shared_ptr<IOProcessor> iop;
3253 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3254 if (iop->feeds (other)) {
3255 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3256 if (via_send_only) {
3257 *via_send_only = true;
3261 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3264 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3269 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3274 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3276 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3279 /** Called from the (non-realtime) butler thread when the transport is stopped */
3281 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3283 framepos_t now = _session.transport_frame();
3286 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3288 Automatable::transport_stopped (now);
3290 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3292 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3296 (*i)->transport_stopped (now);
3300 _roll_delay = _initial_delay;
3304 Route::input_change_handler (IOChange change, void * /*src*/)
3306 if ((change.type & IOChange::ConfigurationChanged)) {
3307 /* This is called with the process lock held if change
3308 contains ConfigurationChanged
3310 configure_processors (0);
3311 _phase_invert.resize (_input->n_ports().n_audio ());
3312 io_changed (); /* EMIT SIGNAL */
3315 if (_soloed_by_others_upstream || _solo_isolated_by_upstream) {
3318 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3319 if (_input->connected()) {
3320 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3321 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3325 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3326 if (does_feed && !sends_only) {
3327 if ((*i)->soloed()) {
3330 if ((*i)->solo_isolated()) {
3337 int delta = sbou - _soloed_by_others_upstream;
3338 int idelta = ibou - _solo_isolated_by_upstream;
3341 PBD::warning << string_compose (
3342 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3343 _name, ibou, _solo_isolated_by_upstream, idelta)
3348 if (_soloed_by_others_upstream) {
3349 // ignore new connections (they're not propagated)
3351 mod_solo_by_others_upstream (delta);
3355 if (_solo_isolated_by_upstream) {
3356 // solo-isolate currently only propagates downstream
3358 mod_solo_isolated_by_upstream (false, this);
3360 // TODO think: mod_solo_isolated_by_upstream() does not take delta arg,
3361 // but idelta can't be smaller than -1, can it?
3362 //_solo_isolated_by_upstream = ibou;
3365 // Session::route_solo_changed does not propagate indirect solo-changes
3366 // propagate downstream to tracks
3367 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3368 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3372 bool does_feed = feeds (*i, &sends_only);
3373 if (delta <= 0 && does_feed && !sends_only) {
3374 (*i)->mod_solo_by_others_upstream (delta);
3377 if (idelta < 0 && does_feed && !sends_only) {
3378 (*i)->mod_solo_isolated_by_upstream (false, this);
3385 Route::output_change_handler (IOChange change, void * /*src*/)
3387 if (_initial_io_setup) {
3391 if ((change.type & IOChange::ConfigurationChanged)) {
3392 /* This is called with the process lock held if change
3393 contains ConfigurationChanged
3395 configure_processors (0);
3398 _session.reset_monitor_section();
3401 io_changed (); /* EMIT SIGNAL */
3404 if (_soloed_by_others_downstream) {
3406 /* checking all all downstream routes for
3407 * explicit of implict solo is a rather drastic measure,
3408 * ideally the input_change_handler() of the other route
3409 * would propagate the change to us.
3411 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3412 if (_output->connected()) {
3413 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3414 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3418 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3419 if (does_feed && !sends_only) {
3420 if ((*i)->soloed()) {
3427 int delta = sbod - _soloed_by_others_downstream;
3429 // do not allow new connections to change implicit solo (no propagation)
3430 mod_solo_by_others_downstream (delta);
3431 // Session::route_solo_changed() does not propagate indirect solo-changes
3432 // propagate upstream to tracks
3433 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3434 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3438 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3439 if (delta != 0 && does_feed && !sends_only) {
3440 (*i)->mod_solo_by_others_downstream (delta);
3449 Route::pans_required () const
3451 if (n_outputs().n_audio() < 2) {
3455 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3459 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3461 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3467 if (n_outputs().n_total() == 0) {
3471 if (!_active || n_inputs() == ChanCount::ZERO) {
3472 silence_unlocked (nframes);
3476 if (session_state_changing) {
3477 if (_session.transport_speed() != 0.0f) {
3478 /* we're rolling but some state is changing (e.g. our diskstream contents)
3479 so we cannot use them. Be silent till this is over.
3481 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3483 silence_unlocked (nframes);
3486 /* we're really not rolling, so we're either delivery silence or actually
3487 monitoring, both of which are safe to do while session_state_changing is true.
3491 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3493 fill_buffers_with_input (bufs, _input, nframes);
3495 if (_meter_point == MeterInput) {
3496 _meter->run (bufs, start_frame, end_frame, nframes, true);
3499 _amp->apply_gain_automation (false);
3500 _trim->apply_gain_automation (false);
3501 passthru (bufs, start_frame, end_frame, nframes, 0);
3507 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3509 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3514 if (n_outputs().n_total() == 0) {
3518 if (!_active || n_inputs().n_total() == 0) {
3519 silence_unlocked (nframes);
3523 framepos_t unused = 0;
3525 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3531 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3533 fill_buffers_with_input (bufs, _input, nframes);
3535 if (_meter_point == MeterInput) {
3536 _meter->run (bufs, start_frame, end_frame, nframes, true);
3539 passthru (bufs, start_frame, end_frame, nframes, declick);
3545 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3552 Route::flush_processors ()
3554 /* XXX shouldn't really try to take this lock, since
3555 this is called from the RT audio thread.
3558 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3560 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3566 __attribute__((annotate("realtime")))
3569 Route::apply_processor_changes_rt ()
3571 int emissions = EmitNone;
3573 if (_pending_meter_point != _meter_point) {
3574 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3576 /* meters always have buffers for 'processor_max_streams'
3577 * they can be re-positioned without re-allocation */
3578 if (set_meter_point_unlocked()) {
3579 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3581 emissions |= EmitMeterChanged;
3586 bool changed = false;
3588 if (g_atomic_int_get (&_pending_process_reorder)) {
3589 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3591 apply_processor_order (_pending_processor_order);
3592 setup_invisible_processors ();
3594 g_atomic_int_set (&_pending_process_reorder, 0);
3595 emissions |= EmitRtProcessorChange;
3599 set_processor_positions ();
3601 if (emissions != 0) {
3602 g_atomic_int_set (&_pending_signals, emissions);
3609 Route::emit_pending_signals ()
3612 int sig = g_atomic_int_and (&_pending_signals, 0);
3613 if (sig & EmitMeterChanged) {
3614 _meter->emit_configuration_changed();
3615 meter_change (); /* EMIT SIGNAL */
3616 if (sig & EmitMeterVisibilityChange) {
3617 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3619 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3622 if (sig & EmitRtProcessorChange) {
3623 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3628 Route::set_meter_point (MeterPoint p, bool force)
3630 if (_pending_meter_point == p && !force) {
3634 if (force || !AudioEngine::instance()->running()) {
3635 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3636 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3637 _pending_meter_point = p;
3638 _meter->emit_configuration_changed();
3639 meter_change (); /* EMIT SIGNAL */
3640 if (set_meter_point_unlocked()) {
3641 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3643 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3646 _pending_meter_point = p;
3652 __attribute__((annotate("realtime")))
3655 Route::set_meter_point_unlocked ()
3658 /* Caller must hold process and processor write lock */
3659 assert (!AudioEngine::instance()->process_lock().trylock());
3660 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3661 assert (!lm.locked ());
3664 _meter_point = _pending_meter_point;
3666 bool meter_was_visible_to_user = _meter->display_to_user ();
3668 if (!_custom_meter_position_noted) {
3669 maybe_note_meter_position ();
3672 if (_meter_point != MeterCustom) {
3674 _meter->set_display_to_user (false);
3676 setup_invisible_processors ();
3679 _meter->set_display_to_user (true);
3681 /* If we have a previous position for the custom meter, try to put it there */
3682 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3684 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3685 if (i != _processors.end ()) {
3686 _processors.remove (_meter);
3687 _processors.insert (i, _meter);
3689 } else {// at end, right before the mains_out/panner
3690 _processors.remove (_meter);
3691 ProcessorList::iterator main = _processors.end();
3692 _processors.insert (--main, _meter);
3696 /* Set up the meter for its new position */
3698 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3702 if (loc == _processors.begin()) {
3703 m_in = _input->n_ports();
3705 ProcessorList::iterator before = loc;
3707 m_in = (*before)->output_streams ();
3710 _meter->reflect_inputs (m_in);
3712 /* we do not need to reconfigure the processors, because the meter
3713 (a) is always ready to handle processor_max_streams
3714 (b) is always an N-in/N-out processor, and thus moving
3715 it doesn't require any changes to the other processors.
3718 /* these should really be done after releasing the lock
3719 * but all those signals are subscribed to with gui_thread()
3722 return (_meter->display_to_user() != meter_was_visible_to_user);
3726 Route::listen_position_changed ()
3729 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3730 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3731 ProcessorState pstate (this);
3733 if (configure_processors_unlocked (0)) {
3734 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3736 configure_processors_unlocked (0); // it worked before we tried to add it ...
3741 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3742 _session.set_dirty ();
3745 boost::shared_ptr<CapturingProcessor>
3746 Route::add_export_point()
3748 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3749 if (!_capturing_processor) {
3751 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3752 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3754 _capturing_processor.reset (new CapturingProcessor (_session));
3755 _capturing_processor->activate ();
3757 configure_processors_unlocked (0);
3761 return _capturing_processor;
3765 Route::update_signal_latency ()
3767 framecnt_t l = _output->user_latency();
3768 framecnt_t lamp = 0;
3769 bool before_amp = true;
3770 framecnt_t ltrim = 0;
3771 bool before_trim = true;
3773 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3774 if ((*i)->active ()) {
3775 l += (*i)->signal_latency ();
3780 if ((*i) == _trim) {
3791 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3793 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3794 _signal_latency_at_amp_position = lamp;
3795 _signal_latency_at_trim_position = ltrim;
3797 if (_signal_latency != l) {
3798 _signal_latency = l;
3799 signal_latency_changed (); /* EMIT SIGNAL */
3802 return _signal_latency;
3806 Route::set_user_latency (framecnt_t nframes)
3808 _output->set_user_latency (nframes);
3809 _session.update_latency_compensation ();
3813 Route::set_latency_compensation (framecnt_t longest_session_latency)
3815 framecnt_t old = _initial_delay;
3817 if (_signal_latency < longest_session_latency) {
3818 _initial_delay = longest_session_latency - _signal_latency;
3823 DEBUG_TRACE (DEBUG::Latency, string_compose (
3824 "%1: compensate for maximum latency of %2,"
3825 "given own latency of %3, using initial delay of %4\n",
3826 name(), longest_session_latency, _signal_latency, _initial_delay));
3828 if (_initial_delay != old) {
3829 initial_delay_changed (); /* EMIT SIGNAL */
3832 if (_session.transport_stopped()) {
3833 _roll_delay = _initial_delay;
3837 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3838 : AutomationControl (r->session(),
3839 Evoral::Parameter (SoloAutomation),
3840 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3841 boost::shared_ptr<AutomationList>(), name)
3844 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3845 gl->set_interpolation(Evoral::ControlList::Discrete);
3850 Route::SoloControllable::set_value (double val)
3852 const bool bval = ((val >= 0.5) ? true : false);
3854 boost::shared_ptr<RouteList> rl (new RouteList);
3856 boost::shared_ptr<Route> r = _route.lock ();
3863 if (Config->get_solo_control_is_listen_control()) {
3864 _session.set_listen (rl, bval);
3866 _session.set_solo (rl, bval);
3871 Route::SoloControllable::get_value () const
3873 boost::shared_ptr<Route> r = _route.lock ();
3878 if (Config->get_solo_control_is_listen_control()) {
3879 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3881 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3885 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3886 : AutomationControl (r->session(),
3887 Evoral::Parameter (MuteAutomation),
3888 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3889 boost::shared_ptr<AutomationList>(),
3893 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3894 gl->set_interpolation(Evoral::ControlList::Discrete);
3899 Route::MuteControllable::set_superficial_value(bool muted)
3901 /* Note we can not use AutomationControl::set_value here since it will emit
3902 Changed(), but the value will not be correct to the observer. */
3904 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3906 Control::set_double (muted, _session.transport_frame(), to_list);
3910 Route::MuteControllable::set_value (double val)
3912 const bool bval = ((val >= 0.5) ? true : false);
3914 boost::shared_ptr<Route> r = _route.lock ();
3919 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3920 // Playing back automation, set route mute directly
3921 r->set_mute (bval, this);
3923 // Set from user, queue mute event
3924 boost::shared_ptr<RouteList> rl (new RouteList);
3926 _session.set_mute (rl, bval, Session::rt_cleanup);
3929 // Set superficial/automation value to drive controller (and possibly record)
3930 set_superficial_value(bval);
3934 Route::MuteControllable::get_value () const
3936 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3937 // Playing back automation, get the value from the list
3938 return AutomationControl::get_value();
3941 // Not playing back automation, get the actual route mute value
3942 boost::shared_ptr<Route> r = _route.lock ();
3943 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3947 Route::set_block_size (pframes_t nframes)
3949 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3950 (*i)->set_block_size (nframes);
3953 _session.ensure_buffers (n_process_buffers ());
3957 Route::protect_automation ()
3959 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3960 (*i)->protect_automation();
3963 /** @param declick 1 to set a pending declick fade-in,
3964 * -1 to set a pending declick fade-out
3967 Route::set_pending_declick (int declick)
3970 /* this call is not allowed to turn off a pending declick */
3972 _pending_declick = declick;
3975 _pending_declick = 0;
3979 /** Shift automation forwards from a particular place, thereby inserting time.
3980 * Adds undo commands for any shifts that are performed.
3982 * @param pos Position to start shifting from.
3983 * @param frames Amount to shift forwards by.
3987 Route::shift (framepos_t pos, framecnt_t frames)
3989 /* gain automation */
3991 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3993 XMLNode &before = gc->alist()->get_state ();
3994 gc->alist()->shift (pos, frames);
3995 XMLNode &after = gc->alist()->get_state ();
3996 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3999 /* gain automation */
4001 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
4003 XMLNode &before = gc->alist()->get_state ();
4004 gc->alist()->shift (pos, frames);
4005 XMLNode &after = gc->alist()->get_state ();
4006 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
4009 // TODO mute automation ??
4011 /* pan automation */
4013 ControlSet::Controls& c (_pannable->controls());
4015 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
4016 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
4018 boost::shared_ptr<AutomationList> al = pc->alist();
4019 XMLNode& before = al->get_state ();
4020 al->shift (pos, frames);
4021 XMLNode& after = al->get_state ();
4022 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4027 /* redirect automation */
4029 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4030 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
4032 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
4034 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
4035 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
4037 boost::shared_ptr<AutomationList> al = ac->alist();
4038 XMLNode &before = al->get_state ();
4039 al->shift (pos, frames);
4040 XMLNode &after = al->get_state ();
4041 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4050 Route::save_as_template (const string& path, const string& name)
4052 XMLNode& node (state (false));
4055 IO::set_name_in_state (*node.children().front(), name);
4057 tree.set_root (&node);
4058 return tree.write (path.c_str());
4063 Route::set_name (const string& str)
4065 if (str == name()) {
4069 string name = Route::ensure_track_or_route_name (str, _session);
4070 SessionObject::set_name (name);
4072 bool ret = (_input->set_name(name) && _output->set_name(name));
4075 /* rename the main outs. Leave other IO processors
4076 * with whatever name they already have, because its
4077 * just fine as it is (it will not contain the route
4078 * name if its a port insert, port send or port return).
4082 if (_main_outs->set_name (name)) {
4083 /* XXX returning false here is stupid because
4084 we already changed the route name.
4094 /** Set the name of a route in an XML description.
4095 * @param node XML <Route> node to set the name in.
4096 * @param name New name.
4099 Route::set_name_in_state (XMLNode& node, string const & name)
4101 node.add_property (X_("name"), name);
4103 XMLNodeList children = node.children();
4104 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4106 if ((*i)->name() == X_("IO")) {
4108 IO::set_name_in_state (**i, name);
4110 } else if ((*i)->name() == X_("Processor")) {
4112 XMLProperty* role = (*i)->property (X_("role"));
4113 if (role && role->value() == X_("Main")) {
4114 (*i)->add_property (X_("name"), name);
4117 } else if ((*i)->name() == X_("Diskstream")) {
4119 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4120 (*i)->add_property (X_("name"), name);
4126 boost::shared_ptr<Send>
4127 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4129 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4131 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4132 boost::shared_ptr<InternalSend> send;
4134 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4135 if (send->target_route() == target) {
4141 return boost::shared_ptr<Send>();
4144 /** @param c Audio channel index.
4145 * @param yn true to invert phase, otherwise false.
4148 Route::set_phase_invert (uint32_t c, bool yn)
4150 if (_phase_invert[c] != yn) {
4151 _phase_invert[c] = yn;
4152 phase_invert_changed (); /* EMIT SIGNAL */
4153 _session.set_dirty ();
4158 Route::set_phase_invert (boost::dynamic_bitset<> p)
4160 if (_phase_invert != p) {
4162 phase_invert_changed (); /* EMIT SIGNAL */
4163 _session.set_dirty ();
4168 Route::phase_invert (uint32_t c) const
4170 return _phase_invert[c];
4173 boost::dynamic_bitset<>
4174 Route::phase_invert () const
4176 return _phase_invert;
4180 Route::set_denormal_protection (bool yn)
4182 if (_denormal_protection != yn) {
4183 _denormal_protection = yn;
4184 denormal_protection_changed (); /* EMIT SIGNAL */
4189 Route::denormal_protection () const
4191 return _denormal_protection;
4195 Route::set_active (bool yn, void* src)
4197 if (_session.transport_rolling()) {
4201 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4202 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4206 if (_active != yn) {
4208 _input->set_active (yn);
4209 _output->set_active (yn);
4210 active_changed (); // EMIT SIGNAL
4211 _session.set_dirty ();
4215 boost::shared_ptr<Pannable>
4216 Route::pannable() const
4221 boost::shared_ptr<Panner>
4222 Route::panner() const
4225 return _main_outs->panner_shell()->panner();
4228 boost::shared_ptr<PannerShell>
4229 Route::panner_shell() const
4231 return _main_outs->panner_shell();
4234 boost::shared_ptr<AutomationControl>
4235 Route::gain_control() const
4237 return _amp->gain_control();
4240 boost::shared_ptr<AutomationControl>
4241 Route::get_control (const Evoral::Parameter& param)
4243 /* either we own the control or .... */
4245 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4249 /* maybe one of our processors does or ... */
4251 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4252 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4253 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4261 /* nobody does so we'll make a new one */
4263 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4270 boost::shared_ptr<Processor>
4271 Route::nth_plugin (uint32_t n)
4273 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4274 ProcessorList::iterator i;
4276 for (i = _processors.begin(); i != _processors.end(); ++i) {
4277 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4284 return boost::shared_ptr<Processor> ();
4287 boost::shared_ptr<Processor>
4288 Route::nth_send (uint32_t n)
4290 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4291 ProcessorList::iterator i;
4293 for (i = _processors.begin(); i != _processors.end(); ++i) {
4294 if (boost::dynamic_pointer_cast<Send> (*i)) {
4301 return boost::shared_ptr<Processor> ();
4305 Route::has_io_processor_named (const string& name)
4307 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4308 ProcessorList::iterator i;
4310 for (i = _processors.begin(); i != _processors.end(); ++i) {
4311 if (boost::dynamic_pointer_cast<Send> (*i) ||
4312 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4313 if ((*i)->name() == name) {
4322 MuteMaster::MutePoint
4323 Route::mute_points () const
4325 return _mute_master->mute_points ();
4329 Route::set_processor_positions ()
4331 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4333 bool had_amp = false;
4334 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4335 (*i)->set_pre_fader (!had_amp);
4342 /** Called when there is a proposed change to the input port count */
4344 Route::input_port_count_changing (ChanCount to)
4346 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4348 /* The processors cannot be configured with the new input arrangement, so
4354 /* The change is ok */
4358 /** Called when there is a proposed change to the output port count */
4360 Route::output_port_count_changing (ChanCount to)
4362 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4363 if (processor_out_streams.get(*t) > to.get(*t)) {
4367 /* The change is ok */
4372 Route::unknown_processors () const
4376 if (_session.get_disable_all_loaded_plugins ()) {
4377 // Do not list "missing plugins" if they are explicitly disabled
4381 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4382 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4383 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4384 p.push_back ((*i)->name ());
4393 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4395 /* we assume that all our input ports feed all our output ports. its not
4396 universally true, but the alternative is way too corner-case to worry about.
4399 LatencyRange all_connections;
4402 all_connections.min = 0;
4403 all_connections.max = 0;
4405 all_connections.min = ~((pframes_t) 0);
4406 all_connections.max = 0;
4408 /* iterate over all "from" ports and determine the latency range for all of their
4409 connections to the "outside" (outside of this Route).
4412 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4416 p->get_connected_latency_range (range, playback);
4418 all_connections.min = min (all_connections.min, range.min);
4419 all_connections.max = max (all_connections.max, range.max);
4423 /* set the "from" port latencies to the max/min range of all their connections */
4425 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4426 p->set_private_latency_range (all_connections, playback);
4429 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4431 all_connections.min += our_latency;
4432 all_connections.max += our_latency;
4434 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4435 p->set_private_latency_range (all_connections, playback);
4438 return all_connections.max;
4442 Route::set_private_port_latencies (bool playback) const
4444 framecnt_t own_latency = 0;
4446 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4447 OR LATENCY CALLBACK.
4449 This is called (early) from the latency callback. It computes the REAL
4450 latency associated with each port and stores the result as the "private"
4451 latency of the port. A later call to Route::set_public_port_latencies()
4452 sets all ports to the same value to reflect the fact that we do latency
4453 compensation and so all signals are delayed by the same amount as they
4454 flow through ardour.
4457 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4458 if ((*i)->active ()) {
4459 own_latency += (*i)->signal_latency ();
4464 /* playback: propagate latency from "outside the route" to outputs to inputs */
4465 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4467 /* capture: propagate latency from "outside the route" to inputs to outputs */
4468 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4473 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4475 /* this is called to set the JACK-visible port latencies, which take
4476 latency compensation into account.
4485 const PortSet& ports (_input->ports());
4486 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4487 p->set_public_latency_range (range, playback);
4492 const PortSet& ports (_output->ports());
4493 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4494 p->set_public_latency_range (range, playback);
4499 /** Put the invisible processors in the right place in _processors.
4500 * Must be called with a writer lock on _processor_lock held.
4503 __attribute__((annotate("realtime")))
4506 Route::setup_invisible_processors ()
4509 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4510 assert (!lm.locked ());
4514 /* too early to be doing this stuff */
4518 /* we'll build this new list here and then use it
4520 * TODO put the ProcessorList is on the stack for RT-safety.
4523 ProcessorList new_processors;
4525 /* find visible processors */
4527 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4528 if ((*i)->display_to_user ()) {
4529 new_processors.push_back (*i);
4535 ProcessorList::iterator amp = new_processors.begin ();
4536 while (amp != new_processors.end() && *amp != _amp) {
4540 assert (amp != new_processors.end ());
4542 /* and the processor after the amp */
4544 ProcessorList::iterator after_amp = amp;
4550 switch (_meter_point) {
4552 assert (!_meter->display_to_user ());
4553 new_processors.push_front (_meter);
4556 assert (!_meter->display_to_user ());
4557 new_processors.insert (amp, _meter);
4559 case MeterPostFader:
4560 /* do nothing here */
4563 /* do nothing here */
4566 /* the meter is visible, so we don't touch it here */
4573 assert (_main_outs);
4574 assert (!_main_outs->display_to_user ());
4575 new_processors.push_back (_main_outs);
4577 /* iterator for the main outs */
4579 ProcessorList::iterator main = new_processors.end();
4582 /* OUTPUT METERING */
4584 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4585 assert (!_meter->display_to_user ());
4587 /* add the processor just before or just after the main outs */
4589 ProcessorList::iterator meter_point = main;
4591 if (_meter_point == MeterOutput) {
4594 new_processors.insert (meter_point, _meter);
4599 if (_monitor_send && !is_monitor ()) {
4600 assert (!_monitor_send->display_to_user ());
4601 switch (Config->get_listen_position ()) {
4602 case PreFaderListen:
4603 switch (Config->get_pfl_position ()) {
4604 case PFLFromBeforeProcessors:
4605 new_processors.push_front (_monitor_send);
4607 case PFLFromAfterProcessors:
4608 new_processors.insert (amp, _monitor_send);
4611 _monitor_send->set_can_pan (false);
4613 case AfterFaderListen:
4614 switch (Config->get_afl_position ()) {
4615 case AFLFromBeforeProcessors:
4616 new_processors.insert (after_amp, _monitor_send);
4618 case AFLFromAfterProcessors:
4619 new_processors.insert (new_processors.end(), _monitor_send);
4622 _monitor_send->set_can_pan (true);
4627 #if 0 // not used - just yet
4628 if (!is_master() && !is_monitor() && !is_auditioner()) {
4629 new_processors.push_front (_delayline);
4633 /* MONITOR CONTROL */
4635 if (_monitor_control && is_monitor ()) {
4636 assert (!_monitor_control->display_to_user ());
4637 new_processors.push_front (_monitor_control);
4640 /* INTERNAL RETURN */
4642 /* doing this here means that any monitor control will come just after
4647 assert (!_intreturn->display_to_user ());
4648 new_processors.push_front (_intreturn);
4651 if (_trim && _trim->active()) {
4652 assert (!_trim->display_to_user ());
4653 new_processors.push_front (_trim);
4655 /* EXPORT PROCESSOR */
4657 if (_capturing_processor) {
4658 assert (!_capturing_processor->display_to_user ());
4659 new_processors.push_front (_capturing_processor);
4662 _processors = new_processors;
4664 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4665 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4670 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4671 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4672 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4679 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4680 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4684 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4685 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4692 /** If the meter point is `Custom', make a note of where the meter is.
4693 * This is so that if the meter point is subsequently set to something else,
4694 * and then back to custom, we can put the meter back where it was last time
4695 * custom was enabled.
4697 * Must be called with the _processor_lock held.
4700 Route::maybe_note_meter_position ()
4702 if (_meter_point != MeterCustom) {
4706 _custom_meter_position_noted = true;
4707 /* custom meter points range from after trim to before panner/main_outs
4708 * this is a limitation by the current processor UI
4710 bool seen_trim = false;
4711 _processor_after_last_custom_meter.reset();
4712 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4713 if ((*i) == _trim) {
4716 if ((*i) == _main_outs) {
4717 _processor_after_last_custom_meter = *i;
4720 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4722 _processor_after_last_custom_meter = _trim;
4724 ProcessorList::iterator j = i;
4726 assert(j != _processors.end ()); // main_outs should be before
4727 _processor_after_last_custom_meter = *j;
4732 assert(_processor_after_last_custom_meter.lock());
4735 boost::shared_ptr<Processor>
4736 Route::processor_by_id (PBD::ID id) const
4738 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4739 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4740 if ((*i)->id() == id) {
4745 return boost::shared_ptr<Processor> ();
4748 /** @return the monitoring state, or in other words what data we are pushing
4749 * into the route (data from the inputs, data from disk or silence)
4752 Route::monitoring_state () const
4754 return MonitoringInput;
4757 /** @return what we should be metering; either the data coming from the input
4758 * IO or the data that is flowing through the route.
4761 Route::metering_state () const
4763 return MeteringRoute;
4767 Route::has_external_redirects () const
4769 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4771 /* ignore inactive processors and obviously ignore the main
4772 * outs since everything has them and we don't care.
4775 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4783 boost::shared_ptr<Processor>
4784 Route::the_instrument () const
4786 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4787 return the_instrument_unlocked ();
4790 boost::shared_ptr<Processor>
4791 Route::the_instrument_unlocked () const
4793 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4794 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4795 if ((*i)->input_streams().n_midi() > 0 &&
4796 (*i)->output_streams().n_audio() > 0) {
4801 return boost::shared_ptr<Processor>();
4807 Route::non_realtime_locate (framepos_t pos)
4810 _pannable->transport_located (pos);
4813 if (_delayline.get()) {
4814 _delayline.get()->flush();
4818 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4819 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4821 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4822 (*i)->transport_located (pos);
4825 _roll_delay = _initial_delay;
4829 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4836 * We don't currently mix MIDI input together, so we don't need the
4837 * complex logic of the audio case.
4840 n_buffers = bufs.count().n_midi ();
4842 for (i = 0; i < n_buffers; ++i) {
4844 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4845 MidiBuffer& buf (bufs.get_midi (i));
4848 buf.copy (source_port->get_midi_buffer(nframes));
4850 buf.silence (nframes);
4856 n_buffers = bufs.count().n_audio();
4858 size_t n_ports = io->n_ports().n_audio();
4859 float scaling = 1.0f;
4861 if (n_ports > n_buffers) {
4862 scaling = ((float) n_buffers) / n_ports;
4865 for (i = 0; i < n_ports; ++i) {
4867 /* if there are more ports than buffers, map them onto buffers
4868 * in a round-robin fashion
4871 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4872 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4875 if (i < n_buffers) {
4877 /* first time through just copy a channel into
4881 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4883 if (scaling != 1.0f) {
4884 buf.apply_gain (scaling, nframes);
4889 /* on subsequent times around, merge data from
4890 * the port with what is already there
4893 if (scaling != 1.0f) {
4894 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4896 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4901 /* silence any remaining buffers */
4903 for (; i < n_buffers; ++i) {
4904 AudioBuffer& buf (bufs.get_audio (i));
4905 buf.silence (nframes);
4908 /* establish the initial setup of the buffer set, reflecting what was
4909 copied into it. unless, of course, we are the auditioner, in which
4910 case nothing was fed into it from the inputs at all.
4913 if (!is_auditioner()) {
4914 bufs.set_count (io->n_ports());