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, string_compose("\t ... INVERT push from %1\n", _name));
904 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
908 boost::shared_ptr<Route> sr = i->r.lock();
910 sr->mod_solo_by_others_downstream (-delta);
916 set_mute_master_solo ();
917 solo_changed (false, this);
921 Route::mod_solo_by_others_downstream (int32_t delta)
923 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
924 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
927 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
928 _soloed_by_others_downstream += delta;
930 _soloed_by_others_downstream = 0;
933 _soloed_by_others_downstream += delta;
936 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
938 set_mute_master_solo ();
939 solo_changed (false, this);
943 Route::set_mute_master_solo ()
945 _mute_master->set_soloed_by_self (self_soloed());
946 _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
950 Route::mod_solo_isolated_by_upstream (bool yn, void* src)
952 bool old = solo_isolated ();
955 if (_solo_isolated_by_upstream >= 1) {
956 _solo_isolated_by_upstream--;
958 _solo_isolated_by_upstream = 0;
961 _solo_isolated_by_upstream++;
964 if (solo_isolated() != old) {
965 /* solo isolated status changed */
966 _mute_master->set_solo_ignore (yn);
967 solo_isolated_changed (src);
972 Route::set_solo_isolated (bool yn, void *src)
974 if (is_master() || is_monitor() || is_auditioner()) {
978 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
979 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
983 bool changed = false;
986 if (_solo_isolated == false) {
987 _mute_master->set_solo_ignore (true);
990 _solo_isolated = true;
992 if (_solo_isolated == true) {
993 _solo_isolated = false;
994 _mute_master->set_solo_ignore (false);
1004 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1006 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1007 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1009 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1014 bool does_feed = feeds (*i, &sends_only);
1016 if (does_feed && !sends_only) {
1017 (*i)->mod_solo_isolated_by_upstream (yn, src);
1021 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1023 solo_isolated_changed (src);
1027 Route::solo_isolated () const
1029 return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
1033 Route::set_mute_points (MuteMaster::MutePoint mp)
1035 _mute_master->set_mute_points (mp);
1036 mute_points_changed (); /* EMIT SIGNAL */
1038 if (_mute_master->muted_by_self()) {
1039 mute_changed (this); /* EMIT SIGNAL */
1040 _mute_control->Changed (); /* EMIT SIGNAL */
1045 Route::set_mute (bool yn, void *src)
1047 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1048 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1052 if (muted() != yn) {
1053 _mute_master->set_muted_by_self (yn);
1054 /* allow any derived classes to respond to the mute change
1055 before anybody else knows about it.
1058 /* tell everyone else */
1059 mute_changed (src); /* EMIT SIGNAL */
1060 _mute_control->Changed (); /* EMIT SIGNAL */
1065 Route::muted () const
1067 return _mute_master->muted_by_self();
1071 Route::muted_by_others () const
1073 // This method is only used by route_ui for display state.
1074 // The real thing is MuteMaster::muted_by_others_at()
1076 //master is never muted by others
1080 //now check to see if something is soloed (and I am not)
1081 //see also MuteMaster::mute_gain_at()
1082 return (_session.soloing() && !soloed() && !solo_isolated());
1087 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1089 cerr << name << " {" << endl;
1090 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1091 p != procs.end(); ++p) {
1092 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1094 cerr << "}" << endl;
1098 /** Supposing that we want to insert a Processor at a given Placement, return
1099 * the processor to add the new one before (or 0 to add at the end).
1101 boost::shared_ptr<Processor>
1102 Route::before_processor_for_placement (Placement p)
1104 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1106 ProcessorList::iterator loc;
1108 if (p == PreFader) {
1109 /* generic pre-fader: insert immediately before the amp */
1110 loc = find (_processors.begin(), _processors.end(), _amp);
1112 /* generic post-fader: insert right before the main outs */
1113 loc = find (_processors.begin(), _processors.end(), _main_outs);
1116 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1119 /** Supposing that we want to insert a Processor at a given index, return
1120 * the processor to add the new one before (or 0 to add at the end).
1122 boost::shared_ptr<Processor>
1123 Route::before_processor_for_index (int index)
1126 return boost::shared_ptr<Processor> ();
1129 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1131 ProcessorList::iterator i = _processors.begin ();
1133 while (i != _processors.end() && j < index) {
1134 if ((*i)->display_to_user()) {
1141 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1144 /** Add a processor either pre- or post-fader
1145 * @return 0 on success, non-0 on failure.
1148 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1150 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1154 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1155 * @param index Index to add the processor at, or -1 to add at the end of the list.
1156 * @return 0 on success, non-0 on failure.
1159 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1161 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1164 /** Add a processor to the route.
1165 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1166 * @return 0 on success, non-0 on failure.
1169 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1171 assert (processor != _meter);
1172 assert (processor != _main_outs);
1174 DEBUG_TRACE (DEBUG::Processors, string_compose (
1175 "%1 adding processor %2\n", name(), processor->name()));
1177 if (!AudioEngine::instance()->connected() || !processor) {
1182 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1183 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1184 ProcessorState pstate (this);
1186 boost::shared_ptr<PluginInsert> pi;
1187 boost::shared_ptr<PortInsert> porti;
1189 if (processor == _amp) {
1190 /* Ensure that only one amp is in the list at any time */
1191 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1192 if (check != _processors.end()) {
1193 if (before == _amp) {
1194 /* Already in position; all is well */
1197 _processors.erase (check);
1202 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1204 ProcessorList::iterator loc;
1206 /* inserting before a processor; find it */
1207 loc = find (_processors.begin(), _processors.end(), before);
1208 if (loc == _processors.end ()) {
1213 /* inserting at end */
1214 loc = _processors.end ();
1217 _processors.insert (loc, processor);
1218 processor->set_owner (this);
1220 // Set up processor list channels. This will set processor->[input|output]_streams(),
1221 // configure redirect ports properly, etc.
1224 if (configure_processors_unlocked (err)) {
1226 configure_processors_unlocked (0); // it worked before we tried to add it ...
1231 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1233 if (pi->has_no_inputs ()) {
1234 /* generator plugin */
1235 _have_internal_generator = true;
1240 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
1241 processor->activate ();
1244 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1246 _output->set_user_latency (0);
1249 reset_instrument_info ();
1250 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1251 set_processor_positions ();
1257 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1259 const XMLProperty *prop;
1262 boost::shared_ptr<Processor> processor;
1264 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1265 so that we can add the processor in the right place (pre/post-fader)
1268 XMLNodeList const & children = node.children ();
1269 XMLNodeList::const_iterator i = children.begin ();
1271 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1275 Placement placement = PreFader;
1277 if (i != children.end()) {
1278 if ((prop = (*i)->property (X_("placement"))) != 0) {
1279 placement = Placement (string_2_enum (prop->value(), placement));
1283 if (node.name() == "Insert") {
1285 if ((prop = node.property ("type")) != 0) {
1287 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1288 prop->value() == "lv2" ||
1289 prop->value() == "windows-vst" ||
1290 prop->value() == "lxvst" ||
1291 prop->value() == "audiounit") {
1293 if (_session.get_disable_all_loaded_plugins ()) {
1294 processor.reset (new UnknownProcessor (_session, node));
1296 processor.reset (new PluginInsert (_session));
1301 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1306 } else if (node.name() == "Send") {
1308 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1309 processor.reset (new Send (_session, sendpan, _mute_master));
1313 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1317 if (processor->set_state (node, version)) {
1321 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1322 if (i != children.end()) {
1323 if ((prop = (*i)->property (X_("active"))) != 0) {
1324 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1325 processor->activate();
1327 processor->deactivate();
1331 return (add_processor (processor, placement, 0, false) == 0);
1334 catch (failed_constructor &err) {
1335 warning << _("processor could not be created. Ignored.") << endmsg;
1341 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1343 /* NOTE: this is intended to be used ONLY when copying
1344 processors from another Route. Hence the subtle
1345 differences between this and ::add_processor()
1348 ProcessorList::iterator loc;
1351 loc = find(_processors.begin(), _processors.end(), before);
1353 /* nothing specified - at end */
1354 loc = _processors.end ();
1357 if (!_session.engine().connected()) {
1361 if (others.empty()) {
1366 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1367 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1368 ProcessorState pstate (this);
1370 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1376 boost::shared_ptr<PluginInsert> pi;
1378 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1382 _processors.insert (loc, *i);
1383 (*i)->set_owner (this);
1385 if ((*i)->active()) {
1389 /* Think: does this really need to be called for every processor in the loop? */
1391 if (configure_processors_unlocked (err)) {
1393 configure_processors_unlocked (0); // it worked before we tried to add it ...
1398 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1401 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1402 boost::shared_ptr<PluginInsert> pi;
1404 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1405 if (pi->has_no_inputs ()) {
1406 _have_internal_generator = true;
1412 _output->set_user_latency (0);
1415 reset_instrument_info ();
1416 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1417 set_processor_positions ();
1423 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1425 if (p == PreFader) {
1426 start = _processors.begin();
1427 end = find(_processors.begin(), _processors.end(), _amp);
1429 start = find(_processors.begin(), _processors.end(), _amp);
1431 end = _processors.end();
1435 /** Turn off all processors with a given placement
1436 * @param p Placement of processors to disable
1439 Route::disable_processors (Placement p)
1441 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1443 ProcessorList::iterator start, end;
1444 placement_range(p, start, end);
1446 for (ProcessorList::iterator i = start; i != end; ++i) {
1447 (*i)->deactivate ();
1450 _session.set_dirty ();
1453 /** Turn off all redirects
1456 Route::disable_processors ()
1458 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1460 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1461 (*i)->deactivate ();
1464 _session.set_dirty ();
1467 /** Turn off all redirects with a given placement
1468 * @param p Placement of redirects to disable
1471 Route::disable_plugins (Placement p)
1473 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1475 ProcessorList::iterator start, end;
1476 placement_range(p, start, end);
1478 for (ProcessorList::iterator i = start; i != end; ++i) {
1479 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1480 (*i)->deactivate ();
1484 _session.set_dirty ();
1487 /** Turn off all plugins
1490 Route::disable_plugins ()
1492 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1494 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1495 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1496 (*i)->deactivate ();
1500 _session.set_dirty ();
1505 Route::ab_plugins (bool forward)
1507 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1511 /* forward = turn off all active redirects, and mark them so that the next time
1512 we go the other way, we will revert them
1515 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1516 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1520 if ((*i)->active()) {
1521 (*i)->deactivate ();
1522 (*i)->set_next_ab_is_active (true);
1524 (*i)->set_next_ab_is_active (false);
1530 /* backward = if the redirect was marked to go active on the next ab, do so */
1532 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1534 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1538 if ((*i)->get_next_ab_is_active()) {
1541 (*i)->deactivate ();
1546 _session.set_dirty ();
1550 /** Remove processors with a given placement.
1551 * @param p Placement of processors to remove.
1554 Route::clear_processors (Placement p)
1556 if (!_session.engine().connected()) {
1560 bool already_deleting = _session.deletion_in_progress();
1561 if (!already_deleting) {
1562 _session.set_deletion_in_progress();
1566 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1567 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1568 ProcessorList new_list;
1569 ProcessorStreams err;
1570 bool seen_amp = false;
1572 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1578 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1580 /* you can't remove these */
1582 new_list.push_back (*i);
1589 new_list.push_back (*i);
1592 (*i)->drop_references ();
1600 (*i)->drop_references ();
1603 new_list.push_back (*i);
1610 _processors = new_list;
1611 configure_processors_unlocked (&err); // this can't fail
1614 processor_max_streams.reset();
1615 _have_internal_generator = false;
1616 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1617 set_processor_positions ();
1619 reset_instrument_info ();
1621 if (!already_deleting) {
1622 _session.clear_deletion_in_progress();
1627 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1629 // TODO once the export point can be configured properly, do something smarter here
1630 if (processor == _capturing_processor) {
1631 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1632 if (need_process_lock) {
1636 _capturing_processor.reset();
1638 if (need_process_lock) {
1643 /* these can never be removed */
1645 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1649 if (!_session.engine().connected()) {
1653 processor_max_streams.reset();
1656 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1657 if (need_process_lock) {
1661 /* Caller must hold process lock */
1662 assert (!AudioEngine::instance()->process_lock().trylock());
1664 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1666 ProcessorState pstate (this);
1668 ProcessorList::iterator i;
1669 bool removed = false;
1671 for (i = _processors.begin(); i != _processors.end(); ) {
1672 if (*i == processor) {
1674 /* move along, see failure case for configure_processors()
1675 where we may need to reconfigure the processor.
1678 /* stop redirects that send signals to JACK ports
1679 from causing noise as a result of no longer being
1683 boost::shared_ptr<IOProcessor> iop;
1685 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1689 i = _processors.erase (i);
1697 _output->set_user_latency (0);
1705 if (configure_processors_unlocked (err)) {
1707 /* we know this will work, because it worked before :) */
1708 configure_processors_unlocked (0);
1712 _have_internal_generator = false;
1714 for (i = _processors.begin(); i != _processors.end(); ++i) {
1715 boost::shared_ptr<PluginInsert> pi;
1717 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1718 if (pi->has_no_inputs ()) {
1719 _have_internal_generator = true;
1724 if (need_process_lock) {
1729 reset_instrument_info ();
1730 processor->drop_references ();
1731 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1732 set_processor_positions ();
1738 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1740 ProcessorList deleted;
1742 if (!_session.engine().connected()) {
1746 processor_max_streams.reset();
1749 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1750 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1751 ProcessorState pstate (this);
1753 ProcessorList::iterator i;
1754 boost::shared_ptr<Processor> processor;
1756 for (i = _processors.begin(); i != _processors.end(); ) {
1760 /* these can never be removed */
1762 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1767 /* see if its in the list of processors to delete */
1769 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1774 /* stop IOProcessors that send to JACK ports
1775 from causing noise as a result of no longer being
1779 boost::shared_ptr<IOProcessor> iop;
1781 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1785 deleted.push_back (processor);
1786 i = _processors.erase (i);
1789 if (deleted.empty()) {
1790 /* none of those in the requested list were found */
1794 _output->set_user_latency (0);
1796 if (configure_processors_unlocked (err)) {
1798 /* we know this will work, because it worked before :) */
1799 configure_processors_unlocked (0);
1804 _have_internal_generator = false;
1806 for (i = _processors.begin(); i != _processors.end(); ++i) {
1807 boost::shared_ptr<PluginInsert> pi;
1809 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1810 if (pi->has_no_inputs ()) {
1811 _have_internal_generator = true;
1818 /* now try to do what we need to so that those that were removed will be deleted */
1820 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1821 (*i)->drop_references ();
1824 reset_instrument_info ();
1825 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1826 set_processor_positions ();
1832 Route::reset_instrument_info ()
1834 boost::shared_ptr<Processor> instr = the_instrument();
1836 _instrument_info.set_internal_instrument (instr);
1840 /** Caller must hold process lock */
1842 Route::configure_processors (ProcessorStreams* err)
1844 #ifndef PLATFORM_WINDOWS
1845 assert (!AudioEngine::instance()->process_lock().trylock());
1848 if (!_in_configure_processors) {
1849 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1850 return configure_processors_unlocked (err);
1857 Route::input_streams () const
1859 return _input->n_ports ();
1862 list<pair<ChanCount, ChanCount> >
1863 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1865 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1867 return try_configure_processors_unlocked (in, err);
1870 list<pair<ChanCount, ChanCount> >
1871 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1873 // Check each processor in order to see if we can configure as requested
1875 list<pair<ChanCount, ChanCount> > configuration;
1878 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1879 DEBUG_TRACE (DEBUG::Processors, "{\n");
1881 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1883 if ((*p)->can_support_io_configuration(in, out)) {
1884 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1885 configuration.push_back(make_pair(in, out));
1892 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1893 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1894 DEBUG_TRACE (DEBUG::Processors, "}\n");
1895 return list<pair<ChanCount, ChanCount> > ();
1899 DEBUG_TRACE (DEBUG::Processors, "}\n");
1901 return configuration;
1904 /** Set the input/output configuration of each processor in the processors list.
1905 * Caller must hold process lock.
1906 * Return 0 on success, otherwise configuration is impossible.
1909 Route::configure_processors_unlocked (ProcessorStreams* err)
1911 #ifndef PLATFORM_WINDOWS
1912 assert (!AudioEngine::instance()->process_lock().trylock());
1915 if (_in_configure_processors) {
1919 /* put invisible processors where they should be */
1920 setup_invisible_processors ();
1922 _in_configure_processors = true;
1924 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1926 if (configuration.empty ()) {
1927 _in_configure_processors = false;
1932 bool seen_mains_out = false;
1933 processor_out_streams = _input->n_ports();
1934 processor_max_streams.reset();
1936 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1937 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1939 if (!(*p)->configure_io(c->first, c->second)) {
1940 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1942 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1943 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1945 boost::shared_ptr<PluginInsert> pi;
1946 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1947 /* plugins connected via Split Match may have more channels.
1948 * route/scratch buffers are needed for all of them*/
1949 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
1950 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
1954 if (boost::dynamic_pointer_cast<Delivery> (*p)
1955 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1956 /* main delivery will increase port count to match input.
1957 * the Delivery::Main is usually the last processor - followed only by
1960 seen_mains_out = true;
1962 if (!seen_mains_out) {
1963 processor_out_streams = out;
1969 _meter->set_max_channels (processor_max_streams);
1972 /* make sure we have sufficient scratch buffers to cope with the new processor
1975 _session.ensure_buffers (n_process_buffers ());
1977 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1979 _in_configure_processors = false;
1983 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1984 * @param state New active state for those processors.
1987 Route::all_visible_processors_active (bool state)
1989 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1991 if (_processors.empty()) {
1995 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1996 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2003 (*i)->deactivate ();
2007 _session.set_dirty ();
2011 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2013 /* check if re-order requires re-configuration of any processors
2014 * -> compare channel configuration for all processors
2016 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2017 ChanCount c = input_streams ();
2019 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2021 if (c != (*j)->input_streams()) {
2024 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2027 if ((*i)->input_streams() != c) {
2030 c = (*i)->output_streams();
2042 __attribute__((annotate("realtime")))
2045 Route::apply_processor_order (const ProcessorList& new_order)
2047 /* need to hold processor_lock; either read or write lock
2048 * and the engine process_lock.
2049 * Due to r/w lock ambiguity we can only assert the latter
2051 assert (!AudioEngine::instance()->process_lock().trylock());
2054 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2055 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2056 * processors in the current actual processor list that are hidden. Any visible processors
2057 * in the current list but not in "new_order" will be assumed to be deleted.
2060 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2061 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2062 * (note though that ::processors_reorder_needs_configure() ensured that
2063 * this function will only ever be called from the rt-thread if no processor were removed)
2065 * either way, I can't proove it, but an x-run due to re-order here is less likley
2066 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2069 ProcessorList as_it_will_be;
2070 ProcessorList::iterator oiter;
2071 ProcessorList::const_iterator niter;
2073 oiter = _processors.begin();
2074 niter = new_order.begin();
2076 while (niter != new_order.end()) {
2078 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2079 then append it to the temp list.
2081 Otherwise, see if the next processor in the old list is in the new list. if not,
2082 its been deleted. If its there, append it to the temp list.
2085 if (oiter == _processors.end()) {
2087 /* no more elements in the old list, so just stick the rest of
2088 the new order onto the temp list.
2091 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2092 while (niter != new_order.end()) {
2099 if (!(*oiter)->display_to_user()) {
2101 as_it_will_be.push_back (*oiter);
2105 /* visible processor: check that its in the new order */
2107 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2108 /* deleted: do nothing, shared_ptr<> will clean up */
2110 /* ignore this one, and add the next item from the new order instead */
2111 as_it_will_be.push_back (*niter);
2116 /* now remove from old order - its taken care of no matter what */
2117 oiter = _processors.erase (oiter);
2121 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2123 /* If the meter is in a custom position, find it and make a rough note of its position */
2124 maybe_note_meter_position ();
2128 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2130 // it a change is already queued, wait for it
2131 // (unless engine is stopped. apply immediately and proceed
2132 while (g_atomic_int_get (&_pending_process_reorder)) {
2133 if (!AudioEngine::instance()->running()) {
2134 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2135 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2137 apply_processor_order(_pending_processor_order);
2138 setup_invisible_processors ();
2140 g_atomic_int_set (&_pending_process_reorder, 0);
2142 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2143 set_processor_positions ();
2145 // TODO rather use a semaphore or something.
2146 // but since ::reorder_processors() is called
2147 // from the GUI thread, this is fine..
2152 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2154 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2155 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2156 ProcessorState pstate (this);
2158 apply_processor_order (new_order);
2160 if (configure_processors_unlocked (err)) {
2168 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2169 set_processor_positions ();
2172 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2173 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2175 // _pending_processor_order is protected by _processor_lock
2176 _pending_processor_order = new_order;
2177 g_atomic_int_set (&_pending_process_reorder, 1);
2190 Route::get_template()
2192 return state(false);
2196 Route::state(bool full_state)
2198 XMLNode *node = new XMLNode("Route");
2199 ProcessorList::iterator i;
2202 id().print (buf, sizeof (buf));
2203 node->add_property("id", buf);
2204 node->add_property ("name", _name);
2205 node->add_property("default-type", _default_type.to_string());
2208 node->add_property("flags", enum_2_string (_flags));
2211 node->add_property("active", _active?"yes":"no");
2213 boost::to_string (_phase_invert, p);
2214 node->add_property("phase-invert", p);
2215 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2216 node->add_property("meter-point", enum_2_string (_meter_point));
2218 node->add_property("meter-type", enum_2_string (_meter_type));
2221 node->add_property("route-group", _route_group->name());
2224 snprintf (buf, sizeof (buf), "%d", _order_key);
2225 node->add_property ("order-key", buf);
2226 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2227 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2228 node->add_property ("soloed-by-upstream", buf);
2229 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2230 node->add_property ("soloed-by-downstream", buf);
2231 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2232 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2234 node->add_child_nocopy (_input->state (full_state));
2235 node->add_child_nocopy (_output->state (full_state));
2236 node->add_child_nocopy (_solo_control->get_state ());
2237 node->add_child_nocopy (_mute_control->get_state ());
2238 node->add_child_nocopy (_mute_master->get_state ());
2241 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2244 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2245 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2246 remote_control_node->add_property (X_("id"), buf);
2247 node->add_child_nocopy (*remote_control_node);
2249 if (_comment.length()) {
2250 XMLNode *cmt = node->add_child ("Comment");
2251 cmt->add_content (_comment);
2255 node->add_child_nocopy (_pannable->state (full_state));
2258 for (i = _processors.begin(); i != _processors.end(); ++i) {
2260 /* template save: do not include internal sends functioning as
2261 aux sends because the chance of the target ID
2262 in the session where this template is used
2265 similarly, do not save listen sends which connect to
2266 the monitor section, because these will always be
2269 boost::shared_ptr<InternalSend> is;
2271 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2272 if (is->role() == Delivery::Listen) {
2277 node->add_child_nocopy((*i)->state (full_state));
2281 node->add_child_copy (*_extra_xml);
2284 if (_custom_meter_position_noted) {
2285 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2287 after->id().print (buf, sizeof (buf));
2288 node->add_property (X_("processor-after-last-custom-meter"), buf);
2296 Route::set_state (const XMLNode& node, int version)
2298 if (version < 3000) {
2299 return set_state_2X (node, version);
2303 XMLNodeConstIterator niter;
2305 const XMLProperty *prop;
2307 if (node.name() != "Route"){
2308 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2312 if ((prop = node.property (X_("name"))) != 0) {
2313 Route::set_name (prop->value());
2317 _initial_io_setup = true;
2319 if ((prop = node.property (X_("flags"))) != 0) {
2320 _flags = Flag (string_2_enum (prop->value(), _flags));
2325 if (is_master() || is_monitor() || is_auditioner()) {
2326 _mute_master->set_solo_ignore (true);
2330 /* monitor bus does not get a panner, but if (re)created
2331 via XML, it will already have one by the time we
2332 call ::set_state(). so ... remove it.
2337 /* add all processors (except amp, which is always present) */
2339 nlist = node.children();
2340 XMLNode processor_state (X_("processor_state"));
2342 Stateful::save_extra_xml (node);
2344 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2348 if (child->name() == IO::state_node_name) {
2349 if ((prop = child->property (X_("direction"))) == 0) {
2353 if (prop->value() == "Input") {
2354 _input->set_state (*child, version);
2355 } else if (prop->value() == "Output") {
2356 _output->set_state (*child, version);
2360 if (child->name() == X_("Processor")) {
2361 processor_state.add_child_copy (*child);
2364 if (child->name() == X_("Pannable")) {
2366 _pannable->set_state (*child, version);
2368 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2373 if ((prop = node.property (X_("meter-point"))) != 0) {
2374 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2375 set_meter_point (mp, true);
2377 _meter->set_display_to_user (_meter_point == MeterCustom);
2381 if ((prop = node.property (X_("meter-type"))) != 0) {
2382 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2385 _initial_io_setup = false;
2387 set_processor_state (processor_state);
2389 // this looks up the internal instrument in processors
2390 reset_instrument_info();
2392 if ((prop = node.property ("self-solo")) != 0) {
2393 set_self_solo (string_is_affirmative (prop->value()));
2396 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2397 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2398 mod_solo_by_others_upstream (atoi (prop->value()));
2401 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2402 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2403 mod_solo_by_others_downstream (atoi (prop->value()));
2406 if ((prop = node.property ("solo-isolated")) != 0) {
2407 set_solo_isolated (string_is_affirmative (prop->value()), this);
2410 if ((prop = node.property ("solo-safe")) != 0) {
2411 set_solo_safe (string_is_affirmative (prop->value()), this);
2414 if ((prop = node.property (X_("phase-invert"))) != 0) {
2415 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2418 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2419 set_denormal_protection (string_is_affirmative (prop->value()));
2422 if ((prop = node.property (X_("active"))) != 0) {
2423 bool yn = string_is_affirmative (prop->value());
2424 _active = !yn; // force switch
2425 set_active (yn, this);
2428 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2429 set_order_key (atoi(prop->value()));
2432 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2436 string::size_type colon, equal;
2437 string remaining = prop->value();
2439 while (remaining.length()) {
2441 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2442 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2445 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2446 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2449 string keyname = remaining.substr (0, equal);
2451 if ((keyname == "EditorSort") || (keyname == "editor")) {
2452 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2458 colon = remaining.find_first_of (':');
2460 if (colon != string::npos) {
2461 remaining = remaining.substr (colon+1);
2468 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2469 PBD::ID id (prop->value ());
2470 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2471 ProcessorList::const_iterator i = _processors.begin ();
2472 while (i != _processors.end() && (*i)->id() != id) {
2476 if (i != _processors.end ()) {
2477 _processor_after_last_custom_meter = *i;
2478 _custom_meter_position_noted = true;
2482 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2485 if (child->name() == X_("Comment")) {
2487 /* XXX this is a terrible API design in libxml++ */
2489 XMLNode *cmt = *(child->children().begin());
2490 _comment = cmt->content();
2492 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2493 if (prop->value() == "solo") {
2494 _solo_control->set_state (*child, version);
2495 } else if (prop->value() == "mute") {
2496 _mute_control->set_state (*child, version);
2499 } else if (child->name() == X_("RemoteControl")) {
2500 if ((prop = child->property (X_("id"))) != 0) {
2502 sscanf (prop->value().c_str(), "%d", &x);
2503 set_remote_control_id_internal (x);
2506 } else if (child->name() == X_("MuteMaster")) {
2507 _mute_master->set_state (*child, version);
2509 } else if (child->name() == Automatable::xml_node_name) {
2510 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2518 Route::set_state_2X (const XMLNode& node, int version)
2520 LocaleGuard lg (X_("C"));
2522 XMLNodeConstIterator niter;
2524 const XMLProperty *prop;
2526 /* 2X things which still remain to be handled:
2532 if (node.name() != "Route") {
2533 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2537 if ((prop = node.property (X_("flags"))) != 0) {
2538 string f = prop->value ();
2539 boost::replace_all (f, "ControlOut", "MonitorOut");
2540 _flags = Flag (string_2_enum (f, _flags));
2545 if (is_master() || is_monitor() || is_auditioner()) {
2546 _mute_master->set_solo_ignore (true);
2549 if ((prop = node.property (X_("phase-invert"))) != 0) {
2550 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2551 if (string_is_affirmative (prop->value ())) {
2554 set_phase_invert (p);
2557 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2558 set_denormal_protection (string_is_affirmative (prop->value()));
2561 if ((prop = node.property (X_("soloed"))) != 0) {
2562 bool yn = string_is_affirmative (prop->value());
2564 /* XXX force reset of solo status */
2566 set_solo (yn, this);
2569 if ((prop = node.property (X_("muted"))) != 0) {
2572 bool muted = string_is_affirmative (prop->value());
2578 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2580 if (string_is_affirmative (prop->value())){
2581 mute_point = mute_point + "PreFader";
2586 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2588 if (string_is_affirmative (prop->value())){
2591 mute_point = mute_point + ",";
2594 mute_point = mute_point + "PostFader";
2599 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2601 if (string_is_affirmative (prop->value())){
2604 mute_point = mute_point + ",";
2607 mute_point = mute_point + "Listen";
2612 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2614 if (string_is_affirmative (prop->value())){
2617 mute_point = mute_point + ",";
2620 mute_point = mute_point + "Main";
2624 _mute_master->set_mute_points (mute_point);
2625 _mute_master->set_muted_by_self (true);
2629 if ((prop = node.property (X_("meter-point"))) != 0) {
2630 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2633 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2634 don't mean the same thing.
2637 if ((prop = node.property (X_("order-keys"))) != 0) {
2641 string::size_type colon, equal;
2642 string remaining = prop->value();
2644 while (remaining.length()) {
2646 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2647 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2650 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2651 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2654 string keyname = remaining.substr (0, equal);
2656 if (keyname == "EditorSort" || keyname == "editor") {
2657 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2663 colon = remaining.find_first_of (':');
2665 if (colon != string::npos) {
2666 remaining = remaining.substr (colon+1);
2675 nlist = node.children ();
2676 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2680 if (child->name() == IO::state_node_name) {
2682 /* there is a note in IO::set_state_2X() about why we have to call
2686 _input->set_state_2X (*child, version, true);
2687 _output->set_state_2X (*child, version, false);
2689 if ((prop = child->property (X_("name"))) != 0) {
2690 Route::set_name (prop->value ());
2695 if ((prop = child->property (X_("active"))) != 0) {
2696 bool yn = string_is_affirmative (prop->value());
2697 _active = !yn; // force switch
2698 set_active (yn, this);
2701 if ((prop = child->property (X_("gain"))) != 0) {
2704 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2705 _amp->gain_control()->set_value (val);
2709 /* Set up Panners in the IO */
2710 XMLNodeList io_nlist = child->children ();
2712 XMLNodeConstIterator io_niter;
2715 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2717 io_child = *io_niter;
2719 if (io_child->name() == X_("Panner")) {
2720 _main_outs->panner_shell()->set_state(*io_child, version);
2721 } else if (io_child->name() == X_("Automation")) {
2722 /* IO's automation is for the fader */
2723 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2729 XMLNodeList redirect_nodes;
2731 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2735 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2736 redirect_nodes.push_back(child);
2741 set_processor_state_2X (redirect_nodes, version);
2743 Stateful::save_extra_xml (node);
2745 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2748 if (child->name() == X_("Comment")) {
2750 /* XXX this is a terrible API design in libxml++ */
2752 XMLNode *cmt = *(child->children().begin());
2753 _comment = cmt->content();
2755 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2756 if (prop->value() == X_("solo")) {
2757 _solo_control->set_state (*child, version);
2758 } else if (prop->value() == X_("mute")) {
2759 _mute_control->set_state (*child, version);
2762 } else if (child->name() == X_("RemoteControl")) {
2763 if ((prop = child->property (X_("id"))) != 0) {
2765 sscanf (prop->value().c_str(), "%d", &x);
2766 set_remote_control_id_internal (x);
2776 Route::get_processor_state ()
2778 XMLNode* root = new XMLNode (X_("redirects"));
2779 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2780 root->add_child_nocopy ((*i)->state (true));
2787 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2789 /* We don't bother removing existing processors not in nList, as this
2790 method will only be called when creating a Route from scratch, not
2791 for undo purposes. Just put processors in at the appropriate place
2795 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2796 add_processor_from_xml_2X (**i, version);
2801 Route::set_processor_state (const XMLNode& node)
2803 const XMLNodeList &nlist = node.children();
2804 XMLNodeConstIterator niter;
2805 ProcessorList new_order;
2806 bool must_configure = false;
2808 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2810 XMLProperty* prop = (*niter)->property ("type");
2812 if (prop->value() == "amp") {
2813 _amp->set_state (**niter, Stateful::current_state_version);
2814 new_order.push_back (_amp);
2815 } else if (prop->value() == "trim") {
2816 _trim->set_state (**niter, Stateful::current_state_version);
2817 new_order.push_back (_trim);
2818 } else if (prop->value() == "meter") {
2819 _meter->set_state (**niter, Stateful::current_state_version);
2820 new_order.push_back (_meter);
2821 } else if (prop->value() == "delay") {
2823 _delayline->set_state (**niter, Stateful::current_state_version);
2824 new_order.push_back (_delayline);
2826 } else if (prop->value() == "main-outs") {
2827 _main_outs->set_state (**niter, Stateful::current_state_version);
2828 } else if (prop->value() == "intreturn") {
2830 _intreturn.reset (new InternalReturn (_session));
2831 must_configure = true;
2833 _intreturn->set_state (**niter, Stateful::current_state_version);
2834 } else if (is_monitor() && prop->value() == "monitor") {
2835 if (!_monitor_control) {
2836 _monitor_control.reset (new MonitorProcessor (_session));
2837 must_configure = true;
2839 _monitor_control->set_state (**niter, Stateful::current_state_version);
2840 } else if (prop->value() == "capture") {
2841 /* CapturingProcessor should never be restored, it's always
2842 added explicitly when needed */
2844 ProcessorList::iterator o;
2846 for (o = _processors.begin(); o != _processors.end(); ++o) {
2847 XMLProperty* id_prop = (*niter)->property(X_("id"));
2848 if (id_prop && (*o)->id() == id_prop->value()) {
2849 (*o)->set_state (**niter, Stateful::current_state_version);
2850 new_order.push_back (*o);
2855 // If the processor (*niter) is not on the route then create it
2857 if (o == _processors.end()) {
2859 boost::shared_ptr<Processor> processor;
2861 if (prop->value() == "intsend") {
2863 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2865 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2866 prop->value() == "lv2" ||
2867 prop->value() == "windows-vst" ||
2868 prop->value() == "lxvst" ||
2869 prop->value() == "audiounit") {
2871 if (_session.get_disable_all_loaded_plugins ()) {
2872 processor.reset (new UnknownProcessor (_session, **niter));
2874 processor.reset (new PluginInsert (_session));
2876 } else if (prop->value() == "port") {
2878 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2880 } else if (prop->value() == "send") {
2882 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2885 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2889 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2890 /* This processor could not be configured. Turn it into a UnknownProcessor */
2891 processor.reset (new UnknownProcessor (_session, **niter));
2894 /* we have to note the monitor send here, otherwise a new one will be created
2895 and the state of this one will be lost.
2897 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2898 if (isend && isend->role() == Delivery::Listen) {
2899 _monitor_send = isend;
2902 /* it doesn't matter if invisible processors are added here, as they
2903 will be sorted out by setup_invisible_processors () shortly.
2906 new_order.push_back (processor);
2907 must_configure = true;
2913 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2914 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2915 _processors = new_order;
2917 if (must_configure) {
2918 configure_processors_unlocked (0);
2921 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2923 (*i)->set_owner (this);
2924 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2926 boost::shared_ptr<PluginInsert> pi;
2928 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2929 if (pi->has_no_inputs ()) {
2930 _have_internal_generator = true;
2937 reset_instrument_info ();
2938 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2939 set_processor_positions ();
2943 Route::curve_reallocate ()
2945 // _gain_automation_curve.finish_resize ();
2946 // _pan_automation_curve.finish_resize ();
2950 Route::silence (framecnt_t nframes)
2952 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2957 silence_unlocked (nframes);
2961 Route::silence_unlocked (framecnt_t nframes)
2963 /* Must be called with the processor lock held */
2967 _output->silence (nframes);
2969 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2970 boost::shared_ptr<PluginInsert> pi;
2972 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2973 // skip plugins, they don't need anything when we're not active
2977 (*i)->silence (nframes);
2980 if (nframes == _session.get_block_size()) {
2987 Route::add_internal_return ()
2990 _intreturn.reset (new InternalReturn (_session));
2991 add_processor (_intreturn, PreFader);
2996 Route::add_send_to_internal_return (InternalSend* send)
2998 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3000 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3001 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3004 return d->add_send (send);
3010 Route::remove_send_from_internal_return (InternalSend* send)
3012 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3014 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3015 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3018 return d->remove_send (send);
3024 Route::enable_monitor_send ()
3026 /* Caller must hold process lock */
3027 assert (!AudioEngine::instance()->process_lock().trylock());
3029 /* master never sends to monitor section via the normal mechanism */
3030 assert (!is_master ());
3031 assert (!is_monitor ());
3033 /* make sure we have one */
3034 if (!_monitor_send) {
3035 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3036 _monitor_send->set_display_to_user (false);
3040 configure_processors (0);
3043 /** Add an aux send to a route.
3044 * @param route route to send to.
3045 * @param before Processor to insert before, or 0 to insert at the end.
3048 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3050 assert (route != _session.monitor_out ());
3053 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3055 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3057 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3059 if (d && d->target_route() == route) {
3060 /* already listening via the specified IO: do nothing */
3068 boost::shared_ptr<InternalSend> listener;
3071 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3072 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3073 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3076 add_processor (listener, before);
3078 } catch (failed_constructor& err) {
3086 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3088 ProcessorStreams err;
3089 ProcessorList::iterator tmp;
3092 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3094 /* have to do this early because otherwise processor reconfig
3095 * will put _monitor_send back in the list
3098 if (route == _session.monitor_out()) {
3099 _monitor_send.reset ();
3103 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3105 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3107 if (d && d->target_route() == route) {
3109 if (remove_processor (*x, &err, false) > 0) {
3115 /* list could have been demolished while we dropped the lock
3118 if (_session.engine().connected()) {
3119 /* i/o processors cannot be removed if the engine is not running
3120 * so don't live-loop in case the engine is N/A or dies
3130 Route::set_comment (string cmt, void *src)
3133 comment_changed (src);
3134 _session.set_dirty ();
3138 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3140 FeedRecord fr (other, via_sends_only);
3142 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3144 if (!result.second) {
3146 /* already a record for "other" - make sure sends-only information is correct */
3147 if (!via_sends_only && result.first->sends_only) {
3148 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3149 frp->sends_only = false;
3153 return result.second;
3157 Route::clear_fed_by ()
3163 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3165 const FedBy& fed_by (other->fed_by());
3167 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3168 boost::shared_ptr<Route> sr = f->r.lock();
3170 if (sr && (sr.get() == this)) {
3172 if (via_sends_only) {
3173 *via_sends_only = f->sends_only;
3184 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3186 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3188 if (_output->connected_to (other->input())) {
3189 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3190 if (via_send_only) {
3191 *via_send_only = false;
3198 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3200 boost::shared_ptr<IOProcessor> iop;
3202 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3203 if (iop->feeds (other)) {
3204 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3205 if (via_send_only) {
3206 *via_send_only = true;
3210 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3213 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3218 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3223 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3225 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3228 /** Called from the (non-realtime) butler thread when the transport is stopped */
3230 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3232 framepos_t now = _session.transport_frame();
3235 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3237 Automatable::transport_stopped (now);
3239 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3241 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3245 (*i)->transport_stopped (now);
3249 _roll_delay = _initial_delay;
3253 Route::input_change_handler (IOChange change, void * /*src*/)
3255 bool need_to_queue_solo_change = true;
3257 if ((change.type & IOChange::ConfigurationChanged)) {
3258 /* This is called with the process lock held if change
3259 contains ConfigurationChanged
3261 need_to_queue_solo_change = false;
3262 configure_processors (0);
3263 _phase_invert.resize (_input->n_ports().n_audio ());
3264 io_changed (); /* EMIT SIGNAL */
3267 if (!_input->connected() && _soloed_by_others_upstream) {
3268 if (need_to_queue_solo_change) {
3269 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3271 cancel_solo_after_disconnect (true);
3274 } else if (_soloed_by_others_upstream) {
3275 bool cancel_solo = true;
3276 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3277 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3278 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3282 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3283 if (does_feed && !sends_only) {
3284 if ((*i)->soloed()) {
3285 cancel_solo = false;
3291 cancel_solo_after_disconnect (true);
3294 } else if (self_soloed()) {
3296 // TODO propagate upstream
3297 // see commment in output_change_handler() below
3302 Route::output_change_handler (IOChange change, void * /*src*/)
3304 bool need_to_queue_solo_change = true;
3305 if (_initial_io_setup) {
3309 if ((change.type & IOChange::ConfigurationChanged)) {
3310 /* This is called with the process lock held if change
3311 contains ConfigurationChanged
3313 need_to_queue_solo_change = false;
3314 configure_processors (0);
3317 _session.reset_monitor_section();
3320 io_changed (); /* EMIT SIGNAL */
3323 if (!_output->connected() && _soloed_by_others_downstream) {
3324 if (need_to_queue_solo_change) {
3325 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3327 cancel_solo_after_disconnect (false);
3330 } else if (_soloed_by_others_downstream) {
3331 bool cancel_solo = true;
3332 /* checking all all downstream routes for
3333 * explicit of implict solo is a rather drastic measure,
3334 * ideally the input_change_handler() of the other route
3335 * would propagate the change to us.
3337 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3338 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3339 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3343 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3344 if (does_feed && !sends_only) {
3345 if ((*i)->soloed()) {
3346 cancel_solo = false;
3352 cancel_solo_after_disconnect (false);
3355 } else if (self_soloed()) {
3356 // TODO propagate change downstream to the disconnected routes
3357 // Q: how to get the routes that were just disconnected. ?
3358 // A: /maybe/ by diff feeds() aka fed_by() vs direct_feeds_according_to_reality() ?!?
3364 Route::cancel_solo_after_disconnect (bool upstream)
3367 _soloed_by_others_upstream = 0;
3369 _soloed_by_others_downstream = 0;
3371 set_mute_master_solo ();
3372 solo_changed (false, this);
3376 Route::pans_required () const
3378 if (n_outputs().n_audio() < 2) {
3382 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3386 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3388 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3394 if (n_outputs().n_total() == 0) {
3398 if (!_active || n_inputs() == ChanCount::ZERO) {
3399 silence_unlocked (nframes);
3403 if (session_state_changing) {
3404 if (_session.transport_speed() != 0.0f) {
3405 /* we're rolling but some state is changing (e.g. our diskstream contents)
3406 so we cannot use them. Be silent till this is over.
3408 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3410 silence_unlocked (nframes);
3413 /* we're really not rolling, so we're either delivery silence or actually
3414 monitoring, both of which are safe to do while session_state_changing is true.
3418 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3420 fill_buffers_with_input (bufs, _input, nframes);
3422 if (_meter_point == MeterInput) {
3423 _meter->run (bufs, start_frame, end_frame, nframes, true);
3426 _amp->apply_gain_automation (false);
3427 _trim->apply_gain_automation (false);
3428 passthru (bufs, start_frame, end_frame, nframes, 0);
3434 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3436 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3441 if (n_outputs().n_total() == 0) {
3445 if (!_active || n_inputs().n_total() == 0) {
3446 silence_unlocked (nframes);
3450 framepos_t unused = 0;
3452 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3458 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3460 fill_buffers_with_input (bufs, _input, nframes);
3462 if (_meter_point == MeterInput) {
3463 _meter->run (bufs, start_frame, end_frame, nframes, true);
3466 passthru (bufs, start_frame, end_frame, nframes, declick);
3472 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3479 Route::flush_processors ()
3481 /* XXX shouldn't really try to take this lock, since
3482 this is called from the RT audio thread.
3485 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3487 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3493 __attribute__((annotate("realtime")))
3496 Route::apply_processor_changes_rt ()
3498 int emissions = EmitNone;
3500 if (_pending_meter_point != _meter_point) {
3501 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3503 /* meters always have buffers for 'processor_max_streams'
3504 * they can be re-positioned without re-allocation */
3505 if (set_meter_point_unlocked()) {
3506 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3508 emissions |= EmitMeterChanged;
3513 bool changed = false;
3515 if (g_atomic_int_get (&_pending_process_reorder)) {
3516 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3518 apply_processor_order (_pending_processor_order);
3519 setup_invisible_processors ();
3521 g_atomic_int_set (&_pending_process_reorder, 0);
3522 emissions |= EmitRtProcessorChange;
3526 set_processor_positions ();
3528 if (emissions != 0) {
3529 g_atomic_int_set (&_pending_signals, emissions);
3536 Route::emit_pending_signals ()
3539 int sig = g_atomic_int_and (&_pending_signals, 0);
3540 if (sig & EmitMeterChanged) {
3541 _meter->emit_configuration_changed();
3542 meter_change (); /* EMIT SIGNAL */
3543 if (sig & EmitMeterVisibilityChange) {
3544 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3546 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3549 if (sig & EmitRtProcessorChange) {
3550 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3555 Route::set_meter_point (MeterPoint p, bool force)
3557 if (_pending_meter_point == p && !force) {
3561 if (force || !AudioEngine::instance()->running()) {
3562 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3563 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3564 _pending_meter_point = p;
3565 _meter->emit_configuration_changed();
3566 meter_change (); /* EMIT SIGNAL */
3567 if (set_meter_point_unlocked()) {
3568 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3570 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3573 _pending_meter_point = p;
3579 __attribute__((annotate("realtime")))
3582 Route::set_meter_point_unlocked ()
3585 /* Caller must hold process and processor write lock */
3586 assert (!AudioEngine::instance()->process_lock().trylock());
3587 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3588 assert (!lm.locked ());
3591 _meter_point = _pending_meter_point;
3593 bool meter_was_visible_to_user = _meter->display_to_user ();
3595 if (!_custom_meter_position_noted) {
3596 maybe_note_meter_position ();
3599 if (_meter_point != MeterCustom) {
3601 _meter->set_display_to_user (false);
3603 setup_invisible_processors ();
3606 _meter->set_display_to_user (true);
3608 /* If we have a previous position for the custom meter, try to put it there */
3609 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3611 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3612 if (i != _processors.end ()) {
3613 _processors.remove (_meter);
3614 _processors.insert (i, _meter);
3616 } else {// at end, right before the mains_out/panner
3617 _processors.remove (_meter);
3618 ProcessorList::iterator main = _processors.end();
3619 _processors.insert (--main, _meter);
3623 /* Set up the meter for its new position */
3625 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3629 if (loc == _processors.begin()) {
3630 m_in = _input->n_ports();
3632 ProcessorList::iterator before = loc;
3634 m_in = (*before)->output_streams ();
3637 _meter->reflect_inputs (m_in);
3639 /* we do not need to reconfigure the processors, because the meter
3640 (a) is always ready to handle processor_max_streams
3641 (b) is always an N-in/N-out processor, and thus moving
3642 it doesn't require any changes to the other processors.
3645 /* these should really be done after releasing the lock
3646 * but all those signals are subscribed to with gui_thread()
3649 return (_meter->display_to_user() != meter_was_visible_to_user);
3653 Route::listen_position_changed ()
3656 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3657 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3658 ProcessorState pstate (this);
3660 if (configure_processors_unlocked (0)) {
3662 configure_processors_unlocked (0); // it worked before we tried to add it ...
3667 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3668 _session.set_dirty ();
3671 boost::shared_ptr<CapturingProcessor>
3672 Route::add_export_point()
3674 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3675 if (!_capturing_processor) {
3677 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3678 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3680 _capturing_processor.reset (new CapturingProcessor (_session));
3681 _capturing_processor->activate ();
3683 configure_processors_unlocked (0);
3687 return _capturing_processor;
3691 Route::update_signal_latency ()
3693 framecnt_t l = _output->user_latency();
3694 framecnt_t lamp = 0;
3695 bool before_amp = true;
3696 framecnt_t ltrim = 0;
3697 bool before_trim = true;
3699 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3700 if ((*i)->active ()) {
3701 l += (*i)->signal_latency ();
3706 if ((*i) == _trim) {
3717 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3719 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3720 _signal_latency_at_amp_position = lamp;
3721 _signal_latency_at_trim_position = ltrim;
3723 if (_signal_latency != l) {
3724 _signal_latency = l;
3725 signal_latency_changed (); /* EMIT SIGNAL */
3728 return _signal_latency;
3732 Route::set_user_latency (framecnt_t nframes)
3734 _output->set_user_latency (nframes);
3735 _session.update_latency_compensation ();
3739 Route::set_latency_compensation (framecnt_t longest_session_latency)
3741 framecnt_t old = _initial_delay;
3743 if (_signal_latency < longest_session_latency) {
3744 _initial_delay = longest_session_latency - _signal_latency;
3749 DEBUG_TRACE (DEBUG::Latency, string_compose (
3750 "%1: compensate for maximum latency of %2,"
3751 "given own latency of %3, using initial delay of %4\n",
3752 name(), longest_session_latency, _signal_latency, _initial_delay));
3754 if (_initial_delay != old) {
3755 initial_delay_changed (); /* EMIT SIGNAL */
3758 if (_session.transport_stopped()) {
3759 _roll_delay = _initial_delay;
3763 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3764 : AutomationControl (r->session(),
3765 Evoral::Parameter (SoloAutomation),
3766 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3767 boost::shared_ptr<AutomationList>(), name)
3770 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3771 gl->set_interpolation(Evoral::ControlList::Discrete);
3776 Route::SoloControllable::set_value (double val)
3778 const bool bval = ((val >= 0.5) ? true : false);
3780 boost::shared_ptr<RouteList> rl (new RouteList);
3782 boost::shared_ptr<Route> r = _route.lock ();
3789 if (Config->get_solo_control_is_listen_control()) {
3790 _session.set_listen (rl, bval);
3792 _session.set_solo (rl, bval);
3797 Route::SoloControllable::get_value () const
3799 boost::shared_ptr<Route> r = _route.lock ();
3804 if (Config->get_solo_control_is_listen_control()) {
3805 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3807 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3811 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3812 : AutomationControl (r->session(),
3813 Evoral::Parameter (MuteAutomation),
3814 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3815 boost::shared_ptr<AutomationList>(),
3819 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3820 gl->set_interpolation(Evoral::ControlList::Discrete);
3825 Route::MuteControllable::set_superficial_value(bool muted)
3827 /* Note we can not use AutomationControl::set_value here since it will emit
3828 Changed(), but the value will not be correct to the observer. */
3830 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3832 Control::set_double (muted, _session.transport_frame(), to_list);
3836 Route::MuteControllable::set_value (double val)
3838 const bool bval = ((val >= 0.5) ? true : false);
3840 boost::shared_ptr<Route> r = _route.lock ();
3845 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3846 // Playing back automation, set route mute directly
3847 r->set_mute (bval, this);
3849 // Set from user, queue mute event
3850 boost::shared_ptr<RouteList> rl (new RouteList);
3852 _session.set_mute (rl, bval, Session::rt_cleanup);
3855 // Set superficial/automation value to drive controller (and possibly record)
3856 set_superficial_value(bval);
3860 Route::MuteControllable::get_value () const
3862 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3863 // Playing back automation, get the value from the list
3864 return AutomationControl::get_value();
3867 // Not playing back automation, get the actual route mute value
3868 boost::shared_ptr<Route> r = _route.lock ();
3869 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3873 Route::set_block_size (pframes_t nframes)
3875 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3876 (*i)->set_block_size (nframes);
3879 _session.ensure_buffers (n_process_buffers ());
3883 Route::protect_automation ()
3885 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3886 (*i)->protect_automation();
3889 /** @param declick 1 to set a pending declick fade-in,
3890 * -1 to set a pending declick fade-out
3893 Route::set_pending_declick (int declick)
3896 /* this call is not allowed to turn off a pending declick */
3898 _pending_declick = declick;
3901 _pending_declick = 0;
3905 /** Shift automation forwards from a particular place, thereby inserting time.
3906 * Adds undo commands for any shifts that are performed.
3908 * @param pos Position to start shifting from.
3909 * @param frames Amount to shift forwards by.
3913 Route::shift (framepos_t pos, framecnt_t frames)
3915 /* gain automation */
3917 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3919 XMLNode &before = gc->alist()->get_state ();
3920 gc->alist()->shift (pos, frames);
3921 XMLNode &after = gc->alist()->get_state ();
3922 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3925 /* gain automation */
3927 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3929 XMLNode &before = gc->alist()->get_state ();
3930 gc->alist()->shift (pos, frames);
3931 XMLNode &after = gc->alist()->get_state ();
3932 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3935 // TODO mute automation ??
3937 /* pan automation */
3939 ControlSet::Controls& c (_pannable->controls());
3941 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3942 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3944 boost::shared_ptr<AutomationList> al = pc->alist();
3945 XMLNode& before = al->get_state ();
3946 al->shift (pos, frames);
3947 XMLNode& after = al->get_state ();
3948 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3953 /* redirect automation */
3955 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3956 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3958 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3960 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3961 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3963 boost::shared_ptr<AutomationList> al = ac->alist();
3964 XMLNode &before = al->get_state ();
3965 al->shift (pos, frames);
3966 XMLNode &after = al->get_state ();
3967 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3976 Route::save_as_template (const string& path, const string& name)
3978 XMLNode& node (state (false));
3981 IO::set_name_in_state (*node.children().front(), name);
3983 tree.set_root (&node);
3984 return tree.write (path.c_str());
3989 Route::set_name (const string& str)
3991 if (str == name()) {
3995 string name = Route::ensure_track_or_route_name (str, _session);
3996 SessionObject::set_name (name);
3998 bool ret = (_input->set_name(name) && _output->set_name(name));
4001 /* rename the main outs. Leave other IO processors
4002 * with whatever name they already have, because its
4003 * just fine as it is (it will not contain the route
4004 * name if its a port insert, port send or port return).
4008 if (_main_outs->set_name (name)) {
4009 /* XXX returning false here is stupid because
4010 we already changed the route name.
4020 /** Set the name of a route in an XML description.
4021 * @param node XML <Route> node to set the name in.
4022 * @param name New name.
4025 Route::set_name_in_state (XMLNode& node, string const & name)
4027 node.add_property (X_("name"), name);
4029 XMLNodeList children = node.children();
4030 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4032 if ((*i)->name() == X_("IO")) {
4034 IO::set_name_in_state (**i, name);
4036 } else if ((*i)->name() == X_("Processor")) {
4038 XMLProperty* role = (*i)->property (X_("role"));
4039 if (role && role->value() == X_("Main")) {
4040 (*i)->add_property (X_("name"), name);
4043 } else if ((*i)->name() == X_("Diskstream")) {
4045 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4046 (*i)->add_property (X_("name"), name);
4052 boost::shared_ptr<Send>
4053 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4055 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4057 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4058 boost::shared_ptr<InternalSend> send;
4060 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4061 if (send->target_route() == target) {
4067 return boost::shared_ptr<Send>();
4070 /** @param c Audio channel index.
4071 * @param yn true to invert phase, otherwise false.
4074 Route::set_phase_invert (uint32_t c, bool yn)
4076 if (_phase_invert[c] != yn) {
4077 _phase_invert[c] = yn;
4078 phase_invert_changed (); /* EMIT SIGNAL */
4079 _session.set_dirty ();
4084 Route::set_phase_invert (boost::dynamic_bitset<> p)
4086 if (_phase_invert != p) {
4088 phase_invert_changed (); /* EMIT SIGNAL */
4089 _session.set_dirty ();
4094 Route::phase_invert (uint32_t c) const
4096 return _phase_invert[c];
4099 boost::dynamic_bitset<>
4100 Route::phase_invert () const
4102 return _phase_invert;
4106 Route::set_denormal_protection (bool yn)
4108 if (_denormal_protection != yn) {
4109 _denormal_protection = yn;
4110 denormal_protection_changed (); /* EMIT SIGNAL */
4115 Route::denormal_protection () const
4117 return _denormal_protection;
4121 Route::set_active (bool yn, void* src)
4123 if (_session.transport_rolling()) {
4127 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4128 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4132 if (_active != yn) {
4134 _input->set_active (yn);
4135 _output->set_active (yn);
4136 active_changed (); // EMIT SIGNAL
4137 _session.set_dirty ();
4141 boost::shared_ptr<Pannable>
4142 Route::pannable() const
4147 boost::shared_ptr<Panner>
4148 Route::panner() const
4151 return _main_outs->panner_shell()->panner();
4154 boost::shared_ptr<PannerShell>
4155 Route::panner_shell() const
4157 return _main_outs->panner_shell();
4160 boost::shared_ptr<AutomationControl>
4161 Route::gain_control() const
4163 return _amp->gain_control();
4166 boost::shared_ptr<AutomationControl>
4167 Route::get_control (const Evoral::Parameter& param)
4169 /* either we own the control or .... */
4171 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4175 /* maybe one of our processors does or ... */
4177 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4178 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4179 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4187 /* nobody does so we'll make a new one */
4189 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4196 boost::shared_ptr<Processor>
4197 Route::nth_plugin (uint32_t n)
4199 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4200 ProcessorList::iterator i;
4202 for (i = _processors.begin(); i != _processors.end(); ++i) {
4203 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4210 return boost::shared_ptr<Processor> ();
4213 boost::shared_ptr<Processor>
4214 Route::nth_send (uint32_t n)
4216 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4217 ProcessorList::iterator i;
4219 for (i = _processors.begin(); i != _processors.end(); ++i) {
4220 if (boost::dynamic_pointer_cast<Send> (*i)) {
4227 return boost::shared_ptr<Processor> ();
4231 Route::has_io_processor_named (const string& name)
4233 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4234 ProcessorList::iterator i;
4236 for (i = _processors.begin(); i != _processors.end(); ++i) {
4237 if (boost::dynamic_pointer_cast<Send> (*i) ||
4238 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4239 if ((*i)->name() == name) {
4248 MuteMaster::MutePoint
4249 Route::mute_points () const
4251 return _mute_master->mute_points ();
4255 Route::set_processor_positions ()
4257 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4259 bool had_amp = false;
4260 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4261 (*i)->set_pre_fader (!had_amp);
4268 /** Called when there is a proposed change to the input port count */
4270 Route::input_port_count_changing (ChanCount to)
4272 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4274 /* The processors cannot be configured with the new input arrangement, so
4280 /* The change is ok */
4284 /** Called when there is a proposed change to the output port count */
4286 Route::output_port_count_changing (ChanCount to)
4288 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4289 if (processor_out_streams.get(*t) > to.get(*t)) {
4293 /* The change is ok */
4298 Route::unknown_processors () const
4302 if (_session.get_disable_all_loaded_plugins ()) {
4303 // Do not list "missing plugins" if they are explicitly disabled
4307 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4308 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4309 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4310 p.push_back ((*i)->name ());
4319 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4321 /* we assume that all our input ports feed all our output ports. its not
4322 universally true, but the alternative is way too corner-case to worry about.
4325 LatencyRange all_connections;
4328 all_connections.min = 0;
4329 all_connections.max = 0;
4331 all_connections.min = ~((pframes_t) 0);
4332 all_connections.max = 0;
4334 /* iterate over all "from" ports and determine the latency range for all of their
4335 connections to the "outside" (outside of this Route).
4338 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4342 p->get_connected_latency_range (range, playback);
4344 all_connections.min = min (all_connections.min, range.min);
4345 all_connections.max = max (all_connections.max, range.max);
4349 /* set the "from" port latencies to the max/min range of all their connections */
4351 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4352 p->set_private_latency_range (all_connections, playback);
4355 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4357 all_connections.min += our_latency;
4358 all_connections.max += our_latency;
4360 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4361 p->set_private_latency_range (all_connections, playback);
4364 return all_connections.max;
4368 Route::set_private_port_latencies (bool playback) const
4370 framecnt_t own_latency = 0;
4372 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4373 OR LATENCY CALLBACK.
4375 This is called (early) from the latency callback. It computes the REAL
4376 latency associated with each port and stores the result as the "private"
4377 latency of the port. A later call to Route::set_public_port_latencies()
4378 sets all ports to the same value to reflect the fact that we do latency
4379 compensation and so all signals are delayed by the same amount as they
4380 flow through ardour.
4383 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4384 if ((*i)->active ()) {
4385 own_latency += (*i)->signal_latency ();
4390 /* playback: propagate latency from "outside the route" to outputs to inputs */
4391 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4393 /* capture: propagate latency from "outside the route" to inputs to outputs */
4394 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4399 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4401 /* this is called to set the JACK-visible port latencies, which take
4402 latency compensation into account.
4411 const PortSet& ports (_input->ports());
4412 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4413 p->set_public_latency_range (range, playback);
4418 const PortSet& ports (_output->ports());
4419 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4420 p->set_public_latency_range (range, playback);
4425 /** Put the invisible processors in the right place in _processors.
4426 * Must be called with a writer lock on _processor_lock held.
4429 __attribute__((annotate("realtime")))
4432 Route::setup_invisible_processors ()
4435 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4436 assert (!lm.locked ());
4440 /* too early to be doing this stuff */
4444 /* we'll build this new list here and then use it
4446 * TODO put the ProcessorList is on the stack for RT-safety.
4449 ProcessorList new_processors;
4451 /* find visible processors */
4453 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4454 if ((*i)->display_to_user ()) {
4455 new_processors.push_back (*i);
4461 ProcessorList::iterator amp = new_processors.begin ();
4462 while (amp != new_processors.end() && *amp != _amp) {
4466 assert (amp != new_processors.end ());
4468 /* and the processor after the amp */
4470 ProcessorList::iterator after_amp = amp;
4476 switch (_meter_point) {
4478 assert (!_meter->display_to_user ());
4479 new_processors.push_front (_meter);
4482 assert (!_meter->display_to_user ());
4483 new_processors.insert (amp, _meter);
4485 case MeterPostFader:
4486 /* do nothing here */
4489 /* do nothing here */
4492 /* the meter is visible, so we don't touch it here */
4499 assert (_main_outs);
4500 assert (!_main_outs->display_to_user ());
4501 new_processors.push_back (_main_outs);
4503 /* iterator for the main outs */
4505 ProcessorList::iterator main = new_processors.end();
4508 /* OUTPUT METERING */
4510 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4511 assert (!_meter->display_to_user ());
4513 /* add the processor just before or just after the main outs */
4515 ProcessorList::iterator meter_point = main;
4517 if (_meter_point == MeterOutput) {
4520 new_processors.insert (meter_point, _meter);
4525 if (_monitor_send && !is_monitor ()) {
4526 assert (!_monitor_send->display_to_user ());
4527 if (Config->get_solo_control_is_listen_control()) {
4528 switch (Config->get_listen_position ()) {
4529 case PreFaderListen:
4530 switch (Config->get_pfl_position ()) {
4531 case PFLFromBeforeProcessors:
4532 new_processors.push_front (_monitor_send);
4534 case PFLFromAfterProcessors:
4535 new_processors.insert (amp, _monitor_send);
4538 _monitor_send->set_can_pan (false);
4540 case AfterFaderListen:
4541 switch (Config->get_afl_position ()) {
4542 case AFLFromBeforeProcessors:
4543 new_processors.insert (after_amp, _monitor_send);
4545 case AFLFromAfterProcessors:
4546 new_processors.insert (new_processors.end(), _monitor_send);
4549 _monitor_send->set_can_pan (true);
4553 new_processors.insert (new_processors.end(), _monitor_send);
4554 _monitor_send->set_can_pan (false);
4558 #if 0 // not used - just yet
4559 if (!is_master() && !is_monitor() && !is_auditioner()) {
4560 new_processors.push_front (_delayline);
4564 /* MONITOR CONTROL */
4566 if (_monitor_control && is_monitor ()) {
4567 assert (!_monitor_control->display_to_user ());
4568 new_processors.push_front (_monitor_control);
4571 /* INTERNAL RETURN */
4573 /* doing this here means that any monitor control will come just after
4578 assert (!_intreturn->display_to_user ());
4579 new_processors.push_front (_intreturn);
4582 if (_trim && _trim->active()) {
4583 assert (!_trim->display_to_user ());
4584 new_processors.push_front (_trim);
4586 /* EXPORT PROCESSOR */
4588 if (_capturing_processor) {
4589 assert (!_capturing_processor->display_to_user ());
4590 new_processors.push_front (_capturing_processor);
4593 _processors = new_processors;
4595 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4596 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4601 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4602 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4603 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4610 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4611 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4615 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4616 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4623 /** If the meter point is `Custom', make a note of where the meter is.
4624 * This is so that if the meter point is subsequently set to something else,
4625 * and then back to custom, we can put the meter back where it was last time
4626 * custom was enabled.
4628 * Must be called with the _processor_lock held.
4631 Route::maybe_note_meter_position ()
4633 if (_meter_point != MeterCustom) {
4637 _custom_meter_position_noted = true;
4638 /* custom meter points range from after trim to before panner/main_outs
4639 * this is a limitation by the current processor UI
4641 bool seen_trim = false;
4642 _processor_after_last_custom_meter.reset();
4643 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4644 if ((*i) == _trim) {
4647 if ((*i) == _main_outs) {
4648 _processor_after_last_custom_meter = *i;
4651 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4653 _processor_after_last_custom_meter = _trim;
4655 ProcessorList::iterator j = i;
4657 assert(j != _processors.end ()); // main_outs should be before
4658 _processor_after_last_custom_meter = *j;
4663 assert(_processor_after_last_custom_meter.lock());
4666 boost::shared_ptr<Processor>
4667 Route::processor_by_id (PBD::ID id) const
4669 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4670 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4671 if ((*i)->id() == id) {
4676 return boost::shared_ptr<Processor> ();
4679 /** @return the monitoring state, or in other words what data we are pushing
4680 * into the route (data from the inputs, data from disk or silence)
4683 Route::monitoring_state () const
4685 return MonitoringInput;
4688 /** @return what we should be metering; either the data coming from the input
4689 * IO or the data that is flowing through the route.
4692 Route::metering_state () const
4694 return MeteringRoute;
4698 Route::has_external_redirects () const
4700 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4702 /* ignore inactive processors and obviously ignore the main
4703 * outs since everything has them and we don't care.
4706 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4714 boost::shared_ptr<Processor>
4715 Route::the_instrument () const
4717 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4718 return the_instrument_unlocked ();
4721 boost::shared_ptr<Processor>
4722 Route::the_instrument_unlocked () const
4724 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4725 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4726 if ((*i)->input_streams().n_midi() > 0 &&
4727 (*i)->output_streams().n_audio() > 0) {
4732 return boost::shared_ptr<Processor>();
4738 Route::non_realtime_locate (framepos_t pos)
4741 _pannable->transport_located (pos);
4744 if (_delayline.get()) {
4745 _delayline.get()->flush();
4749 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4750 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4752 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4753 (*i)->transport_located (pos);
4756 _roll_delay = _initial_delay;
4760 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4767 * We don't currently mix MIDI input together, so we don't need the
4768 * complex logic of the audio case.
4771 n_buffers = bufs.count().n_midi ();
4773 for (i = 0; i < n_buffers; ++i) {
4775 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4776 MidiBuffer& buf (bufs.get_midi (i));
4779 buf.copy (source_port->get_midi_buffer(nframes));
4781 buf.silence (nframes);
4787 n_buffers = bufs.count().n_audio();
4789 size_t n_ports = io->n_ports().n_audio();
4790 float scaling = 1.0f;
4792 if (n_ports > n_buffers) {
4793 scaling = ((float) n_buffers) / n_ports;
4796 for (i = 0; i < n_ports; ++i) {
4798 /* if there are more ports than buffers, map them onto buffers
4799 * in a round-robin fashion
4802 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4803 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4806 if (i < n_buffers) {
4808 /* first time through just copy a channel into
4812 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4814 if (scaling != 1.0f) {
4815 buf.apply_gain (scaling, nframes);
4820 /* on subsequent times around, merge data from
4821 * the port with what is already there
4824 if (scaling != 1.0f) {
4825 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4827 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4832 /* silence any remaining buffers */
4834 for (; i < n_buffers; ++i) {
4835 AudioBuffer& buf (bufs.get_audio (i));
4836 buf.silence (nframes);
4839 /* establish the initial setup of the buffer set, reflecting what was
4840 copied into it. unless, of course, we are the auditioner, in which
4841 case nothing was fed into it from the inputs at all.
4844 if (!is_auditioner()) {
4845 bufs.set_count (io->n_ports());