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::clear_all_solo_state ()
821 // ideally this function will never do anything, it only exists to forestall Murphy
822 bool emit_changed = false;
823 bool old_safe = _solo_safe;
826 // these are really debug messages, but of possible interest.
828 PBD::info << string_compose (_("Cleared Explicit solo: %1\n"), name());
830 if (_soloed_by_others_upstream || _soloed_by_others_downstream) {
831 PBD::info << string_compose (_("Cleared Implicit solo: %1 up:%2 down:%3\n"),
832 name(), _soloed_by_others_upstream, _soloed_by_others_downstream);
836 if (!_self_solo && (_soloed_by_others_upstream || _soloed_by_others_downstream)) {
837 // if self-soled, set_solo() will do signal emission
841 _soloed_by_others_upstream = 0;
842 _soloed_by_others_downstream = 0;
844 _solo_safe = false; // allow set_solo() to do its job;
845 set_solo (false, this);
846 _solo_safe = old_safe;
849 set_mute_master_solo ();
850 solo_changed (false, this); /* EMIT SIGNAL */
855 Route::set_solo (bool yn, void *src)
858 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
862 if (is_master() || is_monitor() || is_auditioner()) {
863 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
867 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
868 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
872 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
873 name(), yn, src, (src == _route_group), self_soloed()));
875 if (self_soloed() != yn) {
877 set_mute_master_solo ();
878 solo_changed (true, src); /* EMIT SIGNAL */
879 _solo_control->Changed (); /* EMIT SIGNAL */
882 assert (Config->get_solo_control_is_listen_control() || !_monitor_send || !_monitor_send->active());
884 /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
885 Config->get_solo_mute_overrride().
888 if (yn && Profile->get_trx()) {
889 set_mute (false, src);
894 Route::set_self_solo (bool yn)
896 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
901 Route::mod_solo_by_others_upstream (int32_t delta)
903 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
904 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
906 uint32_t old_sbu = _soloed_by_others_upstream;
909 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
910 _soloed_by_others_upstream += delta;
912 _soloed_by_others_upstream = 0;
915 _soloed_by_others_upstream += delta;
918 DEBUG_TRACE (DEBUG::Solo, string_compose (
919 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
920 name(), delta, _soloed_by_others_upstream, old_sbu,
921 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
923 /* push the inverse solo change to everything that feeds us.
925 This is important for solo-within-group. When we solo 1 track out of N that
926 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
927 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
928 tracks that feed it. This will silence them if they were audible because
929 of a bus solo, but the newly soloed track will still be audible (because
932 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
936 if ((_self_solo || _soloed_by_others_downstream) &&
937 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
938 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
940 if (delta > 0 || !Config->get_exclusive_solo()) {
941 DEBUG_TRACE (DEBUG::Solo, string_compose("\t ... INVERT push from %1\n", _name));
942 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
946 boost::shared_ptr<Route> sr = i->r.lock();
948 sr->mod_solo_by_others_downstream (-delta);
954 set_mute_master_solo ();
955 solo_changed (false, this); /* EMIT SIGNAL */
959 Route::mod_solo_by_others_downstream (int32_t delta)
961 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
962 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
965 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
966 _soloed_by_others_downstream += delta;
968 _soloed_by_others_downstream = 0;
971 _soloed_by_others_downstream += delta;
974 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
976 set_mute_master_solo ();
977 solo_changed (false, this); /* EMIT SIGNAL */
981 Route::set_mute_master_solo ()
983 _mute_master->set_soloed_by_self (self_soloed());
984 _mute_master->set_soloed_by_others (soloed_by_others_downstream() || soloed_by_others_upstream());
988 Route::mod_solo_isolated_by_upstream (bool yn, void* src)
990 bool old = solo_isolated ();
991 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod_solo_isolated_by_upstream cur: %2 d: %3\n",
992 name(), _solo_isolated_by_upstream, yn ? "+1" : "-1"));
995 if (_solo_isolated_by_upstream >= 1) {
996 _solo_isolated_by_upstream--;
998 _solo_isolated_by_upstream = 0;
1001 _solo_isolated_by_upstream++;
1004 if (solo_isolated() != old) {
1005 /* solo isolated status changed */
1006 _mute_master->set_solo_ignore (solo_isolated());
1007 solo_isolated_changed (src); /* EMIT SIGNAL */
1012 Route::set_solo_isolated (bool yn, void *src)
1014 if (is_master() || is_monitor() || is_auditioner()) {
1018 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
1019 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
1023 bool changed = false;
1026 if (_solo_isolated == false) {
1027 _mute_master->set_solo_ignore (true);
1030 _solo_isolated = true;
1032 if (_solo_isolated == true) {
1033 _solo_isolated = false;
1034 _mute_master->set_solo_ignore (false);
1044 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1046 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1047 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1049 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1054 bool does_feed = feeds (*i, &sends_only);
1056 if (does_feed && !sends_only) {
1057 (*i)->mod_solo_isolated_by_upstream (yn, src);
1061 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1063 solo_isolated_changed (src); /* EMIT SIGNAL */
1067 Route::solo_isolated () const
1069 return (_solo_isolated == true) || (_solo_isolated_by_upstream > 0);
1073 Route::set_mute_points (MuteMaster::MutePoint mp)
1075 _mute_master->set_mute_points (mp);
1076 mute_points_changed (); /* EMIT SIGNAL */
1078 if (_mute_master->muted_by_self()) {
1079 mute_changed (this); /* EMIT SIGNAL */
1080 _mute_control->Changed (); /* EMIT SIGNAL */
1085 Route::set_mute (bool yn, void *src)
1087 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1088 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1092 if (muted() != yn) {
1093 _mute_master->set_muted_by_self (yn);
1094 /* allow any derived classes to respond to the mute change
1095 before anybody else knows about it.
1098 /* tell everyone else */
1099 mute_changed (src); /* EMIT SIGNAL */
1100 _mute_control->Changed (); /* EMIT SIGNAL */
1105 Route::muted () const
1107 return _mute_master->muted_by_self();
1111 Route::muted_by_others () const
1113 // This method is only used by route_ui for display state.
1114 // The real thing is MuteMaster::muted_by_others_at()
1116 //master is never muted by others
1120 //now check to see if something is soloed (and I am not)
1121 //see also MuteMaster::mute_gain_at()
1122 return (_session.soloing() && !soloed() && !solo_isolated());
1127 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1129 cerr << name << " {" << endl;
1130 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1131 p != procs.end(); ++p) {
1132 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1134 cerr << "}" << endl;
1138 /** Supposing that we want to insert a Processor at a given Placement, return
1139 * the processor to add the new one before (or 0 to add at the end).
1141 boost::shared_ptr<Processor>
1142 Route::before_processor_for_placement (Placement p)
1144 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1146 ProcessorList::iterator loc;
1148 if (p == PreFader) {
1149 /* generic pre-fader: insert immediately before the amp */
1150 loc = find (_processors.begin(), _processors.end(), _amp);
1152 /* generic post-fader: insert right before the main outs */
1153 loc = find (_processors.begin(), _processors.end(), _main_outs);
1156 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1159 /** Supposing that we want to insert a Processor at a given index, return
1160 * the processor to add the new one before (or 0 to add at the end).
1162 boost::shared_ptr<Processor>
1163 Route::before_processor_for_index (int index)
1166 return boost::shared_ptr<Processor> ();
1169 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1171 ProcessorList::iterator i = _processors.begin ();
1173 while (i != _processors.end() && j < index) {
1174 if ((*i)->display_to_user()) {
1181 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1184 /** Add a processor either pre- or post-fader
1185 * @return 0 on success, non-0 on failure.
1188 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1190 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1194 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1195 * @param index Index to add the processor at, or -1 to add at the end of the list.
1196 * @return 0 on success, non-0 on failure.
1199 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1201 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1204 /** Add a processor to the route.
1205 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1206 * @return 0 on success, non-0 on failure.
1209 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1211 assert (processor != _meter);
1212 assert (processor != _main_outs);
1214 DEBUG_TRACE (DEBUG::Processors, string_compose (
1215 "%1 adding processor %2\n", name(), processor->name()));
1217 if (!AudioEngine::instance()->connected() || !processor) {
1222 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1223 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1224 ProcessorState pstate (this);
1226 boost::shared_ptr<PluginInsert> pi;
1227 boost::shared_ptr<PortInsert> porti;
1229 if (processor == _amp) {
1230 /* Ensure that only one amp is in the list at any time */
1231 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1232 if (check != _processors.end()) {
1233 if (before == _amp) {
1234 /* Already in position; all is well */
1237 _processors.erase (check);
1242 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1244 ProcessorList::iterator loc;
1246 /* inserting before a processor; find it */
1247 loc = find (_processors.begin(), _processors.end(), before);
1248 if (loc == _processors.end ()) {
1253 /* inserting at end */
1254 loc = _processors.end ();
1257 _processors.insert (loc, processor);
1258 processor->set_owner (this);
1260 // Set up processor list channels. This will set processor->[input|output]_streams(),
1261 // configure redirect ports properly, etc.
1264 if (configure_processors_unlocked (err)) {
1266 configure_processors_unlocked (0); // it worked before we tried to add it ...
1271 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1273 if (pi->has_no_inputs ()) {
1274 /* generator plugin */
1275 _have_internal_generator = true;
1280 if (activation_allowed && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user ())) {
1281 processor->activate ();
1284 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1286 _output->set_user_latency (0);
1289 reset_instrument_info ();
1290 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1291 set_processor_positions ();
1297 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1299 const XMLProperty *prop;
1302 boost::shared_ptr<Processor> processor;
1304 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1305 so that we can add the processor in the right place (pre/post-fader)
1308 XMLNodeList const & children = node.children ();
1309 XMLNodeList::const_iterator i = children.begin ();
1311 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1315 Placement placement = PreFader;
1317 if (i != children.end()) {
1318 if ((prop = (*i)->property (X_("placement"))) != 0) {
1319 placement = Placement (string_2_enum (prop->value(), placement));
1323 if (node.name() == "Insert") {
1325 if ((prop = node.property ("type")) != 0) {
1327 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1328 prop->value() == "lv2" ||
1329 prop->value() == "windows-vst" ||
1330 prop->value() == "lxvst" ||
1331 prop->value() == "audiounit") {
1333 if (_session.get_disable_all_loaded_plugins ()) {
1334 processor.reset (new UnknownProcessor (_session, node));
1336 processor.reset (new PluginInsert (_session));
1341 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1346 } else if (node.name() == "Send") {
1348 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1349 processor.reset (new Send (_session, sendpan, _mute_master));
1353 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1357 if (processor->set_state (node, version)) {
1361 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1362 if (i != children.end()) {
1363 if ((prop = (*i)->property (X_("active"))) != 0) {
1364 if ( string_is_affirmative (prop->value()) && (!_session.get_bypass_all_loaded_plugins () || !processor->display_to_user () ) )
1365 processor->activate();
1367 processor->deactivate();
1371 return (add_processor (processor, placement, 0, false) == 0);
1374 catch (failed_constructor &err) {
1375 warning << _("processor could not be created. Ignored.") << endmsg;
1381 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1383 /* NOTE: this is intended to be used ONLY when copying
1384 processors from another Route. Hence the subtle
1385 differences between this and ::add_processor()
1388 ProcessorList::iterator loc;
1391 loc = find(_processors.begin(), _processors.end(), before);
1393 /* nothing specified - at end */
1394 loc = _processors.end ();
1397 if (!_session.engine().connected()) {
1401 if (others.empty()) {
1406 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1407 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1408 ProcessorState pstate (this);
1410 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1416 boost::shared_ptr<PluginInsert> pi;
1418 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1422 _processors.insert (loc, *i);
1423 (*i)->set_owner (this);
1425 if ((*i)->active()) {
1429 /* Think: does this really need to be called for every processor in the loop? */
1431 if (configure_processors_unlocked (err)) {
1433 configure_processors_unlocked (0); // it worked before we tried to add it ...
1438 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1441 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1442 boost::shared_ptr<PluginInsert> pi;
1444 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1445 if (pi->has_no_inputs ()) {
1446 _have_internal_generator = true;
1452 _output->set_user_latency (0);
1455 reset_instrument_info ();
1456 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1457 set_processor_positions ();
1463 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1465 if (p == PreFader) {
1466 start = _processors.begin();
1467 end = find(_processors.begin(), _processors.end(), _amp);
1469 start = find(_processors.begin(), _processors.end(), _amp);
1471 end = _processors.end();
1475 /** Turn off all processors with a given placement
1476 * @param p Placement of processors to disable
1479 Route::disable_processors (Placement p)
1481 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1483 ProcessorList::iterator start, end;
1484 placement_range(p, start, end);
1486 for (ProcessorList::iterator i = start; i != end; ++i) {
1487 (*i)->deactivate ();
1490 _session.set_dirty ();
1493 /** Turn off all redirects
1496 Route::disable_processors ()
1498 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1500 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1501 (*i)->deactivate ();
1504 _session.set_dirty ();
1507 /** Turn off all redirects with a given placement
1508 * @param p Placement of redirects to disable
1511 Route::disable_plugins (Placement p)
1513 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1515 ProcessorList::iterator start, end;
1516 placement_range(p, start, end);
1518 for (ProcessorList::iterator i = start; i != end; ++i) {
1519 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1520 (*i)->deactivate ();
1524 _session.set_dirty ();
1527 /** Turn off all plugins
1530 Route::disable_plugins ()
1532 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1534 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1535 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1536 (*i)->deactivate ();
1540 _session.set_dirty ();
1545 Route::ab_plugins (bool forward)
1547 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1551 /* forward = turn off all active redirects, and mark them so that the next time
1552 we go the other way, we will revert them
1555 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1556 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1560 if ((*i)->active()) {
1561 (*i)->deactivate ();
1562 (*i)->set_next_ab_is_active (true);
1564 (*i)->set_next_ab_is_active (false);
1570 /* backward = if the redirect was marked to go active on the next ab, do so */
1572 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1574 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1578 if ((*i)->get_next_ab_is_active()) {
1581 (*i)->deactivate ();
1586 _session.set_dirty ();
1590 /** Remove processors with a given placement.
1591 * @param p Placement of processors to remove.
1594 Route::clear_processors (Placement p)
1596 if (!_session.engine().connected()) {
1600 bool already_deleting = _session.deletion_in_progress();
1601 if (!already_deleting) {
1602 _session.set_deletion_in_progress();
1606 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1607 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1608 ProcessorList new_list;
1609 ProcessorStreams err;
1610 bool seen_amp = false;
1612 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1618 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1620 /* you can't remove these */
1622 new_list.push_back (*i);
1629 new_list.push_back (*i);
1632 (*i)->drop_references ();
1640 (*i)->drop_references ();
1643 new_list.push_back (*i);
1650 _processors = new_list;
1651 configure_processors_unlocked (&err); // this can't fail
1654 processor_max_streams.reset();
1655 _have_internal_generator = false;
1656 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1657 set_processor_positions ();
1659 reset_instrument_info ();
1661 if (!already_deleting) {
1662 _session.clear_deletion_in_progress();
1667 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1669 // TODO once the export point can be configured properly, do something smarter here
1670 if (processor == _capturing_processor) {
1671 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1672 if (need_process_lock) {
1676 _capturing_processor.reset();
1678 if (need_process_lock) {
1683 /* these can never be removed */
1685 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1689 if (!_session.engine().connected()) {
1693 processor_max_streams.reset();
1696 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1697 if (need_process_lock) {
1701 /* Caller must hold process lock */
1702 assert (!AudioEngine::instance()->process_lock().trylock());
1704 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1706 ProcessorState pstate (this);
1708 ProcessorList::iterator i;
1709 bool removed = false;
1711 for (i = _processors.begin(); i != _processors.end(); ) {
1712 if (*i == processor) {
1714 /* move along, see failure case for configure_processors()
1715 where we may need to reconfigure the processor.
1718 /* stop redirects that send signals to JACK ports
1719 from causing noise as a result of no longer being
1723 boost::shared_ptr<IOProcessor> iop;
1725 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1729 i = _processors.erase (i);
1737 _output->set_user_latency (0);
1745 if (configure_processors_unlocked (err)) {
1747 /* we know this will work, because it worked before :) */
1748 configure_processors_unlocked (0);
1752 _have_internal_generator = false;
1754 for (i = _processors.begin(); i != _processors.end(); ++i) {
1755 boost::shared_ptr<PluginInsert> pi;
1757 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1758 if (pi->has_no_inputs ()) {
1759 _have_internal_generator = true;
1764 if (need_process_lock) {
1769 reset_instrument_info ();
1770 processor->drop_references ();
1771 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1772 set_processor_positions ();
1778 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1780 ProcessorList deleted;
1782 if (!_session.engine().connected()) {
1786 processor_max_streams.reset();
1789 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1790 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1791 ProcessorState pstate (this);
1793 ProcessorList::iterator i;
1794 boost::shared_ptr<Processor> processor;
1796 for (i = _processors.begin(); i != _processors.end(); ) {
1800 /* these can never be removed */
1802 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1807 /* see if its in the list of processors to delete */
1809 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1814 /* stop IOProcessors that send to JACK ports
1815 from causing noise as a result of no longer being
1819 boost::shared_ptr<IOProcessor> iop;
1821 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1825 deleted.push_back (processor);
1826 i = _processors.erase (i);
1829 if (deleted.empty()) {
1830 /* none of those in the requested list were found */
1834 _output->set_user_latency (0);
1836 if (configure_processors_unlocked (err)) {
1838 /* we know this will work, because it worked before :) */
1839 configure_processors_unlocked (0);
1844 _have_internal_generator = false;
1846 for (i = _processors.begin(); i != _processors.end(); ++i) {
1847 boost::shared_ptr<PluginInsert> pi;
1849 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1850 if (pi->has_no_inputs ()) {
1851 _have_internal_generator = true;
1858 /* now try to do what we need to so that those that were removed will be deleted */
1860 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1861 (*i)->drop_references ();
1864 reset_instrument_info ();
1865 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1866 set_processor_positions ();
1872 Route::reset_instrument_info ()
1874 boost::shared_ptr<Processor> instr = the_instrument();
1876 _instrument_info.set_internal_instrument (instr);
1880 /** Caller must hold process lock */
1882 Route::configure_processors (ProcessorStreams* err)
1884 #ifndef PLATFORM_WINDOWS
1885 assert (!AudioEngine::instance()->process_lock().trylock());
1888 if (!_in_configure_processors) {
1889 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1890 return configure_processors_unlocked (err);
1897 Route::input_streams () const
1899 return _input->n_ports ();
1902 list<pair<ChanCount, ChanCount> >
1903 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1905 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1907 return try_configure_processors_unlocked (in, err);
1910 list<pair<ChanCount, ChanCount> >
1911 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1913 // Check each processor in order to see if we can configure as requested
1915 list<pair<ChanCount, ChanCount> > configuration;
1918 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1919 DEBUG_TRACE (DEBUG::Processors, "{\n");
1921 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1923 if ((*p)->can_support_io_configuration(in, out)) {
1924 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1925 configuration.push_back(make_pair(in, out));
1932 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1933 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1934 DEBUG_TRACE (DEBUG::Processors, "}\n");
1935 return list<pair<ChanCount, ChanCount> > ();
1939 DEBUG_TRACE (DEBUG::Processors, "}\n");
1941 return configuration;
1944 /** Set the input/output configuration of each processor in the processors list.
1945 * Caller must hold process lock.
1946 * Return 0 on success, otherwise configuration is impossible.
1949 Route::configure_processors_unlocked (ProcessorStreams* err)
1951 #ifndef PLATFORM_WINDOWS
1952 assert (!AudioEngine::instance()->process_lock().trylock());
1955 if (_in_configure_processors) {
1959 /* put invisible processors where they should be */
1960 setup_invisible_processors ();
1962 _in_configure_processors = true;
1964 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1966 if (configuration.empty ()) {
1967 _in_configure_processors = false;
1972 bool seen_mains_out = false;
1973 processor_out_streams = _input->n_ports();
1974 processor_max_streams.reset();
1976 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1977 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1979 if (!(*p)->configure_io(c->first, c->second)) {
1980 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration failed\n", _name));
1982 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1983 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1985 boost::shared_ptr<PluginInsert> pi;
1986 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1987 /* plugins connected via Split Match may have more channels.
1988 * route/scratch buffers are needed for all of them*/
1989 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
1990 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
1994 if (boost::dynamic_pointer_cast<Delivery> (*p)
1995 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1996 /* main delivery will increase port count to match input.
1997 * the Delivery::Main is usually the last processor - followed only by
2000 seen_mains_out = true;
2002 if (!seen_mains_out) {
2003 processor_out_streams = out;
2009 _meter->set_max_channels (processor_max_streams);
2012 /* make sure we have sufficient scratch buffers to cope with the new processor
2015 _session.ensure_buffers (n_process_buffers ());
2017 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
2019 _in_configure_processors = false;
2023 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
2024 * @param state New active state for those processors.
2027 Route::all_visible_processors_active (bool state)
2029 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2031 if (_processors.empty()) {
2035 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2036 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2043 (*i)->deactivate ();
2047 _session.set_dirty ();
2051 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2053 /* check if re-order requires re-configuration of any processors
2054 * -> compare channel configuration for all processors
2056 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2057 ChanCount c = input_streams ();
2059 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2061 if (c != (*j)->input_streams()) {
2064 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2067 if ((*i)->input_streams() != c) {
2070 c = (*i)->output_streams();
2082 __attribute__((annotate("realtime")))
2085 Route::apply_processor_order (const ProcessorList& new_order)
2087 /* need to hold processor_lock; either read or write lock
2088 * and the engine process_lock.
2089 * Due to r/w lock ambiguity we can only assert the latter
2091 assert (!AudioEngine::instance()->process_lock().trylock());
2094 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2095 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2096 * processors in the current actual processor list that are hidden. Any visible processors
2097 * in the current list but not in "new_order" will be assumed to be deleted.
2100 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2101 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2102 * (note though that ::processors_reorder_needs_configure() ensured that
2103 * this function will only ever be called from the rt-thread if no processor were removed)
2105 * either way, I can't proove it, but an x-run due to re-order here is less likley
2106 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2109 ProcessorList as_it_will_be;
2110 ProcessorList::iterator oiter;
2111 ProcessorList::const_iterator niter;
2113 oiter = _processors.begin();
2114 niter = new_order.begin();
2116 while (niter != new_order.end()) {
2118 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2119 then append it to the temp list.
2121 Otherwise, see if the next processor in the old list is in the new list. if not,
2122 its been deleted. If its there, append it to the temp list.
2125 if (oiter == _processors.end()) {
2127 /* no more elements in the old list, so just stick the rest of
2128 the new order onto the temp list.
2131 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2132 while (niter != new_order.end()) {
2139 if (!(*oiter)->display_to_user()) {
2141 as_it_will_be.push_back (*oiter);
2145 /* visible processor: check that its in the new order */
2147 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2148 /* deleted: do nothing, shared_ptr<> will clean up */
2150 /* ignore this one, and add the next item from the new order instead */
2151 as_it_will_be.push_back (*niter);
2156 /* now remove from old order - its taken care of no matter what */
2157 oiter = _processors.erase (oiter);
2161 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2163 /* If the meter is in a custom position, find it and make a rough note of its position */
2164 maybe_note_meter_position ();
2168 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2170 // it a change is already queued, wait for it
2171 // (unless engine is stopped. apply immediately and proceed
2172 while (g_atomic_int_get (&_pending_process_reorder)) {
2173 if (!AudioEngine::instance()->running()) {
2174 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2175 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2177 apply_processor_order(_pending_processor_order);
2178 setup_invisible_processors ();
2180 g_atomic_int_set (&_pending_process_reorder, 0);
2182 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2183 set_processor_positions ();
2185 // TODO rather use a semaphore or something.
2186 // but since ::reorder_processors() is called
2187 // from the GUI thread, this is fine..
2192 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2194 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2195 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2196 ProcessorState pstate (this);
2198 apply_processor_order (new_order);
2200 if (configure_processors_unlocked (err)) {
2208 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2209 set_processor_positions ();
2212 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2213 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2215 // _pending_processor_order is protected by _processor_lock
2216 _pending_processor_order = new_order;
2217 g_atomic_int_set (&_pending_process_reorder, 1);
2230 Route::get_template()
2232 return state(false);
2236 Route::state(bool full_state)
2238 XMLNode *node = new XMLNode("Route");
2239 ProcessorList::iterator i;
2242 id().print (buf, sizeof (buf));
2243 node->add_property("id", buf);
2244 node->add_property ("name", _name);
2245 node->add_property("default-type", _default_type.to_string());
2248 node->add_property("flags", enum_2_string (_flags));
2251 node->add_property("active", _active?"yes":"no");
2253 boost::to_string (_phase_invert, p);
2254 node->add_property("phase-invert", p);
2255 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2256 node->add_property("meter-point", enum_2_string (_meter_point));
2258 node->add_property("meter-type", enum_2_string (_meter_type));
2261 node->add_property("route-group", _route_group->name());
2264 snprintf (buf, sizeof (buf), "%d", _order_key);
2265 node->add_property ("order-key", buf);
2266 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2267 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2268 node->add_property ("soloed-by-upstream", buf);
2269 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2270 node->add_property ("soloed-by-downstream", buf);
2271 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2272 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2274 node->add_child_nocopy (_input->state (full_state));
2275 node->add_child_nocopy (_output->state (full_state));
2276 node->add_child_nocopy (_solo_control->get_state ());
2277 node->add_child_nocopy (_mute_control->get_state ());
2278 node->add_child_nocopy (_mute_master->get_state ());
2281 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2284 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2285 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2286 remote_control_node->add_property (X_("id"), buf);
2287 node->add_child_nocopy (*remote_control_node);
2289 if (_comment.length()) {
2290 XMLNode *cmt = node->add_child ("Comment");
2291 cmt->add_content (_comment);
2295 node->add_child_nocopy (_pannable->state (full_state));
2298 for (i = _processors.begin(); i != _processors.end(); ++i) {
2300 /* template save: do not include internal sends functioning as
2301 aux sends because the chance of the target ID
2302 in the session where this template is used
2305 similarly, do not save listen sends which connect to
2306 the monitor section, because these will always be
2309 boost::shared_ptr<InternalSend> is;
2311 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2312 if (is->role() == Delivery::Listen) {
2317 node->add_child_nocopy((*i)->state (full_state));
2321 node->add_child_copy (*_extra_xml);
2324 if (_custom_meter_position_noted) {
2325 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2327 after->id().print (buf, sizeof (buf));
2328 node->add_property (X_("processor-after-last-custom-meter"), buf);
2336 Route::set_state (const XMLNode& node, int version)
2338 if (version < 3000) {
2339 return set_state_2X (node, version);
2343 XMLNodeConstIterator niter;
2345 const XMLProperty *prop;
2347 if (node.name() != "Route"){
2348 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2352 if ((prop = node.property (X_("name"))) != 0) {
2353 Route::set_name (prop->value());
2357 _initial_io_setup = true;
2359 if ((prop = node.property (X_("flags"))) != 0) {
2360 _flags = Flag (string_2_enum (prop->value(), _flags));
2365 if (is_master() || is_monitor() || is_auditioner()) {
2366 _mute_master->set_solo_ignore (true);
2370 /* monitor bus does not get a panner, but if (re)created
2371 via XML, it will already have one by the time we
2372 call ::set_state(). so ... remove it.
2377 /* add all processors (except amp, which is always present) */
2379 nlist = node.children();
2380 XMLNode processor_state (X_("processor_state"));
2382 Stateful::save_extra_xml (node);
2384 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2388 if (child->name() == IO::state_node_name) {
2389 if ((prop = child->property (X_("direction"))) == 0) {
2393 if (prop->value() == "Input") {
2394 _input->set_state (*child, version);
2395 } else if (prop->value() == "Output") {
2396 _output->set_state (*child, version);
2400 if (child->name() == X_("Processor")) {
2401 processor_state.add_child_copy (*child);
2404 if (child->name() == X_("Pannable")) {
2406 _pannable->set_state (*child, version);
2408 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2413 if ((prop = node.property (X_("meter-point"))) != 0) {
2414 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2415 set_meter_point (mp, true);
2417 _meter->set_display_to_user (_meter_point == MeterCustom);
2421 if ((prop = node.property (X_("meter-type"))) != 0) {
2422 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2425 _initial_io_setup = false;
2427 set_processor_state (processor_state);
2429 // this looks up the internal instrument in processors
2430 reset_instrument_info();
2432 if ((prop = node.property ("self-solo")) != 0) {
2433 set_self_solo (string_is_affirmative (prop->value()));
2436 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2437 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2438 mod_solo_by_others_upstream (atoi (prop->value()));
2441 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2442 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2443 mod_solo_by_others_downstream (atoi (prop->value()));
2446 if ((prop = node.property ("solo-isolated")) != 0) {
2447 set_solo_isolated (string_is_affirmative (prop->value()), this);
2450 if ((prop = node.property ("solo-safe")) != 0) {
2451 set_solo_safe (string_is_affirmative (prop->value()), this);
2454 if ((prop = node.property (X_("phase-invert"))) != 0) {
2455 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2458 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2459 set_denormal_protection (string_is_affirmative (prop->value()));
2462 if ((prop = node.property (X_("active"))) != 0) {
2463 bool yn = string_is_affirmative (prop->value());
2464 _active = !yn; // force switch
2465 set_active (yn, this);
2468 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2469 set_order_key (atoi(prop->value()));
2472 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2476 string::size_type colon, equal;
2477 string remaining = prop->value();
2479 while (remaining.length()) {
2481 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2482 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2485 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2486 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2489 string keyname = remaining.substr (0, equal);
2491 if ((keyname == "EditorSort") || (keyname == "editor")) {
2492 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2498 colon = remaining.find_first_of (':');
2500 if (colon != string::npos) {
2501 remaining = remaining.substr (colon+1);
2508 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2509 PBD::ID id (prop->value ());
2510 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2511 ProcessorList::const_iterator i = _processors.begin ();
2512 while (i != _processors.end() && (*i)->id() != id) {
2516 if (i != _processors.end ()) {
2517 _processor_after_last_custom_meter = *i;
2518 _custom_meter_position_noted = true;
2522 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2525 if (child->name() == X_("Comment")) {
2527 /* XXX this is a terrible API design in libxml++ */
2529 XMLNode *cmt = *(child->children().begin());
2530 _comment = cmt->content();
2532 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2533 if (prop->value() == "solo") {
2534 _solo_control->set_state (*child, version);
2535 } else if (prop->value() == "mute") {
2536 _mute_control->set_state (*child, version);
2539 } else if (child->name() == X_("RemoteControl")) {
2540 if ((prop = child->property (X_("id"))) != 0) {
2542 sscanf (prop->value().c_str(), "%d", &x);
2543 set_remote_control_id_internal (x);
2546 } else if (child->name() == X_("MuteMaster")) {
2547 _mute_master->set_state (*child, version);
2549 } else if (child->name() == Automatable::xml_node_name) {
2550 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2558 Route::set_state_2X (const XMLNode& node, int version)
2560 LocaleGuard lg (X_("C"));
2562 XMLNodeConstIterator niter;
2564 const XMLProperty *prop;
2566 /* 2X things which still remain to be handled:
2572 if (node.name() != "Route") {
2573 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2577 if ((prop = node.property (X_("flags"))) != 0) {
2578 string f = prop->value ();
2579 boost::replace_all (f, "ControlOut", "MonitorOut");
2580 _flags = Flag (string_2_enum (f, _flags));
2585 if (is_master() || is_monitor() || is_auditioner()) {
2586 _mute_master->set_solo_ignore (true);
2589 if ((prop = node.property (X_("phase-invert"))) != 0) {
2590 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2591 if (string_is_affirmative (prop->value ())) {
2594 set_phase_invert (p);
2597 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2598 set_denormal_protection (string_is_affirmative (prop->value()));
2601 if ((prop = node.property (X_("soloed"))) != 0) {
2602 bool yn = string_is_affirmative (prop->value());
2604 /* XXX force reset of solo status */
2606 set_solo (yn, this);
2609 if ((prop = node.property (X_("muted"))) != 0) {
2612 bool muted = string_is_affirmative (prop->value());
2618 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2620 if (string_is_affirmative (prop->value())){
2621 mute_point = mute_point + "PreFader";
2626 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2628 if (string_is_affirmative (prop->value())){
2631 mute_point = mute_point + ",";
2634 mute_point = mute_point + "PostFader";
2639 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2641 if (string_is_affirmative (prop->value())){
2644 mute_point = mute_point + ",";
2647 mute_point = mute_point + "Listen";
2652 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2654 if (string_is_affirmative (prop->value())){
2657 mute_point = mute_point + ",";
2660 mute_point = mute_point + "Main";
2664 _mute_master->set_mute_points (mute_point);
2665 _mute_master->set_muted_by_self (true);
2669 if ((prop = node.property (X_("meter-point"))) != 0) {
2670 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2673 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2674 don't mean the same thing.
2677 if ((prop = node.property (X_("order-keys"))) != 0) {
2681 string::size_type colon, equal;
2682 string remaining = prop->value();
2684 while (remaining.length()) {
2686 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2687 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2690 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2691 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2694 string keyname = remaining.substr (0, equal);
2696 if (keyname == "EditorSort" || keyname == "editor") {
2697 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2703 colon = remaining.find_first_of (':');
2705 if (colon != string::npos) {
2706 remaining = remaining.substr (colon+1);
2715 nlist = node.children ();
2716 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2720 if (child->name() == IO::state_node_name) {
2722 /* there is a note in IO::set_state_2X() about why we have to call
2726 _input->set_state_2X (*child, version, true);
2727 _output->set_state_2X (*child, version, false);
2729 if ((prop = child->property (X_("name"))) != 0) {
2730 Route::set_name (prop->value ());
2735 if ((prop = child->property (X_("active"))) != 0) {
2736 bool yn = string_is_affirmative (prop->value());
2737 _active = !yn; // force switch
2738 set_active (yn, this);
2741 if ((prop = child->property (X_("gain"))) != 0) {
2744 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2745 _amp->gain_control()->set_value (val);
2749 /* Set up Panners in the IO */
2750 XMLNodeList io_nlist = child->children ();
2752 XMLNodeConstIterator io_niter;
2755 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2757 io_child = *io_niter;
2759 if (io_child->name() == X_("Panner")) {
2760 _main_outs->panner_shell()->set_state(*io_child, version);
2761 } else if (io_child->name() == X_("Automation")) {
2762 /* IO's automation is for the fader */
2763 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2769 XMLNodeList redirect_nodes;
2771 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2775 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2776 redirect_nodes.push_back(child);
2781 set_processor_state_2X (redirect_nodes, version);
2783 Stateful::save_extra_xml (node);
2785 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2788 if (child->name() == X_("Comment")) {
2790 /* XXX this is a terrible API design in libxml++ */
2792 XMLNode *cmt = *(child->children().begin());
2793 _comment = cmt->content();
2795 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2796 if (prop->value() == X_("solo")) {
2797 _solo_control->set_state (*child, version);
2798 } else if (prop->value() == X_("mute")) {
2799 _mute_control->set_state (*child, version);
2802 } else if (child->name() == X_("RemoteControl")) {
2803 if ((prop = child->property (X_("id"))) != 0) {
2805 sscanf (prop->value().c_str(), "%d", &x);
2806 set_remote_control_id_internal (x);
2816 Route::get_processor_state ()
2818 XMLNode* root = new XMLNode (X_("redirects"));
2819 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2820 root->add_child_nocopy ((*i)->state (true));
2827 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2829 /* We don't bother removing existing processors not in nList, as this
2830 method will only be called when creating a Route from scratch, not
2831 for undo purposes. Just put processors in at the appropriate place
2835 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2836 add_processor_from_xml_2X (**i, version);
2841 Route::set_processor_state (const XMLNode& node)
2843 const XMLNodeList &nlist = node.children();
2844 XMLNodeConstIterator niter;
2845 ProcessorList new_order;
2846 bool must_configure = false;
2848 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2850 XMLProperty* prop = (*niter)->property ("type");
2852 if (prop->value() == "amp") {
2853 _amp->set_state (**niter, Stateful::current_state_version);
2854 new_order.push_back (_amp);
2855 } else if (prop->value() == "trim") {
2856 _trim->set_state (**niter, Stateful::current_state_version);
2857 new_order.push_back (_trim);
2858 } else if (prop->value() == "meter") {
2859 _meter->set_state (**niter, Stateful::current_state_version);
2860 new_order.push_back (_meter);
2861 } else if (prop->value() == "delay") {
2863 _delayline->set_state (**niter, Stateful::current_state_version);
2864 new_order.push_back (_delayline);
2866 } else if (prop->value() == "main-outs") {
2867 _main_outs->set_state (**niter, Stateful::current_state_version);
2868 } else if (prop->value() == "intreturn") {
2870 _intreturn.reset (new InternalReturn (_session));
2871 must_configure = true;
2873 _intreturn->set_state (**niter, Stateful::current_state_version);
2874 } else if (is_monitor() && prop->value() == "monitor") {
2875 if (!_monitor_control) {
2876 _monitor_control.reset (new MonitorProcessor (_session));
2877 must_configure = true;
2879 _monitor_control->set_state (**niter, Stateful::current_state_version);
2880 } else if (prop->value() == "capture") {
2881 /* CapturingProcessor should never be restored, it's always
2882 added explicitly when needed */
2884 ProcessorList::iterator o;
2886 for (o = _processors.begin(); o != _processors.end(); ++o) {
2887 XMLProperty* id_prop = (*niter)->property(X_("id"));
2888 if (id_prop && (*o)->id() == id_prop->value()) {
2889 (*o)->set_state (**niter, Stateful::current_state_version);
2890 new_order.push_back (*o);
2895 // If the processor (*niter) is not on the route then create it
2897 if (o == _processors.end()) {
2899 boost::shared_ptr<Processor> processor;
2901 if (prop->value() == "intsend") {
2903 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2905 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2906 prop->value() == "lv2" ||
2907 prop->value() == "windows-vst" ||
2908 prop->value() == "lxvst" ||
2909 prop->value() == "audiounit") {
2911 if (_session.get_disable_all_loaded_plugins ()) {
2912 processor.reset (new UnknownProcessor (_session, **niter));
2914 processor.reset (new PluginInsert (_session));
2916 } else if (prop->value() == "port") {
2918 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2920 } else if (prop->value() == "send") {
2922 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2925 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2929 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2930 /* This processor could not be configured. Turn it into a UnknownProcessor */
2931 processor.reset (new UnknownProcessor (_session, **niter));
2934 /* we have to note the monitor send here, otherwise a new one will be created
2935 and the state of this one will be lost.
2937 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2938 if (isend && isend->role() == Delivery::Listen) {
2939 _monitor_send = isend;
2942 /* it doesn't matter if invisible processors are added here, as they
2943 will be sorted out by setup_invisible_processors () shortly.
2946 new_order.push_back (processor);
2947 must_configure = true;
2953 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2954 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2955 _processors = new_order;
2957 if (must_configure) {
2958 configure_processors_unlocked (0);
2961 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2963 (*i)->set_owner (this);
2964 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2966 boost::shared_ptr<PluginInsert> pi;
2968 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2969 if (pi->has_no_inputs ()) {
2970 _have_internal_generator = true;
2977 reset_instrument_info ();
2978 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2979 set_processor_positions ();
2983 Route::curve_reallocate ()
2985 // _gain_automation_curve.finish_resize ();
2986 // _pan_automation_curve.finish_resize ();
2990 Route::silence (framecnt_t nframes)
2992 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2997 silence_unlocked (nframes);
3001 Route::silence_unlocked (framecnt_t nframes)
3003 /* Must be called with the processor lock held */
3007 _output->silence (nframes);
3009 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3010 boost::shared_ptr<PluginInsert> pi;
3012 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
3013 // skip plugins, they don't need anything when we're not active
3017 (*i)->silence (nframes);
3020 if (nframes == _session.get_block_size()) {
3027 Route::add_internal_return ()
3030 _intreturn.reset (new InternalReturn (_session));
3031 add_processor (_intreturn, PreFader);
3036 Route::add_send_to_internal_return (InternalSend* send)
3038 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3040 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3041 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3044 return d->add_send (send);
3050 Route::remove_send_from_internal_return (InternalSend* send)
3052 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3054 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3055 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3058 return d->remove_send (send);
3064 Route::enable_monitor_send ()
3066 /* Caller must hold process lock */
3067 assert (!AudioEngine::instance()->process_lock().trylock());
3069 /* master never sends to monitor section via the normal mechanism */
3070 assert (!is_master ());
3071 assert (!is_monitor ());
3073 /* make sure we have one */
3074 if (!_monitor_send) {
3075 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3076 _monitor_send->set_display_to_user (false);
3080 configure_processors (0);
3083 /** Add an aux send to a route.
3084 * @param route route to send to.
3085 * @param before Processor to insert before, or 0 to insert at the end.
3088 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3090 assert (route != _session.monitor_out ());
3093 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3095 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3097 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3099 if (d && d->target_route() == route) {
3100 /* already listening via the specified IO: do nothing */
3108 boost::shared_ptr<InternalSend> listener;
3111 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3112 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3113 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3116 add_processor (listener, before);
3118 } catch (failed_constructor& err) {
3126 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3128 ProcessorStreams err;
3129 ProcessorList::iterator tmp;
3132 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3134 /* have to do this early because otherwise processor reconfig
3135 * will put _monitor_send back in the list
3138 if (route == _session.monitor_out()) {
3139 _monitor_send.reset ();
3143 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3145 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3147 if (d && d->target_route() == route) {
3149 if (remove_processor (*x, &err, false) > 0) {
3155 /* list could have been demolished while we dropped the lock
3158 if (_session.engine().connected()) {
3159 /* i/o processors cannot be removed if the engine is not running
3160 * so don't live-loop in case the engine is N/A or dies
3170 Route::set_comment (string cmt, void *src)
3173 comment_changed (src);
3174 _session.set_dirty ();
3178 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3180 FeedRecord fr (other, via_sends_only);
3182 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3184 if (!result.second) {
3186 /* already a record for "other" - make sure sends-only information is correct */
3187 if (!via_sends_only && result.first->sends_only) {
3188 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3189 frp->sends_only = false;
3193 return result.second;
3197 Route::clear_fed_by ()
3203 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3205 const FedBy& fed_by (other->fed_by());
3207 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3208 boost::shared_ptr<Route> sr = f->r.lock();
3210 if (sr && (sr.get() == this)) {
3212 if (via_sends_only) {
3213 *via_sends_only = f->sends_only;
3224 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3226 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3228 if (_output->connected_to (other->input())) {
3229 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3230 if (via_send_only) {
3231 *via_send_only = false;
3238 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3240 boost::shared_ptr<IOProcessor> iop;
3242 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3243 if (iop->feeds (other)) {
3244 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3245 if (via_send_only) {
3246 *via_send_only = true;
3250 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3253 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3258 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3263 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3265 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3268 /** Called from the (non-realtime) butler thread when the transport is stopped */
3270 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3272 framepos_t now = _session.transport_frame();
3275 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3277 Automatable::transport_stopped (now);
3279 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3281 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3285 (*i)->transport_stopped (now);
3289 _roll_delay = _initial_delay;
3293 Route::input_change_handler (IOChange change, void * /*src*/)
3295 if ((change.type & IOChange::ConfigurationChanged)) {
3296 /* This is called with the process lock held if change
3297 contains ConfigurationChanged
3299 configure_processors (0);
3300 _phase_invert.resize (_input->n_ports().n_audio ());
3301 io_changed (); /* EMIT SIGNAL */
3304 if (_soloed_by_others_upstream || _solo_isolated_by_upstream) {
3307 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3308 if (_input->connected()) {
3309 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3310 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3314 bool does_feed = (*i)->direct_feeds_according_to_reality (shared_from_this(), &sends_only);
3315 if (does_feed && !sends_only) {
3316 if ((*i)->soloed()) {
3319 if ((*i)->solo_isolated()) {
3326 int delta = sbou - _soloed_by_others_upstream;
3327 int idelta = ibou - _solo_isolated_by_upstream;
3330 PBD::warning << string_compose (
3331 _("Invalid Solo-Isolate propagation: from:%1 new:%2 - old:%3 = delta:%4"),
3332 _name, ibou, _solo_isolated_by_upstream, idelta)
3337 if (_soloed_by_others_upstream) {
3338 // ignore new connections (they're not propagated)
3340 mod_solo_by_others_upstream (delta);
3344 if (_solo_isolated_by_upstream) {
3345 // solo-isolate currently only propagates downstream
3347 mod_solo_isolated_by_upstream (false, this);
3349 // TODO think: mod_solo_isolated_by_upstream() does not take delta arg,
3350 // but idelta can't be smaller than -1, can it?
3351 //_solo_isolated_by_upstream = ibou;
3354 // Session::route_solo_changed does not propagate indirect solo-changes
3355 // propagate downstream to tracks
3356 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3357 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3361 bool does_feed = feeds (*i, &sends_only);
3362 if (delta <= 0 && does_feed && !sends_only) {
3363 (*i)->mod_solo_by_others_upstream (delta);
3366 if (idelta < 0 && does_feed && !sends_only) {
3367 (*i)->mod_solo_isolated_by_upstream (false, this);
3374 Route::output_change_handler (IOChange change, void * /*src*/)
3376 if (_initial_io_setup) {
3380 if ((change.type & IOChange::ConfigurationChanged)) {
3381 /* This is called with the process lock held if change
3382 contains ConfigurationChanged
3384 configure_processors (0);
3387 _session.reset_monitor_section();
3390 io_changed (); /* EMIT SIGNAL */
3393 if (_soloed_by_others_downstream) {
3395 /* checking all all downstream routes for
3396 * explicit of implict solo is a rather drastic measure,
3397 * ideally the input_change_handler() of the other route
3398 * would propagate the change to us.
3400 boost::shared_ptr<RouteList> routes = _session.get_routes ();
3401 if (_output->connected()) {
3402 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3403 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3407 bool does_feed = direct_feeds_according_to_reality (*i, &sends_only);
3408 if (does_feed && !sends_only) {
3409 if ((*i)->soloed()) {
3416 int delta = sbod - _soloed_by_others_downstream;
3418 // do not allow new connections to change implicit solo (no propagation)
3419 mod_solo_by_others_downstream (delta);
3420 // Session::route_solo_changed() does not propagate indirect solo-changes
3421 // propagate upstream to tracks
3422 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
3423 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
3427 bool does_feed = (*i)->feeds (shared_from_this(), &sends_only);
3428 if (delta != 0 && does_feed && !sends_only) {
3429 (*i)->mod_solo_by_others_downstream (delta);
3438 Route::pans_required () const
3440 if (n_outputs().n_audio() < 2) {
3444 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3448 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3450 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3456 if (n_outputs().n_total() == 0) {
3460 if (!_active || n_inputs() == ChanCount::ZERO) {
3461 silence_unlocked (nframes);
3465 if (session_state_changing) {
3466 if (_session.transport_speed() != 0.0f) {
3467 /* we're rolling but some state is changing (e.g. our diskstream contents)
3468 so we cannot use them. Be silent till this is over.
3470 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3472 silence_unlocked (nframes);
3475 /* we're really not rolling, so we're either delivery silence or actually
3476 monitoring, both of which are safe to do while session_state_changing is true.
3480 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3482 fill_buffers_with_input (bufs, _input, nframes);
3484 if (_meter_point == MeterInput) {
3485 _meter->run (bufs, start_frame, end_frame, nframes, true);
3488 _amp->apply_gain_automation (false);
3489 _trim->apply_gain_automation (false);
3490 passthru (bufs, start_frame, end_frame, nframes, 0);
3496 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3498 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3503 if (n_outputs().n_total() == 0) {
3507 if (!_active || n_inputs().n_total() == 0) {
3508 silence_unlocked (nframes);
3512 framepos_t unused = 0;
3514 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3520 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3522 fill_buffers_with_input (bufs, _input, nframes);
3524 if (_meter_point == MeterInput) {
3525 _meter->run (bufs, start_frame, end_frame, nframes, true);
3528 passthru (bufs, start_frame, end_frame, nframes, declick);
3534 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3541 Route::flush_processors ()
3543 /* XXX shouldn't really try to take this lock, since
3544 this is called from the RT audio thread.
3547 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3549 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3555 __attribute__((annotate("realtime")))
3558 Route::apply_processor_changes_rt ()
3560 int emissions = EmitNone;
3562 if (_pending_meter_point != _meter_point) {
3563 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3565 /* meters always have buffers for 'processor_max_streams'
3566 * they can be re-positioned without re-allocation */
3567 if (set_meter_point_unlocked()) {
3568 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3570 emissions |= EmitMeterChanged;
3575 bool changed = false;
3577 if (g_atomic_int_get (&_pending_process_reorder)) {
3578 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3580 apply_processor_order (_pending_processor_order);
3581 setup_invisible_processors ();
3583 g_atomic_int_set (&_pending_process_reorder, 0);
3584 emissions |= EmitRtProcessorChange;
3588 set_processor_positions ();
3590 if (emissions != 0) {
3591 g_atomic_int_set (&_pending_signals, emissions);
3598 Route::emit_pending_signals ()
3601 int sig = g_atomic_int_and (&_pending_signals, 0);
3602 if (sig & EmitMeterChanged) {
3603 _meter->emit_configuration_changed();
3604 meter_change (); /* EMIT SIGNAL */
3605 if (sig & EmitMeterVisibilityChange) {
3606 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3608 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3611 if (sig & EmitRtProcessorChange) {
3612 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3617 Route::set_meter_point (MeterPoint p, bool force)
3619 if (_pending_meter_point == p && !force) {
3623 if (force || !AudioEngine::instance()->running()) {
3624 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3625 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3626 _pending_meter_point = p;
3627 _meter->emit_configuration_changed();
3628 meter_change (); /* EMIT SIGNAL */
3629 if (set_meter_point_unlocked()) {
3630 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3632 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3635 _pending_meter_point = p;
3641 __attribute__((annotate("realtime")))
3644 Route::set_meter_point_unlocked ()
3647 /* Caller must hold process and processor write lock */
3648 assert (!AudioEngine::instance()->process_lock().trylock());
3649 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3650 assert (!lm.locked ());
3653 _meter_point = _pending_meter_point;
3655 bool meter_was_visible_to_user = _meter->display_to_user ();
3657 if (!_custom_meter_position_noted) {
3658 maybe_note_meter_position ();
3661 if (_meter_point != MeterCustom) {
3663 _meter->set_display_to_user (false);
3665 setup_invisible_processors ();
3668 _meter->set_display_to_user (true);
3670 /* If we have a previous position for the custom meter, try to put it there */
3671 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3673 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3674 if (i != _processors.end ()) {
3675 _processors.remove (_meter);
3676 _processors.insert (i, _meter);
3678 } else {// at end, right before the mains_out/panner
3679 _processors.remove (_meter);
3680 ProcessorList::iterator main = _processors.end();
3681 _processors.insert (--main, _meter);
3685 /* Set up the meter for its new position */
3687 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3691 if (loc == _processors.begin()) {
3692 m_in = _input->n_ports();
3694 ProcessorList::iterator before = loc;
3696 m_in = (*before)->output_streams ();
3699 _meter->reflect_inputs (m_in);
3701 /* we do not need to reconfigure the processors, because the meter
3702 (a) is always ready to handle processor_max_streams
3703 (b) is always an N-in/N-out processor, and thus moving
3704 it doesn't require any changes to the other processors.
3707 /* these should really be done after releasing the lock
3708 * but all those signals are subscribed to with gui_thread()
3711 return (_meter->display_to_user() != meter_was_visible_to_user);
3715 Route::listen_position_changed ()
3718 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3719 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3720 ProcessorState pstate (this);
3722 if (configure_processors_unlocked (0)) {
3723 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
3725 configure_processors_unlocked (0); // it worked before we tried to add it ...
3730 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3731 _session.set_dirty ();
3734 boost::shared_ptr<CapturingProcessor>
3735 Route::add_export_point()
3737 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3738 if (!_capturing_processor) {
3740 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3741 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3743 _capturing_processor.reset (new CapturingProcessor (_session));
3744 _capturing_processor->activate ();
3746 configure_processors_unlocked (0);
3750 return _capturing_processor;
3754 Route::update_signal_latency ()
3756 framecnt_t l = _output->user_latency();
3757 framecnt_t lamp = 0;
3758 bool before_amp = true;
3759 framecnt_t ltrim = 0;
3760 bool before_trim = true;
3762 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3763 if ((*i)->active ()) {
3764 l += (*i)->signal_latency ();
3769 if ((*i) == _trim) {
3780 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3782 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3783 _signal_latency_at_amp_position = lamp;
3784 _signal_latency_at_trim_position = ltrim;
3786 if (_signal_latency != l) {
3787 _signal_latency = l;
3788 signal_latency_changed (); /* EMIT SIGNAL */
3791 return _signal_latency;
3795 Route::set_user_latency (framecnt_t nframes)
3797 _output->set_user_latency (nframes);
3798 _session.update_latency_compensation ();
3802 Route::set_latency_compensation (framecnt_t longest_session_latency)
3804 framecnt_t old = _initial_delay;
3806 if (_signal_latency < longest_session_latency) {
3807 _initial_delay = longest_session_latency - _signal_latency;
3812 DEBUG_TRACE (DEBUG::Latency, string_compose (
3813 "%1: compensate for maximum latency of %2,"
3814 "given own latency of %3, using initial delay of %4\n",
3815 name(), longest_session_latency, _signal_latency, _initial_delay));
3817 if (_initial_delay != old) {
3818 initial_delay_changed (); /* EMIT SIGNAL */
3821 if (_session.transport_stopped()) {
3822 _roll_delay = _initial_delay;
3826 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3827 : AutomationControl (r->session(),
3828 Evoral::Parameter (SoloAutomation),
3829 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3830 boost::shared_ptr<AutomationList>(), name)
3833 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3834 gl->set_interpolation(Evoral::ControlList::Discrete);
3839 Route::SoloControllable::set_value (double val)
3841 const bool bval = ((val >= 0.5) ? true : false);
3843 boost::shared_ptr<RouteList> rl (new RouteList);
3845 boost::shared_ptr<Route> r = _route.lock ();
3852 if (Config->get_solo_control_is_listen_control()) {
3853 _session.set_listen (rl, bval);
3855 _session.set_solo (rl, bval);
3860 Route::SoloControllable::get_value () const
3862 boost::shared_ptr<Route> r = _route.lock ();
3867 if (Config->get_solo_control_is_listen_control()) {
3868 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3870 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3874 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3875 : AutomationControl (r->session(),
3876 Evoral::Parameter (MuteAutomation),
3877 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3878 boost::shared_ptr<AutomationList>(),
3882 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3883 gl->set_interpolation(Evoral::ControlList::Discrete);
3888 Route::MuteControllable::set_superficial_value(bool muted)
3890 /* Note we can not use AutomationControl::set_value here since it will emit
3891 Changed(), but the value will not be correct to the observer. */
3893 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3895 Control::set_double (muted, _session.transport_frame(), to_list);
3899 Route::MuteControllable::set_value (double val)
3901 const bool bval = ((val >= 0.5) ? true : false);
3903 boost::shared_ptr<Route> r = _route.lock ();
3908 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3909 // Playing back automation, set route mute directly
3910 r->set_mute (bval, this);
3912 // Set from user, queue mute event
3913 boost::shared_ptr<RouteList> rl (new RouteList);
3915 _session.set_mute (rl, bval, Session::rt_cleanup);
3918 // Set superficial/automation value to drive controller (and possibly record)
3919 set_superficial_value(bval);
3923 Route::MuteControllable::get_value () const
3925 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3926 // Playing back automation, get the value from the list
3927 return AutomationControl::get_value();
3930 // Not playing back automation, get the actual route mute value
3931 boost::shared_ptr<Route> r = _route.lock ();
3932 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3936 Route::set_block_size (pframes_t nframes)
3938 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3939 (*i)->set_block_size (nframes);
3942 _session.ensure_buffers (n_process_buffers ());
3946 Route::protect_automation ()
3948 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3949 (*i)->protect_automation();
3952 /** @param declick 1 to set a pending declick fade-in,
3953 * -1 to set a pending declick fade-out
3956 Route::set_pending_declick (int declick)
3959 /* this call is not allowed to turn off a pending declick */
3961 _pending_declick = declick;
3964 _pending_declick = 0;
3968 /** Shift automation forwards from a particular place, thereby inserting time.
3969 * Adds undo commands for any shifts that are performed.
3971 * @param pos Position to start shifting from.
3972 * @param frames Amount to shift forwards by.
3976 Route::shift (framepos_t pos, framecnt_t frames)
3978 /* gain automation */
3980 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3982 XMLNode &before = gc->alist()->get_state ();
3983 gc->alist()->shift (pos, frames);
3984 XMLNode &after = gc->alist()->get_state ();
3985 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3988 /* gain automation */
3990 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3992 XMLNode &before = gc->alist()->get_state ();
3993 gc->alist()->shift (pos, frames);
3994 XMLNode &after = gc->alist()->get_state ();
3995 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3998 // TODO mute automation ??
4000 /* pan automation */
4002 ControlSet::Controls& c (_pannable->controls());
4004 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
4005 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
4007 boost::shared_ptr<AutomationList> al = pc->alist();
4008 XMLNode& before = al->get_state ();
4009 al->shift (pos, frames);
4010 XMLNode& after = al->get_state ();
4011 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4016 /* redirect automation */
4018 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4019 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
4021 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
4023 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
4024 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
4026 boost::shared_ptr<AutomationList> al = ac->alist();
4027 XMLNode &before = al->get_state ();
4028 al->shift (pos, frames);
4029 XMLNode &after = al->get_state ();
4030 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
4039 Route::save_as_template (const string& path, const string& name)
4041 XMLNode& node (state (false));
4044 IO::set_name_in_state (*node.children().front(), name);
4046 tree.set_root (&node);
4047 return tree.write (path.c_str());
4052 Route::set_name (const string& str)
4054 if (str == name()) {
4058 string name = Route::ensure_track_or_route_name (str, _session);
4059 SessionObject::set_name (name);
4061 bool ret = (_input->set_name(name) && _output->set_name(name));
4064 /* rename the main outs. Leave other IO processors
4065 * with whatever name they already have, because its
4066 * just fine as it is (it will not contain the route
4067 * name if its a port insert, port send or port return).
4071 if (_main_outs->set_name (name)) {
4072 /* XXX returning false here is stupid because
4073 we already changed the route name.
4083 /** Set the name of a route in an XML description.
4084 * @param node XML <Route> node to set the name in.
4085 * @param name New name.
4088 Route::set_name_in_state (XMLNode& node, string const & name)
4090 node.add_property (X_("name"), name);
4092 XMLNodeList children = node.children();
4093 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
4095 if ((*i)->name() == X_("IO")) {
4097 IO::set_name_in_state (**i, name);
4099 } else if ((*i)->name() == X_("Processor")) {
4101 XMLProperty* role = (*i)->property (X_("role"));
4102 if (role && role->value() == X_("Main")) {
4103 (*i)->add_property (X_("name"), name);
4106 } else if ((*i)->name() == X_("Diskstream")) {
4108 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
4109 (*i)->add_property (X_("name"), name);
4115 boost::shared_ptr<Send>
4116 Route::internal_send_for (boost::shared_ptr<const Route> target) const
4118 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4120 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4121 boost::shared_ptr<InternalSend> send;
4123 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4124 if (send->target_route() == target) {
4130 return boost::shared_ptr<Send>();
4133 /** @param c Audio channel index.
4134 * @param yn true to invert phase, otherwise false.
4137 Route::set_phase_invert (uint32_t c, bool yn)
4139 if (_phase_invert[c] != yn) {
4140 _phase_invert[c] = yn;
4141 phase_invert_changed (); /* EMIT SIGNAL */
4142 _session.set_dirty ();
4147 Route::set_phase_invert (boost::dynamic_bitset<> p)
4149 if (_phase_invert != p) {
4151 phase_invert_changed (); /* EMIT SIGNAL */
4152 _session.set_dirty ();
4157 Route::phase_invert (uint32_t c) const
4159 return _phase_invert[c];
4162 boost::dynamic_bitset<>
4163 Route::phase_invert () const
4165 return _phase_invert;
4169 Route::set_denormal_protection (bool yn)
4171 if (_denormal_protection != yn) {
4172 _denormal_protection = yn;
4173 denormal_protection_changed (); /* EMIT SIGNAL */
4178 Route::denormal_protection () const
4180 return _denormal_protection;
4184 Route::set_active (bool yn, void* src)
4186 if (_session.transport_rolling()) {
4190 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4191 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4195 if (_active != yn) {
4197 _input->set_active (yn);
4198 _output->set_active (yn);
4199 active_changed (); // EMIT SIGNAL
4200 _session.set_dirty ();
4204 boost::shared_ptr<Pannable>
4205 Route::pannable() const
4210 boost::shared_ptr<Panner>
4211 Route::panner() const
4214 return _main_outs->panner_shell()->panner();
4217 boost::shared_ptr<PannerShell>
4218 Route::panner_shell() const
4220 return _main_outs->panner_shell();
4223 boost::shared_ptr<AutomationControl>
4224 Route::gain_control() const
4226 return _amp->gain_control();
4229 boost::shared_ptr<AutomationControl>
4230 Route::get_control (const Evoral::Parameter& param)
4232 /* either we own the control or .... */
4234 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4238 /* maybe one of our processors does or ... */
4240 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4241 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4242 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4250 /* nobody does so we'll make a new one */
4252 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4259 boost::shared_ptr<Processor>
4260 Route::nth_plugin (uint32_t n)
4262 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4263 ProcessorList::iterator i;
4265 for (i = _processors.begin(); i != _processors.end(); ++i) {
4266 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4273 return boost::shared_ptr<Processor> ();
4276 boost::shared_ptr<Processor>
4277 Route::nth_send (uint32_t n)
4279 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4280 ProcessorList::iterator i;
4282 for (i = _processors.begin(); i != _processors.end(); ++i) {
4283 if (boost::dynamic_pointer_cast<Send> (*i)) {
4290 return boost::shared_ptr<Processor> ();
4294 Route::has_io_processor_named (const string& name)
4296 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4297 ProcessorList::iterator i;
4299 for (i = _processors.begin(); i != _processors.end(); ++i) {
4300 if (boost::dynamic_pointer_cast<Send> (*i) ||
4301 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4302 if ((*i)->name() == name) {
4311 MuteMaster::MutePoint
4312 Route::mute_points () const
4314 return _mute_master->mute_points ();
4318 Route::set_processor_positions ()
4320 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4322 bool had_amp = false;
4323 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4324 (*i)->set_pre_fader (!had_amp);
4331 /** Called when there is a proposed change to the input port count */
4333 Route::input_port_count_changing (ChanCount to)
4335 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4337 /* The processors cannot be configured with the new input arrangement, so
4343 /* The change is ok */
4347 /** Called when there is a proposed change to the output port count */
4349 Route::output_port_count_changing (ChanCount to)
4351 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4352 if (processor_out_streams.get(*t) > to.get(*t)) {
4356 /* The change is ok */
4361 Route::unknown_processors () const
4365 if (_session.get_disable_all_loaded_plugins ()) {
4366 // Do not list "missing plugins" if they are explicitly disabled
4370 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4371 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4372 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4373 p.push_back ((*i)->name ());
4382 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4384 /* we assume that all our input ports feed all our output ports. its not
4385 universally true, but the alternative is way too corner-case to worry about.
4388 LatencyRange all_connections;
4391 all_connections.min = 0;
4392 all_connections.max = 0;
4394 all_connections.min = ~((pframes_t) 0);
4395 all_connections.max = 0;
4397 /* iterate over all "from" ports and determine the latency range for all of their
4398 connections to the "outside" (outside of this Route).
4401 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4405 p->get_connected_latency_range (range, playback);
4407 all_connections.min = min (all_connections.min, range.min);
4408 all_connections.max = max (all_connections.max, range.max);
4412 /* set the "from" port latencies to the max/min range of all their connections */
4414 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4415 p->set_private_latency_range (all_connections, playback);
4418 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4420 all_connections.min += our_latency;
4421 all_connections.max += our_latency;
4423 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4424 p->set_private_latency_range (all_connections, playback);
4427 return all_connections.max;
4431 Route::set_private_port_latencies (bool playback) const
4433 framecnt_t own_latency = 0;
4435 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4436 OR LATENCY CALLBACK.
4438 This is called (early) from the latency callback. It computes the REAL
4439 latency associated with each port and stores the result as the "private"
4440 latency of the port. A later call to Route::set_public_port_latencies()
4441 sets all ports to the same value to reflect the fact that we do latency
4442 compensation and so all signals are delayed by the same amount as they
4443 flow through ardour.
4446 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4447 if ((*i)->active ()) {
4448 own_latency += (*i)->signal_latency ();
4453 /* playback: propagate latency from "outside the route" to outputs to inputs */
4454 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4456 /* capture: propagate latency from "outside the route" to inputs to outputs */
4457 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4462 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4464 /* this is called to set the JACK-visible port latencies, which take
4465 latency compensation into account.
4474 const PortSet& ports (_input->ports());
4475 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4476 p->set_public_latency_range (range, playback);
4481 const PortSet& ports (_output->ports());
4482 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4483 p->set_public_latency_range (range, playback);
4488 /** Put the invisible processors in the right place in _processors.
4489 * Must be called with a writer lock on _processor_lock held.
4492 __attribute__((annotate("realtime")))
4495 Route::setup_invisible_processors ()
4498 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4499 assert (!lm.locked ());
4503 /* too early to be doing this stuff */
4507 /* we'll build this new list here and then use it
4509 * TODO put the ProcessorList is on the stack for RT-safety.
4512 ProcessorList new_processors;
4514 /* find visible processors */
4516 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4517 if ((*i)->display_to_user ()) {
4518 new_processors.push_back (*i);
4524 ProcessorList::iterator amp = new_processors.begin ();
4525 while (amp != new_processors.end() && *amp != _amp) {
4529 assert (amp != new_processors.end ());
4531 /* and the processor after the amp */
4533 ProcessorList::iterator after_amp = amp;
4539 switch (_meter_point) {
4541 assert (!_meter->display_to_user ());
4542 new_processors.push_front (_meter);
4545 assert (!_meter->display_to_user ());
4546 new_processors.insert (amp, _meter);
4548 case MeterPostFader:
4549 /* do nothing here */
4552 /* do nothing here */
4555 /* the meter is visible, so we don't touch it here */
4562 assert (_main_outs);
4563 assert (!_main_outs->display_to_user ());
4564 new_processors.push_back (_main_outs);
4566 /* iterator for the main outs */
4568 ProcessorList::iterator main = new_processors.end();
4571 /* OUTPUT METERING */
4573 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4574 assert (!_meter->display_to_user ());
4576 /* add the processor just before or just after the main outs */
4578 ProcessorList::iterator meter_point = main;
4580 if (_meter_point == MeterOutput) {
4583 new_processors.insert (meter_point, _meter);
4588 if (_monitor_send && !is_monitor ()) {
4589 assert (!_monitor_send->display_to_user ());
4590 switch (Config->get_listen_position ()) {
4591 case PreFaderListen:
4592 switch (Config->get_pfl_position ()) {
4593 case PFLFromBeforeProcessors:
4594 new_processors.push_front (_monitor_send);
4596 case PFLFromAfterProcessors:
4597 new_processors.insert (amp, _monitor_send);
4600 _monitor_send->set_can_pan (false);
4602 case AfterFaderListen:
4603 switch (Config->get_afl_position ()) {
4604 case AFLFromBeforeProcessors:
4605 new_processors.insert (after_amp, _monitor_send);
4607 case AFLFromAfterProcessors:
4608 new_processors.insert (new_processors.end(), _monitor_send);
4611 _monitor_send->set_can_pan (true);
4616 #if 0 // not used - just yet
4617 if (!is_master() && !is_monitor() && !is_auditioner()) {
4618 new_processors.push_front (_delayline);
4622 /* MONITOR CONTROL */
4624 if (_monitor_control && is_monitor ()) {
4625 assert (!_monitor_control->display_to_user ());
4626 new_processors.push_front (_monitor_control);
4629 /* INTERNAL RETURN */
4631 /* doing this here means that any monitor control will come just after
4636 assert (!_intreturn->display_to_user ());
4637 new_processors.push_front (_intreturn);
4640 if (_trim && _trim->active()) {
4641 assert (!_trim->display_to_user ());
4642 new_processors.push_front (_trim);
4644 /* EXPORT PROCESSOR */
4646 if (_capturing_processor) {
4647 assert (!_capturing_processor->display_to_user ());
4648 new_processors.push_front (_capturing_processor);
4651 _processors = new_processors;
4653 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4654 if (!(*i)->display_to_user () && !(*i)->active () && (*i) != _monitor_send) {
4659 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4660 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4661 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4668 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4669 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4673 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4674 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4681 /** If the meter point is `Custom', make a note of where the meter is.
4682 * This is so that if the meter point is subsequently set to something else,
4683 * and then back to custom, we can put the meter back where it was last time
4684 * custom was enabled.
4686 * Must be called with the _processor_lock held.
4689 Route::maybe_note_meter_position ()
4691 if (_meter_point != MeterCustom) {
4695 _custom_meter_position_noted = true;
4696 /* custom meter points range from after trim to before panner/main_outs
4697 * this is a limitation by the current processor UI
4699 bool seen_trim = false;
4700 _processor_after_last_custom_meter.reset();
4701 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4702 if ((*i) == _trim) {
4705 if ((*i) == _main_outs) {
4706 _processor_after_last_custom_meter = *i;
4709 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4711 _processor_after_last_custom_meter = _trim;
4713 ProcessorList::iterator j = i;
4715 assert(j != _processors.end ()); // main_outs should be before
4716 _processor_after_last_custom_meter = *j;
4721 assert(_processor_after_last_custom_meter.lock());
4724 boost::shared_ptr<Processor>
4725 Route::processor_by_id (PBD::ID id) const
4727 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4728 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4729 if ((*i)->id() == id) {
4734 return boost::shared_ptr<Processor> ();
4737 /** @return the monitoring state, or in other words what data we are pushing
4738 * into the route (data from the inputs, data from disk or silence)
4741 Route::monitoring_state () const
4743 return MonitoringInput;
4746 /** @return what we should be metering; either the data coming from the input
4747 * IO or the data that is flowing through the route.
4750 Route::metering_state () const
4752 return MeteringRoute;
4756 Route::has_external_redirects () const
4758 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4760 /* ignore inactive processors and obviously ignore the main
4761 * outs since everything has them and we don't care.
4764 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4772 boost::shared_ptr<Processor>
4773 Route::the_instrument () const
4775 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4776 return the_instrument_unlocked ();
4779 boost::shared_ptr<Processor>
4780 Route::the_instrument_unlocked () const
4782 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4783 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4784 if ((*i)->input_streams().n_midi() > 0 &&
4785 (*i)->output_streams().n_audio() > 0) {
4790 return boost::shared_ptr<Processor>();
4796 Route::non_realtime_locate (framepos_t pos)
4799 _pannable->transport_located (pos);
4802 if (_delayline.get()) {
4803 _delayline.get()->flush();
4807 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4808 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4810 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4811 (*i)->transport_located (pos);
4814 _roll_delay = _initial_delay;
4818 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4825 * We don't currently mix MIDI input together, so we don't need the
4826 * complex logic of the audio case.
4829 n_buffers = bufs.count().n_midi ();
4831 for (i = 0; i < n_buffers; ++i) {
4833 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4834 MidiBuffer& buf (bufs.get_midi (i));
4837 buf.copy (source_port->get_midi_buffer(nframes));
4839 buf.silence (nframes);
4845 n_buffers = bufs.count().n_audio();
4847 size_t n_ports = io->n_ports().n_audio();
4848 float scaling = 1.0f;
4850 if (n_ports > n_buffers) {
4851 scaling = ((float) n_buffers) / n_ports;
4854 for (i = 0; i < n_ports; ++i) {
4856 /* if there are more ports than buffers, map them onto buffers
4857 * in a round-robin fashion
4860 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4861 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4864 if (i < n_buffers) {
4866 /* first time through just copy a channel into
4870 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4872 if (scaling != 1.0f) {
4873 buf.apply_gain (scaling, nframes);
4878 /* on subsequent times around, merge data from
4879 * the port with what is already there
4882 if (scaling != 1.0f) {
4883 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4885 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4890 /* silence any remaining buffers */
4892 for (; i < n_buffers; ++i) {
4893 AudioBuffer& buf (bufs.get_audio (i));
4894 buf.silence (nframes);
4897 /* establish the initial setup of the buffer set, reflecting what was
4898 copied into it. unless, of course, we are the auditioner, in which
4899 case nothing was fed into it from the inputs at all.
4902 if (!is_auditioner()) {
4903 bufs.set_count (io->n_ports());