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"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_track.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/buffer.h"
44 #include "ardour/buffer_set.h"
45 #include "ardour/capturing_processor.h"
46 #include "ardour/debug.h"
47 #include "ardour/delivery.h"
48 #include "ardour/internal_return.h"
49 #include "ardour/internal_send.h"
50 #include "ardour/meter.h"
51 #include "ardour/delayline.h"
52 #include "ardour/midi_buffer.h"
53 #include "ardour/midi_port.h"
54 #include "ardour/monitor_processor.h"
55 #include "ardour/pannable.h"
56 #include "ardour/panner.h"
57 #include "ardour/panner_shell.h"
58 #include "ardour/plugin_insert.h"
59 #include "ardour/port.h"
60 #include "ardour/port_insert.h"
61 #include "ardour/processor.h"
62 #include "ardour/profile.h"
63 #include "ardour/route.h"
64 #include "ardour/route_group.h"
65 #include "ardour/send.h"
66 #include "ardour/session.h"
67 #include "ardour/unknown_processor.h"
68 #include "ardour/utils.h"
73 using namespace ARDOUR;
76 PBD::Signal0<void> Route::SyncOrderKeys;
77 PBD::Signal0<void> Route::RemoteControlIDChange;
79 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
80 : SessionObject (sess, name)
82 , GraphNode (sess._process_graph)
85 , _signal_latency_at_amp_position (0)
86 , _signal_latency_at_trim_position (0)
89 , _pending_process_reorder (0)
90 , _pending_signals (0)
92 , _pending_declick (true)
93 , _meter_point (MeterPostFader)
94 , _pending_meter_point (MeterPostFader)
95 , _meter_type (MeterPeak)
97 , _soloed_by_others_upstream (0)
98 , _soloed_by_others_downstream (0)
99 , _solo_isolated (false)
100 , _solo_isolated_by_upstream (0)
101 , _denormal_protection (false)
104 , _declickable (false)
105 , _mute_master (new MuteMaster (sess, name))
106 , _have_internal_generator (false)
108 , _default_type (default_type)
110 , _has_order_key (false)
111 , _remote_control_id (0)
113 , _in_configure_processors (false)
114 , _initial_io_setup (false)
115 , _custom_meter_position_noted (false)
117 processor_max_streams.reset();
123 /* set default meter type */
125 _meter_type = Config->get_meter_type_master ();
127 else if (dynamic_cast<Track*>(this)) {
128 _meter_type = Config->get_meter_type_track ();
130 _meter_type = Config->get_meter_type_bus ();
133 /* add standard controls */
135 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
136 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
138 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
139 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
141 add_control (_solo_control);
142 add_control (_mute_control);
146 if (!(_flags & Route::MonitorOut)) {
147 _pannable.reset (new Pannable (_session));
150 /* input and output objects */
152 _input.reset (new IO (_session, _name, IO::Input, _default_type));
153 _output.reset (new IO (_session, _name, IO::Output, _default_type));
155 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
156 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
158 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
159 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
161 #if 0 // not used - just yet
162 if (!is_master() && !is_monitor() && !is_auditioner()) {
163 _delayline.reset (new DelayLine (_session, _name));
164 add_processor (_delayline, PreFader);
168 /* add amp processor */
170 _amp.reset (new Amp (_session));
171 add_processor (_amp, PostFader);
174 _trim.reset (new Amp (_session, "trim"));
175 _trim->set_display_to_user (false);
177 if (dynamic_cast<AudioTrack*>(this)) {
178 /* we can't do this in the AudioTrack's constructor
179 * because _trim does not exit then
183 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
188 /* create standard processors: meter, main outs, monitor out;
189 they will be added to _processors by setup_invisible_processors ()
192 _meter.reset (new PeakMeter (_session, _name));
193 _meter->set_owner (this);
194 _meter->set_display_to_user (false);
197 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
198 _main_outs->activate ();
201 /* where we listen to tracks */
202 _intreturn.reset (new InternalReturn (_session));
203 _intreturn->activate ();
205 /* the thing that provides proper control over a control/monitor/listen bus
206 (such as per-channel cut, dim, solo, invert, etc).
208 _monitor_control.reset (new MonitorProcessor (_session));
209 _monitor_control->activate ();
212 if (is_master() || is_monitor() || is_auditioner()) {
213 _mute_master->set_solo_ignore (true);
216 /* now that we have _meter, its safe to connect to this */
219 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
220 configure_processors (0);
228 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
230 /* do this early so that we don't get incoming signals as we are going through destruction
235 /* don't use clear_processors here, as it depends on the session which may
236 be half-destroyed by now
239 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
240 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
241 (*i)->drop_references ();
244 _processors.clear ();
248 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
250 if (Config->get_remote_model() != UserOrdered) {
254 set_remote_control_id_internal (id, notify_class_listeners);
258 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
260 /* force IDs for master/monitor busses and prevent
261 any other route from accidentally getting these IDs
262 (i.e. legacy sessions)
265 if (is_master() && id != MasterBusRemoteControlID) {
266 id = MasterBusRemoteControlID;
269 if (is_monitor() && id != MonitorBusRemoteControlID) {
270 id = MonitorBusRemoteControlID;
277 /* don't allow it to collide */
279 if (!is_master () && !is_monitor() &&
280 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
281 id += MonitorBusRemoteControlID;
284 if (id != remote_control_id()) {
285 _remote_control_id = id;
286 RemoteControlIDChanged ();
288 if (notify_class_listeners) {
289 RemoteControlIDChange ();
295 Route::remote_control_id() const
298 return MasterBusRemoteControlID;
302 return MonitorBusRemoteControlID;
305 return _remote_control_id;
309 Route::has_order_key () const
311 return _has_order_key;
315 Route::order_key () const
321 Route::set_remote_control_id_explicit (uint32_t rid)
323 if (is_master() || is_monitor() || is_auditioner()) {
324 /* hard-coded remote IDs, or no remote ID */
328 if (_remote_control_id != rid) {
329 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
330 _remote_control_id = rid;
331 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
334 /* don't emit the class-level RID signal RemoteControlIDChange here,
335 leave that to the entity that changed the order key, so that we
336 don't get lots of emissions for no good reasons (e.g. when changing
337 all route order keys).
339 See Session::sync_remote_id_from_order_keys() for the (primary|only)
340 spot where that is emitted.
345 Route::set_order_key (uint32_t n)
347 _has_order_key = true;
349 if (_order_key == n) {
355 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
356 name(), order_key ()));
358 _session.set_dirty ();
362 Route::ensure_track_or_route_name(string name, Session &session)
364 string newname = name;
366 while (!session.io_name_is_legal (newname)) {
367 newname = bump_name_once (newname, ' ');
374 Route::inc_gain (gain_t fraction, void *src)
376 _amp->inc_gain (fraction, src);
380 Route::set_gain (gain_t val, void *src)
382 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
384 if (_route_group->is_relative()) {
386 gain_t usable_gain = _amp->gain();
387 if (usable_gain < 0.000001f) {
388 usable_gain = 0.000001f;
392 if (delta < 0.000001f) {
396 delta -= usable_gain;
401 gain_t factor = delta / usable_gain;
404 factor = _route_group->get_max_factor(factor);
405 if (factor == 0.0f) {
406 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
410 factor = _route_group->get_min_factor(factor);
411 if (factor == 0.0f) {
412 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
417 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
421 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
427 if (val == _amp->gain()) {
431 _amp->set_gain (val, src);
435 Route::inc_trim (gain_t fraction, void *src)
437 _trim->inc_gain (fraction, src);
441 Route::set_trim (gain_t val, void * /* src */)
443 // TODO route group, see set_gain()
444 _trim->set_gain (val, 0);
448 Route::maybe_declick (BufferSet&, framecnt_t, int)
450 /* this is the "bus" implementation and they never declick.
455 /** Process this route for one (sub) cycle (process thread)
457 * @param bufs Scratch buffers to use for the signal path
458 * @param start_frame Initial transport frame
459 * @param end_frame Final transport frame
460 * @param nframes Number of frames to output (to ports)
462 * Note that (end_frame - start_frame) may not be equal to nframes when the
463 * transport speed isn't 1.0 (eg varispeed).
466 Route::process_output_buffers (BufferSet& bufs,
467 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
468 int declick, bool gain_automation_ok)
470 /* Caller must hold process lock */
471 assert (!AudioEngine::instance()->process_lock().trylock());
473 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
475 // can this actually happen? functions calling process_output_buffers()
476 // already take a reader-lock.
477 bufs.silence (nframes, 0);
481 /* figure out if we're going to use gain automation */
482 if (gain_automation_ok) {
483 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
484 _amp->setup_gain_automation (
485 start_frame + _signal_latency_at_amp_position,
486 end_frame + _signal_latency_at_amp_position,
489 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
490 _trim->setup_gain_automation (
491 start_frame + _signal_latency_at_trim_position,
492 end_frame + _signal_latency_at_trim_position,
495 _amp->apply_gain_automation (false);
496 _trim->apply_gain_automation (false);
499 /* Tell main outs what to do about monitoring. We do this so that
500 on a transition between monitoring states we get a de-clicking gain
501 change in the _main_outs delivery, if config.get_use_monitor_fades()
504 We override this in the case where we have an internal generator.
506 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
508 _main_outs->no_outs_cuz_we_no_monitor (silence);
510 /* -------------------------------------------------------------------------------------------
511 GLOBAL DECLICK (for transport changes etc.)
512 ----------------------------------------------------------------------------------------- */
514 maybe_declick (bufs, nframes, declick);
515 _pending_declick = 0;
517 /* -------------------------------------------------------------------------------------------
518 DENORMAL CONTROL/PHASE INVERT
519 ----------------------------------------------------------------------------------------- */
521 if (_phase_invert.any ()) {
525 if (_denormal_protection || Config->get_denormal_protection()) {
527 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
528 Sample* const sp = i->data();
530 if (_phase_invert[chn]) {
531 for (pframes_t nx = 0; nx < nframes; ++nx) {
536 for (pframes_t nx = 0; nx < nframes; ++nx) {
544 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
545 Sample* const sp = i->data();
547 if (_phase_invert[chn]) {
548 for (pframes_t nx = 0; nx < nframes; ++nx) {
557 if (_denormal_protection || Config->get_denormal_protection()) {
559 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
560 Sample* const sp = i->data();
561 for (pframes_t nx = 0; nx < nframes; ++nx) {
569 /* -------------------------------------------------------------------------------------------
571 ----------------------------------------------------------------------------------------- */
573 /* set this to be true if the meter will already have been ::run() earlier */
574 bool const meter_already_run = metering_state() == MeteringInput;
576 framecnt_t latency = 0;
578 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
580 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
581 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
586 /* if it has any inputs, make sure they match */
587 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
588 if (bufs.count() != (*i)->input_streams()) {
590 DEBUG::Processors, string_compose (
591 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
592 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
599 /* should we NOT run plugins here if the route is inactive?
600 do we catch route != active somewhere higher?
603 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
604 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
607 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
608 bufs.set_count ((*i)->output_streams());
610 if ((*i)->active ()) {
611 latency += (*i)->signal_latency ();
617 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
618 boost::shared_ptr<Processor> endpoint,
619 bool include_endpoint, bool for_export, bool for_freeze)
621 /* If no processing is required, there's no need to go any further. */
622 if (!endpoint && !include_endpoint) {
626 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
627 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
628 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
630 /* trim is always at the top, for bounce no latency compensation is needed */
631 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
632 _trim->setup_gain_automation (start, start + nframes, nframes);
635 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
637 if (!include_endpoint && (*i) == endpoint) {
641 /* if we're not exporting, stop processing if we come across a routing processor. */
642 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
645 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
649 /* don't run any processors that does routing.
650 * oh, and don't bother with the peak meter either.
652 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
653 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
654 buffers.set_count ((*i)->output_streams());
655 latency += (*i)->signal_latency ();
658 if ((*i) == endpoint) {
665 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
666 bool include_endpoint, bool for_export, bool for_freeze) const
668 framecnt_t latency = 0;
669 if (!endpoint && !include_endpoint) {
673 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
674 if (!include_endpoint && (*i) == endpoint) {
677 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
680 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
683 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
684 latency += (*i)->signal_latency ();
686 if ((*i) == endpoint) {
694 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
695 bool include_endpoint, bool for_export, bool for_freeze) const
697 if (!endpoint && !include_endpoint) {
701 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
702 if (!include_endpoint && (*i) == endpoint) {
705 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
708 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
711 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
712 cc = (*i)->output_streams();
714 if ((*i) == endpoint) {
722 Route::n_process_buffers ()
724 return max (_input->n_ports(), processor_max_streams);
728 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
730 assert (is_monitor());
731 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
732 fill_buffers_with_input (bufs, _input, nframes);
733 passthru (bufs, start_frame, end_frame, nframes, declick);
737 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
741 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
743 /* control/monitor bus ignores input ports when something is
744 feeding the listen "stream". data will "arrive" into the
745 route from the intreturn processor element.
748 bufs.silence (nframes, 0);
751 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
752 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
756 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
758 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
760 bufs.set_count (_input->n_ports());
761 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
762 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
766 Route::set_listen (bool yn, void* src)
772 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
773 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
778 if (yn != _monitor_send->active()) {
780 _monitor_send->activate ();
781 _mute_master->set_soloed_by_self (true);
783 _monitor_send->deactivate ();
784 _mute_master->set_soloed_by_self (false);
786 _mute_master->set_soloed_by_others (false);
788 listen_changed (src); /* EMIT SIGNAL */
794 Route::listening_via_monitor () const
797 return _monitor_send->active ();
804 Route::set_solo_safe (bool yn, void *src)
806 if (_solo_safe != yn) {
808 solo_safe_changed (src);
813 Route::solo_safe() const
819 Route::set_solo (bool yn, void *src)
822 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
826 if (is_master() || is_monitor() || is_auditioner()) {
827 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
831 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
832 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
836 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
837 name(), yn, src, (src == _route_group), self_soloed()));
839 if (self_soloed() != yn) {
841 set_mute_master_solo ();
842 solo_changed (true, src); /* EMIT SIGNAL */
843 _solo_control->Changed (); /* EMIT SIGNAL */
846 /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
847 Config->get_solo_mute_overrride().
850 if (yn && Profile->get_trx()) {
851 set_mute (false, src);
856 Route::set_self_solo (bool yn)
858 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
863 Route::mod_solo_by_others_upstream (int32_t delta)
865 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
866 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
868 uint32_t old_sbu = _soloed_by_others_upstream;
871 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
872 _soloed_by_others_upstream += delta;
874 _soloed_by_others_upstream = 0;
877 _soloed_by_others_upstream += delta;
880 DEBUG_TRACE (DEBUG::Solo, string_compose (
881 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
882 name(), delta, _soloed_by_others_upstream, old_sbu,
883 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
885 /* push the inverse solo change to everything that feeds us.
887 This is important for solo-within-group. When we solo 1 track out of N that
888 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
889 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
890 tracks that feed it. This will silence them if they were audible because
891 of a bus solo, but the newly soloed track will still be audible (because
894 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
898 if ((_self_solo || _soloed_by_others_downstream) &&
899 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
900 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
902 if (delta > 0 || !Config->get_exclusive_solo()) {
903 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
904 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
905 boost::shared_ptr<Route> sr = i->r.lock();
907 sr->mod_solo_by_others_downstream (-delta);
913 set_mute_master_solo ();
914 solo_changed (false, this);
918 Route::mod_solo_by_others_downstream (int32_t delta)
920 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
921 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
924 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
925 _soloed_by_others_downstream += delta;
927 _soloed_by_others_downstream = 0;
930 _soloed_by_others_downstream += delta;
933 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
935 set_mute_master_solo ();
936 solo_changed (false, this);
940 Route::set_mute_master_solo ()
942 _mute_master->set_soloed_by_self (self_soloed());
943 _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
947 Route::mod_solo_isolated_by_upstream (bool yn, void* src)
949 bool old = solo_isolated ();
952 if (_solo_isolated_by_upstream >= 1) {
953 _solo_isolated_by_upstream--;
955 _solo_isolated_by_upstream = 0;
958 _solo_isolated_by_upstream++;
961 if (solo_isolated() != old) {
962 /* solo isolated status changed */
963 _mute_master->set_solo_ignore (yn);
964 solo_isolated_changed (src);
969 Route::set_solo_isolated (bool yn, void *src)
971 if (is_master() || is_monitor() || is_auditioner()) {
975 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
976 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
980 bool changed = false;
983 if (_solo_isolated == false) {
984 _mute_master->set_solo_ignore (true);
987 _solo_isolated = true;
989 if (_solo_isolated == true) {
990 _solo_isolated = false;
991 _mute_master->set_solo_ignore (false);
1001 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1003 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1004 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1006 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1011 bool does_feed = feeds (*i, &sends_only);
1013 if (does_feed && !sends_only) {
1014 (*i)->mod_solo_isolated_by_upstream (yn, src);
1018 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1020 solo_isolated_changed (src);
1024 Route::solo_isolated () const
1026 return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
1030 Route::set_mute_points (MuteMaster::MutePoint mp)
1032 _mute_master->set_mute_points (mp);
1033 mute_points_changed (); /* EMIT SIGNAL */
1035 if (_mute_master->muted_by_self()) {
1036 mute_changed (this); /* EMIT SIGNAL */
1037 _mute_control->Changed (); /* EMIT SIGNAL */
1042 Route::set_mute (bool yn, void *src)
1044 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1045 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1049 if (muted() != yn) {
1050 _mute_master->set_muted_by_self (yn);
1051 /* allow any derived classes to respond to the mute change
1052 before anybody else knows about it.
1055 /* tell everyone else */
1056 mute_changed (src); /* EMIT SIGNAL */
1057 _mute_control->Changed (); /* EMIT SIGNAL */
1062 Route::muted () const
1064 return _mute_master->muted_by_self();
1068 Route::muted_by_others () const
1070 // This method is only used by route_ui for display state.
1071 // The real thing is MuteMaster::muted_by_others_at()
1073 //master is never muted by others
1077 //now check to see if something is soloed (and I am not)
1078 //see also MuteMaster::mute_gain_at()
1079 return (_session.soloing() && !soloed() && !solo_isolated());
1084 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1086 cerr << name << " {" << endl;
1087 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1088 p != procs.end(); ++p) {
1089 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1091 cerr << "}" << endl;
1095 /** Supposing that we want to insert a Processor at a given Placement, return
1096 * the processor to add the new one before (or 0 to add at the end).
1098 boost::shared_ptr<Processor>
1099 Route::before_processor_for_placement (Placement p)
1101 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1103 ProcessorList::iterator loc;
1105 if (p == PreFader) {
1106 /* generic pre-fader: insert immediately before the amp */
1107 loc = find (_processors.begin(), _processors.end(), _amp);
1109 /* generic post-fader: insert right before the main outs */
1110 loc = find (_processors.begin(), _processors.end(), _main_outs);
1113 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1116 /** Supposing that we want to insert a Processor at a given index, return
1117 * the processor to add the new one before (or 0 to add at the end).
1119 boost::shared_ptr<Processor>
1120 Route::before_processor_for_index (int index)
1123 return boost::shared_ptr<Processor> ();
1126 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1128 ProcessorList::iterator i = _processors.begin ();
1130 while (i != _processors.end() && j < index) {
1131 if ((*i)->display_to_user()) {
1138 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1141 /** Add a processor either pre- or post-fader
1142 * @return 0 on success, non-0 on failure.
1145 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1147 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1151 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1152 * @param index Index to add the processor at, or -1 to add at the end of the list.
1153 * @return 0 on success, non-0 on failure.
1156 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1158 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1161 /** Add a processor to the route.
1162 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1163 * @return 0 on success, non-0 on failure.
1166 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1168 assert (processor != _meter);
1169 assert (processor != _main_outs);
1171 DEBUG_TRACE (DEBUG::Processors, string_compose (
1172 "%1 adding processor %2\n", name(), processor->name()));
1174 if (!AudioEngine::instance()->connected() || !processor) {
1179 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1180 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1181 ProcessorState pstate (this);
1183 boost::shared_ptr<PluginInsert> pi;
1184 boost::shared_ptr<PortInsert> porti;
1186 if (processor == _amp) {
1187 /* Ensure that only one amp is in the list at any time */
1188 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1189 if (check != _processors.end()) {
1190 if (before == _amp) {
1191 /* Already in position; all is well */
1194 _processors.erase (check);
1199 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1201 ProcessorList::iterator loc;
1203 /* inserting before a processor; find it */
1204 loc = find (_processors.begin(), _processors.end(), before);
1205 if (loc == _processors.end ()) {
1210 /* inserting at end */
1211 loc = _processors.end ();
1214 _processors.insert (loc, processor);
1215 processor->set_owner (this);
1217 // Set up processor list channels. This will set processor->[input|output]_streams(),
1218 // configure redirect ports properly, etc.
1221 if (configure_processors_unlocked (err)) {
1223 configure_processors_unlocked (0); // it worked before we tried to add it ...
1228 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1230 if (pi->has_no_inputs ()) {
1231 /* generator plugin */
1232 _have_internal_generator = true;
1237 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
1238 processor->activate ();
1241 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1243 _output->set_user_latency (0);
1246 reset_instrument_info ();
1247 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1248 set_processor_positions ();
1254 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1256 const XMLProperty *prop;
1259 boost::shared_ptr<Processor> processor;
1261 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1262 so that we can add the processor in the right place (pre/post-fader)
1265 XMLNodeList const & children = node.children ();
1266 XMLNodeList::const_iterator i = children.begin ();
1268 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1272 Placement placement = PreFader;
1274 if (i != children.end()) {
1275 if ((prop = (*i)->property (X_("placement"))) != 0) {
1276 placement = Placement (string_2_enum (prop->value(), placement));
1280 if (node.name() == "Insert") {
1282 if ((prop = node.property ("type")) != 0) {
1284 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1285 prop->value() == "lv2" ||
1286 prop->value() == "windows-vst" ||
1287 prop->value() == "lxvst" ||
1288 prop->value() == "audiounit") {
1290 if (_session.get_disable_all_loaded_plugins ()) {
1291 processor.reset (new UnknownProcessor (_session, node));
1293 processor.reset (new PluginInsert (_session));
1298 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1303 } else if (node.name() == "Send") {
1305 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1306 processor.reset (new Send (_session, sendpan, _mute_master));
1310 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1314 if (processor->set_state (node, version)) {
1318 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1319 if (i != children.end()) {
1320 if ((prop = (*i)->property (X_("active"))) != 0) {
1321 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1322 processor->activate();
1324 processor->deactivate();
1328 return (add_processor (processor, placement, 0, false) == 0);
1331 catch (failed_constructor &err) {
1332 warning << _("processor could not be created. Ignored.") << endmsg;
1338 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1340 /* NOTE: this is intended to be used ONLY when copying
1341 processors from another Route. Hence the subtle
1342 differences between this and ::add_processor()
1345 ProcessorList::iterator loc;
1348 loc = find(_processors.begin(), _processors.end(), before);
1350 /* nothing specified - at end */
1351 loc = _processors.end ();
1354 if (!_session.engine().connected()) {
1358 if (others.empty()) {
1363 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1364 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1365 ProcessorState pstate (this);
1367 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1373 boost::shared_ptr<PluginInsert> pi;
1375 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1379 _processors.insert (loc, *i);
1380 (*i)->set_owner (this);
1382 if ((*i)->active()) {
1386 /* Think: does this really need to be called for every processor in the loop? */
1388 if (configure_processors_unlocked (err)) {
1390 configure_processors_unlocked (0); // it worked before we tried to add it ...
1395 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1398 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1399 boost::shared_ptr<PluginInsert> pi;
1401 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1402 if (pi->has_no_inputs ()) {
1403 _have_internal_generator = true;
1409 _output->set_user_latency (0);
1412 reset_instrument_info ();
1413 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1414 set_processor_positions ();
1420 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1422 if (p == PreFader) {
1423 start = _processors.begin();
1424 end = find(_processors.begin(), _processors.end(), _amp);
1426 start = find(_processors.begin(), _processors.end(), _amp);
1428 end = _processors.end();
1432 /** Turn off all processors with a given placement
1433 * @param p Placement of processors to disable
1436 Route::disable_processors (Placement p)
1438 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1440 ProcessorList::iterator start, end;
1441 placement_range(p, start, end);
1443 for (ProcessorList::iterator i = start; i != end; ++i) {
1444 (*i)->deactivate ();
1447 _session.set_dirty ();
1450 /** Turn off all redirects
1453 Route::disable_processors ()
1455 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1457 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1458 (*i)->deactivate ();
1461 _session.set_dirty ();
1464 /** Turn off all redirects with a given placement
1465 * @param p Placement of redirects to disable
1468 Route::disable_plugins (Placement p)
1470 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1472 ProcessorList::iterator start, end;
1473 placement_range(p, start, end);
1475 for (ProcessorList::iterator i = start; i != end; ++i) {
1476 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1477 (*i)->deactivate ();
1481 _session.set_dirty ();
1484 /** Turn off all plugins
1487 Route::disable_plugins ()
1489 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1491 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1492 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1493 (*i)->deactivate ();
1497 _session.set_dirty ();
1502 Route::ab_plugins (bool forward)
1504 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1508 /* forward = turn off all active redirects, and mark them so that the next time
1509 we go the other way, we will revert them
1512 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1513 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1517 if ((*i)->active()) {
1518 (*i)->deactivate ();
1519 (*i)->set_next_ab_is_active (true);
1521 (*i)->set_next_ab_is_active (false);
1527 /* backward = if the redirect was marked to go active on the next ab, do so */
1529 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1531 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1535 if ((*i)->get_next_ab_is_active()) {
1538 (*i)->deactivate ();
1543 _session.set_dirty ();
1547 /** Remove processors with a given placement.
1548 * @param p Placement of processors to remove.
1551 Route::clear_processors (Placement p)
1553 if (!_session.engine().connected()) {
1557 bool already_deleting = _session.deletion_in_progress();
1558 if (!already_deleting) {
1559 _session.set_deletion_in_progress();
1563 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1564 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1565 ProcessorList new_list;
1566 ProcessorStreams err;
1567 bool seen_amp = false;
1569 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1575 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1577 /* you can't remove these */
1579 new_list.push_back (*i);
1586 new_list.push_back (*i);
1589 (*i)->drop_references ();
1597 (*i)->drop_references ();
1600 new_list.push_back (*i);
1607 _processors = new_list;
1608 configure_processors_unlocked (&err); // this can't fail
1611 processor_max_streams.reset();
1612 _have_internal_generator = false;
1613 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1614 set_processor_positions ();
1616 reset_instrument_info ();
1618 if (!already_deleting) {
1619 _session.clear_deletion_in_progress();
1624 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1626 // TODO once the export point can be configured properly, do something smarter here
1627 if (processor == _capturing_processor) {
1628 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1629 if (need_process_lock) {
1633 _capturing_processor.reset();
1635 if (need_process_lock) {
1640 /* these can never be removed */
1642 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1646 if (!_session.engine().connected()) {
1650 processor_max_streams.reset();
1653 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1654 if (need_process_lock) {
1658 /* Caller must hold process lock */
1659 assert (!AudioEngine::instance()->process_lock().trylock());
1661 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1663 ProcessorState pstate (this);
1665 ProcessorList::iterator i;
1666 bool removed = false;
1668 for (i = _processors.begin(); i != _processors.end(); ) {
1669 if (*i == processor) {
1671 /* move along, see failure case for configure_processors()
1672 where we may need to reconfigure the processor.
1675 /* stop redirects that send signals to JACK ports
1676 from causing noise as a result of no longer being
1680 boost::shared_ptr<IOProcessor> iop;
1682 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1686 i = _processors.erase (i);
1694 _output->set_user_latency (0);
1702 if (configure_processors_unlocked (err)) {
1704 /* we know this will work, because it worked before :) */
1705 configure_processors_unlocked (0);
1709 _have_internal_generator = false;
1711 for (i = _processors.begin(); i != _processors.end(); ++i) {
1712 boost::shared_ptr<PluginInsert> pi;
1714 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1715 if (pi->has_no_inputs ()) {
1716 _have_internal_generator = true;
1721 if (need_process_lock) {
1726 reset_instrument_info ();
1727 processor->drop_references ();
1728 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1729 set_processor_positions ();
1735 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1737 ProcessorList deleted;
1739 if (!_session.engine().connected()) {
1743 processor_max_streams.reset();
1746 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1747 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1748 ProcessorState pstate (this);
1750 ProcessorList::iterator i;
1751 boost::shared_ptr<Processor> processor;
1753 for (i = _processors.begin(); i != _processors.end(); ) {
1757 /* these can never be removed */
1759 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1764 /* see if its in the list of processors to delete */
1766 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1771 /* stop IOProcessors that send to JACK ports
1772 from causing noise as a result of no longer being
1776 boost::shared_ptr<IOProcessor> iop;
1778 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1782 deleted.push_back (processor);
1783 i = _processors.erase (i);
1786 if (deleted.empty()) {
1787 /* none of those in the requested list were found */
1791 _output->set_user_latency (0);
1793 if (configure_processors_unlocked (err)) {
1795 /* we know this will work, because it worked before :) */
1796 configure_processors_unlocked (0);
1801 _have_internal_generator = false;
1803 for (i = _processors.begin(); i != _processors.end(); ++i) {
1804 boost::shared_ptr<PluginInsert> pi;
1806 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1807 if (pi->has_no_inputs ()) {
1808 _have_internal_generator = true;
1815 /* now try to do what we need to so that those that were removed will be deleted */
1817 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1818 (*i)->drop_references ();
1821 reset_instrument_info ();
1822 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1823 set_processor_positions ();
1829 Route::reset_instrument_info ()
1831 boost::shared_ptr<Processor> instr = the_instrument();
1833 _instrument_info.set_internal_instrument (instr);
1837 /** Caller must hold process lock */
1839 Route::configure_processors (ProcessorStreams* err)
1841 #ifndef PLATFORM_WINDOWS
1842 assert (!AudioEngine::instance()->process_lock().trylock());
1845 if (!_in_configure_processors) {
1846 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1847 return configure_processors_unlocked (err);
1854 Route::input_streams () const
1856 return _input->n_ports ();
1859 list<pair<ChanCount, ChanCount> >
1860 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1862 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1864 return try_configure_processors_unlocked (in, err);
1867 list<pair<ChanCount, ChanCount> >
1868 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1870 // Check each processor in order to see if we can configure as requested
1872 list<pair<ChanCount, ChanCount> > configuration;
1875 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1876 DEBUG_TRACE (DEBUG::Processors, "{\n");
1878 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1880 if ((*p)->can_support_io_configuration(in, out)) {
1881 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1882 configuration.push_back(make_pair(in, out));
1889 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1890 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1891 DEBUG_TRACE (DEBUG::Processors, "}\n");
1892 return list<pair<ChanCount, ChanCount> > ();
1896 DEBUG_TRACE (DEBUG::Processors, "}\n");
1898 return configuration;
1901 /** Set the input/output configuration of each processor in the processors list.
1902 * Caller must hold process lock.
1903 * Return 0 on success, otherwise configuration is impossible.
1906 Route::configure_processors_unlocked (ProcessorStreams* err)
1908 #ifndef PLATFORM_WINDOWS
1909 assert (!AudioEngine::instance()->process_lock().trylock());
1912 if (_in_configure_processors) {
1916 /* put invisible processors where they should be */
1917 setup_invisible_processors ();
1919 _in_configure_processors = true;
1921 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1923 if (configuration.empty ()) {
1924 _in_configure_processors = false;
1929 bool seen_mains_out = false;
1930 processor_out_streams = _input->n_ports();
1931 processor_max_streams.reset();
1933 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1934 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1936 if (!(*p)->configure_io(c->first, c->second)) {
1937 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1939 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1940 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1942 boost::shared_ptr<PluginInsert> pi;
1943 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1944 /* plugins connected via Split Match may have more channels.
1945 * route/scratch buffers are needed for all of them*/
1946 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
1947 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
1951 if (boost::dynamic_pointer_cast<Delivery> (*p)
1952 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1953 /* main delivery will increase port count to match input.
1954 * the Delivery::Main is usually the last processor - followed only by
1957 seen_mains_out = true;
1959 if (!seen_mains_out) {
1960 processor_out_streams = out;
1966 _meter->set_max_channels (processor_max_streams);
1969 /* make sure we have sufficient scratch buffers to cope with the new processor
1972 _session.ensure_buffers (n_process_buffers ());
1974 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1976 _in_configure_processors = false;
1980 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1981 * @param state New active state for those processors.
1984 Route::all_visible_processors_active (bool state)
1986 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1988 if (_processors.empty()) {
1992 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1993 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2000 (*i)->deactivate ();
2004 _session.set_dirty ();
2008 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2010 /* check if re-order requires re-configuration of any processors
2011 * -> compare channel configuration for all processors
2013 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2014 ChanCount c = input_streams ();
2016 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2018 if (c != (*j)->input_streams()) {
2021 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2024 if ((*i)->input_streams() != c) {
2027 c = (*i)->output_streams();
2039 __attribute__((annotate("realtime")))
2042 Route::apply_processor_order (const ProcessorList& new_order)
2044 /* need to hold processor_lock; either read or write lock
2045 * and the engine process_lock.
2046 * Due to r/w lock ambiguity we can only assert the latter
2048 assert (!AudioEngine::instance()->process_lock().trylock());
2051 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2052 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2053 * processors in the current actual processor list that are hidden. Any visible processors
2054 * in the current list but not in "new_order" will be assumed to be deleted.
2057 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2058 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2059 * (note though that ::processors_reorder_needs_configure() ensured that
2060 * this function will only ever be called from the rt-thread if no processor were removed)
2062 * either way, I can't proove it, but an x-run due to re-order here is less likley
2063 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2066 ProcessorList as_it_will_be;
2067 ProcessorList::iterator oiter;
2068 ProcessorList::const_iterator niter;
2070 oiter = _processors.begin();
2071 niter = new_order.begin();
2073 while (niter != new_order.end()) {
2075 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2076 then append it to the temp list.
2078 Otherwise, see if the next processor in the old list is in the new list. if not,
2079 its been deleted. If its there, append it to the temp list.
2082 if (oiter == _processors.end()) {
2084 /* no more elements in the old list, so just stick the rest of
2085 the new order onto the temp list.
2088 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2089 while (niter != new_order.end()) {
2096 if (!(*oiter)->display_to_user()) {
2098 as_it_will_be.push_back (*oiter);
2102 /* visible processor: check that its in the new order */
2104 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2105 /* deleted: do nothing, shared_ptr<> will clean up */
2107 /* ignore this one, and add the next item from the new order instead */
2108 as_it_will_be.push_back (*niter);
2113 /* now remove from old order - its taken care of no matter what */
2114 oiter = _processors.erase (oiter);
2118 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2120 /* If the meter is in a custom position, find it and make a rough note of its position */
2121 maybe_note_meter_position ();
2125 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2127 // it a change is already queued, wait for it
2128 // (unless engine is stopped. apply immediately and proceed
2129 while (g_atomic_int_get (&_pending_process_reorder)) {
2130 if (!AudioEngine::instance()->running()) {
2131 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2132 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2134 apply_processor_order(_pending_processor_order);
2135 setup_invisible_processors ();
2137 g_atomic_int_set (&_pending_process_reorder, 0);
2139 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2140 set_processor_positions ();
2142 // TODO rather use a semaphore or something.
2143 // but since ::reorder_processors() is called
2144 // from the GUI thread, this is fine..
2149 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2151 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2152 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2153 ProcessorState pstate (this);
2155 apply_processor_order (new_order);
2157 if (configure_processors_unlocked (err)) {
2165 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2166 set_processor_positions ();
2169 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2170 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2172 // _pending_processor_order is protected by _processor_lock
2173 _pending_processor_order = new_order;
2174 g_atomic_int_set (&_pending_process_reorder, 1);
2187 Route::get_template()
2189 return state(false);
2193 Route::state(bool full_state)
2195 XMLNode *node = new XMLNode("Route");
2196 ProcessorList::iterator i;
2199 id().print (buf, sizeof (buf));
2200 node->add_property("id", buf);
2201 node->add_property ("name", _name);
2202 node->add_property("default-type", _default_type.to_string());
2205 node->add_property("flags", enum_2_string (_flags));
2208 node->add_property("active", _active?"yes":"no");
2210 boost::to_string (_phase_invert, p);
2211 node->add_property("phase-invert", p);
2212 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2213 node->add_property("meter-point", enum_2_string (_meter_point));
2215 node->add_property("meter-type", enum_2_string (_meter_type));
2218 node->add_property("route-group", _route_group->name());
2221 snprintf (buf, sizeof (buf), "%d", _order_key);
2222 node->add_property ("order-key", buf);
2223 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2224 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2225 node->add_property ("soloed-by-upstream", buf);
2226 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2227 node->add_property ("soloed-by-downstream", buf);
2228 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2229 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2231 node->add_child_nocopy (_input->state (full_state));
2232 node->add_child_nocopy (_output->state (full_state));
2233 node->add_child_nocopy (_solo_control->get_state ());
2234 node->add_child_nocopy (_mute_control->get_state ());
2235 node->add_child_nocopy (_mute_master->get_state ());
2238 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2241 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2242 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2243 remote_control_node->add_property (X_("id"), buf);
2244 node->add_child_nocopy (*remote_control_node);
2246 if (_comment.length()) {
2247 XMLNode *cmt = node->add_child ("Comment");
2248 cmt->add_content (_comment);
2252 node->add_child_nocopy (_pannable->state (full_state));
2255 for (i = _processors.begin(); i != _processors.end(); ++i) {
2257 /* template save: do not include internal sends functioning as
2258 aux sends because the chance of the target ID
2259 in the session where this template is used
2262 similarly, do not save listen sends which connect to
2263 the monitor section, because these will always be
2266 boost::shared_ptr<InternalSend> is;
2268 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2269 if (is->role() == Delivery::Listen) {
2274 node->add_child_nocopy((*i)->state (full_state));
2278 node->add_child_copy (*_extra_xml);
2281 if (_custom_meter_position_noted) {
2282 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2284 after->id().print (buf, sizeof (buf));
2285 node->add_property (X_("processor-after-last-custom-meter"), buf);
2293 Route::set_state (const XMLNode& node, int version)
2295 if (version < 3000) {
2296 return set_state_2X (node, version);
2300 XMLNodeConstIterator niter;
2302 const XMLProperty *prop;
2304 if (node.name() != "Route"){
2305 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2309 if ((prop = node.property (X_("name"))) != 0) {
2310 Route::set_name (prop->value());
2314 _initial_io_setup = true;
2316 if ((prop = node.property (X_("flags"))) != 0) {
2317 _flags = Flag (string_2_enum (prop->value(), _flags));
2322 if (is_master() || is_monitor() || is_auditioner()) {
2323 _mute_master->set_solo_ignore (true);
2327 /* monitor bus does not get a panner, but if (re)created
2328 via XML, it will already have one by the time we
2329 call ::set_state(). so ... remove it.
2334 /* add all processors (except amp, which is always present) */
2336 nlist = node.children();
2337 XMLNode processor_state (X_("processor_state"));
2339 Stateful::save_extra_xml (node);
2341 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2345 if (child->name() == IO::state_node_name) {
2346 if ((prop = child->property (X_("direction"))) == 0) {
2350 if (prop->value() == "Input") {
2351 _input->set_state (*child, version);
2352 } else if (prop->value() == "Output") {
2353 _output->set_state (*child, version);
2357 if (child->name() == X_("Processor")) {
2358 processor_state.add_child_copy (*child);
2361 if (child->name() == X_("Pannable")) {
2363 _pannable->set_state (*child, version);
2365 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2370 if ((prop = node.property (X_("meter-point"))) != 0) {
2371 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2372 set_meter_point (mp, true);
2374 _meter->set_display_to_user (_meter_point == MeterCustom);
2378 if ((prop = node.property (X_("meter-type"))) != 0) {
2379 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2382 _initial_io_setup = false;
2384 set_processor_state (processor_state);
2386 // this looks up the internal instrument in processors
2387 reset_instrument_info();
2389 if ((prop = node.property ("self-solo")) != 0) {
2390 set_self_solo (string_is_affirmative (prop->value()));
2393 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2394 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2395 mod_solo_by_others_upstream (atoi (prop->value()));
2398 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2399 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2400 mod_solo_by_others_downstream (atoi (prop->value()));
2403 if ((prop = node.property ("solo-isolated")) != 0) {
2404 set_solo_isolated (string_is_affirmative (prop->value()), this);
2407 if ((prop = node.property ("solo-safe")) != 0) {
2408 set_solo_safe (string_is_affirmative (prop->value()), this);
2411 if ((prop = node.property (X_("phase-invert"))) != 0) {
2412 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2415 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2416 set_denormal_protection (string_is_affirmative (prop->value()));
2419 if ((prop = node.property (X_("active"))) != 0) {
2420 bool yn = string_is_affirmative (prop->value());
2421 _active = !yn; // force switch
2422 set_active (yn, this);
2425 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2426 set_order_key (atoi(prop->value()));
2429 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2433 string::size_type colon, equal;
2434 string remaining = prop->value();
2436 while (remaining.length()) {
2438 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2439 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2442 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2443 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2446 string keyname = remaining.substr (0, equal);
2448 if ((keyname == "EditorSort") || (keyname == "editor")) {
2449 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2455 colon = remaining.find_first_of (':');
2457 if (colon != string::npos) {
2458 remaining = remaining.substr (colon+1);
2465 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2466 PBD::ID id (prop->value ());
2467 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2468 ProcessorList::const_iterator i = _processors.begin ();
2469 while (i != _processors.end() && (*i)->id() != id) {
2473 if (i != _processors.end ()) {
2474 _processor_after_last_custom_meter = *i;
2475 _custom_meter_position_noted = true;
2479 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2482 if (child->name() == X_("Comment")) {
2484 /* XXX this is a terrible API design in libxml++ */
2486 XMLNode *cmt = *(child->children().begin());
2487 _comment = cmt->content();
2489 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2490 if (prop->value() == "solo") {
2491 _solo_control->set_state (*child, version);
2492 } else if (prop->value() == "mute") {
2493 _mute_control->set_state (*child, version);
2496 } else if (child->name() == X_("RemoteControl")) {
2497 if ((prop = child->property (X_("id"))) != 0) {
2499 sscanf (prop->value().c_str(), "%d", &x);
2500 set_remote_control_id_internal (x);
2503 } else if (child->name() == X_("MuteMaster")) {
2504 _mute_master->set_state (*child, version);
2506 } else if (child->name() == Automatable::xml_node_name) {
2507 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2515 Route::set_state_2X (const XMLNode& node, int version)
2517 LocaleGuard lg (X_("C"));
2519 XMLNodeConstIterator niter;
2521 const XMLProperty *prop;
2523 /* 2X things which still remain to be handled:
2529 if (node.name() != "Route") {
2530 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2534 if ((prop = node.property (X_("flags"))) != 0) {
2535 string f = prop->value ();
2536 boost::replace_all (f, "ControlOut", "MonitorOut");
2537 _flags = Flag (string_2_enum (f, _flags));
2542 if (is_master() || is_monitor() || is_auditioner()) {
2543 _mute_master->set_solo_ignore (true);
2546 if ((prop = node.property (X_("phase-invert"))) != 0) {
2547 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2548 if (string_is_affirmative (prop->value ())) {
2551 set_phase_invert (p);
2554 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2555 set_denormal_protection (string_is_affirmative (prop->value()));
2558 if ((prop = node.property (X_("soloed"))) != 0) {
2559 bool yn = string_is_affirmative (prop->value());
2561 /* XXX force reset of solo status */
2563 set_solo (yn, this);
2566 if ((prop = node.property (X_("muted"))) != 0) {
2569 bool muted = string_is_affirmative (prop->value());
2575 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2577 if (string_is_affirmative (prop->value())){
2578 mute_point = mute_point + "PreFader";
2583 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2585 if (string_is_affirmative (prop->value())){
2588 mute_point = mute_point + ",";
2591 mute_point = mute_point + "PostFader";
2596 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2598 if (string_is_affirmative (prop->value())){
2601 mute_point = mute_point + ",";
2604 mute_point = mute_point + "Listen";
2609 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2611 if (string_is_affirmative (prop->value())){
2614 mute_point = mute_point + ",";
2617 mute_point = mute_point + "Main";
2621 _mute_master->set_mute_points (mute_point);
2622 _mute_master->set_muted_by_self (true);
2626 if ((prop = node.property (X_("meter-point"))) != 0) {
2627 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2630 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2631 don't mean the same thing.
2634 if ((prop = node.property (X_("order-keys"))) != 0) {
2638 string::size_type colon, equal;
2639 string remaining = prop->value();
2641 while (remaining.length()) {
2643 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2644 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2647 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2648 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2651 string keyname = remaining.substr (0, equal);
2653 if (keyname == "EditorSort" || keyname == "editor") {
2654 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2660 colon = remaining.find_first_of (':');
2662 if (colon != string::npos) {
2663 remaining = remaining.substr (colon+1);
2672 nlist = node.children ();
2673 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2677 if (child->name() == IO::state_node_name) {
2679 /* there is a note in IO::set_state_2X() about why we have to call
2683 _input->set_state_2X (*child, version, true);
2684 _output->set_state_2X (*child, version, false);
2686 if ((prop = child->property (X_("name"))) != 0) {
2687 Route::set_name (prop->value ());
2692 if ((prop = child->property (X_("active"))) != 0) {
2693 bool yn = string_is_affirmative (prop->value());
2694 _active = !yn; // force switch
2695 set_active (yn, this);
2698 if ((prop = child->property (X_("gain"))) != 0) {
2701 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2702 _amp->gain_control()->set_value (val);
2706 /* Set up Panners in the IO */
2707 XMLNodeList io_nlist = child->children ();
2709 XMLNodeConstIterator io_niter;
2712 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2714 io_child = *io_niter;
2716 if (io_child->name() == X_("Panner")) {
2717 _main_outs->panner_shell()->set_state(*io_child, version);
2718 } else if (io_child->name() == X_("Automation")) {
2719 /* IO's automation is for the fader */
2720 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2726 XMLNodeList redirect_nodes;
2728 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2732 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2733 redirect_nodes.push_back(child);
2738 set_processor_state_2X (redirect_nodes, version);
2740 Stateful::save_extra_xml (node);
2742 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2745 if (child->name() == X_("Comment")) {
2747 /* XXX this is a terrible API design in libxml++ */
2749 XMLNode *cmt = *(child->children().begin());
2750 _comment = cmt->content();
2752 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2753 if (prop->value() == X_("solo")) {
2754 _solo_control->set_state (*child, version);
2755 } else if (prop->value() == X_("mute")) {
2756 _mute_control->set_state (*child, version);
2759 } else if (child->name() == X_("RemoteControl")) {
2760 if ((prop = child->property (X_("id"))) != 0) {
2762 sscanf (prop->value().c_str(), "%d", &x);
2763 set_remote_control_id_internal (x);
2773 Route::get_processor_state ()
2775 XMLNode* root = new XMLNode (X_("redirects"));
2776 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2777 root->add_child_nocopy ((*i)->state (true));
2784 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2786 /* We don't bother removing existing processors not in nList, as this
2787 method will only be called when creating a Route from scratch, not
2788 for undo purposes. Just put processors in at the appropriate place
2792 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2793 add_processor_from_xml_2X (**i, version);
2798 Route::set_processor_state (const XMLNode& node)
2800 const XMLNodeList &nlist = node.children();
2801 XMLNodeConstIterator niter;
2802 ProcessorList new_order;
2803 bool must_configure = false;
2805 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2807 XMLProperty* prop = (*niter)->property ("type");
2809 if (prop->value() == "amp") {
2810 _amp->set_state (**niter, Stateful::current_state_version);
2811 new_order.push_back (_amp);
2812 } else if (prop->value() == "trim") {
2813 _trim->set_state (**niter, Stateful::current_state_version);
2814 new_order.push_back (_trim);
2815 } else if (prop->value() == "meter") {
2816 _meter->set_state (**niter, Stateful::current_state_version);
2817 new_order.push_back (_meter);
2818 } else if (prop->value() == "delay") {
2820 _delayline->set_state (**niter, Stateful::current_state_version);
2821 new_order.push_back (_delayline);
2823 } else if (prop->value() == "main-outs") {
2824 _main_outs->set_state (**niter, Stateful::current_state_version);
2825 } else if (prop->value() == "intreturn") {
2827 _intreturn.reset (new InternalReturn (_session));
2828 must_configure = true;
2830 _intreturn->set_state (**niter, Stateful::current_state_version);
2831 } else if (is_monitor() && prop->value() == "monitor") {
2832 if (!_monitor_control) {
2833 _monitor_control.reset (new MonitorProcessor (_session));
2834 must_configure = true;
2836 _monitor_control->set_state (**niter, Stateful::current_state_version);
2837 } else if (prop->value() == "capture") {
2838 /* CapturingProcessor should never be restored, it's always
2839 added explicitly when needed */
2841 ProcessorList::iterator o;
2843 for (o = _processors.begin(); o != _processors.end(); ++o) {
2844 XMLProperty* id_prop = (*niter)->property(X_("id"));
2845 if (id_prop && (*o)->id() == id_prop->value()) {
2846 (*o)->set_state (**niter, Stateful::current_state_version);
2847 new_order.push_back (*o);
2852 // If the processor (*niter) is not on the route then create it
2854 if (o == _processors.end()) {
2856 boost::shared_ptr<Processor> processor;
2858 if (prop->value() == "intsend") {
2860 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2862 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2863 prop->value() == "lv2" ||
2864 prop->value() == "windows-vst" ||
2865 prop->value() == "lxvst" ||
2866 prop->value() == "audiounit") {
2868 if (_session.get_disable_all_loaded_plugins ()) {
2869 processor.reset (new UnknownProcessor (_session, **niter));
2871 processor.reset (new PluginInsert (_session));
2873 } else if (prop->value() == "port") {
2875 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2877 } else if (prop->value() == "send") {
2879 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2882 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2886 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2887 /* This processor could not be configured. Turn it into a UnknownProcessor */
2888 processor.reset (new UnknownProcessor (_session, **niter));
2891 /* we have to note the monitor send here, otherwise a new one will be created
2892 and the state of this one will be lost.
2894 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2895 if (isend && isend->role() == Delivery::Listen) {
2896 _monitor_send = isend;
2899 /* it doesn't matter if invisible processors are added here, as they
2900 will be sorted out by setup_invisible_processors () shortly.
2903 new_order.push_back (processor);
2904 must_configure = true;
2910 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2911 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2912 _processors = new_order;
2914 if (must_configure) {
2915 configure_processors_unlocked (0);
2918 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2920 (*i)->set_owner (this);
2921 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2923 boost::shared_ptr<PluginInsert> pi;
2925 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2926 if (pi->has_no_inputs ()) {
2927 _have_internal_generator = true;
2934 reset_instrument_info ();
2935 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2936 set_processor_positions ();
2940 Route::curve_reallocate ()
2942 // _gain_automation_curve.finish_resize ();
2943 // _pan_automation_curve.finish_resize ();
2947 Route::silence (framecnt_t nframes)
2949 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2954 silence_unlocked (nframes);
2958 Route::silence_unlocked (framecnt_t nframes)
2960 /* Must be called with the processor lock held */
2964 _output->silence (nframes);
2966 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2967 boost::shared_ptr<PluginInsert> pi;
2969 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2970 // skip plugins, they don't need anything when we're not active
2974 (*i)->silence (nframes);
2977 if (nframes == _session.get_block_size()) {
2984 Route::add_internal_return ()
2987 _intreturn.reset (new InternalReturn (_session));
2988 add_processor (_intreturn, PreFader);
2993 Route::add_send_to_internal_return (InternalSend* send)
2995 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2997 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2998 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3001 return d->add_send (send);
3007 Route::remove_send_from_internal_return (InternalSend* send)
3009 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3011 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3012 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3015 return d->remove_send (send);
3021 Route::enable_monitor_send ()
3023 /* Caller must hold process lock */
3024 assert (!AudioEngine::instance()->process_lock().trylock());
3026 /* master never sends to monitor section via the normal mechanism */
3027 assert (!is_master ());
3028 assert (!is_monitor ());
3030 /* make sure we have one */
3031 if (!_monitor_send) {
3032 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3033 _monitor_send->set_display_to_user (false);
3037 configure_processors (0);
3040 /** Add an aux send to a route.
3041 * @param route route to send to.
3042 * @param before Processor to insert before, or 0 to insert at the end.
3045 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3047 assert (route != _session.monitor_out ());
3050 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3052 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3054 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3056 if (d && d->target_route() == route) {
3057 /* already listening via the specified IO: do nothing */
3065 boost::shared_ptr<InternalSend> listener;
3068 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3069 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3070 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3073 add_processor (listener, before);
3075 } catch (failed_constructor& err) {
3083 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3085 ProcessorStreams err;
3086 ProcessorList::iterator tmp;
3089 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3091 /* have to do this early because otherwise processor reconfig
3092 * will put _monitor_send back in the list
3095 if (route == _session.monitor_out()) {
3096 _monitor_send.reset ();
3100 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3102 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3104 if (d && d->target_route() == route) {
3106 if (remove_processor (*x, &err, false) > 0) {
3112 /* list could have been demolished while we dropped the lock
3115 if (_session.engine().connected()) {
3116 /* i/o processors cannot be removed if the engine is not running
3117 * so don't live-loop in case the engine is N/A or dies
3127 Route::set_comment (string cmt, void *src)
3130 comment_changed (src);
3131 _session.set_dirty ();
3135 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3137 FeedRecord fr (other, via_sends_only);
3139 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3141 if (!result.second) {
3143 /* already a record for "other" - make sure sends-only information is correct */
3144 if (!via_sends_only && result.first->sends_only) {
3145 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3146 frp->sends_only = false;
3150 return result.second;
3154 Route::clear_fed_by ()
3160 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3162 const FedBy& fed_by (other->fed_by());
3164 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3165 boost::shared_ptr<Route> sr = f->r.lock();
3167 if (sr && (sr.get() == this)) {
3169 if (via_sends_only) {
3170 *via_sends_only = f->sends_only;
3181 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3183 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3185 if (_output->connected_to (other->input())) {
3186 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3187 if (via_send_only) {
3188 *via_send_only = false;
3195 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3197 boost::shared_ptr<IOProcessor> iop;
3199 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3200 if (iop->feeds (other)) {
3201 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3202 if (via_send_only) {
3203 *via_send_only = true;
3207 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3210 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3215 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3220 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3222 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3225 /** Called from the (non-realtime) butler thread when the transport is stopped */
3227 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3229 framepos_t now = _session.transport_frame();
3232 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3234 Automatable::transport_stopped (now);
3236 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3238 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3242 (*i)->transport_stopped (now);
3246 _roll_delay = _initial_delay;
3250 Route::input_change_handler (IOChange change, void * /*src*/)
3252 bool need_to_queue_solo_change = true;
3254 if ((change.type & IOChange::ConfigurationChanged)) {
3255 /* This is called with the process lock held if change
3256 contains ConfigurationChanged
3258 need_to_queue_solo_change = false;
3259 configure_processors (0);
3260 _phase_invert.resize (_input->n_ports().n_audio ());
3261 io_changed (); /* EMIT SIGNAL */
3264 if (!_input->connected() && _soloed_by_others_upstream) {
3265 if (need_to_queue_solo_change) {
3266 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3268 cancel_solo_after_disconnect (true);
3271 } else if (_soloed_by_others_upstream) {
3272 bool cancel_solo = true;
3273 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3274 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3275 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3279 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3280 if (does_feed && !sends_only) {
3281 if ((*i)->soloed()) {
3282 cancel_solo = false;
3288 cancel_solo_after_disconnect (true);
3291 } else if (self_soloed()) {
3293 // TODO propagate upstream
3294 // see commment in output_change_handler() below
3299 Route::output_change_handler (IOChange change, void * /*src*/)
3301 bool need_to_queue_solo_change = true;
3302 if (_initial_io_setup) {
3306 if ((change.type & IOChange::ConfigurationChanged)) {
3307 /* This is called with the process lock held if change
3308 contains ConfigurationChanged
3310 need_to_queue_solo_change = false;
3311 configure_processors (0);
3314 _session.reset_monitor_section();
3317 io_changed (); /* EMIT SIGNAL */
3320 if (!_output->connected() && _soloed_by_others_downstream) {
3321 if (need_to_queue_solo_change) {
3322 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3324 cancel_solo_after_disconnect (false);
3327 } else if (_soloed_by_others_downstream) {
3328 bool cancel_solo = true;
3329 /* checking all all downstream routes for
3330 * explicit of implict solo is a rather drastic measure,
3331 * ideally the input_change_handler() of the other route
3332 * would propagate the change to us.
3334 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3335 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3336 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3340 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3341 if (does_feed && !sends_only) {
3342 if ((*i)->soloed()) {
3343 cancel_solo = false;
3349 cancel_solo_after_disconnect (false);
3352 } else if (self_soloed()) {
3353 // TODO propagate change downstream to the disconnected routes
3354 // Q: how to get the routes that were just disconnected. ?
3355 // A: /maybe/ by diff feeds() aka fed_by() vs direct_feeds_according_to_reality() ?!?
3361 Route::cancel_solo_after_disconnect (bool upstream)
3364 _soloed_by_others_upstream = 0;
3366 _soloed_by_others_downstream = 0;
3368 set_mute_master_solo ();
3369 solo_changed (false, this);
3373 Route::pans_required () const
3375 if (n_outputs().n_audio() < 2) {
3379 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3383 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3385 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3391 if (n_outputs().n_total() == 0) {
3395 if (!_active || n_inputs() == ChanCount::ZERO) {
3396 silence_unlocked (nframes);
3400 if (session_state_changing) {
3401 if (_session.transport_speed() != 0.0f) {
3402 /* we're rolling but some state is changing (e.g. our diskstream contents)
3403 so we cannot use them. Be silent till this is over.
3405 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3407 silence_unlocked (nframes);
3410 /* we're really not rolling, so we're either delivery silence or actually
3411 monitoring, both of which are safe to do while session_state_changing is true.
3415 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3417 fill_buffers_with_input (bufs, _input, nframes);
3419 if (_meter_point == MeterInput) {
3420 _meter->run (bufs, start_frame, end_frame, nframes, true);
3423 _amp->apply_gain_automation (false);
3424 _trim->apply_gain_automation (false);
3425 passthru (bufs, start_frame, end_frame, nframes, 0);
3431 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3433 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3438 if (n_outputs().n_total() == 0) {
3442 if (!_active || n_inputs().n_total() == 0) {
3443 silence_unlocked (nframes);
3447 framepos_t unused = 0;
3449 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3455 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3457 fill_buffers_with_input (bufs, _input, nframes);
3459 if (_meter_point == MeterInput) {
3460 _meter->run (bufs, start_frame, end_frame, nframes, true);
3463 passthru (bufs, start_frame, end_frame, nframes, declick);
3469 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3476 Route::flush_processors ()
3478 /* XXX shouldn't really try to take this lock, since
3479 this is called from the RT audio thread.
3482 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3484 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3490 __attribute__((annotate("realtime")))
3493 Route::apply_processor_changes_rt ()
3495 int emissions = EmitNone;
3497 if (_pending_meter_point != _meter_point) {
3498 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3500 /* meters always have buffers for 'processor_max_streams'
3501 * they can be re-positioned without re-allocation */
3502 if (set_meter_point_unlocked()) {
3503 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3505 emissions |= EmitMeterChanged;
3510 bool changed = false;
3512 if (g_atomic_int_get (&_pending_process_reorder)) {
3513 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3515 apply_processor_order (_pending_processor_order);
3516 setup_invisible_processors ();
3518 g_atomic_int_set (&_pending_process_reorder, 0);
3519 emissions |= EmitRtProcessorChange;
3523 set_processor_positions ();
3525 if (emissions != 0) {
3526 g_atomic_int_set (&_pending_signals, emissions);
3533 Route::emit_pending_signals ()
3536 int sig = g_atomic_int_and (&_pending_signals, 0);
3537 if (sig & EmitMeterChanged) {
3538 _meter->emit_configuration_changed();
3539 meter_change (); /* EMIT SIGNAL */
3540 if (sig & EmitMeterVisibilityChange) {
3541 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3543 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3546 if (sig & EmitRtProcessorChange) {
3547 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3552 Route::set_meter_point (MeterPoint p, bool force)
3554 if (_pending_meter_point == p && !force) {
3558 if (force || !AudioEngine::instance()->running()) {
3559 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3560 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3561 _pending_meter_point = p;
3562 _meter->emit_configuration_changed();
3563 meter_change (); /* EMIT SIGNAL */
3564 if (set_meter_point_unlocked()) {
3565 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3567 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3570 _pending_meter_point = p;
3576 __attribute__((annotate("realtime")))
3579 Route::set_meter_point_unlocked ()
3582 /* Caller must hold process and processor write lock */
3583 assert (!AudioEngine::instance()->process_lock().trylock());
3584 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3585 assert (!lm.locked ());
3588 _meter_point = _pending_meter_point;
3590 bool meter_was_visible_to_user = _meter->display_to_user ();
3592 if (!_custom_meter_position_noted) {
3593 maybe_note_meter_position ();
3596 if (_meter_point != MeterCustom) {
3598 _meter->set_display_to_user (false);
3600 setup_invisible_processors ();
3603 _meter->set_display_to_user (true);
3605 /* If we have a previous position for the custom meter, try to put it there */
3606 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3608 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3609 if (i != _processors.end ()) {
3610 _processors.remove (_meter);
3611 _processors.insert (i, _meter);
3613 } else {// at end, right before the mains_out/panner
3614 _processors.remove (_meter);
3615 ProcessorList::iterator main = _processors.end();
3616 _processors.insert (--main, _meter);
3620 /* Set up the meter for its new position */
3622 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3626 if (loc == _processors.begin()) {
3627 m_in = _input->n_ports();
3629 ProcessorList::iterator before = loc;
3631 m_in = (*before)->output_streams ();
3634 _meter->reflect_inputs (m_in);
3636 /* we do not need to reconfigure the processors, because the meter
3637 (a) is always ready to handle processor_max_streams
3638 (b) is always an N-in/N-out processor, and thus moving
3639 it doesn't require any changes to the other processors.
3642 /* these should really be done after releasing the lock
3643 * but all those signals are subscribed to with gui_thread()
3646 return (_meter->display_to_user() != meter_was_visible_to_user);
3650 Route::listen_position_changed ()
3653 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3654 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3655 ProcessorState pstate (this);
3657 if (configure_processors_unlocked (0)) {
3659 configure_processors_unlocked (0); // it worked before we tried to add it ...
3664 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3665 _session.set_dirty ();
3668 boost::shared_ptr<CapturingProcessor>
3669 Route::add_export_point()
3671 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3672 if (!_capturing_processor) {
3674 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3675 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3677 _capturing_processor.reset (new CapturingProcessor (_session));
3678 _capturing_processor->activate ();
3680 configure_processors_unlocked (0);
3684 return _capturing_processor;
3688 Route::update_signal_latency ()
3690 framecnt_t l = _output->user_latency();
3691 framecnt_t lamp = 0;
3692 bool before_amp = true;
3693 framecnt_t ltrim = 0;
3694 bool before_trim = true;
3696 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3697 if ((*i)->active ()) {
3698 l += (*i)->signal_latency ();
3703 if ((*i) == _trim) {
3714 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3716 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3717 _signal_latency_at_amp_position = lamp;
3718 _signal_latency_at_trim_position = ltrim;
3720 if (_signal_latency != l) {
3721 _signal_latency = l;
3722 signal_latency_changed (); /* EMIT SIGNAL */
3725 return _signal_latency;
3729 Route::set_user_latency (framecnt_t nframes)
3731 _output->set_user_latency (nframes);
3732 _session.update_latency_compensation ();
3736 Route::set_latency_compensation (framecnt_t longest_session_latency)
3738 framecnt_t old = _initial_delay;
3740 if (_signal_latency < longest_session_latency) {
3741 _initial_delay = longest_session_latency - _signal_latency;
3746 DEBUG_TRACE (DEBUG::Latency, string_compose (
3747 "%1: compensate for maximum latency of %2,"
3748 "given own latency of %3, using initial delay of %4\n",
3749 name(), longest_session_latency, _signal_latency, _initial_delay));
3751 if (_initial_delay != old) {
3752 initial_delay_changed (); /* EMIT SIGNAL */
3755 if (_session.transport_stopped()) {
3756 _roll_delay = _initial_delay;
3760 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3761 : AutomationControl (r->session(),
3762 Evoral::Parameter (SoloAutomation),
3763 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3764 boost::shared_ptr<AutomationList>(), name)
3767 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3768 gl->set_interpolation(Evoral::ControlList::Discrete);
3773 Route::SoloControllable::set_value (double val)
3775 const bool bval = ((val >= 0.5) ? true : false);
3777 boost::shared_ptr<RouteList> rl (new RouteList);
3779 boost::shared_ptr<Route> r = _route.lock ();
3786 if (Config->get_solo_control_is_listen_control()) {
3787 _session.set_listen (rl, bval);
3789 _session.set_solo (rl, bval);
3794 Route::SoloControllable::get_value () const
3796 boost::shared_ptr<Route> r = _route.lock ();
3801 if (Config->get_solo_control_is_listen_control()) {
3802 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3804 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3808 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3809 : AutomationControl (r->session(),
3810 Evoral::Parameter (MuteAutomation),
3811 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3812 boost::shared_ptr<AutomationList>(),
3816 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3817 gl->set_interpolation(Evoral::ControlList::Discrete);
3822 Route::MuteControllable::set_superficial_value(bool muted)
3824 /* Note we can not use AutomationControl::set_value here since it will emit
3825 Changed(), but the value will not be correct to the observer. */
3827 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3829 Control::set_double (muted, _session.transport_frame(), to_list);
3833 Route::MuteControllable::set_value (double val)
3835 const bool bval = ((val >= 0.5) ? true : false);
3837 boost::shared_ptr<Route> r = _route.lock ();
3842 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3843 // Playing back automation, set route mute directly
3844 r->set_mute (bval, this);
3846 // Set from user, queue mute event
3847 boost::shared_ptr<RouteList> rl (new RouteList);
3849 _session.set_mute (rl, bval, Session::rt_cleanup);
3852 // Set superficial/automation value to drive controller (and possibly record)
3853 set_superficial_value(bval);
3857 Route::MuteControllable::get_value () const
3859 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3860 // Playing back automation, get the value from the list
3861 return AutomationControl::get_value();
3864 // Not playing back automation, get the actual route mute value
3865 boost::shared_ptr<Route> r = _route.lock ();
3866 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3870 Route::set_block_size (pframes_t nframes)
3872 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3873 (*i)->set_block_size (nframes);
3876 _session.ensure_buffers (n_process_buffers ());
3880 Route::protect_automation ()
3882 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3883 (*i)->protect_automation();
3886 /** @param declick 1 to set a pending declick fade-in,
3887 * -1 to set a pending declick fade-out
3890 Route::set_pending_declick (int declick)
3893 /* this call is not allowed to turn off a pending declick */
3895 _pending_declick = declick;
3898 _pending_declick = 0;
3902 /** Shift automation forwards from a particular place, thereby inserting time.
3903 * Adds undo commands for any shifts that are performed.
3905 * @param pos Position to start shifting from.
3906 * @param frames Amount to shift forwards by.
3910 Route::shift (framepos_t pos, framecnt_t frames)
3912 /* gain automation */
3914 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3916 XMLNode &before = gc->alist()->get_state ();
3917 gc->alist()->shift (pos, frames);
3918 XMLNode &after = gc->alist()->get_state ();
3919 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3922 /* gain automation */
3924 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3926 XMLNode &before = gc->alist()->get_state ();
3927 gc->alist()->shift (pos, frames);
3928 XMLNode &after = gc->alist()->get_state ();
3929 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3932 // TODO mute automation ??
3934 /* pan automation */
3936 ControlSet::Controls& c (_pannable->controls());
3938 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3939 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3941 boost::shared_ptr<AutomationList> al = pc->alist();
3942 XMLNode& before = al->get_state ();
3943 al->shift (pos, frames);
3944 XMLNode& after = al->get_state ();
3945 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3950 /* redirect automation */
3952 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3953 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3955 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3957 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3958 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3960 boost::shared_ptr<AutomationList> al = ac->alist();
3961 XMLNode &before = al->get_state ();
3962 al->shift (pos, frames);
3963 XMLNode &after = al->get_state ();
3964 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3973 Route::save_as_template (const string& path, const string& name)
3975 XMLNode& node (state (false));
3978 IO::set_name_in_state (*node.children().front(), name);
3980 tree.set_root (&node);
3981 return tree.write (path.c_str());
3986 Route::set_name (const string& str)
3988 if (str == name()) {
3992 string name = Route::ensure_track_or_route_name (str, _session);
3993 SessionObject::set_name (name);
3995 bool ret = (_input->set_name(name) && _output->set_name(name));
3998 /* rename the main outs. Leave other IO processors
3999 * with whatever name they already have, because its
4000 * just fine as it is (it will not contain the route
4001 * name if its a port insert, port send or port return).
4005 if (_main_outs->set_name (name)) {
4006 /* XXX returning false here is stupid because
4007 we already changed the route name.
4017 /** Set the name of a route in an XML description.
4018 * @param node XML <Route> node to set the name in.
4019 * @param name New name.
4022 Route::set_name_in_state (XMLNode& node, string const & name)
4024 node.add_property (X_("name"), name);
4026 XMLNodeList children = node.children();
4027 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4029 if ((*i)->name() == X_("IO")) {
4031 IO::set_name_in_state (**i, name);
4033 } else if ((*i)->name() == X_("Processor")) {
4035 XMLProperty* role = (*i)->property (X_("role"));
4036 if (role && role->value() == X_("Main")) {
4037 (*i)->add_property (X_("name"), name);
4040 } else if ((*i)->name() == X_("Diskstream")) {
4042 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4043 (*i)->add_property (X_("name"), name);
4049 boost::shared_ptr<Send>
4050 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4052 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4054 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4055 boost::shared_ptr<InternalSend> send;
4057 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4058 if (send->target_route() == target) {
4064 return boost::shared_ptr<Send>();
4067 /** @param c Audio channel index.
4068 * @param yn true to invert phase, otherwise false.
4071 Route::set_phase_invert (uint32_t c, bool yn)
4073 if (_phase_invert[c] != yn) {
4074 _phase_invert[c] = yn;
4075 phase_invert_changed (); /* EMIT SIGNAL */
4076 _session.set_dirty ();
4081 Route::set_phase_invert (boost::dynamic_bitset<> p)
4083 if (_phase_invert != p) {
4085 phase_invert_changed (); /* EMIT SIGNAL */
4086 _session.set_dirty ();
4091 Route::phase_invert (uint32_t c) const
4093 return _phase_invert[c];
4096 boost::dynamic_bitset<>
4097 Route::phase_invert () const
4099 return _phase_invert;
4103 Route::set_denormal_protection (bool yn)
4105 if (_denormal_protection != yn) {
4106 _denormal_protection = yn;
4107 denormal_protection_changed (); /* EMIT SIGNAL */
4112 Route::denormal_protection () const
4114 return _denormal_protection;
4118 Route::set_active (bool yn, void* src)
4120 if (_session.transport_rolling()) {
4124 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4125 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4129 if (_active != yn) {
4131 _input->set_active (yn);
4132 _output->set_active (yn);
4133 active_changed (); // EMIT SIGNAL
4134 _session.set_dirty ();
4138 boost::shared_ptr<Pannable>
4139 Route::pannable() const
4144 boost::shared_ptr<Panner>
4145 Route::panner() const
4148 return _main_outs->panner_shell()->panner();
4151 boost::shared_ptr<PannerShell>
4152 Route::panner_shell() const
4154 return _main_outs->panner_shell();
4157 boost::shared_ptr<AutomationControl>
4158 Route::gain_control() const
4160 return _amp->gain_control();
4163 boost::shared_ptr<AutomationControl>
4164 Route::get_control (const Evoral::Parameter& param)
4166 /* either we own the control or .... */
4168 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4172 /* maybe one of our processors does or ... */
4174 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4175 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4176 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4184 /* nobody does so we'll make a new one */
4186 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4193 boost::shared_ptr<Processor>
4194 Route::nth_plugin (uint32_t n)
4196 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4197 ProcessorList::iterator i;
4199 for (i = _processors.begin(); i != _processors.end(); ++i) {
4200 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4207 return boost::shared_ptr<Processor> ();
4210 boost::shared_ptr<Processor>
4211 Route::nth_send (uint32_t n)
4213 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4214 ProcessorList::iterator i;
4216 for (i = _processors.begin(); i != _processors.end(); ++i) {
4217 if (boost::dynamic_pointer_cast<Send> (*i)) {
4224 return boost::shared_ptr<Processor> ();
4228 Route::has_io_processor_named (const string& name)
4230 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4231 ProcessorList::iterator i;
4233 for (i = _processors.begin(); i != _processors.end(); ++i) {
4234 if (boost::dynamic_pointer_cast<Send> (*i) ||
4235 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4236 if ((*i)->name() == name) {
4245 MuteMaster::MutePoint
4246 Route::mute_points () const
4248 return _mute_master->mute_points ();
4252 Route::set_processor_positions ()
4254 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4256 bool had_amp = false;
4257 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4258 (*i)->set_pre_fader (!had_amp);
4265 /** Called when there is a proposed change to the input port count */
4267 Route::input_port_count_changing (ChanCount to)
4269 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4271 /* The processors cannot be configured with the new input arrangement, so
4277 /* The change is ok */
4281 /** Called when there is a proposed change to the output port count */
4283 Route::output_port_count_changing (ChanCount to)
4285 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4286 if (processor_out_streams.get(*t) > to.get(*t)) {
4290 /* The change is ok */
4295 Route::unknown_processors () const
4299 if (_session.get_disable_all_loaded_plugins ()) {
4300 // Do not list "missing plugins" if they are explicitly disabled
4304 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4305 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4306 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4307 p.push_back ((*i)->name ());
4316 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4318 /* we assume that all our input ports feed all our output ports. its not
4319 universally true, but the alternative is way too corner-case to worry about.
4322 LatencyRange all_connections;
4325 all_connections.min = 0;
4326 all_connections.max = 0;
4328 all_connections.min = ~((pframes_t) 0);
4329 all_connections.max = 0;
4331 /* iterate over all "from" ports and determine the latency range for all of their
4332 connections to the "outside" (outside of this Route).
4335 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4339 p->get_connected_latency_range (range, playback);
4341 all_connections.min = min (all_connections.min, range.min);
4342 all_connections.max = max (all_connections.max, range.max);
4346 /* set the "from" port latencies to the max/min range of all their connections */
4348 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4349 p->set_private_latency_range (all_connections, playback);
4352 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4354 all_connections.min += our_latency;
4355 all_connections.max += our_latency;
4357 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4358 p->set_private_latency_range (all_connections, playback);
4361 return all_connections.max;
4365 Route::set_private_port_latencies (bool playback) const
4367 framecnt_t own_latency = 0;
4369 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4370 OR LATENCY CALLBACK.
4372 This is called (early) from the latency callback. It computes the REAL
4373 latency associated with each port and stores the result as the "private"
4374 latency of the port. A later call to Route::set_public_port_latencies()
4375 sets all ports to the same value to reflect the fact that we do latency
4376 compensation and so all signals are delayed by the same amount as they
4377 flow through ardour.
4380 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4381 if ((*i)->active ()) {
4382 own_latency += (*i)->signal_latency ();
4387 /* playback: propagate latency from "outside the route" to outputs to inputs */
4388 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4390 /* capture: propagate latency from "outside the route" to inputs to outputs */
4391 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4396 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4398 /* this is called to set the JACK-visible port latencies, which take
4399 latency compensation into account.
4408 const PortSet& ports (_input->ports());
4409 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4410 p->set_public_latency_range (range, playback);
4415 const PortSet& ports (_output->ports());
4416 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4417 p->set_public_latency_range (range, playback);
4422 /** Put the invisible processors in the right place in _processors.
4423 * Must be called with a writer lock on _processor_lock held.
4426 __attribute__((annotate("realtime")))
4429 Route::setup_invisible_processors ()
4432 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4433 assert (!lm.locked ());
4437 /* too early to be doing this stuff */
4441 /* we'll build this new list here and then use it
4443 * TODO put the ProcessorList is on the stack for RT-safety.
4446 ProcessorList new_processors;
4448 /* find visible processors */
4450 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4451 if ((*i)->display_to_user ()) {
4452 new_processors.push_back (*i);
4458 ProcessorList::iterator amp = new_processors.begin ();
4459 while (amp != new_processors.end() && *amp != _amp) {
4463 assert (amp != new_processors.end ());
4465 /* and the processor after the amp */
4467 ProcessorList::iterator after_amp = amp;
4473 switch (_meter_point) {
4475 assert (!_meter->display_to_user ());
4476 new_processors.push_front (_meter);
4479 assert (!_meter->display_to_user ());
4480 new_processors.insert (amp, _meter);
4482 case MeterPostFader:
4483 /* do nothing here */
4486 /* do nothing here */
4489 /* the meter is visible, so we don't touch it here */
4496 assert (_main_outs);
4497 assert (!_main_outs->display_to_user ());
4498 new_processors.push_back (_main_outs);
4500 /* iterator for the main outs */
4502 ProcessorList::iterator main = new_processors.end();
4505 /* OUTPUT METERING */
4507 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4508 assert (!_meter->display_to_user ());
4510 /* add the processor just before or just after the main outs */
4512 ProcessorList::iterator meter_point = main;
4514 if (_meter_point == MeterOutput) {
4517 new_processors.insert (meter_point, _meter);
4522 if (_monitor_send && !is_monitor ()) {
4523 assert (!_monitor_send->display_to_user ());
4524 if (Config->get_solo_control_is_listen_control()) {
4525 switch (Config->get_listen_position ()) {
4526 case PreFaderListen:
4527 switch (Config->get_pfl_position ()) {
4528 case PFLFromBeforeProcessors:
4529 new_processors.push_front (_monitor_send);
4531 case PFLFromAfterProcessors:
4532 new_processors.insert (amp, _monitor_send);
4535 _monitor_send->set_can_pan (false);
4537 case AfterFaderListen:
4538 switch (Config->get_afl_position ()) {
4539 case AFLFromBeforeProcessors:
4540 new_processors.insert (after_amp, _monitor_send);
4542 case AFLFromAfterProcessors:
4543 new_processors.insert (new_processors.end(), _monitor_send);
4546 _monitor_send->set_can_pan (true);
4550 new_processors.insert (new_processors.end(), _monitor_send);
4551 _monitor_send->set_can_pan (false);
4555 #if 0 // not used - just yet
4556 if (!is_master() && !is_monitor() && !is_auditioner()) {
4557 new_processors.push_front (_delayline);
4561 /* MONITOR CONTROL */
4563 if (_monitor_control && is_monitor ()) {
4564 assert (!_monitor_control->display_to_user ());
4565 new_processors.push_front (_monitor_control);
4568 /* INTERNAL RETURN */
4570 /* doing this here means that any monitor control will come just after
4575 assert (!_intreturn->display_to_user ());
4576 new_processors.push_front (_intreturn);
4579 if (_trim && _trim->active()) {
4580 assert (!_trim->display_to_user ());
4581 new_processors.push_front (_trim);
4583 /* EXPORT PROCESSOR */
4585 if (_capturing_processor) {
4586 assert (!_capturing_processor->display_to_user ());
4587 new_processors.push_front (_capturing_processor);
4590 _processors = new_processors;
4592 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4593 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4598 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4599 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4600 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4607 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4608 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4612 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4613 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4620 /** If the meter point is `Custom', make a note of where the meter is.
4621 * This is so that if the meter point is subsequently set to something else,
4622 * and then back to custom, we can put the meter back where it was last time
4623 * custom was enabled.
4625 * Must be called with the _processor_lock held.
4628 Route::maybe_note_meter_position ()
4630 if (_meter_point != MeterCustom) {
4634 _custom_meter_position_noted = true;
4635 /* custom meter points range from after trim to before panner/main_outs
4636 * this is a limitation by the current processor UI
4638 bool seen_trim = false;
4639 _processor_after_last_custom_meter.reset();
4640 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4641 if ((*i) == _trim) {
4644 if ((*i) == _main_outs) {
4645 _processor_after_last_custom_meter = *i;
4648 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4650 _processor_after_last_custom_meter = _trim;
4652 ProcessorList::iterator j = i;
4654 assert(j != _processors.end ()); // main_outs should be before
4655 _processor_after_last_custom_meter = *j;
4660 assert(_processor_after_last_custom_meter.lock());
4663 boost::shared_ptr<Processor>
4664 Route::processor_by_id (PBD::ID id) const
4666 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4667 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4668 if ((*i)->id() == id) {
4673 return boost::shared_ptr<Processor> ();
4676 /** @return the monitoring state, or in other words what data we are pushing
4677 * into the route (data from the inputs, data from disk or silence)
4680 Route::monitoring_state () const
4682 return MonitoringInput;
4685 /** @return what we should be metering; either the data coming from the input
4686 * IO or the data that is flowing through the route.
4689 Route::metering_state () const
4691 return MeteringRoute;
4695 Route::has_external_redirects () const
4697 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4699 /* ignore inactive processors and obviously ignore the main
4700 * outs since everything has them and we don't care.
4703 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4711 boost::shared_ptr<Processor>
4712 Route::the_instrument () const
4714 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4715 return the_instrument_unlocked ();
4718 boost::shared_ptr<Processor>
4719 Route::the_instrument_unlocked () const
4721 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4722 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4723 if ((*i)->input_streams().n_midi() > 0 &&
4724 (*i)->output_streams().n_audio() > 0) {
4729 return boost::shared_ptr<Processor>();
4735 Route::non_realtime_locate (framepos_t pos)
4738 _pannable->transport_located (pos);
4741 if (_delayline.get()) {
4742 _delayline.get()->flush();
4746 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4747 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4749 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4750 (*i)->transport_located (pos);
4753 _roll_delay = _initial_delay;
4757 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4764 * We don't currently mix MIDI input together, so we don't need the
4765 * complex logic of the audio case.
4768 n_buffers = bufs.count().n_midi ();
4770 for (i = 0; i < n_buffers; ++i) {
4772 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4773 MidiBuffer& buf (bufs.get_midi (i));
4776 buf.copy (source_port->get_midi_buffer(nframes));
4778 buf.silence (nframes);
4784 n_buffers = bufs.count().n_audio();
4786 size_t n_ports = io->n_ports().n_audio();
4787 float scaling = 1.0f;
4789 if (n_ports > n_buffers) {
4790 scaling = ((float) n_buffers) / n_ports;
4793 for (i = 0; i < n_ports; ++i) {
4795 /* if there are more ports than buffers, map them onto buffers
4796 * in a round-robin fashion
4799 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4800 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4803 if (i < n_buffers) {
4805 /* first time through just copy a channel into
4809 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4811 if (scaling != 1.0f) {
4812 buf.apply_gain (scaling, nframes);
4817 /* on subsequent times around, merge data from
4818 * the port with what is already there
4821 if (scaling != 1.0f) {
4822 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4824 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4829 /* silence any remaining buffers */
4831 for (; i < n_buffers; ++i) {
4832 AudioBuffer& buf (bufs.get_audio (i));
4833 buf.silence (nframes);
4836 /* establish the initial setup of the buffer set, reflecting what was
4837 copied into it. unless, of course, we are the auditioner, in which
4838 case nothing was fed into it from the inputs at all.
4841 if (!is_auditioner()) {
4842 bufs.set_count (io->n_ports());