2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/boost_debug.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_track.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/buffer.h"
44 #include "ardour/buffer_set.h"
45 #include "ardour/capturing_processor.h"
46 #include "ardour/debug.h"
47 #include "ardour/delivery.h"
48 #include "ardour/internal_return.h"
49 #include "ardour/internal_send.h"
50 #include "ardour/meter.h"
51 #include "ardour/delayline.h"
52 #include "ardour/midi_buffer.h"
53 #include "ardour/midi_port.h"
54 #include "ardour/monitor_processor.h"
55 #include "ardour/pannable.h"
56 #include "ardour/panner.h"
57 #include "ardour/panner_shell.h"
58 #include "ardour/plugin_insert.h"
59 #include "ardour/port.h"
60 #include "ardour/port_insert.h"
61 #include "ardour/processor.h"
62 #include "ardour/profile.h"
63 #include "ardour/route.h"
64 #include "ardour/route_group.h"
65 #include "ardour/send.h"
66 #include "ardour/session.h"
67 #include "ardour/unknown_processor.h"
68 #include "ardour/utils.h"
73 using namespace ARDOUR;
76 PBD::Signal0<void> Route::SyncOrderKeys;
77 PBD::Signal0<void> Route::RemoteControlIDChange;
79 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
80 : SessionObject (sess, name)
82 , GraphNode (sess._process_graph)
85 , _signal_latency_at_amp_position (0)
86 , _signal_latency_at_trim_position (0)
89 , _pending_process_reorder (0)
90 , _pending_signals (0)
92 , _pending_declick (true)
93 , _meter_point (MeterPostFader)
94 , _pending_meter_point (MeterPostFader)
95 , _meter_type (MeterPeak)
97 , _soloed_by_others_upstream (0)
98 , _soloed_by_others_downstream (0)
99 , _solo_isolated (false)
100 , _solo_isolated_by_upstream (0)
101 , _denormal_protection (false)
104 , _declickable (false)
105 , _mute_master (new MuteMaster (sess, name))
106 , _have_internal_generator (false)
108 , _default_type (default_type)
110 , _has_order_key (false)
111 , _remote_control_id (0)
113 , _in_configure_processors (false)
114 , _initial_io_setup (false)
115 , _custom_meter_position_noted (false)
117 processor_max_streams.reset();
123 /* set default meter type */
125 _meter_type = Config->get_meter_type_master ();
127 else if (dynamic_cast<Track*>(this)) {
128 _meter_type = Config->get_meter_type_track ();
130 _meter_type = Config->get_meter_type_bus ();
133 /* add standard controls */
135 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
136 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
138 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
139 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
141 add_control (_solo_control);
142 add_control (_mute_control);
146 if (!(_flags & Route::MonitorOut)) {
147 _pannable.reset (new Pannable (_session));
150 /* input and output objects */
152 _input.reset (new IO (_session, _name, IO::Input, _default_type));
153 _output.reset (new IO (_session, _name, IO::Output, _default_type));
155 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
156 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
158 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
159 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
161 #if 0 // not used - just yet
162 if (!is_master() && !is_monitor() && !is_auditioner()) {
163 _delayline.reset (new DelayLine (_session, _name));
164 add_processor (_delayline, PreFader);
168 /* add amp processor */
170 _amp.reset (new Amp (_session));
171 add_processor (_amp, PostFader);
174 _trim.reset (new Amp (_session, "trim"));
175 _trim->set_display_to_user (false);
177 if (dynamic_cast<AudioTrack*>(this)) {
178 /* we can't do this in the AudioTrack's constructor
179 * because _trim does not exit then
183 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
188 /* create standard processors: meter, main outs, monitor out;
189 they will be added to _processors by setup_invisible_processors ()
192 _meter.reset (new PeakMeter (_session, _name));
193 _meter->set_owner (this);
194 _meter->set_display_to_user (false);
197 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
198 _main_outs->activate ();
201 /* where we listen to tracks */
202 _intreturn.reset (new InternalReturn (_session));
203 _intreturn->activate ();
205 /* the thing that provides proper control over a control/monitor/listen bus
206 (such as per-channel cut, dim, solo, invert, etc).
208 _monitor_control.reset (new MonitorProcessor (_session));
209 _monitor_control->activate ();
212 if (is_master() || is_monitor() || is_auditioner()) {
213 _mute_master->set_solo_ignore (true);
216 /* now that we have _meter, its safe to connect to this */
219 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
220 configure_processors (0);
228 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
230 /* do this early so that we don't get incoming signals as we are going through destruction
235 /* don't use clear_processors here, as it depends on the session which may
236 be half-destroyed by now
239 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
240 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
241 (*i)->drop_references ();
244 _processors.clear ();
248 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
250 if (Config->get_remote_model() != UserOrdered) {
254 set_remote_control_id_internal (id, notify_class_listeners);
258 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
260 /* force IDs for master/monitor busses and prevent
261 any other route from accidentally getting these IDs
262 (i.e. legacy sessions)
265 if (is_master() && id != MasterBusRemoteControlID) {
266 id = MasterBusRemoteControlID;
269 if (is_monitor() && id != MonitorBusRemoteControlID) {
270 id = MonitorBusRemoteControlID;
277 /* don't allow it to collide */
279 if (!is_master () && !is_monitor() &&
280 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
281 id += MonitorBusRemoteControlID;
284 if (id != remote_control_id()) {
285 _remote_control_id = id;
286 RemoteControlIDChanged ();
288 if (notify_class_listeners) {
289 RemoteControlIDChange ();
295 Route::remote_control_id() const
298 return MasterBusRemoteControlID;
302 return MonitorBusRemoteControlID;
305 return _remote_control_id;
309 Route::has_order_key () const
311 return _has_order_key;
315 Route::order_key () const
321 Route::set_remote_control_id_explicit (uint32_t rid)
323 if (is_master() || is_monitor() || is_auditioner()) {
324 /* hard-coded remote IDs, or no remote ID */
328 if (_remote_control_id != rid) {
329 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
330 _remote_control_id = rid;
331 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
334 /* don't emit the class-level RID signal RemoteControlIDChange here,
335 leave that to the entity that changed the order key, so that we
336 don't get lots of emissions for no good reasons (e.g. when changing
337 all route order keys).
339 See Session::sync_remote_id_from_order_keys() for the (primary|only)
340 spot where that is emitted.
345 Route::set_order_key (uint32_t n)
347 _has_order_key = true;
349 if (_order_key == n) {
355 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
356 name(), order_key ()));
358 _session.set_dirty ();
362 Route::ensure_track_or_route_name(string name, Session &session)
364 string newname = name;
366 while (!session.io_name_is_legal (newname)) {
367 newname = bump_name_once (newname, ' ');
374 Route::inc_gain (gain_t fraction, void *src)
376 _amp->inc_gain (fraction, src);
380 Route::set_gain (gain_t val, void *src)
382 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
384 if (_route_group->is_relative()) {
386 gain_t usable_gain = _amp->gain();
387 if (usable_gain < 0.000001f) {
388 usable_gain = 0.000001f;
392 if (delta < 0.000001f) {
396 delta -= usable_gain;
401 gain_t factor = delta / usable_gain;
404 factor = _route_group->get_max_factor(factor);
405 if (factor == 0.0f) {
406 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
410 factor = _route_group->get_min_factor(factor);
411 if (factor == 0.0f) {
412 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
417 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
421 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
427 if (val == _amp->gain()) {
431 _amp->set_gain (val, src);
435 Route::inc_trim (gain_t fraction, void *src)
437 _trim->inc_gain (fraction, src);
441 Route::set_trim (gain_t val, void * /* src */)
443 // TODO route group, see set_gain()
444 _trim->set_gain (val, 0);
448 Route::maybe_declick (BufferSet&, framecnt_t, int)
450 /* this is the "bus" implementation and they never declick.
455 /** Process this route for one (sub) cycle (process thread)
457 * @param bufs Scratch buffers to use for the signal path
458 * @param start_frame Initial transport frame
459 * @param end_frame Final transport frame
460 * @param nframes Number of frames to output (to ports)
462 * Note that (end_frame - start_frame) may not be equal to nframes when the
463 * transport speed isn't 1.0 (eg varispeed).
466 Route::process_output_buffers (BufferSet& bufs,
467 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
468 int declick, bool gain_automation_ok)
470 /* Caller must hold process lock */
471 assert (!AudioEngine::instance()->process_lock().trylock());
473 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
475 // can this actually happen? functions calling process_output_buffers()
476 // already take a reader-lock.
477 bufs.silence (nframes, 0);
481 /* figure out if we're going to use gain automation */
482 if (gain_automation_ok) {
483 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
484 _amp->setup_gain_automation (
485 start_frame + _signal_latency_at_amp_position,
486 end_frame + _signal_latency_at_amp_position,
489 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
490 _trim->setup_gain_automation (
491 start_frame + _signal_latency_at_trim_position,
492 end_frame + _signal_latency_at_trim_position,
495 _amp->apply_gain_automation (false);
496 _trim->apply_gain_automation (false);
499 /* Tell main outs what to do about monitoring. We do this so that
500 on a transition between monitoring states we get a de-clicking gain
501 change in the _main_outs delivery, if config.get_use_monitor_fades()
504 We override this in the case where we have an internal generator.
506 bool silence = _have_internal_generator ? false : (monitoring_state () == MonitoringSilence);
508 _main_outs->no_outs_cuz_we_no_monitor (silence);
510 /* -------------------------------------------------------------------------------------------
511 GLOBAL DECLICK (for transport changes etc.)
512 ----------------------------------------------------------------------------------------- */
514 maybe_declick (bufs, nframes, declick);
515 _pending_declick = 0;
517 /* -------------------------------------------------------------------------------------------
518 DENORMAL CONTROL/PHASE INVERT
519 ----------------------------------------------------------------------------------------- */
521 if (_phase_invert.any ()) {
525 if (_denormal_protection || Config->get_denormal_protection()) {
527 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
528 Sample* const sp = i->data();
530 if (_phase_invert[chn]) {
531 for (pframes_t nx = 0; nx < nframes; ++nx) {
536 for (pframes_t nx = 0; nx < nframes; ++nx) {
544 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
545 Sample* const sp = i->data();
547 if (_phase_invert[chn]) {
548 for (pframes_t nx = 0; nx < nframes; ++nx) {
557 if (_denormal_protection || Config->get_denormal_protection()) {
559 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
560 Sample* const sp = i->data();
561 for (pframes_t nx = 0; nx < nframes; ++nx) {
569 /* -------------------------------------------------------------------------------------------
571 ----------------------------------------------------------------------------------------- */
573 /* set this to be true if the meter will already have been ::run() earlier */
574 bool const meter_already_run = metering_state() == MeteringInput;
576 framecnt_t latency = 0;
578 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
580 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
581 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
586 /* if it has any inputs, make sure they match */
587 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
588 if (bufs.count() != (*i)->input_streams()) {
590 DEBUG::Processors, string_compose (
591 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
592 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
599 /* should we NOT run plugins here if the route is inactive?
600 do we catch route != active somewhere higher?
603 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
604 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
607 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
608 bufs.set_count ((*i)->output_streams());
610 if ((*i)->active ()) {
611 latency += (*i)->signal_latency ();
617 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
618 boost::shared_ptr<Processor> endpoint,
619 bool include_endpoint, bool for_export, bool for_freeze)
621 /* If no processing is required, there's no need to go any further. */
622 if (!endpoint && !include_endpoint) {
626 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
627 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
628 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
630 /* trim is always at the top, for bounce no latency compensation is needed */
631 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
632 _trim->setup_gain_automation (start, start + nframes, nframes);
635 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
637 if (!include_endpoint && (*i) == endpoint) {
641 /* if we're not exporting, stop processing if we come across a routing processor. */
642 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
645 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
649 /* don't run any processors that does routing.
650 * oh, and don't bother with the peak meter either.
652 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
653 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
654 buffers.set_count ((*i)->output_streams());
655 latency += (*i)->signal_latency ();
658 if ((*i) == endpoint) {
665 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
666 bool include_endpoint, bool for_export, bool for_freeze) const
668 framecnt_t latency = 0;
669 if (!endpoint && !include_endpoint) {
673 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
674 if (!include_endpoint && (*i) == endpoint) {
677 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
680 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
683 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
684 latency += (*i)->signal_latency ();
686 if ((*i) == endpoint) {
694 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
695 bool include_endpoint, bool for_export, bool for_freeze) const
697 if (!endpoint && !include_endpoint) {
701 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
702 if (!include_endpoint && (*i) == endpoint) {
705 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
708 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
711 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
712 cc = (*i)->output_streams();
714 if ((*i) == endpoint) {
722 Route::n_process_buffers ()
724 return max (_input->n_ports(), processor_max_streams);
728 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
730 assert (is_monitor());
731 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
732 fill_buffers_with_input (bufs, _input, nframes);
733 passthru (bufs, start_frame, end_frame, nframes, declick);
737 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
741 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
743 /* control/monitor bus ignores input ports when something is
744 feeding the listen "stream". data will "arrive" into the
745 route from the intreturn processor element.
748 bufs.silence (nframes, 0);
751 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
752 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
756 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
758 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
760 bufs.set_count (_input->n_ports());
761 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
762 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
766 Route::set_listen (bool yn, void* src)
772 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
773 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
778 if (yn != _monitor_send->active()) {
780 _monitor_send->activate ();
781 _mute_master->set_soloed_by_self (true);
783 _monitor_send->deactivate ();
784 _mute_master->set_soloed_by_self (false);
786 _mute_master->set_soloed_by_others (false);
788 listen_changed (src); /* EMIT SIGNAL */
794 Route::listening_via_monitor () const
797 return _monitor_send->active ();
804 Route::set_solo_safe (bool yn, void *src)
806 if (_solo_safe != yn) {
808 solo_safe_changed (src);
813 Route::solo_safe() const
819 Route::set_solo (bool yn, void *src)
822 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
826 if (is_master() || is_monitor() || is_auditioner()) {
827 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
831 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
832 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
836 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
837 name(), yn, src, (src == _route_group), self_soloed()));
839 if (self_soloed() != yn) {
841 set_mute_master_solo ();
842 solo_changed (true, src); /* EMIT SIGNAL */
843 _solo_control->Changed (); /* EMIT SIGNAL */
846 /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
847 Config->get_solo_mute_overrride().
850 if (yn && Profile->get_trx()) {
851 set_mute (false, src);
856 Route::set_self_solo (bool yn)
858 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
863 Route::mod_solo_by_others_upstream (int32_t delta)
865 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
866 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
868 uint32_t old_sbu = _soloed_by_others_upstream;
871 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
872 _soloed_by_others_upstream += delta;
874 _soloed_by_others_upstream = 0;
877 _soloed_by_others_upstream += delta;
880 DEBUG_TRACE (DEBUG::Solo, string_compose (
881 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
882 name(), delta, _soloed_by_others_upstream, old_sbu,
883 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
885 /* push the inverse solo change to everything that feeds us.
887 This is important for solo-within-group. When we solo 1 track out of N that
888 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
889 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
890 tracks that feed it. This will silence them if they were audible because
891 of a bus solo, but the newly soloed track will still be audible (because
894 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
898 if ((_self_solo || _soloed_by_others_downstream) &&
899 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
900 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
902 if (delta > 0 || !Config->get_exclusive_solo()) {
903 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
904 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
905 boost::shared_ptr<Route> sr = i->r.lock();
907 sr->mod_solo_by_others_downstream (-delta);
913 set_mute_master_solo ();
914 solo_changed (false, this);
918 Route::mod_solo_by_others_downstream (int32_t delta)
920 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
921 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
924 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
925 _soloed_by_others_downstream += delta;
927 _soloed_by_others_downstream = 0;
930 _soloed_by_others_downstream += delta;
933 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
935 set_mute_master_solo ();
936 solo_changed (false, this);
940 Route::set_mute_master_solo ()
942 _mute_master->set_soloed_by_self (self_soloed());
943 _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
947 Route::mod_solo_isolated_by_upstream (bool yn, void* src)
949 bool old = solo_isolated ();
952 if (_solo_isolated_by_upstream >= 1) {
953 _solo_isolated_by_upstream--;
955 _solo_isolated_by_upstream = 0;
958 _solo_isolated_by_upstream++;
961 if (solo_isolated() != old) {
962 /* solo isolated status changed */
963 _mute_master->set_solo_ignore (yn);
964 solo_isolated_changed (src);
969 Route::set_solo_isolated (bool yn, void *src)
971 if (is_master() || is_monitor() || is_auditioner()) {
975 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
976 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
980 bool changed = false;
983 if (_solo_isolated == false) {
984 _mute_master->set_solo_ignore (true);
987 _solo_isolated = true;
989 if (_solo_isolated == true) {
990 _solo_isolated = false;
991 _mute_master->set_solo_ignore (false);
1001 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1003 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1004 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1006 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1011 bool does_feed = feeds (*i, &sends_only);
1013 if (does_feed && !sends_only) {
1014 (*i)->mod_solo_isolated_by_upstream (yn, src);
1018 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1020 solo_isolated_changed (src);
1024 Route::solo_isolated () const
1026 return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
1030 Route::set_mute_points (MuteMaster::MutePoint mp)
1032 _mute_master->set_mute_points (mp);
1033 mute_points_changed (); /* EMIT SIGNAL */
1035 if (_mute_master->muted_by_self()) {
1036 mute_changed (this); /* EMIT SIGNAL */
1037 _mute_control->Changed (); /* EMIT SIGNAL */
1042 Route::set_mute (bool yn, void *src)
1044 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1045 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1049 if (muted() != yn) {
1050 _mute_master->set_muted_by_self (yn);
1051 /* allow any derived classes to respond to the mute change
1052 before anybody else knows about it.
1055 /* tell everyone else */
1056 mute_changed (src); /* EMIT SIGNAL */
1057 _mute_control->Changed (); /* EMIT SIGNAL */
1062 Route::muted () const
1064 return _mute_master->muted_by_self();
1068 Route::muted_by_others () const
1070 //master is never muted by others
1074 //now check to see if something is soloed (and I am not)
1075 return (_session.soloing() && !self_soloed() && !solo_isolated());
1080 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1082 cerr << name << " {" << endl;
1083 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1084 p != procs.end(); ++p) {
1085 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1087 cerr << "}" << endl;
1091 /** Supposing that we want to insert a Processor at a given Placement, return
1092 * the processor to add the new one before (or 0 to add at the end).
1094 boost::shared_ptr<Processor>
1095 Route::before_processor_for_placement (Placement p)
1097 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1099 ProcessorList::iterator loc;
1101 if (p == PreFader) {
1102 /* generic pre-fader: insert immediately before the amp */
1103 loc = find (_processors.begin(), _processors.end(), _amp);
1105 /* generic post-fader: insert right before the main outs */
1106 loc = find (_processors.begin(), _processors.end(), _main_outs);
1109 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1112 /** Supposing that we want to insert a Processor at a given index, return
1113 * the processor to add the new one before (or 0 to add at the end).
1115 boost::shared_ptr<Processor>
1116 Route::before_processor_for_index (int index)
1119 return boost::shared_ptr<Processor> ();
1122 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1124 ProcessorList::iterator i = _processors.begin ();
1126 while (i != _processors.end() && j < index) {
1127 if ((*i)->display_to_user()) {
1134 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1137 /** Add a processor either pre- or post-fader
1138 * @return 0 on success, non-0 on failure.
1141 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1143 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1147 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1148 * @param index Index to add the processor at, or -1 to add at the end of the list.
1149 * @return 0 on success, non-0 on failure.
1152 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1154 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1157 /** Add a processor to the route.
1158 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1159 * @return 0 on success, non-0 on failure.
1162 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1164 assert (processor != _meter);
1165 assert (processor != _main_outs);
1167 DEBUG_TRACE (DEBUG::Processors, string_compose (
1168 "%1 adding processor %2\n", name(), processor->name()));
1170 if (!AudioEngine::instance()->connected() || !processor) {
1175 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1176 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1177 ProcessorState pstate (this);
1179 boost::shared_ptr<PluginInsert> pi;
1180 boost::shared_ptr<PortInsert> porti;
1182 if (processor == _amp) {
1183 /* Ensure that only one amp is in the list at any time */
1184 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1185 if (check != _processors.end()) {
1186 if (before == _amp) {
1187 /* Already in position; all is well */
1190 _processors.erase (check);
1195 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1197 ProcessorList::iterator loc;
1199 /* inserting before a processor; find it */
1200 loc = find (_processors.begin(), _processors.end(), before);
1201 if (loc == _processors.end ()) {
1206 /* inserting at end */
1207 loc = _processors.end ();
1210 _processors.insert (loc, processor);
1211 processor->set_owner (this);
1213 // Set up processor list channels. This will set processor->[input|output]_streams(),
1214 // configure redirect ports properly, etc.
1217 if (configure_processors_unlocked (err)) {
1219 configure_processors_unlocked (0); // it worked before we tried to add it ...
1224 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1226 if (pi->has_no_inputs ()) {
1227 /* generator plugin */
1228 _have_internal_generator = true;
1233 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
1234 processor->activate ();
1237 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1239 _output->set_user_latency (0);
1242 reset_instrument_info ();
1243 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1244 set_processor_positions ();
1250 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1252 const XMLProperty *prop;
1255 boost::shared_ptr<Processor> processor;
1257 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1258 so that we can add the processor in the right place (pre/post-fader)
1261 XMLNodeList const & children = node.children ();
1262 XMLNodeList::const_iterator i = children.begin ();
1264 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1268 Placement placement = PreFader;
1270 if (i != children.end()) {
1271 if ((prop = (*i)->property (X_("placement"))) != 0) {
1272 placement = Placement (string_2_enum (prop->value(), placement));
1276 if (node.name() == "Insert") {
1278 if ((prop = node.property ("type")) != 0) {
1280 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1281 prop->value() == "lv2" ||
1282 prop->value() == "windows-vst" ||
1283 prop->value() == "lxvst" ||
1284 prop->value() == "audiounit") {
1286 if (_session.get_disable_all_loaded_plugins ()) {
1287 processor.reset (new UnknownProcessor (_session, node));
1289 processor.reset (new PluginInsert (_session));
1294 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1299 } else if (node.name() == "Send") {
1301 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1302 processor.reset (new Send (_session, sendpan, _mute_master));
1306 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1310 if (processor->set_state (node, version)) {
1314 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1315 if (i != children.end()) {
1316 if ((prop = (*i)->property (X_("active"))) != 0) {
1317 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1318 processor->activate();
1320 processor->deactivate();
1324 return (add_processor (processor, placement, 0, false) == 0);
1327 catch (failed_constructor &err) {
1328 warning << _("processor could not be created. Ignored.") << endmsg;
1334 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1336 /* NOTE: this is intended to be used ONLY when copying
1337 processors from another Route. Hence the subtle
1338 differences between this and ::add_processor()
1341 ProcessorList::iterator loc;
1344 loc = find(_processors.begin(), _processors.end(), before);
1346 /* nothing specified - at end */
1347 loc = _processors.end ();
1350 if (!_session.engine().connected()) {
1354 if (others.empty()) {
1359 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1360 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1361 ProcessorState pstate (this);
1363 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1369 boost::shared_ptr<PluginInsert> pi;
1371 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1375 _processors.insert (loc, *i);
1376 (*i)->set_owner (this);
1378 if ((*i)->active()) {
1382 /* Think: does this really need to be called for every processor in the loop? */
1384 if (configure_processors_unlocked (err)) {
1386 configure_processors_unlocked (0); // it worked before we tried to add it ...
1391 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1394 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1395 boost::shared_ptr<PluginInsert> pi;
1397 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1398 if (pi->has_no_inputs ()) {
1399 _have_internal_generator = true;
1405 _output->set_user_latency (0);
1408 reset_instrument_info ();
1409 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1410 set_processor_positions ();
1416 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1418 if (p == PreFader) {
1419 start = _processors.begin();
1420 end = find(_processors.begin(), _processors.end(), _amp);
1422 start = find(_processors.begin(), _processors.end(), _amp);
1424 end = _processors.end();
1428 /** Turn off all processors with a given placement
1429 * @param p Placement of processors to disable
1432 Route::disable_processors (Placement p)
1434 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1436 ProcessorList::iterator start, end;
1437 placement_range(p, start, end);
1439 for (ProcessorList::iterator i = start; i != end; ++i) {
1440 (*i)->deactivate ();
1443 _session.set_dirty ();
1446 /** Turn off all redirects
1449 Route::disable_processors ()
1451 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1453 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1454 (*i)->deactivate ();
1457 _session.set_dirty ();
1460 /** Turn off all redirects with a given placement
1461 * @param p Placement of redirects to disable
1464 Route::disable_plugins (Placement p)
1466 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1468 ProcessorList::iterator start, end;
1469 placement_range(p, start, end);
1471 for (ProcessorList::iterator i = start; i != end; ++i) {
1472 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1473 (*i)->deactivate ();
1477 _session.set_dirty ();
1480 /** Turn off all plugins
1483 Route::disable_plugins ()
1485 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1487 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1488 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1489 (*i)->deactivate ();
1493 _session.set_dirty ();
1498 Route::ab_plugins (bool forward)
1500 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1504 /* forward = turn off all active redirects, and mark them so that the next time
1505 we go the other way, we will revert them
1508 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1509 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1513 if ((*i)->active()) {
1514 (*i)->deactivate ();
1515 (*i)->set_next_ab_is_active (true);
1517 (*i)->set_next_ab_is_active (false);
1523 /* backward = if the redirect was marked to go active on the next ab, do so */
1525 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1527 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1531 if ((*i)->get_next_ab_is_active()) {
1534 (*i)->deactivate ();
1539 _session.set_dirty ();
1543 /** Remove processors with a given placement.
1544 * @param p Placement of processors to remove.
1547 Route::clear_processors (Placement p)
1549 if (!_session.engine().connected()) {
1553 bool already_deleting = _session.deletion_in_progress();
1554 if (!already_deleting) {
1555 _session.set_deletion_in_progress();
1559 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1560 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1561 ProcessorList new_list;
1562 ProcessorStreams err;
1563 bool seen_amp = false;
1565 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1571 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1573 /* you can't remove these */
1575 new_list.push_back (*i);
1582 new_list.push_back (*i);
1585 (*i)->drop_references ();
1593 (*i)->drop_references ();
1596 new_list.push_back (*i);
1603 _processors = new_list;
1604 configure_processors_unlocked (&err); // this can't fail
1607 processor_max_streams.reset();
1608 _have_internal_generator = false;
1609 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1610 set_processor_positions ();
1612 reset_instrument_info ();
1614 if (!already_deleting) {
1615 _session.clear_deletion_in_progress();
1620 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1622 // TODO once the export point can be configured properly, do something smarter here
1623 if (processor == _capturing_processor) {
1624 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1625 if (need_process_lock) {
1629 _capturing_processor.reset();
1631 if (need_process_lock) {
1636 /* these can never be removed */
1638 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1642 if (!_session.engine().connected()) {
1646 processor_max_streams.reset();
1649 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1650 if (need_process_lock) {
1654 /* Caller must hold process lock */
1655 assert (!AudioEngine::instance()->process_lock().trylock());
1657 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1659 ProcessorState pstate (this);
1661 ProcessorList::iterator i;
1662 bool removed = false;
1664 for (i = _processors.begin(); i != _processors.end(); ) {
1665 if (*i == processor) {
1667 /* move along, see failure case for configure_processors()
1668 where we may need to reconfigure the processor.
1671 /* stop redirects that send signals to JACK ports
1672 from causing noise as a result of no longer being
1676 boost::shared_ptr<IOProcessor> iop;
1678 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1682 i = _processors.erase (i);
1690 _output->set_user_latency (0);
1698 if (configure_processors_unlocked (err)) {
1700 /* we know this will work, because it worked before :) */
1701 configure_processors_unlocked (0);
1705 _have_internal_generator = false;
1707 for (i = _processors.begin(); i != _processors.end(); ++i) {
1708 boost::shared_ptr<PluginInsert> pi;
1710 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1711 if (pi->has_no_inputs ()) {
1712 _have_internal_generator = true;
1717 if (need_process_lock) {
1722 reset_instrument_info ();
1723 processor->drop_references ();
1724 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1725 set_processor_positions ();
1731 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1733 ProcessorList deleted;
1735 if (!_session.engine().connected()) {
1739 processor_max_streams.reset();
1742 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1743 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1744 ProcessorState pstate (this);
1746 ProcessorList::iterator i;
1747 boost::shared_ptr<Processor> processor;
1749 for (i = _processors.begin(); i != _processors.end(); ) {
1753 /* these can never be removed */
1755 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1760 /* see if its in the list of processors to delete */
1762 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1767 /* stop IOProcessors that send to JACK ports
1768 from causing noise as a result of no longer being
1772 boost::shared_ptr<IOProcessor> iop;
1774 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1778 deleted.push_back (processor);
1779 i = _processors.erase (i);
1782 if (deleted.empty()) {
1783 /* none of those in the requested list were found */
1787 _output->set_user_latency (0);
1789 if (configure_processors_unlocked (err)) {
1791 /* we know this will work, because it worked before :) */
1792 configure_processors_unlocked (0);
1797 _have_internal_generator = false;
1799 for (i = _processors.begin(); i != _processors.end(); ++i) {
1800 boost::shared_ptr<PluginInsert> pi;
1802 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1803 if (pi->has_no_inputs ()) {
1804 _have_internal_generator = true;
1811 /* now try to do what we need to so that those that were removed will be deleted */
1813 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1814 (*i)->drop_references ();
1817 reset_instrument_info ();
1818 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1819 set_processor_positions ();
1825 Route::reset_instrument_info ()
1827 boost::shared_ptr<Processor> instr = the_instrument();
1829 _instrument_info.set_internal_instrument (instr);
1833 /** Caller must hold process lock */
1835 Route::configure_processors (ProcessorStreams* err)
1837 #ifndef PLATFORM_WINDOWS
1838 assert (!AudioEngine::instance()->process_lock().trylock());
1841 if (!_in_configure_processors) {
1842 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1843 return configure_processors_unlocked (err);
1850 Route::input_streams () const
1852 return _input->n_ports ();
1855 list<pair<ChanCount, ChanCount> >
1856 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1858 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1860 return try_configure_processors_unlocked (in, err);
1863 list<pair<ChanCount, ChanCount> >
1864 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1866 // Check each processor in order to see if we can configure as requested
1868 list<pair<ChanCount, ChanCount> > configuration;
1871 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1872 DEBUG_TRACE (DEBUG::Processors, "{\n");
1874 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1876 if ((*p)->can_support_io_configuration(in, out)) {
1877 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1878 configuration.push_back(make_pair(in, out));
1885 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1886 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1887 DEBUG_TRACE (DEBUG::Processors, "}\n");
1888 return list<pair<ChanCount, ChanCount> > ();
1892 DEBUG_TRACE (DEBUG::Processors, "}\n");
1894 return configuration;
1897 /** Set the input/output configuration of each processor in the processors list.
1898 * Caller must hold process lock.
1899 * Return 0 on success, otherwise configuration is impossible.
1902 Route::configure_processors_unlocked (ProcessorStreams* err)
1904 #ifndef PLATFORM_WINDOWS
1905 assert (!AudioEngine::instance()->process_lock().trylock());
1908 if (_in_configure_processors) {
1912 /* put invisible processors where they should be */
1913 setup_invisible_processors ();
1915 _in_configure_processors = true;
1917 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1919 if (configuration.empty ()) {
1920 _in_configure_processors = false;
1925 bool seen_mains_out = false;
1926 processor_out_streams = _input->n_ports();
1927 processor_max_streams.reset();
1929 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1930 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1932 if (!(*p)->configure_io(c->first, c->second)) {
1933 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1935 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1936 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1938 boost::shared_ptr<PluginInsert> pi;
1939 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1940 /* plugins connected via Split Match may have more channels.
1941 * route/scratch buffers are needed for all of them*/
1942 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
1943 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
1947 if (boost::dynamic_pointer_cast<Delivery> (*p)
1948 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1949 /* main delivery will increase port count to match input.
1950 * the Delivery::Main is usually the last processor - followed only by
1953 seen_mains_out = true;
1955 if (!seen_mains_out) {
1956 processor_out_streams = out;
1962 _meter->set_max_channels (processor_max_streams);
1965 /* make sure we have sufficient scratch buffers to cope with the new processor
1968 _session.ensure_buffers (n_process_buffers ());
1970 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1972 _in_configure_processors = false;
1976 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1977 * @param state New active state for those processors.
1980 Route::all_visible_processors_active (bool state)
1982 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1984 if (_processors.empty()) {
1988 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1989 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1996 (*i)->deactivate ();
2000 _session.set_dirty ();
2004 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2006 /* check if re-order requires re-configuration of any processors
2007 * -> compare channel configuration for all processors
2009 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2010 ChanCount c = input_streams ();
2012 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2014 if (c != (*j)->input_streams()) {
2017 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2020 if ((*i)->input_streams() != c) {
2023 c = (*i)->output_streams();
2035 __attribute__((annotate("realtime")))
2038 Route::apply_processor_order (const ProcessorList& new_order)
2040 /* need to hold processor_lock; either read or write lock
2041 * and the engine process_lock.
2042 * Due to r/w lock ambiguity we can only assert the latter
2044 assert (!AudioEngine::instance()->process_lock().trylock());
2047 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2048 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2049 * processors in the current actual processor list that are hidden. Any visible processors
2050 * in the current list but not in "new_order" will be assumed to be deleted.
2053 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2054 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2055 * (note though that ::processors_reorder_needs_configure() ensured that
2056 * this function will only ever be called from the rt-thread if no processor were removed)
2058 * either way, I can't proove it, but an x-run due to re-order here is less likley
2059 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2062 ProcessorList as_it_will_be;
2063 ProcessorList::iterator oiter;
2064 ProcessorList::const_iterator niter;
2066 oiter = _processors.begin();
2067 niter = new_order.begin();
2069 while (niter != new_order.end()) {
2071 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2072 then append it to the temp list.
2074 Otherwise, see if the next processor in the old list is in the new list. if not,
2075 its been deleted. If its there, append it to the temp list.
2078 if (oiter == _processors.end()) {
2080 /* no more elements in the old list, so just stick the rest of
2081 the new order onto the temp list.
2084 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2085 while (niter != new_order.end()) {
2092 if (!(*oiter)->display_to_user()) {
2094 as_it_will_be.push_back (*oiter);
2098 /* visible processor: check that its in the new order */
2100 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2101 /* deleted: do nothing, shared_ptr<> will clean up */
2103 /* ignore this one, and add the next item from the new order instead */
2104 as_it_will_be.push_back (*niter);
2109 /* now remove from old order - its taken care of no matter what */
2110 oiter = _processors.erase (oiter);
2114 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2116 /* If the meter is in a custom position, find it and make a rough note of its position */
2117 maybe_note_meter_position ();
2121 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2123 // it a change is already queued, wait for it
2124 // (unless engine is stopped. apply immediately and proceed
2125 while (g_atomic_int_get (&_pending_process_reorder)) {
2126 if (!AudioEngine::instance()->running()) {
2127 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2128 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2130 apply_processor_order(_pending_processor_order);
2131 setup_invisible_processors ();
2133 g_atomic_int_set (&_pending_process_reorder, 0);
2135 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2136 set_processor_positions ();
2138 // TODO rather use a semaphore or something.
2139 // but since ::reorder_processors() is called
2140 // from the GUI thread, this is fine..
2145 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2147 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2148 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2149 ProcessorState pstate (this);
2151 apply_processor_order (new_order);
2153 if (configure_processors_unlocked (err)) {
2161 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2162 set_processor_positions ();
2165 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2166 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2168 // _pending_processor_order is protected by _processor_lock
2169 _pending_processor_order = new_order;
2170 g_atomic_int_set (&_pending_process_reorder, 1);
2183 Route::get_template()
2185 return state(false);
2189 Route::state(bool full_state)
2191 XMLNode *node = new XMLNode("Route");
2192 ProcessorList::iterator i;
2195 id().print (buf, sizeof (buf));
2196 node->add_property("id", buf);
2197 node->add_property ("name", _name);
2198 node->add_property("default-type", _default_type.to_string());
2201 node->add_property("flags", enum_2_string (_flags));
2204 node->add_property("active", _active?"yes":"no");
2206 boost::to_string (_phase_invert, p);
2207 node->add_property("phase-invert", p);
2208 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2209 node->add_property("meter-point", enum_2_string (_meter_point));
2211 node->add_property("meter-type", enum_2_string (_meter_type));
2214 node->add_property("route-group", _route_group->name());
2217 snprintf (buf, sizeof (buf), "%d", _order_key);
2218 node->add_property ("order-key", buf);
2219 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2220 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2221 node->add_property ("soloed-by-upstream", buf);
2222 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2223 node->add_property ("soloed-by-downstream", buf);
2224 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2225 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2227 node->add_child_nocopy (_input->state (full_state));
2228 node->add_child_nocopy (_output->state (full_state));
2229 node->add_child_nocopy (_solo_control->get_state ());
2230 node->add_child_nocopy (_mute_control->get_state ());
2231 node->add_child_nocopy (_mute_master->get_state ());
2234 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2237 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2238 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2239 remote_control_node->add_property (X_("id"), buf);
2240 node->add_child_nocopy (*remote_control_node);
2242 if (_comment.length()) {
2243 XMLNode *cmt = node->add_child ("Comment");
2244 cmt->add_content (_comment);
2248 node->add_child_nocopy (_pannable->state (full_state));
2251 for (i = _processors.begin(); i != _processors.end(); ++i) {
2253 /* template save: do not include internal sends functioning as
2254 aux sends because the chance of the target ID
2255 in the session where this template is used
2258 similarly, do not save listen sends which connect to
2259 the monitor section, because these will always be
2262 boost::shared_ptr<InternalSend> is;
2264 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2265 if (is->role() == Delivery::Listen) {
2270 node->add_child_nocopy((*i)->state (full_state));
2274 node->add_child_copy (*_extra_xml);
2277 if (_custom_meter_position_noted) {
2278 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2280 after->id().print (buf, sizeof (buf));
2281 node->add_property (X_("processor-after-last-custom-meter"), buf);
2289 Route::set_state (const XMLNode& node, int version)
2291 if (version < 3000) {
2292 return set_state_2X (node, version);
2296 XMLNodeConstIterator niter;
2298 const XMLProperty *prop;
2300 if (node.name() != "Route"){
2301 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2305 if ((prop = node.property (X_("name"))) != 0) {
2306 Route::set_name (prop->value());
2310 _initial_io_setup = true;
2312 if ((prop = node.property (X_("flags"))) != 0) {
2313 _flags = Flag (string_2_enum (prop->value(), _flags));
2318 if (is_master() || is_monitor() || is_auditioner()) {
2319 _mute_master->set_solo_ignore (true);
2323 /* monitor bus does not get a panner, but if (re)created
2324 via XML, it will already have one by the time we
2325 call ::set_state(). so ... remove it.
2330 /* add all processors (except amp, which is always present) */
2332 nlist = node.children();
2333 XMLNode processor_state (X_("processor_state"));
2335 Stateful::save_extra_xml (node);
2337 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2341 if (child->name() == IO::state_node_name) {
2342 if ((prop = child->property (X_("direction"))) == 0) {
2346 if (prop->value() == "Input") {
2347 _input->set_state (*child, version);
2348 } else if (prop->value() == "Output") {
2349 _output->set_state (*child, version);
2353 if (child->name() == X_("Processor")) {
2354 processor_state.add_child_copy (*child);
2357 if (child->name() == X_("Pannable")) {
2359 _pannable->set_state (*child, version);
2361 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2366 if ((prop = node.property (X_("meter-point"))) != 0) {
2367 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2368 set_meter_point (mp, true);
2370 _meter->set_display_to_user (_meter_point == MeterCustom);
2374 if ((prop = node.property (X_("meter-type"))) != 0) {
2375 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2378 _initial_io_setup = false;
2380 set_processor_state (processor_state);
2382 // this looks up the internal instrument in processors
2383 reset_instrument_info();
2385 if ((prop = node.property ("self-solo")) != 0) {
2386 set_self_solo (string_is_affirmative (prop->value()));
2389 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2390 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2391 mod_solo_by_others_upstream (atoi (prop->value()));
2394 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2395 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2396 mod_solo_by_others_downstream (atoi (prop->value()));
2399 if ((prop = node.property ("solo-isolated")) != 0) {
2400 set_solo_isolated (string_is_affirmative (prop->value()), this);
2403 if ((prop = node.property ("solo-safe")) != 0) {
2404 set_solo_safe (string_is_affirmative (prop->value()), this);
2407 if ((prop = node.property (X_("phase-invert"))) != 0) {
2408 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2411 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2412 set_denormal_protection (string_is_affirmative (prop->value()));
2415 if ((prop = node.property (X_("active"))) != 0) {
2416 bool yn = string_is_affirmative (prop->value());
2417 _active = !yn; // force switch
2418 set_active (yn, this);
2421 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2422 set_order_key (atoi(prop->value()));
2425 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2429 string::size_type colon, equal;
2430 string remaining = prop->value();
2432 while (remaining.length()) {
2434 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2435 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2438 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2439 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2442 string keyname = remaining.substr (0, equal);
2444 if ((keyname == "EditorSort") || (keyname == "editor")) {
2445 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2451 colon = remaining.find_first_of (':');
2453 if (colon != string::npos) {
2454 remaining = remaining.substr (colon+1);
2461 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2462 PBD::ID id (prop->value ());
2463 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2464 ProcessorList::const_iterator i = _processors.begin ();
2465 while (i != _processors.end() && (*i)->id() != id) {
2469 if (i != _processors.end ()) {
2470 _processor_after_last_custom_meter = *i;
2471 _custom_meter_position_noted = true;
2475 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2478 if (child->name() == X_("Comment")) {
2480 /* XXX this is a terrible API design in libxml++ */
2482 XMLNode *cmt = *(child->children().begin());
2483 _comment = cmt->content();
2485 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2486 if (prop->value() == "solo") {
2487 _solo_control->set_state (*child, version);
2488 } else if (prop->value() == "mute") {
2489 _mute_control->set_state (*child, version);
2492 } else if (child->name() == X_("RemoteControl")) {
2493 if ((prop = child->property (X_("id"))) != 0) {
2495 sscanf (prop->value().c_str(), "%d", &x);
2496 set_remote_control_id_internal (x);
2499 } else if (child->name() == X_("MuteMaster")) {
2500 _mute_master->set_state (*child, version);
2502 } else if (child->name() == Automatable::xml_node_name) {
2503 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2511 Route::set_state_2X (const XMLNode& node, int version)
2513 LocaleGuard lg (X_("C"));
2515 XMLNodeConstIterator niter;
2517 const XMLProperty *prop;
2519 /* 2X things which still remain to be handled:
2525 if (node.name() != "Route") {
2526 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2530 if ((prop = node.property (X_("flags"))) != 0) {
2531 string f = prop->value ();
2532 boost::replace_all (f, "ControlOut", "MonitorOut");
2533 _flags = Flag (string_2_enum (f, _flags));
2538 if (is_master() || is_monitor() || is_auditioner()) {
2539 _mute_master->set_solo_ignore (true);
2542 if ((prop = node.property (X_("phase-invert"))) != 0) {
2543 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2544 if (string_is_affirmative (prop->value ())) {
2547 set_phase_invert (p);
2550 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2551 set_denormal_protection (string_is_affirmative (prop->value()));
2554 if ((prop = node.property (X_("soloed"))) != 0) {
2555 bool yn = string_is_affirmative (prop->value());
2557 /* XXX force reset of solo status */
2559 set_solo (yn, this);
2562 if ((prop = node.property (X_("muted"))) != 0) {
2565 bool muted = string_is_affirmative (prop->value());
2571 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2573 if (string_is_affirmative (prop->value())){
2574 mute_point = mute_point + "PreFader";
2579 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2581 if (string_is_affirmative (prop->value())){
2584 mute_point = mute_point + ",";
2587 mute_point = mute_point + "PostFader";
2592 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2594 if (string_is_affirmative (prop->value())){
2597 mute_point = mute_point + ",";
2600 mute_point = mute_point + "Listen";
2605 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2607 if (string_is_affirmative (prop->value())){
2610 mute_point = mute_point + ",";
2613 mute_point = mute_point + "Main";
2617 _mute_master->set_mute_points (mute_point);
2618 _mute_master->set_muted_by_self (true);
2622 if ((prop = node.property (X_("meter-point"))) != 0) {
2623 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2626 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2627 don't mean the same thing.
2630 if ((prop = node.property (X_("order-keys"))) != 0) {
2634 string::size_type colon, equal;
2635 string remaining = prop->value();
2637 while (remaining.length()) {
2639 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2640 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2643 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2644 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2647 string keyname = remaining.substr (0, equal);
2649 if (keyname == "EditorSort" || keyname == "editor") {
2650 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2656 colon = remaining.find_first_of (':');
2658 if (colon != string::npos) {
2659 remaining = remaining.substr (colon+1);
2668 nlist = node.children ();
2669 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2673 if (child->name() == IO::state_node_name) {
2675 /* there is a note in IO::set_state_2X() about why we have to call
2679 _input->set_state_2X (*child, version, true);
2680 _output->set_state_2X (*child, version, false);
2682 if ((prop = child->property (X_("name"))) != 0) {
2683 Route::set_name (prop->value ());
2688 if ((prop = child->property (X_("active"))) != 0) {
2689 bool yn = string_is_affirmative (prop->value());
2690 _active = !yn; // force switch
2691 set_active (yn, this);
2694 if ((prop = child->property (X_("gain"))) != 0) {
2697 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2698 _amp->gain_control()->set_value (val);
2702 /* Set up Panners in the IO */
2703 XMLNodeList io_nlist = child->children ();
2705 XMLNodeConstIterator io_niter;
2708 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2710 io_child = *io_niter;
2712 if (io_child->name() == X_("Panner")) {
2713 _main_outs->panner_shell()->set_state(*io_child, version);
2714 } else if (io_child->name() == X_("Automation")) {
2715 /* IO's automation is for the fader */
2716 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2722 XMLNodeList redirect_nodes;
2724 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2728 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2729 redirect_nodes.push_back(child);
2734 set_processor_state_2X (redirect_nodes, version);
2736 Stateful::save_extra_xml (node);
2738 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2741 if (child->name() == X_("Comment")) {
2743 /* XXX this is a terrible API design in libxml++ */
2745 XMLNode *cmt = *(child->children().begin());
2746 _comment = cmt->content();
2748 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2749 if (prop->value() == X_("solo")) {
2750 _solo_control->set_state (*child, version);
2751 } else if (prop->value() == X_("mute")) {
2752 _mute_control->set_state (*child, version);
2755 } else if (child->name() == X_("RemoteControl")) {
2756 if ((prop = child->property (X_("id"))) != 0) {
2758 sscanf (prop->value().c_str(), "%d", &x);
2759 set_remote_control_id_internal (x);
2769 Route::get_processor_state ()
2771 XMLNode* root = new XMLNode (X_("redirects"));
2772 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2773 root->add_child_nocopy ((*i)->state (true));
2780 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2782 /* We don't bother removing existing processors not in nList, as this
2783 method will only be called when creating a Route from scratch, not
2784 for undo purposes. Just put processors in at the appropriate place
2788 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2789 add_processor_from_xml_2X (**i, version);
2794 Route::set_processor_state (const XMLNode& node)
2796 const XMLNodeList &nlist = node.children();
2797 XMLNodeConstIterator niter;
2798 ProcessorList new_order;
2799 bool must_configure = false;
2801 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2803 XMLProperty* prop = (*niter)->property ("type");
2805 if (prop->value() == "amp") {
2806 _amp->set_state (**niter, Stateful::current_state_version);
2807 new_order.push_back (_amp);
2808 } else if (prop->value() == "trim") {
2809 _trim->set_state (**niter, Stateful::current_state_version);
2810 new_order.push_back (_trim);
2811 } else if (prop->value() == "meter") {
2812 _meter->set_state (**niter, Stateful::current_state_version);
2813 new_order.push_back (_meter);
2814 } else if (prop->value() == "delay") {
2816 _delayline->set_state (**niter, Stateful::current_state_version);
2817 new_order.push_back (_delayline);
2819 } else if (prop->value() == "main-outs") {
2820 _main_outs->set_state (**niter, Stateful::current_state_version);
2821 } else if (prop->value() == "intreturn") {
2823 _intreturn.reset (new InternalReturn (_session));
2824 must_configure = true;
2826 _intreturn->set_state (**niter, Stateful::current_state_version);
2827 } else if (is_monitor() && prop->value() == "monitor") {
2828 if (!_monitor_control) {
2829 _monitor_control.reset (new MonitorProcessor (_session));
2830 must_configure = true;
2832 _monitor_control->set_state (**niter, Stateful::current_state_version);
2833 } else if (prop->value() == "capture") {
2834 /* CapturingProcessor should never be restored, it's always
2835 added explicitly when needed */
2837 ProcessorList::iterator o;
2839 for (o = _processors.begin(); o != _processors.end(); ++o) {
2840 XMLProperty* id_prop = (*niter)->property(X_("id"));
2841 if (id_prop && (*o)->id() == id_prop->value()) {
2842 (*o)->set_state (**niter, Stateful::current_state_version);
2843 new_order.push_back (*o);
2848 // If the processor (*niter) is not on the route then create it
2850 if (o == _processors.end()) {
2852 boost::shared_ptr<Processor> processor;
2854 if (prop->value() == "intsend") {
2856 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2858 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2859 prop->value() == "lv2" ||
2860 prop->value() == "windows-vst" ||
2861 prop->value() == "lxvst" ||
2862 prop->value() == "audiounit") {
2864 if (_session.get_disable_all_loaded_plugins ()) {
2865 processor.reset (new UnknownProcessor (_session, **niter));
2867 processor.reset (new PluginInsert (_session));
2869 } else if (prop->value() == "port") {
2871 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2873 } else if (prop->value() == "send") {
2875 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2878 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2882 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2883 /* This processor could not be configured. Turn it into a UnknownProcessor */
2884 processor.reset (new UnknownProcessor (_session, **niter));
2887 /* we have to note the monitor send here, otherwise a new one will be created
2888 and the state of this one will be lost.
2890 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2891 if (isend && isend->role() == Delivery::Listen) {
2892 _monitor_send = isend;
2895 /* it doesn't matter if invisible processors are added here, as they
2896 will be sorted out by setup_invisible_processors () shortly.
2899 new_order.push_back (processor);
2900 must_configure = true;
2906 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2907 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2908 _processors = new_order;
2910 if (must_configure) {
2911 configure_processors_unlocked (0);
2914 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2916 (*i)->set_owner (this);
2917 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2919 boost::shared_ptr<PluginInsert> pi;
2921 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2922 if (pi->has_no_inputs ()) {
2923 _have_internal_generator = true;
2930 reset_instrument_info ();
2931 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2932 set_processor_positions ();
2936 Route::curve_reallocate ()
2938 // _gain_automation_curve.finish_resize ();
2939 // _pan_automation_curve.finish_resize ();
2943 Route::silence (framecnt_t nframes)
2945 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2950 silence_unlocked (nframes);
2954 Route::silence_unlocked (framecnt_t nframes)
2956 /* Must be called with the processor lock held */
2960 _output->silence (nframes);
2962 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2963 boost::shared_ptr<PluginInsert> pi;
2965 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2966 // skip plugins, they don't need anything when we're not active
2970 (*i)->silence (nframes);
2973 if (nframes == _session.get_block_size()) {
2980 Route::add_internal_return ()
2983 _intreturn.reset (new InternalReturn (_session));
2984 add_processor (_intreturn, PreFader);
2989 Route::add_send_to_internal_return (InternalSend* send)
2991 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2993 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2994 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2997 return d->add_send (send);
3003 Route::remove_send_from_internal_return (InternalSend* send)
3005 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3007 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3008 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3011 return d->remove_send (send);
3017 Route::enable_monitor_send ()
3019 /* Caller must hold process lock */
3020 assert (!AudioEngine::instance()->process_lock().trylock());
3022 /* master never sends to monitor section via the normal mechanism */
3023 assert (!is_master ());
3024 assert (!is_monitor ());
3026 /* make sure we have one */
3027 if (!_monitor_send) {
3028 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3029 _monitor_send->set_display_to_user (false);
3033 configure_processors (0);
3036 /** Add an aux send to a route.
3037 * @param route route to send to.
3038 * @param before Processor to insert before, or 0 to insert at the end.
3041 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3043 assert (route != _session.monitor_out ());
3046 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3048 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3050 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3052 if (d && d->target_route() == route) {
3053 /* already listening via the specified IO: do nothing */
3061 boost::shared_ptr<InternalSend> listener;
3064 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3065 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3066 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3069 add_processor (listener, before);
3071 } catch (failed_constructor& err) {
3079 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3081 ProcessorStreams err;
3082 ProcessorList::iterator tmp;
3085 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3087 /* have to do this early because otherwise processor reconfig
3088 * will put _monitor_send back in the list
3091 if (route == _session.monitor_out()) {
3092 _monitor_send.reset ();
3096 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3098 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3100 if (d && d->target_route() == route) {
3102 if (remove_processor (*x, &err, false) > 0) {
3108 /* list could have been demolished while we dropped the lock
3111 if (_session.engine().connected()) {
3112 /* i/o processors cannot be removed if the engine is not running
3113 * so don't live-loop in case the engine is N/A or dies
3123 Route::set_comment (string cmt, void *src)
3126 comment_changed (src);
3127 _session.set_dirty ();
3131 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3133 FeedRecord fr (other, via_sends_only);
3135 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3137 if (!result.second) {
3139 /* already a record for "other" - make sure sends-only information is correct */
3140 if (!via_sends_only && result.first->sends_only) {
3141 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3142 frp->sends_only = false;
3146 return result.second;
3150 Route::clear_fed_by ()
3156 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3158 const FedBy& fed_by (other->fed_by());
3160 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3161 boost::shared_ptr<Route> sr = f->r.lock();
3163 if (sr && (sr.get() == this)) {
3165 if (via_sends_only) {
3166 *via_sends_only = f->sends_only;
3177 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3179 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3181 if (_output->connected_to (other->input())) {
3182 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3183 if (via_send_only) {
3184 *via_send_only = false;
3191 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3193 boost::shared_ptr<IOProcessor> iop;
3195 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3196 if (iop->feeds (other)) {
3197 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3198 if (via_send_only) {
3199 *via_send_only = true;
3203 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3206 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3211 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3216 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3218 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3221 /** Called from the (non-realtime) butler thread when the transport is stopped */
3223 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3225 framepos_t now = _session.transport_frame();
3228 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3230 Automatable::transport_stopped (now);
3232 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3234 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3238 (*i)->transport_stopped (now);
3242 _roll_delay = _initial_delay;
3246 Route::input_change_handler (IOChange change, void * /*src*/)
3248 bool need_to_queue_solo_change = true;
3250 if ((change.type & IOChange::ConfigurationChanged)) {
3251 /* This is called with the process lock held if change
3252 contains ConfigurationChanged
3254 need_to_queue_solo_change = false;
3255 configure_processors (0);
3256 _phase_invert.resize (_input->n_ports().n_audio ());
3257 io_changed (); /* EMIT SIGNAL */
3260 if (!_input->connected() && _soloed_by_others_upstream) {
3261 if (need_to_queue_solo_change) {
3262 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3264 cancel_solo_after_disconnect (true);
3267 } else if (_soloed_by_others_upstream) {
3268 bool cancel_solo = true;
3269 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3270 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3271 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3275 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3276 if (does_feed && !sends_only) {
3277 if ((*i)->soloed()) {
3278 cancel_solo = false;
3284 cancel_solo_after_disconnect (true);
3287 } else if (self_soloed()) {
3289 // TODO propagate upstream
3290 // see commment in output_change_handler() below
3295 Route::output_change_handler (IOChange change, void * /*src*/)
3297 bool need_to_queue_solo_change = true;
3298 if (_initial_io_setup) {
3302 if ((change.type & IOChange::ConfigurationChanged)) {
3303 /* This is called with the process lock held if change
3304 contains ConfigurationChanged
3306 need_to_queue_solo_change = false;
3307 configure_processors (0);
3310 _session.reset_monitor_section();
3313 io_changed (); /* EMIT SIGNAL */
3316 if (!_output->connected() && _soloed_by_others_downstream) {
3317 if (need_to_queue_solo_change) {
3318 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3320 cancel_solo_after_disconnect (false);
3323 } else if (_soloed_by_others_downstream) {
3324 bool cancel_solo = true;
3325 /* checking all all downstream routes for
3326 * explicit of implict solo is a rather drastic measure,
3327 * ideally the input_change_handler() of the other route
3328 * would propagate the change to us.
3330 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3331 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3332 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3336 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3337 if (does_feed && !sends_only) {
3338 if ((*i)->soloed()) {
3339 cancel_solo = false;
3345 cancel_solo_after_disconnect (false);
3348 } else if (self_soloed()) {
3349 // TODO propagate change downstream to the disconnected routes
3350 // Q: how to get the routes that were just disconnected. ?
3351 // A: /maybe/ by diff feeds() aka fed_by() vs direct_feeds_according_to_reality() ?!?
3357 Route::cancel_solo_after_disconnect (bool upstream)
3360 _soloed_by_others_upstream = 0;
3362 _soloed_by_others_downstream = 0;
3364 set_mute_master_solo ();
3365 solo_changed (false, this);
3369 Route::pans_required () const
3371 if (n_outputs().n_audio() < 2) {
3375 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3379 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3381 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3387 if (n_outputs().n_total() == 0) {
3391 if (!_active || n_inputs() == ChanCount::ZERO) {
3392 silence_unlocked (nframes);
3396 if (session_state_changing) {
3397 if (_session.transport_speed() != 0.0f) {
3398 /* we're rolling but some state is changing (e.g. our diskstream contents)
3399 so we cannot use them. Be silent till this is over.
3401 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3403 silence_unlocked (nframes);
3406 /* we're really not rolling, so we're either delivery silence or actually
3407 monitoring, both of which are safe to do while session_state_changing is true.
3411 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3413 fill_buffers_with_input (bufs, _input, nframes);
3415 if (_meter_point == MeterInput) {
3416 _meter->run (bufs, start_frame, end_frame, nframes, true);
3419 _amp->apply_gain_automation (false);
3420 _trim->apply_gain_automation (false);
3421 passthru (bufs, start_frame, end_frame, nframes, 0);
3427 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3429 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3434 if (n_outputs().n_total() == 0) {
3438 if (!_active || n_inputs().n_total() == 0) {
3439 silence_unlocked (nframes);
3443 framepos_t unused = 0;
3445 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3451 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3453 fill_buffers_with_input (bufs, _input, nframes);
3455 if (_meter_point == MeterInput) {
3456 _meter->run (bufs, start_frame, end_frame, nframes, true);
3459 passthru (bufs, start_frame, end_frame, nframes, declick);
3465 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3472 Route::flush_processors ()
3474 /* XXX shouldn't really try to take this lock, since
3475 this is called from the RT audio thread.
3478 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3480 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3486 __attribute__((annotate("realtime")))
3489 Route::apply_processor_changes_rt ()
3491 int emissions = EmitNone;
3493 if (_pending_meter_point != _meter_point) {
3494 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3496 /* meters always have buffers for 'processor_max_streams'
3497 * they can be re-positioned without re-allocation */
3498 if (set_meter_point_unlocked()) {
3499 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3501 emissions |= EmitMeterChanged;
3506 bool changed = false;
3508 if (g_atomic_int_get (&_pending_process_reorder)) {
3509 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3511 apply_processor_order (_pending_processor_order);
3512 setup_invisible_processors ();
3514 g_atomic_int_set (&_pending_process_reorder, 0);
3515 emissions |= EmitRtProcessorChange;
3519 set_processor_positions ();
3521 if (emissions != 0) {
3522 g_atomic_int_set (&_pending_signals, emissions);
3529 Route::emit_pending_signals ()
3532 int sig = g_atomic_int_and (&_pending_signals, 0);
3533 if (sig & EmitMeterChanged) {
3534 _meter->emit_configuration_changed();
3535 meter_change (); /* EMIT SIGNAL */
3536 if (sig & EmitMeterVisibilityChange) {
3537 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3539 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3542 if (sig & EmitRtProcessorChange) {
3543 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3548 Route::set_meter_point (MeterPoint p, bool force)
3550 if (_pending_meter_point == p && !force) {
3554 if (force || !AudioEngine::instance()->running()) {
3555 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3556 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3557 _pending_meter_point = p;
3558 _meter->emit_configuration_changed();
3559 meter_change (); /* EMIT SIGNAL */
3560 if (set_meter_point_unlocked()) {
3561 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3563 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3566 _pending_meter_point = p;
3572 __attribute__((annotate("realtime")))
3575 Route::set_meter_point_unlocked ()
3578 /* Caller must hold process and processor write lock */
3579 assert (!AudioEngine::instance()->process_lock().trylock());
3580 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3581 assert (!lm.locked ());
3584 _meter_point = _pending_meter_point;
3586 bool meter_was_visible_to_user = _meter->display_to_user ();
3588 if (!_custom_meter_position_noted) {
3589 maybe_note_meter_position ();
3592 if (_meter_point != MeterCustom) {
3594 _meter->set_display_to_user (false);
3596 setup_invisible_processors ();
3599 _meter->set_display_to_user (true);
3601 /* If we have a previous position for the custom meter, try to put it there */
3602 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3604 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3605 if (i != _processors.end ()) {
3606 _processors.remove (_meter);
3607 _processors.insert (i, _meter);
3609 } else {// at end, right before the mains_out/panner
3610 _processors.remove (_meter);
3611 ProcessorList::iterator main = _processors.end();
3612 _processors.insert (--main, _meter);
3616 /* Set up the meter for its new position */
3618 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3622 if (loc == _processors.begin()) {
3623 m_in = _input->n_ports();
3625 ProcessorList::iterator before = loc;
3627 m_in = (*before)->output_streams ();
3630 _meter->reflect_inputs (m_in);
3632 /* we do not need to reconfigure the processors, because the meter
3633 (a) is always ready to handle processor_max_streams
3634 (b) is always an N-in/N-out processor, and thus moving
3635 it doesn't require any changes to the other processors.
3638 /* these should really be done after releasing the lock
3639 * but all those signals are subscribed to with gui_thread()
3642 return (_meter->display_to_user() != meter_was_visible_to_user);
3646 Route::listen_position_changed ()
3649 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3650 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3651 ProcessorState pstate (this);
3653 if (configure_processors_unlocked (0)) {
3655 configure_processors_unlocked (0); // it worked before we tried to add it ...
3660 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3661 _session.set_dirty ();
3664 boost::shared_ptr<CapturingProcessor>
3665 Route::add_export_point()
3667 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3668 if (!_capturing_processor) {
3670 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3671 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3673 _capturing_processor.reset (new CapturingProcessor (_session));
3674 _capturing_processor->activate ();
3676 configure_processors_unlocked (0);
3680 return _capturing_processor;
3684 Route::update_signal_latency ()
3686 framecnt_t l = _output->user_latency();
3687 framecnt_t lamp = 0;
3688 bool before_amp = true;
3689 framecnt_t ltrim = 0;
3690 bool before_trim = true;
3692 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3693 if ((*i)->active ()) {
3694 l += (*i)->signal_latency ();
3699 if ((*i) == _trim) {
3710 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3712 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3713 _signal_latency_at_amp_position = lamp;
3714 _signal_latency_at_trim_position = ltrim;
3716 if (_signal_latency != l) {
3717 _signal_latency = l;
3718 signal_latency_changed (); /* EMIT SIGNAL */
3721 return _signal_latency;
3725 Route::set_user_latency (framecnt_t nframes)
3727 _output->set_user_latency (nframes);
3728 _session.update_latency_compensation ();
3732 Route::set_latency_compensation (framecnt_t longest_session_latency)
3734 framecnt_t old = _initial_delay;
3736 if (_signal_latency < longest_session_latency) {
3737 _initial_delay = longest_session_latency - _signal_latency;
3742 DEBUG_TRACE (DEBUG::Latency, string_compose (
3743 "%1: compensate for maximum latency of %2,"
3744 "given own latency of %3, using initial delay of %4\n",
3745 name(), longest_session_latency, _signal_latency, _initial_delay));
3747 if (_initial_delay != old) {
3748 initial_delay_changed (); /* EMIT SIGNAL */
3751 if (_session.transport_stopped()) {
3752 _roll_delay = _initial_delay;
3756 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3757 : AutomationControl (r->session(),
3758 Evoral::Parameter (SoloAutomation),
3759 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3760 boost::shared_ptr<AutomationList>(), name)
3763 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3764 gl->set_interpolation(Evoral::ControlList::Discrete);
3769 Route::SoloControllable::set_value (double val)
3771 const bool bval = ((val >= 0.5) ? true : false);
3773 boost::shared_ptr<RouteList> rl (new RouteList);
3775 boost::shared_ptr<Route> r = _route.lock ();
3782 if (Config->get_solo_control_is_listen_control()) {
3783 _session.set_listen (rl, bval);
3785 _session.set_solo (rl, bval);
3790 Route::SoloControllable::get_value () const
3792 boost::shared_ptr<Route> r = _route.lock ();
3797 if (Config->get_solo_control_is_listen_control()) {
3798 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3800 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3804 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3805 : AutomationControl (r->session(),
3806 Evoral::Parameter (MuteAutomation),
3807 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3808 boost::shared_ptr<AutomationList>(),
3812 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3813 gl->set_interpolation(Evoral::ControlList::Discrete);
3818 Route::MuteControllable::set_superficial_value(bool muted)
3820 /* Note we can not use AutomationControl::set_value here since it will emit
3821 Changed(), but the value will not be correct to the observer. */
3823 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3825 Control::set_double (muted, _session.transport_frame(), to_list);
3829 Route::MuteControllable::set_value (double val)
3831 const bool bval = ((val >= 0.5) ? true : false);
3833 boost::shared_ptr<Route> r = _route.lock ();
3838 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3839 // Playing back automation, set route mute directly
3840 r->set_mute (bval, this);
3842 // Set from user, queue mute event
3843 boost::shared_ptr<RouteList> rl (new RouteList);
3845 _session.set_mute (rl, bval, Session::rt_cleanup);
3848 // Set superficial/automation value to drive controller (and possibly record)
3849 set_superficial_value(bval);
3853 Route::MuteControllable::get_value () const
3855 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3856 // Playing back automation, get the value from the list
3857 return AutomationControl::get_value();
3860 // Not playing back automation, get the actual route mute value
3861 boost::shared_ptr<Route> r = _route.lock ();
3862 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3866 Route::set_block_size (pframes_t nframes)
3868 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3869 (*i)->set_block_size (nframes);
3872 _session.ensure_buffers (n_process_buffers ());
3876 Route::protect_automation ()
3878 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3879 (*i)->protect_automation();
3882 /** @param declick 1 to set a pending declick fade-in,
3883 * -1 to set a pending declick fade-out
3886 Route::set_pending_declick (int declick)
3889 /* this call is not allowed to turn off a pending declick */
3891 _pending_declick = declick;
3894 _pending_declick = 0;
3898 /** Shift automation forwards from a particular place, thereby inserting time.
3899 * Adds undo commands for any shifts that are performed.
3901 * @param pos Position to start shifting from.
3902 * @param frames Amount to shift forwards by.
3906 Route::shift (framepos_t pos, framecnt_t frames)
3908 /* gain automation */
3910 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3912 XMLNode &before = gc->alist()->get_state ();
3913 gc->alist()->shift (pos, frames);
3914 XMLNode &after = gc->alist()->get_state ();
3915 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3918 /* gain automation */
3920 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3922 XMLNode &before = gc->alist()->get_state ();
3923 gc->alist()->shift (pos, frames);
3924 XMLNode &after = gc->alist()->get_state ();
3925 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3928 // TODO mute automation ??
3930 /* pan automation */
3932 ControlSet::Controls& c (_pannable->controls());
3934 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3935 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3937 boost::shared_ptr<AutomationList> al = pc->alist();
3938 XMLNode& before = al->get_state ();
3939 al->shift (pos, frames);
3940 XMLNode& after = al->get_state ();
3941 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3946 /* redirect automation */
3948 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3949 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3951 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3953 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3954 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3956 boost::shared_ptr<AutomationList> al = ac->alist();
3957 XMLNode &before = al->get_state ();
3958 al->shift (pos, frames);
3959 XMLNode &after = al->get_state ();
3960 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3969 Route::save_as_template (const string& path, const string& name)
3971 XMLNode& node (state (false));
3974 IO::set_name_in_state (*node.children().front(), name);
3976 tree.set_root (&node);
3977 return tree.write (path.c_str());
3982 Route::set_name (const string& str)
3984 if (str == name()) {
3988 string name = Route::ensure_track_or_route_name (str, _session);
3989 SessionObject::set_name (name);
3991 bool ret = (_input->set_name(name) && _output->set_name(name));
3994 /* rename the main outs. Leave other IO processors
3995 * with whatever name they already have, because its
3996 * just fine as it is (it will not contain the route
3997 * name if its a port insert, port send or port return).
4001 if (_main_outs->set_name (name)) {
4002 /* XXX returning false here is stupid because
4003 we already changed the route name.
4013 /** Set the name of a route in an XML description.
4014 * @param node XML <Route> node to set the name in.
4015 * @param name New name.
4018 Route::set_name_in_state (XMLNode& node, string const & name)
4020 node.add_property (X_("name"), name);
4022 XMLNodeList children = node.children();
4023 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4025 if ((*i)->name() == X_("IO")) {
4027 IO::set_name_in_state (**i, name);
4029 } else if ((*i)->name() == X_("Processor")) {
4031 XMLProperty* role = (*i)->property (X_("role"));
4032 if (role && role->value() == X_("Main")) {
4033 (*i)->add_property (X_("name"), name);
4036 } else if ((*i)->name() == X_("Diskstream")) {
4038 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4039 (*i)->add_property (X_("name"), name);
4045 boost::shared_ptr<Send>
4046 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4048 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4050 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4051 boost::shared_ptr<InternalSend> send;
4053 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4054 if (send->target_route() == target) {
4060 return boost::shared_ptr<Send>();
4063 /** @param c Audio channel index.
4064 * @param yn true to invert phase, otherwise false.
4067 Route::set_phase_invert (uint32_t c, bool yn)
4069 if (_phase_invert[c] != yn) {
4070 _phase_invert[c] = yn;
4071 phase_invert_changed (); /* EMIT SIGNAL */
4072 _session.set_dirty ();
4077 Route::set_phase_invert (boost::dynamic_bitset<> p)
4079 if (_phase_invert != p) {
4081 phase_invert_changed (); /* EMIT SIGNAL */
4082 _session.set_dirty ();
4087 Route::phase_invert (uint32_t c) const
4089 return _phase_invert[c];
4092 boost::dynamic_bitset<>
4093 Route::phase_invert () const
4095 return _phase_invert;
4099 Route::set_denormal_protection (bool yn)
4101 if (_denormal_protection != yn) {
4102 _denormal_protection = yn;
4103 denormal_protection_changed (); /* EMIT SIGNAL */
4108 Route::denormal_protection () const
4110 return _denormal_protection;
4114 Route::set_active (bool yn, void* src)
4116 if (_session.transport_rolling()) {
4120 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4121 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4125 if (_active != yn) {
4127 _input->set_active (yn);
4128 _output->set_active (yn);
4129 active_changed (); // EMIT SIGNAL
4130 _session.set_dirty ();
4134 boost::shared_ptr<Pannable>
4135 Route::pannable() const
4140 boost::shared_ptr<Panner>
4141 Route::panner() const
4144 return _main_outs->panner_shell()->panner();
4147 boost::shared_ptr<PannerShell>
4148 Route::panner_shell() const
4150 return _main_outs->panner_shell();
4153 boost::shared_ptr<AutomationControl>
4154 Route::gain_control() const
4156 return _amp->gain_control();
4159 boost::shared_ptr<AutomationControl>
4160 Route::get_control (const Evoral::Parameter& param)
4162 /* either we own the control or .... */
4164 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4168 /* maybe one of our processors does or ... */
4170 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4171 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4172 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4180 /* nobody does so we'll make a new one */
4182 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4189 boost::shared_ptr<Processor>
4190 Route::nth_plugin (uint32_t n)
4192 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4193 ProcessorList::iterator i;
4195 for (i = _processors.begin(); i != _processors.end(); ++i) {
4196 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4203 return boost::shared_ptr<Processor> ();
4206 boost::shared_ptr<Processor>
4207 Route::nth_send (uint32_t n)
4209 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4210 ProcessorList::iterator i;
4212 for (i = _processors.begin(); i != _processors.end(); ++i) {
4213 if (boost::dynamic_pointer_cast<Send> (*i)) {
4220 return boost::shared_ptr<Processor> ();
4224 Route::has_io_processor_named (const string& name)
4226 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4227 ProcessorList::iterator i;
4229 for (i = _processors.begin(); i != _processors.end(); ++i) {
4230 if (boost::dynamic_pointer_cast<Send> (*i) ||
4231 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4232 if ((*i)->name() == name) {
4241 MuteMaster::MutePoint
4242 Route::mute_points () const
4244 return _mute_master->mute_points ();
4248 Route::set_processor_positions ()
4250 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4252 bool had_amp = false;
4253 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4254 (*i)->set_pre_fader (!had_amp);
4261 /** Called when there is a proposed change to the input port count */
4263 Route::input_port_count_changing (ChanCount to)
4265 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4267 /* The processors cannot be configured with the new input arrangement, so
4273 /* The change is ok */
4277 /** Called when there is a proposed change to the output port count */
4279 Route::output_port_count_changing (ChanCount to)
4281 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4282 if (processor_out_streams.get(*t) > to.get(*t)) {
4286 /* The change is ok */
4291 Route::unknown_processors () const
4295 if (_session.get_disable_all_loaded_plugins ()) {
4296 // Do not list "missing plugins" if they are explicitly disabled
4300 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4301 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4302 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4303 p.push_back ((*i)->name ());
4312 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4314 /* we assume that all our input ports feed all our output ports. its not
4315 universally true, but the alternative is way too corner-case to worry about.
4318 LatencyRange all_connections;
4321 all_connections.min = 0;
4322 all_connections.max = 0;
4324 all_connections.min = ~((pframes_t) 0);
4325 all_connections.max = 0;
4327 /* iterate over all "from" ports and determine the latency range for all of their
4328 connections to the "outside" (outside of this Route).
4331 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4335 p->get_connected_latency_range (range, playback);
4337 all_connections.min = min (all_connections.min, range.min);
4338 all_connections.max = max (all_connections.max, range.max);
4342 /* set the "from" port latencies to the max/min range of all their connections */
4344 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4345 p->set_private_latency_range (all_connections, playback);
4348 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4350 all_connections.min += our_latency;
4351 all_connections.max += our_latency;
4353 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4354 p->set_private_latency_range (all_connections, playback);
4357 return all_connections.max;
4361 Route::set_private_port_latencies (bool playback) const
4363 framecnt_t own_latency = 0;
4365 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4366 OR LATENCY CALLBACK.
4368 This is called (early) from the latency callback. It computes the REAL
4369 latency associated with each port and stores the result as the "private"
4370 latency of the port. A later call to Route::set_public_port_latencies()
4371 sets all ports to the same value to reflect the fact that we do latency
4372 compensation and so all signals are delayed by the same amount as they
4373 flow through ardour.
4376 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4377 if ((*i)->active ()) {
4378 own_latency += (*i)->signal_latency ();
4383 /* playback: propagate latency from "outside the route" to outputs to inputs */
4384 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4386 /* capture: propagate latency from "outside the route" to inputs to outputs */
4387 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4392 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4394 /* this is called to set the JACK-visible port latencies, which take
4395 latency compensation into account.
4404 const PortSet& ports (_input->ports());
4405 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4406 p->set_public_latency_range (range, playback);
4411 const PortSet& ports (_output->ports());
4412 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4413 p->set_public_latency_range (range, playback);
4418 /** Put the invisible processors in the right place in _processors.
4419 * Must be called with a writer lock on _processor_lock held.
4422 __attribute__((annotate("realtime")))
4425 Route::setup_invisible_processors ()
4428 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4429 assert (!lm.locked ());
4433 /* too early to be doing this stuff */
4437 /* we'll build this new list here and then use it
4439 * TODO put the ProcessorList is on the stack for RT-safety.
4442 ProcessorList new_processors;
4444 /* find visible processors */
4446 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4447 if ((*i)->display_to_user ()) {
4448 new_processors.push_back (*i);
4454 ProcessorList::iterator amp = new_processors.begin ();
4455 while (amp != new_processors.end() && *amp != _amp) {
4459 assert (amp != new_processors.end ());
4461 /* and the processor after the amp */
4463 ProcessorList::iterator after_amp = amp;
4469 switch (_meter_point) {
4471 assert (!_meter->display_to_user ());
4472 new_processors.push_front (_meter);
4475 assert (!_meter->display_to_user ());
4476 new_processors.insert (amp, _meter);
4478 case MeterPostFader:
4479 /* do nothing here */
4482 /* do nothing here */
4485 /* the meter is visible, so we don't touch it here */
4492 assert (_main_outs);
4493 assert (!_main_outs->display_to_user ());
4494 new_processors.push_back (_main_outs);
4496 /* iterator for the main outs */
4498 ProcessorList::iterator main = new_processors.end();
4501 /* OUTPUT METERING */
4503 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4504 assert (!_meter->display_to_user ());
4506 /* add the processor just before or just after the main outs */
4508 ProcessorList::iterator meter_point = main;
4510 if (_meter_point == MeterOutput) {
4513 new_processors.insert (meter_point, _meter);
4518 if (_monitor_send && !is_monitor ()) {
4519 assert (!_monitor_send->display_to_user ());
4520 if (Config->get_solo_control_is_listen_control()) {
4521 switch (Config->get_listen_position ()) {
4522 case PreFaderListen:
4523 switch (Config->get_pfl_position ()) {
4524 case PFLFromBeforeProcessors:
4525 new_processors.push_front (_monitor_send);
4527 case PFLFromAfterProcessors:
4528 new_processors.insert (amp, _monitor_send);
4531 _monitor_send->set_can_pan (false);
4533 case AfterFaderListen:
4534 switch (Config->get_afl_position ()) {
4535 case AFLFromBeforeProcessors:
4536 new_processors.insert (after_amp, _monitor_send);
4538 case AFLFromAfterProcessors:
4539 new_processors.insert (new_processors.end(), _monitor_send);
4542 _monitor_send->set_can_pan (true);
4546 new_processors.insert (new_processors.end(), _monitor_send);
4547 _monitor_send->set_can_pan (false);
4551 #if 0 // not used - just yet
4552 if (!is_master() && !is_monitor() && !is_auditioner()) {
4553 new_processors.push_front (_delayline);
4557 /* MONITOR CONTROL */
4559 if (_monitor_control && is_monitor ()) {
4560 assert (!_monitor_control->display_to_user ());
4561 new_processors.push_front (_monitor_control);
4564 /* INTERNAL RETURN */
4566 /* doing this here means that any monitor control will come just after
4571 assert (!_intreturn->display_to_user ());
4572 new_processors.push_front (_intreturn);
4575 if (_trim && _trim->active()) {
4576 assert (!_trim->display_to_user ());
4577 new_processors.push_front (_trim);
4579 /* EXPORT PROCESSOR */
4581 if (_capturing_processor) {
4582 assert (!_capturing_processor->display_to_user ());
4583 new_processors.push_front (_capturing_processor);
4586 _processors = new_processors;
4588 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4589 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4594 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4595 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4596 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4603 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4604 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4608 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4609 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4616 /** If the meter point is `Custom', make a note of where the meter is.
4617 * This is so that if the meter point is subsequently set to something else,
4618 * and then back to custom, we can put the meter back where it was last time
4619 * custom was enabled.
4621 * Must be called with the _processor_lock held.
4624 Route::maybe_note_meter_position ()
4626 if (_meter_point != MeterCustom) {
4630 _custom_meter_position_noted = true;
4631 /* custom meter points range from after trim to before panner/main_outs
4632 * this is a limitation by the current processor UI
4634 bool seen_trim = false;
4635 _processor_after_last_custom_meter.reset();
4636 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4637 if ((*i) == _trim) {
4640 if ((*i) == _main_outs) {
4641 _processor_after_last_custom_meter = *i;
4644 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4646 _processor_after_last_custom_meter = _trim;
4648 ProcessorList::iterator j = i;
4650 assert(j != _processors.end ()); // main_outs should be before
4651 _processor_after_last_custom_meter = *j;
4656 assert(_processor_after_last_custom_meter.lock());
4659 boost::shared_ptr<Processor>
4660 Route::processor_by_id (PBD::ID id) const
4662 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4663 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4664 if ((*i)->id() == id) {
4669 return boost::shared_ptr<Processor> ();
4672 /** @return the monitoring state, or in other words what data we are pushing
4673 * into the route (data from the inputs, data from disk or silence)
4676 Route::monitoring_state () const
4678 return MonitoringInput;
4681 /** @return what we should be metering; either the data coming from the input
4682 * IO or the data that is flowing through the route.
4685 Route::metering_state () const
4687 return MeteringRoute;
4691 Route::has_external_redirects () const
4693 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4695 /* ignore inactive processors and obviously ignore the main
4696 * outs since everything has them and we don't care.
4699 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4707 boost::shared_ptr<Processor>
4708 Route::the_instrument () const
4710 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4711 return the_instrument_unlocked ();
4714 boost::shared_ptr<Processor>
4715 Route::the_instrument_unlocked () const
4717 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4718 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4719 if ((*i)->input_streams().n_midi() > 0 &&
4720 (*i)->output_streams().n_audio() > 0) {
4725 return boost::shared_ptr<Processor>();
4731 Route::non_realtime_locate (framepos_t pos)
4734 _pannable->transport_located (pos);
4737 if (_delayline.get()) {
4738 _delayline.get()->flush();
4742 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4743 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4745 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4746 (*i)->transport_located (pos);
4749 _roll_delay = _initial_delay;
4753 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4760 * We don't currently mix MIDI input together, so we don't need the
4761 * complex logic of the audio case.
4764 n_buffers = bufs.count().n_midi ();
4766 for (i = 0; i < n_buffers; ++i) {
4768 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4769 MidiBuffer& buf (bufs.get_midi (i));
4772 buf.copy (source_port->get_midi_buffer(nframes));
4774 buf.silence (nframes);
4780 n_buffers = bufs.count().n_audio();
4782 size_t n_ports = io->n_ports().n_audio();
4783 float scaling = 1.0f;
4785 if (n_ports > n_buffers) {
4786 scaling = ((float) n_buffers) / n_ports;
4789 for (i = 0; i < n_ports; ++i) {
4791 /* if there are more ports than buffers, map them onto buffers
4792 * in a round-robin fashion
4795 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4796 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4799 if (i < n_buffers) {
4801 /* first time through just copy a channel into
4805 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4807 if (scaling != 1.0f) {
4808 buf.apply_gain (scaling, nframes);
4813 /* on subsequent times around, merge data from
4814 * the port with what is already there
4817 if (scaling != 1.0f) {
4818 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4820 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4825 /* silence any remaining buffers */
4827 for (; i < n_buffers; ++i) {
4828 AudioBuffer& buf (bufs.get_audio (i));
4829 buf.silence (nframes);
4832 /* establish the initial setup of the buffer set, reflecting what was
4833 copied into it. unless, of course, we are the auditioner, in which
4834 case nothing was fed into it from the inputs at all.
4837 if (!is_auditioner()) {
4838 bufs.set_count (io->n_ports());