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/route.h"
63 #include "ardour/route_group.h"
64 #include "ardour/send.h"
65 #include "ardour/session.h"
66 #include "ardour/unknown_processor.h"
67 #include "ardour/utils.h"
72 using namespace ARDOUR;
75 PBD::Signal0<void> Route::SyncOrderKeys;
76 PBD::Signal0<void> Route::RemoteControlIDChange;
78 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
79 : SessionObject (sess, name)
81 , GraphNode (sess._process_graph)
84 , _signal_latency_at_amp_position (0)
85 , _signal_latency_at_trim_position (0)
89 , _pending_declick (true)
90 , _meter_point (MeterPostFader)
91 , _pending_meter_point (MeterPostFader)
92 , _meter_type (MeterPeak)
94 , _soloed_by_others_upstream (0)
95 , _soloed_by_others_downstream (0)
97 , _denormal_protection (false)
100 , _declickable (false)
101 , _mute_master (new MuteMaster (sess, name))
102 , _have_internal_generator (false)
104 , _default_type (default_type)
106 , _has_order_key (false)
107 , _remote_control_id (0)
109 , _in_configure_processors (false)
110 , _initial_io_setup (false)
111 , _custom_meter_position_noted (false)
112 , _last_custom_meter_was_at_end (false)
115 _meter_type = MeterK20;
117 processor_max_streams.reset();
123 /* add standard controls */
125 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
126 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
128 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
129 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
131 add_control (_solo_control);
132 add_control (_mute_control);
136 if (!(_flags & Route::MonitorOut)) {
137 _pannable.reset (new Pannable (_session));
140 /* input and output objects */
142 _input.reset (new IO (_session, _name, IO::Input, _default_type));
143 _output.reset (new IO (_session, _name, IO::Output, _default_type));
145 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
146 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
148 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
149 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
151 #if 0 // not used - just yet
152 if (!is_master() && !is_monitor() && !is_auditioner()) {
153 _delayline.reset (new DelayLine (_session, _name));
154 add_processor (_delayline, PreFader);
158 /* add amp processor */
160 _amp.reset (new Amp (_session));
161 add_processor (_amp, PostFader);
164 _trim.reset (new Amp (_session, "trim"));
165 _trim->set_display_to_user (false);
167 if (dynamic_cast<AudioTrack*>(this)) {
168 /* we can't do this in the AudioTrack's constructor
169 * because _trim does not exit then
173 else if (!dynamic_cast<Track*>(this) && ! (is_master() || is_monitor() || is_auditioner())) {
178 /* create standard processors: meter, main outs, monitor out;
179 they will be added to _processors by setup_invisible_processors ()
182 _meter.reset (new PeakMeter (_session, _name));
183 _meter->set_owner (this);
184 _meter->set_display_to_user (false);
187 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
188 _main_outs->activate ();
191 /* where we listen to tracks */
192 _intreturn.reset (new InternalReturn (_session));
193 _intreturn->activate ();
195 /* the thing that provides proper control over a control/monitor/listen bus
196 (such as per-channel cut, dim, solo, invert, etc).
198 _monitor_control.reset (new MonitorProcessor (_session));
199 _monitor_control->activate ();
202 if (is_master() || is_monitor() || is_auditioner()) {
203 _mute_master->set_solo_ignore (true);
206 /* now that we have _meter, its safe to connect to this */
208 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
211 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
212 configure_processors (0);
220 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
222 /* do this early so that we don't get incoming signals as we are going through destruction
227 /* don't use clear_processors here, as it depends on the session which may
228 be half-destroyed by now
231 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
232 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
233 (*i)->drop_references ();
236 _processors.clear ();
240 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
242 if (Config->get_remote_model() != UserOrdered) {
246 set_remote_control_id_internal (id, notify_class_listeners);
250 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
252 /* force IDs for master/monitor busses and prevent
253 any other route from accidentally getting these IDs
254 (i.e. legacy sessions)
257 if (is_master() && id != MasterBusRemoteControlID) {
258 id = MasterBusRemoteControlID;
261 if (is_monitor() && id != MonitorBusRemoteControlID) {
262 id = MonitorBusRemoteControlID;
269 /* don't allow it to collide */
271 if (!is_master () && !is_monitor() &&
272 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
273 id += MonitorBusRemoteControlID;
276 if (id != remote_control_id()) {
277 _remote_control_id = id;
278 RemoteControlIDChanged ();
280 if (notify_class_listeners) {
281 RemoteControlIDChange ();
287 Route::remote_control_id() const
290 return MasterBusRemoteControlID;
294 return MonitorBusRemoteControlID;
297 return _remote_control_id;
301 Route::has_order_key () const
303 return _has_order_key;
307 Route::order_key () const
313 Route::set_remote_control_id_explicit (uint32_t rid)
315 if (is_master() || is_monitor() || is_auditioner()) {
316 /* hard-coded remote IDs, or no remote ID */
320 if (_remote_control_id != rid) {
321 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
322 _remote_control_id = rid;
323 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
326 /* don't emit the class-level RID signal RemoteControlIDChange here,
327 leave that to the entity that changed the order key, so that we
328 don't get lots of emissions for no good reasons (e.g. when changing
329 all route order keys).
331 See Session::sync_remote_id_from_order_keys() for the (primary|only)
332 spot where that is emitted.
337 Route::set_order_key (uint32_t n)
339 _has_order_key = true;
341 if (_order_key == n) {
347 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
348 name(), order_key ()));
350 _session.set_dirty ();
354 Route::ensure_track_or_route_name(string name, Session &session)
356 string newname = name;
358 while (!session.io_name_is_legal (newname)) {
359 newname = bump_name_once (newname, '.');
366 Route::inc_gain (gain_t fraction, void *src)
368 _amp->inc_gain (fraction, src);
372 Route::set_gain (gain_t val, void *src)
374 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
376 if (_route_group->is_relative()) {
378 gain_t usable_gain = _amp->gain();
379 if (usable_gain < 0.000001f) {
380 usable_gain = 0.000001f;
384 if (delta < 0.000001f) {
388 delta -= usable_gain;
393 gain_t factor = delta / usable_gain;
396 factor = _route_group->get_max_factor(factor);
397 if (factor == 0.0f) {
398 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
402 factor = _route_group->get_min_factor(factor);
403 if (factor == 0.0f) {
404 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
409 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
413 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
419 if (val == _amp->gain()) {
423 _amp->set_gain (val, src);
427 Route::inc_trim (gain_t fraction, void *src)
429 _trim->inc_gain (fraction, src);
433 Route::set_trim (gain_t val, void * /* src */)
435 // TODO route group, see set_gain()
436 _trim->set_gain (val, 0);
440 Route::maybe_declick (BufferSet&, framecnt_t, int)
442 /* this is the "bus" implementation and they never declick.
447 /** Process this route for one (sub) cycle (process thread)
449 * @param bufs Scratch buffers to use for the signal path
450 * @param start_frame Initial transport frame
451 * @param end_frame Final transport frame
452 * @param nframes Number of frames to output (to ports)
454 * Note that (end_frame - start_frame) may not be equal to nframes when the
455 * transport speed isn't 1.0 (eg varispeed).
458 Route::process_output_buffers (BufferSet& bufs,
459 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
460 int declick, bool gain_automation_ok)
462 /* Caller must hold process lock */
463 assert (!AudioEngine::instance()->process_lock().trylock());
465 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
467 // can this actually happen? functions calling process_output_buffers()
468 // already take a reader-lock.
469 bufs.silence (nframes, 0);
473 /* figure out if we're going to use gain automation */
474 if (gain_automation_ok) {
475 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
476 _amp->setup_gain_automation (
477 start_frame + _signal_latency_at_amp_position,
478 end_frame + _signal_latency_at_amp_position,
481 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
482 _trim->setup_gain_automation (
483 start_frame + _signal_latency_at_trim_position,
484 end_frame + _signal_latency_at_trim_position,
487 _amp->apply_gain_automation (false);
488 _trim->apply_gain_automation (false);
491 /* Tell main outs what to do about monitoring. We do this so that
492 on a transition between monitoring states we get a de-clicking gain
493 change in the _main_outs delivery.
495 bool silence = monitoring_state () == MonitoringSilence;
497 //but we override this in the case where we have an internal generator
498 if ( _have_internal_generator )
501 _main_outs->no_outs_cuz_we_no_monitor (silence);
503 /* -------------------------------------------------------------------------------------------
504 GLOBAL DECLICK (for transport changes etc.)
505 ----------------------------------------------------------------------------------------- */
507 maybe_declick (bufs, nframes, declick);
508 _pending_declick = 0;
510 /* -------------------------------------------------------------------------------------------
511 DENORMAL CONTROL/PHASE INVERT
512 ----------------------------------------------------------------------------------------- */
514 if (_phase_invert.any ()) {
518 if (_denormal_protection || Config->get_denormal_protection()) {
520 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
521 Sample* const sp = i->data();
523 if (_phase_invert[chn]) {
524 for (pframes_t nx = 0; nx < nframes; ++nx) {
529 for (pframes_t nx = 0; nx < nframes; ++nx) {
537 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
538 Sample* const sp = i->data();
540 if (_phase_invert[chn]) {
541 for (pframes_t nx = 0; nx < nframes; ++nx) {
550 if (_denormal_protection || Config->get_denormal_protection()) {
552 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
553 Sample* const sp = i->data();
554 for (pframes_t nx = 0; nx < nframes; ++nx) {
562 /* -------------------------------------------------------------------------------------------
564 ----------------------------------------------------------------------------------------- */
566 /* set this to be true if the meter will already have been ::run() earlier */
567 bool const meter_already_run = metering_state() == MeteringInput;
569 framecnt_t latency = 0;
571 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
573 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
574 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
579 /* if it has any inputs, make sure they match */
580 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
581 if (bufs.count() != (*i)->input_streams()) {
583 DEBUG::Processors, string_compose (
584 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
585 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
592 /* should we NOT run plugins here if the route is inactive?
593 do we catch route != active somewhere higher?
596 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
597 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
600 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
601 bufs.set_count ((*i)->output_streams());
603 if ((*i)->active ()) {
604 latency += (*i)->signal_latency ();
610 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
611 boost::shared_ptr<Processor> endpoint,
612 bool include_endpoint, bool for_export, bool for_freeze)
614 /* If no processing is required, there's no need to go any further. */
615 if (!endpoint && !include_endpoint) {
619 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
620 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
621 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
623 /* trim is always at the top, for bounce no latency compensation is needed */
624 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
625 _trim->setup_gain_automation (start, start + nframes, nframes);
628 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
630 if (!include_endpoint && (*i) == endpoint) {
634 /* if we're not exporting, stop processing if we come across a routing processor. */
635 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
638 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
642 /* don't run any processors that does routing.
643 * oh, and don't bother with the peak meter either.
645 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
646 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
647 buffers.set_count ((*i)->output_streams());
648 latency += (*i)->signal_latency ();
651 if ((*i) == endpoint) {
658 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
659 bool include_endpoint, bool for_export, bool for_freeze) const
661 framecnt_t latency = 0;
662 if (!endpoint && !include_endpoint) {
666 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
667 if (!include_endpoint && (*i) == endpoint) {
670 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
673 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
676 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
677 latency += (*i)->signal_latency ();
679 if ((*i) == endpoint) {
687 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
688 bool include_endpoint, bool for_export, bool for_freeze) const
690 if (!endpoint && !include_endpoint) {
694 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
695 if (!include_endpoint && (*i) == endpoint) {
698 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
701 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
704 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
705 cc = (*i)->output_streams();
707 if ((*i) == endpoint) {
715 Route::n_process_buffers ()
717 return max (_input->n_ports(), processor_max_streams);
721 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
723 assert (is_monitor());
724 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
725 fill_buffers_with_input (bufs, _input, nframes);
726 passthru (bufs, start_frame, end_frame, nframes, declick);
730 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
734 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
736 /* control/monitor bus ignores input ports when something is
737 feeding the listen "stream". data will "arrive" into the
738 route from the intreturn processor element.
741 bufs.silence (nframes, 0);
744 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
745 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
749 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
751 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
753 bufs.set_count (_input->n_ports());
754 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
755 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
759 Route::set_listen (bool yn, void* src)
765 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
766 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
771 if (yn != _monitor_send->active()) {
773 _monitor_send->activate ();
774 _mute_master->set_soloed (true);
776 _monitor_send->deactivate ();
777 _mute_master->set_soloed (false);
780 listen_changed (src); /* EMIT SIGNAL */
786 Route::listening_via_monitor () const
789 return _monitor_send->active ();
796 Route::set_solo_safe (bool yn, void *src)
798 if (_solo_safe != yn) {
800 solo_safe_changed (src);
805 Route::solo_safe() const
811 Route::set_solo (bool yn, void *src)
814 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
818 if (is_master() || is_monitor() || is_auditioner()) {
819 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
823 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
824 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
828 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
829 name(), yn, src, (src == _route_group), self_soloed()));
831 if (self_soloed() != yn) {
833 set_mute_master_solo ();
834 solo_changed (true, src); /* EMIT SIGNAL */
835 _solo_control->Changed (); /* EMIT SIGNAL */
840 Route::set_self_solo (bool yn)
842 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
847 Route::mod_solo_by_others_upstream (int32_t delta)
850 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
854 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
855 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
857 uint32_t old_sbu = _soloed_by_others_upstream;
860 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
861 _soloed_by_others_upstream += delta;
863 _soloed_by_others_upstream = 0;
866 _soloed_by_others_upstream += delta;
869 DEBUG_TRACE (DEBUG::Solo, string_compose (
870 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
871 name(), delta, _soloed_by_others_upstream, old_sbu,
872 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
874 /* push the inverse solo change to everything that feeds us.
876 This is important for solo-within-group. When we solo 1 track out of N that
877 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
878 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
879 tracks that feed it. This will silence them if they were audible because
880 of a bus solo, but the newly soloed track will still be audible (because
883 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
887 if ((_self_solo || _soloed_by_others_downstream) &&
888 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
889 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
891 if (delta > 0 || !Config->get_exclusive_solo()) {
892 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
893 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
894 boost::shared_ptr<Route> sr = i->r.lock();
896 sr->mod_solo_by_others_downstream (-delta);
902 set_mute_master_solo ();
903 solo_changed (false, this);
907 Route::mod_solo_by_others_downstream (int32_t delta)
910 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
914 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
915 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
918 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
919 _soloed_by_others_downstream += delta;
921 _soloed_by_others_downstream = 0;
924 _soloed_by_others_downstream += delta;
927 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
929 set_mute_master_solo ();
930 solo_changed (false, this);
934 Route::set_mute_master_solo ()
936 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
940 Route::set_solo_isolated (bool yn, void *src)
942 if (is_master() || is_monitor() || is_auditioner()) {
946 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
947 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
951 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
953 boost::shared_ptr<RouteList> routes = _session.get_routes ();
954 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
956 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
961 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
963 if (does_feed && !sends_only) {
964 (*i)->set_solo_isolated (yn, (*i)->route_group());
968 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
970 bool changed = false;
973 if (_solo_isolated == 0) {
974 _mute_master->set_solo_ignore (true);
979 if (_solo_isolated > 0) {
981 if (_solo_isolated == 0) {
982 _mute_master->set_solo_ignore (false);
989 solo_isolated_changed (src);
994 Route::solo_isolated () const
996 return _solo_isolated > 0;
1000 Route::set_mute_points (MuteMaster::MutePoint mp)
1002 _mute_master->set_mute_points (mp);
1003 mute_points_changed (); /* EMIT SIGNAL */
1005 if (_mute_master->muted_by_self()) {
1006 mute_changed (this); /* EMIT SIGNAL */
1007 _mute_control->Changed (); /* EMIT SIGNAL */
1012 Route::set_mute (bool yn, void *src)
1014 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1015 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1019 if (muted() != yn) {
1020 _mute_master->set_muted_by_self (yn);
1021 /* allow any derived classes to respond to the mute change
1022 before anybody else knows about it.
1025 /* tell everyone else */
1026 mute_changed (src); /* EMIT SIGNAL */
1027 _mute_control->Changed (); /* EMIT SIGNAL */
1032 Route::muted () const
1034 return _mute_master->muted_by_self();
1039 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1041 cerr << name << " {" << endl;
1042 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1043 p != procs.end(); ++p) {
1044 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1046 cerr << "}" << endl;
1050 /** Supposing that we want to insert a Processor at a given Placement, return
1051 * the processor to add the new one before (or 0 to add at the end).
1053 boost::shared_ptr<Processor>
1054 Route::before_processor_for_placement (Placement p)
1056 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1058 ProcessorList::iterator loc;
1060 if (p == PreFader) {
1061 /* generic pre-fader: insert immediately before the amp */
1062 loc = find (_processors.begin(), _processors.end(), _amp);
1064 /* generic post-fader: insert right before the main outs */
1065 loc = find (_processors.begin(), _processors.end(), _main_outs);
1068 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1071 /** Supposing that we want to insert a Processor at a given index, return
1072 * the processor to add the new one before (or 0 to add at the end).
1074 boost::shared_ptr<Processor>
1075 Route::before_processor_for_index (int index)
1078 return boost::shared_ptr<Processor> ();
1081 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1083 ProcessorList::iterator i = _processors.begin ();
1085 while (i != _processors.end() && j < index) {
1086 if ((*i)->display_to_user()) {
1093 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1096 /** Add a processor either pre- or post-fader
1097 * @return 0 on success, non-0 on failure.
1100 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1102 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1106 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1107 * @param index Index to add the processor at, or -1 to add at the end of the list.
1108 * @return 0 on success, non-0 on failure.
1111 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1113 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1116 /** Add a processor to the route.
1117 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1118 * @return 0 on success, non-0 on failure.
1121 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1123 assert (processor != _meter);
1124 assert (processor != _main_outs);
1126 DEBUG_TRACE (DEBUG::Processors, string_compose (
1127 "%1 adding processor %2\n", name(), processor->name()));
1129 if (!AudioEngine::instance()->connected() || !processor) {
1134 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1135 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1136 ProcessorState pstate (this);
1138 boost::shared_ptr<PluginInsert> pi;
1139 boost::shared_ptr<PortInsert> porti;
1141 if (processor == _amp) {
1142 /* Ensure that only one amp is in the list at any time */
1143 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1144 if (check != _processors.end()) {
1145 if (before == _amp) {
1146 /* Already in position; all is well */
1149 _processors.erase (check);
1154 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1156 ProcessorList::iterator loc;
1158 /* inserting before a processor; find it */
1159 loc = find (_processors.begin(), _processors.end(), before);
1160 if (loc == _processors.end ()) {
1165 /* inserting at end */
1166 loc = _processors.end ();
1169 _processors.insert (loc, processor);
1170 processor->set_owner (this);
1172 // Set up processor list channels. This will set processor->[input|output]_streams(),
1173 // configure redirect ports properly, etc.
1176 if (configure_processors_unlocked (err)) {
1178 configure_processors_unlocked (0); // it worked before we tried to add it ...
1183 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1185 if (pi->has_no_inputs ()) {
1186 /* generator plugin */
1187 _have_internal_generator = true;
1192 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1193 processor->activate ();
1196 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1198 _output->set_user_latency (0);
1201 reset_instrument_info ();
1202 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1203 set_processor_positions ();
1209 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1211 const XMLProperty *prop;
1214 boost::shared_ptr<Processor> processor;
1216 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1217 so that we can add the processor in the right place (pre/post-fader)
1220 XMLNodeList const & children = node.children ();
1221 XMLNodeList::const_iterator i = children.begin ();
1223 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1227 Placement placement = PreFader;
1229 if (i != children.end()) {
1230 if ((prop = (*i)->property (X_("placement"))) != 0) {
1231 placement = Placement (string_2_enum (prop->value(), placement));
1235 if (node.name() == "Insert") {
1237 if ((prop = node.property ("type")) != 0) {
1239 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1240 prop->value() == "lv2" ||
1241 prop->value() == "windows-vst" ||
1242 prop->value() == "lxvst" ||
1243 prop->value() == "audiounit") {
1245 processor.reset (new PluginInsert (_session));
1249 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1254 } else if (node.name() == "Send") {
1256 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1257 processor.reset (new Send (_session, sendpan, _mute_master));
1261 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1265 if (processor->set_state (node, version)) {
1269 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1270 if (i != children.end()) {
1271 if ((prop = (*i)->property (X_("active"))) != 0) {
1272 if ( string_is_affirmative (prop->value()) && !_session.get_disable_all_loaded_plugins() )
1273 processor->activate();
1275 processor->deactivate();
1279 return (add_processor (processor, placement, 0, false) == 0);
1282 catch (failed_constructor &err) {
1283 warning << _("processor could not be created. Ignored.") << endmsg;
1289 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1291 /* NOTE: this is intended to be used ONLY when copying
1292 processors from another Route. Hence the subtle
1293 differences between this and ::add_processor()
1296 ProcessorList::iterator loc;
1299 loc = find(_processors.begin(), _processors.end(), before);
1301 /* nothing specified - at end */
1302 loc = _processors.end ();
1305 if (!_session.engine().connected()) {
1309 if (others.empty()) {
1314 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1315 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1316 ProcessorState pstate (this);
1318 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1324 boost::shared_ptr<PluginInsert> pi;
1326 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1330 _processors.insert (loc, *i);
1331 (*i)->set_owner (this);
1333 if ((*i)->active()) {
1337 /* Think: does this really need to be called for every processor in the loop? */
1339 if (configure_processors_unlocked (err)) {
1341 configure_processors_unlocked (0); // it worked before we tried to add it ...
1346 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1349 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1350 boost::shared_ptr<PluginInsert> pi;
1352 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1353 if (pi->has_no_inputs ()) {
1354 _have_internal_generator = true;
1360 _output->set_user_latency (0);
1363 reset_instrument_info ();
1364 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1365 set_processor_positions ();
1371 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1373 if (p == PreFader) {
1374 start = _processors.begin();
1375 end = find(_processors.begin(), _processors.end(), _amp);
1377 start = find(_processors.begin(), _processors.end(), _amp);
1379 end = _processors.end();
1383 /** Turn off all processors with a given placement
1384 * @param p Placement of processors to disable
1387 Route::disable_processors (Placement p)
1389 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1391 ProcessorList::iterator start, end;
1392 placement_range(p, start, end);
1394 for (ProcessorList::iterator i = start; i != end; ++i) {
1395 (*i)->deactivate ();
1398 _session.set_dirty ();
1401 /** Turn off all redirects
1404 Route::disable_processors ()
1406 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1408 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1409 (*i)->deactivate ();
1412 _session.set_dirty ();
1415 /** Turn off all redirects with a given placement
1416 * @param p Placement of redirects to disable
1419 Route::disable_plugins (Placement p)
1421 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1423 ProcessorList::iterator start, end;
1424 placement_range(p, start, end);
1426 for (ProcessorList::iterator i = start; i != end; ++i) {
1427 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1428 (*i)->deactivate ();
1432 _session.set_dirty ();
1435 /** Turn off all plugins
1438 Route::disable_plugins ()
1440 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1442 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1443 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1444 (*i)->deactivate ();
1448 _session.set_dirty ();
1453 Route::ab_plugins (bool forward)
1455 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1459 /* forward = turn off all active redirects, and mark them so that the next time
1460 we go the other way, we will revert them
1463 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1464 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1468 if ((*i)->active()) {
1469 (*i)->deactivate ();
1470 (*i)->set_next_ab_is_active (true);
1472 (*i)->set_next_ab_is_active (false);
1478 /* backward = if the redirect was marked to go active on the next ab, do so */
1480 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1482 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1486 if ((*i)->get_next_ab_is_active()) {
1489 (*i)->deactivate ();
1494 _session.set_dirty ();
1498 /** Remove processors with a given placement.
1499 * @param p Placement of processors to remove.
1502 Route::clear_processors (Placement p)
1504 if (!_session.engine().connected()) {
1508 bool already_deleting = _session.deletion_in_progress();
1509 if (!already_deleting) {
1510 _session.set_deletion_in_progress();
1514 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1515 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1516 ProcessorList new_list;
1517 ProcessorStreams err;
1518 bool seen_amp = false;
1520 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1526 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1528 /* you can't remove these */
1530 new_list.push_back (*i);
1537 new_list.push_back (*i);
1540 (*i)->drop_references ();
1548 (*i)->drop_references ();
1551 new_list.push_back (*i);
1558 _processors = new_list;
1559 configure_processors_unlocked (&err); // this can't fail
1562 processor_max_streams.reset();
1563 _have_internal_generator = false;
1564 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1565 set_processor_positions ();
1567 reset_instrument_info ();
1569 if (!already_deleting) {
1570 _session.clear_deletion_in_progress();
1575 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1577 // TODO once the export point can be configured properly, do something smarter here
1578 if (processor == _capturing_processor) {
1579 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1580 if (need_process_lock) {
1584 _capturing_processor.reset();
1586 if (need_process_lock) {
1591 /* these can never be removed */
1593 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1597 if (!_session.engine().connected()) {
1601 processor_max_streams.reset();
1604 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1605 if (need_process_lock) {
1609 /* Caller must hold process lock */
1610 assert (!AudioEngine::instance()->process_lock().trylock());
1612 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1614 ProcessorState pstate (this);
1616 ProcessorList::iterator i;
1617 bool removed = false;
1619 for (i = _processors.begin(); i != _processors.end(); ) {
1620 if (*i == processor) {
1622 /* move along, see failure case for configure_processors()
1623 where we may need to reconfigure the processor.
1626 /* stop redirects that send signals to JACK ports
1627 from causing noise as a result of no longer being
1631 boost::shared_ptr<IOProcessor> iop;
1633 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1637 i = _processors.erase (i);
1645 _output->set_user_latency (0);
1653 if (configure_processors_unlocked (err)) {
1655 /* we know this will work, because it worked before :) */
1656 configure_processors_unlocked (0);
1660 _have_internal_generator = false;
1662 for (i = _processors.begin(); i != _processors.end(); ++i) {
1663 boost::shared_ptr<PluginInsert> pi;
1665 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1666 if (pi->has_no_inputs ()) {
1667 _have_internal_generator = true;
1672 if (need_process_lock) {
1677 reset_instrument_info ();
1678 processor->drop_references ();
1679 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1680 set_processor_positions ();
1686 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1688 ProcessorList deleted;
1690 if (!_session.engine().connected()) {
1694 processor_max_streams.reset();
1697 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1698 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1699 ProcessorState pstate (this);
1701 ProcessorList::iterator i;
1702 boost::shared_ptr<Processor> processor;
1704 for (i = _processors.begin(); i != _processors.end(); ) {
1708 /* these can never be removed */
1710 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1715 /* see if its in the list of processors to delete */
1717 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1722 /* stop IOProcessors that send to JACK ports
1723 from causing noise as a result of no longer being
1727 boost::shared_ptr<IOProcessor> iop;
1729 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1733 deleted.push_back (processor);
1734 i = _processors.erase (i);
1737 if (deleted.empty()) {
1738 /* none of those in the requested list were found */
1742 _output->set_user_latency (0);
1744 if (configure_processors_unlocked (err)) {
1746 /* we know this will work, because it worked before :) */
1747 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;
1766 /* now try to do what we need to so that those that were removed will be deleted */
1768 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1769 (*i)->drop_references ();
1772 reset_instrument_info ();
1773 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1774 set_processor_positions ();
1780 Route::reset_instrument_info ()
1782 boost::shared_ptr<Processor> instr = the_instrument();
1784 _instrument_info.set_internal_instrument (instr);
1788 /** Caller must hold process lock */
1790 Route::configure_processors (ProcessorStreams* err)
1792 #ifndef PLATFORM_WINDOWS
1793 assert (!AudioEngine::instance()->process_lock().trylock());
1796 if (!_in_configure_processors) {
1797 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1798 return configure_processors_unlocked (err);
1805 Route::input_streams () const
1807 return _input->n_ports ();
1810 list<pair<ChanCount, ChanCount> >
1811 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1813 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1815 return try_configure_processors_unlocked (in, err);
1818 list<pair<ChanCount, ChanCount> >
1819 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1821 // Check each processor in order to see if we can configure as requested
1823 list<pair<ChanCount, ChanCount> > configuration;
1826 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1827 DEBUG_TRACE (DEBUG::Processors, "{\n");
1829 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1831 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1832 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1833 DEBUG_TRACE (DEBUG::Processors, "}\n");
1834 return list<pair<ChanCount, ChanCount> > ();
1837 if ((*p)->can_support_io_configuration(in, out)) {
1838 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1839 configuration.push_back(make_pair(in, out));
1846 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1847 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1848 DEBUG_TRACE (DEBUG::Processors, "}\n");
1849 return list<pair<ChanCount, ChanCount> > ();
1853 DEBUG_TRACE (DEBUG::Processors, "}\n");
1855 return configuration;
1858 /** Set the input/output configuration of each processor in the processors list.
1859 * Caller must hold process lock.
1860 * Return 0 on success, otherwise configuration is impossible.
1863 Route::configure_processors_unlocked (ProcessorStreams* err)
1865 #ifndef PLATFORM_WINDOWS
1866 assert (!AudioEngine::instance()->process_lock().trylock());
1869 if (_in_configure_processors) {
1873 /* put invisible processors where they should be */
1874 setup_invisible_processors ();
1876 _in_configure_processors = true;
1878 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1880 if (configuration.empty ()) {
1881 _in_configure_processors = false;
1886 bool seen_mains_out = false;
1887 processor_out_streams = _input->n_ports();
1888 processor_max_streams.reset();
1890 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1891 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1893 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1897 (*p)->configure_io(c->first, c->second);
1898 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1899 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1902 if (boost::dynamic_pointer_cast<Delivery> (*p)
1903 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1904 /* main delivery will increase port count to match input.
1905 * the Delivery::Main is usually the last processor - followed only by
1908 seen_mains_out = true;
1910 if (!seen_mains_out) {
1911 processor_out_streams = out;
1917 _meter->reset_max_channels (processor_max_streams);
1920 /* make sure we have sufficient scratch buffers to cope with the new processor
1923 _session.ensure_buffers (n_process_buffers ());
1925 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1927 _in_configure_processors = false;
1931 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1932 * @param state New active state for those processors.
1935 Route::all_visible_processors_active (bool state)
1937 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1939 if (_processors.empty()) {
1943 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1944 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1951 (*i)->deactivate ();
1955 _session.set_dirty ();
1959 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
1961 /* check if re-order requires re-configuration of any processors
1962 * -> compare channel configuration for all processors
1964 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1965 ChanCount c = input_streams ();
1967 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
1969 if (c != (*j)->input_streams()) {
1972 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1975 if ((*i)->input_streams() != c) {
1978 c = (*i)->output_streams();
1990 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1993 if (processors_reorder_needs_configure (new_order)) {
1994 printf("REORDER NEEDS CONFIGURE\n");
1995 // tough luck, use existing code belog
1997 printf("COULD DO IT CLICKLESS\n");
1998 /* TODO: take a reader-lock, prepare the new order when done
1999 * atomically set it as pending state..
2000 * and do the _processors.insert() in the RT-thread
2001 * configure_processors_unlocked() is NOT needed,
2002 * only setup_invisible_processors() needs to be called.
2004 * see also apply_meter_change_rt()
2009 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2010 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2011 processors in the current actual processor list that are hidden. Any visible processors
2012 in the current list but not in "new_order" will be assumed to be deleted.
2016 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2017 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2018 ProcessorState pstate (this);
2020 ProcessorList::iterator oiter;
2021 ProcessorList::const_iterator niter;
2022 ProcessorList as_it_will_be;
2024 oiter = _processors.begin();
2025 niter = new_order.begin();
2027 while (niter != new_order.end()) {
2029 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2030 then append it to the temp list.
2032 Otherwise, see if the next processor in the old list is in the new list. if not,
2033 its been deleted. If its there, append it to the temp list.
2036 if (oiter == _processors.end()) {
2038 /* no more elements in the old list, so just stick the rest of
2039 the new order onto the temp list.
2042 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2043 while (niter != new_order.end()) {
2050 if (!(*oiter)->display_to_user()) {
2052 as_it_will_be.push_back (*oiter);
2056 /* visible processor: check that its in the new order */
2058 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2059 /* deleted: do nothing, shared_ptr<> will clean up */
2061 /* ignore this one, and add the next item from the new order instead */
2062 as_it_will_be.push_back (*niter);
2067 /* now remove from old order - its taken care of no matter what */
2068 oiter = _processors.erase (oiter);
2073 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2075 /* If the meter is in a custom position, find it and make a rough note of its position */
2076 maybe_note_meter_position ();
2078 if (configure_processors_unlocked (err)) {
2084 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2085 set_processor_positions ();
2097 Route::get_template()
2099 return state(false);
2103 Route::state(bool full_state)
2105 XMLNode *node = new XMLNode("Route");
2106 ProcessorList::iterator i;
2109 id().print (buf, sizeof (buf));
2110 node->add_property("id", buf);
2111 node->add_property ("name", _name);
2112 node->add_property("default-type", _default_type.to_string());
2115 node->add_property("flags", enum_2_string (_flags));
2118 node->add_property("active", _active?"yes":"no");
2120 boost::to_string (_phase_invert, p);
2121 node->add_property("phase-invert", p);
2122 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2123 node->add_property("meter-point", enum_2_string (_meter_point));
2125 node->add_property("meter-type", enum_2_string (_meter_type));
2128 node->add_property("route-group", _route_group->name());
2131 snprintf (buf, sizeof (buf), "%d", _order_key);
2132 node->add_property ("order-key", buf);
2133 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2134 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2135 node->add_property ("soloed-by-upstream", buf);
2136 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2137 node->add_property ("soloed-by-downstream", buf);
2138 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2139 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2141 node->add_child_nocopy (_input->state (full_state));
2142 node->add_child_nocopy (_output->state (full_state));
2143 node->add_child_nocopy (_solo_control->get_state ());
2144 node->add_child_nocopy (_mute_control->get_state ());
2145 node->add_child_nocopy (_mute_master->get_state ());
2148 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2151 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2152 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2153 remote_control_node->add_property (X_("id"), buf);
2154 node->add_child_nocopy (*remote_control_node);
2156 if (_comment.length()) {
2157 XMLNode *cmt = node->add_child ("Comment");
2158 cmt->add_content (_comment);
2162 node->add_child_nocopy (_pannable->state (full_state));
2165 for (i = _processors.begin(); i != _processors.end(); ++i) {
2167 /* template save: do not include internal sends functioning as
2168 aux sends because the chance of the target ID
2169 in the session where this template is used
2172 similarly, do not save listen sends which connect to
2173 the monitor section, because these will always be
2176 boost::shared_ptr<InternalSend> is;
2178 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2179 if (is->role() == Delivery::Listen) {
2184 node->add_child_nocopy((*i)->state (full_state));
2188 node->add_child_copy (*_extra_xml);
2191 if (_custom_meter_position_noted) {
2192 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2194 after->id().print (buf, sizeof (buf));
2195 node->add_property (X_("processor-after-last-custom-meter"), buf);
2198 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
2205 Route::set_state (const XMLNode& node, int version)
2207 if (version < 3000) {
2208 return set_state_2X (node, version);
2212 XMLNodeConstIterator niter;
2214 const XMLProperty *prop;
2216 if (node.name() != "Route"){
2217 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2221 if ((prop = node.property (X_("name"))) != 0) {
2222 Route::set_name (prop->value());
2226 _initial_io_setup = true;
2228 if ((prop = node.property (X_("flags"))) != 0) {
2229 _flags = Flag (string_2_enum (prop->value(), _flags));
2234 if (is_master() || is_monitor() || is_auditioner()) {
2235 _mute_master->set_solo_ignore (true);
2239 /* monitor bus does not get a panner, but if (re)created
2240 via XML, it will already have one by the time we
2241 call ::set_state(). so ... remove it.
2246 /* add all processors (except amp, which is always present) */
2248 nlist = node.children();
2249 XMLNode processor_state (X_("processor_state"));
2251 Stateful::save_extra_xml (node);
2253 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2257 if (child->name() == IO::state_node_name) {
2258 if ((prop = child->property (X_("direction"))) == 0) {
2262 if (prop->value() == "Input") {
2263 _input->set_state (*child, version);
2264 } else if (prop->value() == "Output") {
2265 _output->set_state (*child, version);
2269 if (child->name() == X_("Processor")) {
2270 processor_state.add_child_copy (*child);
2273 if (child->name() == X_("Pannable")) {
2275 _pannable->set_state (*child, version);
2277 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2282 if ((prop = node.property (X_("meter-point"))) != 0) {
2283 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2284 set_meter_point (mp, true);
2286 _meter->set_display_to_user (_meter_point == MeterCustom);
2290 if ((prop = node.property (X_("meter-type"))) != 0) {
2291 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2294 _initial_io_setup = false;
2296 set_processor_state (processor_state);
2298 // this looks up the internal instrument in processors
2299 reset_instrument_info();
2301 if ((prop = node.property ("self-solo")) != 0) {
2302 set_self_solo (string_is_affirmative (prop->value()));
2305 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2306 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2307 mod_solo_by_others_upstream (atoi (prop->value()));
2310 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2311 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2312 mod_solo_by_others_downstream (atoi (prop->value()));
2315 if ((prop = node.property ("solo-isolated")) != 0) {
2316 set_solo_isolated (string_is_affirmative (prop->value()), this);
2319 if ((prop = node.property ("solo-safe")) != 0) {
2320 set_solo_safe (string_is_affirmative (prop->value()), this);
2323 if ((prop = node.property (X_("phase-invert"))) != 0) {
2324 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2327 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2328 set_denormal_protection (string_is_affirmative (prop->value()));
2331 if ((prop = node.property (X_("active"))) != 0) {
2332 bool yn = string_is_affirmative (prop->value());
2333 _active = !yn; // force switch
2334 set_active (yn, this);
2337 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2338 set_order_key (atoi(prop->value()));
2341 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2345 string::size_type colon, equal;
2346 string remaining = prop->value();
2348 while (remaining.length()) {
2350 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2351 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2354 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2355 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2358 string keyname = remaining.substr (0, equal);
2360 if ((keyname == "EditorSort") || (keyname == "editor")) {
2361 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2367 colon = remaining.find_first_of (':');
2369 if (colon != string::npos) {
2370 remaining = remaining.substr (colon+1);
2377 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2378 PBD::ID id (prop->value ());
2379 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2380 ProcessorList::const_iterator i = _processors.begin ();
2381 while (i != _processors.end() && (*i)->id() != id) {
2385 if (i != _processors.end ()) {
2386 _processor_after_last_custom_meter = *i;
2387 _custom_meter_position_noted = true;
2391 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2392 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2395 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2398 if (child->name() == X_("Comment")) {
2400 /* XXX this is a terrible API design in libxml++ */
2402 XMLNode *cmt = *(child->children().begin());
2403 _comment = cmt->content();
2405 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2406 if (prop->value() == "solo") {
2407 _solo_control->set_state (*child, version);
2408 } else if (prop->value() == "mute") {
2409 _mute_control->set_state (*child, version);
2412 } else if (child->name() == X_("RemoteControl")) {
2413 if ((prop = child->property (X_("id"))) != 0) {
2415 sscanf (prop->value().c_str(), "%d", &x);
2416 set_remote_control_id_internal (x);
2419 } else if (child->name() == X_("MuteMaster")) {
2420 _mute_master->set_state (*child, version);
2422 } else if (child->name() == Automatable::xml_node_name) {
2423 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2431 Route::set_state_2X (const XMLNode& node, int version)
2433 LocaleGuard lg (X_("C"));
2435 XMLNodeConstIterator niter;
2437 const XMLProperty *prop;
2439 /* 2X things which still remain to be handled:
2445 if (node.name() != "Route") {
2446 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2450 if ((prop = node.property (X_("flags"))) != 0) {
2451 string f = prop->value ();
2452 boost::replace_all (f, "ControlOut", "MonitorOut");
2453 _flags = Flag (string_2_enum (f, _flags));
2458 if (is_master() || is_monitor() || is_auditioner()) {
2459 _mute_master->set_solo_ignore (true);
2462 if ((prop = node.property (X_("phase-invert"))) != 0) {
2463 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2464 if (string_is_affirmative (prop->value ())) {
2467 set_phase_invert (p);
2470 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2471 set_denormal_protection (string_is_affirmative (prop->value()));
2474 if ((prop = node.property (X_("soloed"))) != 0) {
2475 bool yn = string_is_affirmative (prop->value());
2477 /* XXX force reset of solo status */
2479 set_solo (yn, this);
2482 if ((prop = node.property (X_("muted"))) != 0) {
2485 bool muted = string_is_affirmative (prop->value());
2491 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2493 if (string_is_affirmative (prop->value())){
2494 mute_point = mute_point + "PreFader";
2499 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2501 if (string_is_affirmative (prop->value())){
2504 mute_point = mute_point + ",";
2507 mute_point = mute_point + "PostFader";
2512 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2514 if (string_is_affirmative (prop->value())){
2517 mute_point = mute_point + ",";
2520 mute_point = mute_point + "Listen";
2525 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2527 if (string_is_affirmative (prop->value())){
2530 mute_point = mute_point + ",";
2533 mute_point = mute_point + "Main";
2537 _mute_master->set_mute_points (mute_point);
2538 _mute_master->set_muted_by_self (true);
2542 if ((prop = node.property (X_("meter-point"))) != 0) {
2543 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2546 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2547 don't mean the same thing.
2550 if ((prop = node.property (X_("order-keys"))) != 0) {
2554 string::size_type colon, equal;
2555 string remaining = prop->value();
2557 while (remaining.length()) {
2559 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2560 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2563 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2564 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2567 string keyname = remaining.substr (0, equal);
2569 if (keyname == "EditorSort" || keyname == "editor") {
2570 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2576 colon = remaining.find_first_of (':');
2578 if (colon != string::npos) {
2579 remaining = remaining.substr (colon+1);
2588 nlist = node.children ();
2589 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2593 if (child->name() == IO::state_node_name) {
2595 /* there is a note in IO::set_state_2X() about why we have to call
2599 _input->set_state_2X (*child, version, true);
2600 _output->set_state_2X (*child, version, false);
2602 if ((prop = child->property (X_("name"))) != 0) {
2603 Route::set_name (prop->value ());
2608 if ((prop = child->property (X_("active"))) != 0) {
2609 bool yn = string_is_affirmative (prop->value());
2610 _active = !yn; // force switch
2611 set_active (yn, this);
2614 if ((prop = child->property (X_("gain"))) != 0) {
2617 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2618 _amp->gain_control()->set_value (val);
2622 /* Set up Panners in the IO */
2623 XMLNodeList io_nlist = child->children ();
2625 XMLNodeConstIterator io_niter;
2628 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2630 io_child = *io_niter;
2632 if (io_child->name() == X_("Panner")) {
2633 _main_outs->panner_shell()->set_state(*io_child, version);
2634 } else if (io_child->name() == X_("Automation")) {
2635 /* IO's automation is for the fader */
2636 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2642 XMLNodeList redirect_nodes;
2644 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2648 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2649 redirect_nodes.push_back(child);
2654 set_processor_state_2X (redirect_nodes, version);
2656 Stateful::save_extra_xml (node);
2658 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2661 if (child->name() == X_("Comment")) {
2663 /* XXX this is a terrible API design in libxml++ */
2665 XMLNode *cmt = *(child->children().begin());
2666 _comment = cmt->content();
2668 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2669 if (prop->value() == X_("solo")) {
2670 _solo_control->set_state (*child, version);
2671 } else if (prop->value() == X_("mute")) {
2672 _mute_control->set_state (*child, version);
2675 } else if (child->name() == X_("RemoteControl")) {
2676 if ((prop = child->property (X_("id"))) != 0) {
2678 sscanf (prop->value().c_str(), "%d", &x);
2679 set_remote_control_id_internal (x);
2689 Route::get_processor_state ()
2691 XMLNode* root = new XMLNode (X_("redirects"));
2692 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2693 root->add_child_nocopy ((*i)->state (true));
2700 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2702 /* We don't bother removing existing processors not in nList, as this
2703 method will only be called when creating a Route from scratch, not
2704 for undo purposes. Just put processors in at the appropriate place
2708 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2709 add_processor_from_xml_2X (**i, version);
2714 Route::set_processor_state (const XMLNode& node)
2716 const XMLNodeList &nlist = node.children();
2717 XMLNodeConstIterator niter;
2718 ProcessorList new_order;
2719 bool must_configure = false;
2721 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2723 XMLProperty* prop = (*niter)->property ("type");
2725 if (prop->value() == "amp") {
2726 _amp->set_state (**niter, Stateful::current_state_version);
2727 new_order.push_back (_amp);
2728 } else if (prop->value() == "trim") {
2729 _trim->set_state (**niter, Stateful::current_state_version);
2730 new_order.push_back (_trim);
2731 } else if (prop->value() == "meter") {
2732 _meter->set_state (**niter, Stateful::current_state_version);
2733 new_order.push_back (_meter);
2734 } else if (prop->value() == "delay") {
2736 _delayline->set_state (**niter, Stateful::current_state_version);
2737 new_order.push_back (_delayline);
2739 } else if (prop->value() == "main-outs") {
2740 _main_outs->set_state (**niter, Stateful::current_state_version);
2741 } else if (prop->value() == "intreturn") {
2743 _intreturn.reset (new InternalReturn (_session));
2744 must_configure = true;
2746 _intreturn->set_state (**niter, Stateful::current_state_version);
2747 } else if (is_monitor() && prop->value() == "monitor") {
2748 if (!_monitor_control) {
2749 _monitor_control.reset (new MonitorProcessor (_session));
2750 must_configure = true;
2752 _monitor_control->set_state (**niter, Stateful::current_state_version);
2753 } else if (prop->value() == "capture") {
2754 /* CapturingProcessor should never be restored, it's always
2755 added explicitly when needed */
2757 ProcessorList::iterator o;
2759 for (o = _processors.begin(); o != _processors.end(); ++o) {
2760 XMLProperty* id_prop = (*niter)->property(X_("id"));
2761 if (id_prop && (*o)->id() == id_prop->value()) {
2762 (*o)->set_state (**niter, Stateful::current_state_version);
2763 new_order.push_back (*o);
2768 // If the processor (*niter) is not on the route then create it
2770 if (o == _processors.end()) {
2772 boost::shared_ptr<Processor> processor;
2774 if (prop->value() == "intsend") {
2776 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2778 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2779 prop->value() == "lv2" ||
2780 prop->value() == "windows-vst" ||
2781 prop->value() == "lxvst" ||
2782 prop->value() == "audiounit") {
2784 processor.reset (new PluginInsert(_session));
2786 } else if (prop->value() == "port") {
2788 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2790 } else if (prop->value() == "send") {
2792 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2795 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2799 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2800 /* This processor could not be configured. Turn it into a UnknownProcessor */
2801 processor.reset (new UnknownProcessor (_session, **niter));
2804 /* we have to note the monitor send here, otherwise a new one will be created
2805 and the state of this one will be lost.
2807 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2808 if (isend && isend->role() == Delivery::Listen) {
2809 _monitor_send = isend;
2812 /* it doesn't matter if invisible processors are added here, as they
2813 will be sorted out by setup_invisible_processors () shortly.
2816 new_order.push_back (processor);
2817 must_configure = true;
2823 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2824 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2825 _processors = new_order;
2827 if (must_configure) {
2828 configure_processors_unlocked (0);
2831 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2833 (*i)->set_owner (this);
2834 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2836 boost::shared_ptr<PluginInsert> pi;
2838 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2839 if (pi->has_no_inputs ()) {
2840 _have_internal_generator = true;
2847 reset_instrument_info ();
2848 processors_changed (RouteProcessorChange ());
2849 set_processor_positions ();
2853 Route::curve_reallocate ()
2855 // _gain_automation_curve.finish_resize ();
2856 // _pan_automation_curve.finish_resize ();
2860 Route::silence (framecnt_t nframes)
2862 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2867 silence_unlocked (nframes);
2871 Route::silence_unlocked (framecnt_t nframes)
2873 /* Must be called with the processor lock held */
2877 _output->silence (nframes);
2879 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2880 boost::shared_ptr<PluginInsert> pi;
2882 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2883 // skip plugins, they don't need anything when we're not active
2887 (*i)->silence (nframes);
2890 if (nframes == _session.get_block_size()) {
2897 Route::add_internal_return ()
2900 _intreturn.reset (new InternalReturn (_session));
2901 add_processor (_intreturn, PreFader);
2906 Route::add_send_to_internal_return (InternalSend* send)
2908 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2910 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2911 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2914 return d->add_send (send);
2920 Route::remove_send_from_internal_return (InternalSend* send)
2922 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2924 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2925 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2928 return d->remove_send (send);
2934 Route::enable_monitor_send ()
2936 /* Caller must hold process lock */
2937 assert (!AudioEngine::instance()->process_lock().trylock());
2939 /* master never sends to monitor section via the normal mechanism */
2940 assert (!is_master ());
2941 assert (!is_monitor ());
2943 /* make sure we have one */
2944 if (!_monitor_send) {
2945 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
2946 _monitor_send->set_display_to_user (false);
2950 configure_processors (0);
2953 /** Add an aux send to a route.
2954 * @param route route to send to.
2955 * @param before Processor to insert before, or 0 to insert at the end.
2958 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2960 assert (route != _session.monitor_out ());
2963 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2965 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2967 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2969 if (d && d->target_route() == route) {
2970 /* already listening via the specified IO: do nothing */
2978 boost::shared_ptr<InternalSend> listener;
2981 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2982 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
2983 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
2986 add_processor (listener, before);
2988 } catch (failed_constructor& err) {
2996 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2998 ProcessorStreams err;
2999 ProcessorList::iterator tmp;
3002 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3004 /* have to do this early because otherwise processor reconfig
3005 * will put _monitor_send back in the list
3008 if (route == _session.monitor_out()) {
3009 _monitor_send.reset ();
3013 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3015 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3017 if (d && d->target_route() == route) {
3019 remove_processor (*x, &err, false);
3022 /* list could have been demolished while we dropped the lock
3033 Route::set_comment (string cmt, void *src)
3036 comment_changed (src);
3037 _session.set_dirty ();
3041 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3043 FeedRecord fr (other, via_sends_only);
3045 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3047 if (!result.second) {
3049 /* already a record for "other" - make sure sends-only information is correct */
3050 if (!via_sends_only && result.first->sends_only) {
3051 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3052 frp->sends_only = false;
3056 return result.second;
3060 Route::clear_fed_by ()
3066 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3068 const FedBy& fed_by (other->fed_by());
3070 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3071 boost::shared_ptr<Route> sr = f->r.lock();
3073 if (sr && (sr.get() == this)) {
3075 if (via_sends_only) {
3076 *via_sends_only = f->sends_only;
3087 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3089 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3091 if (_output->connected_to (other->input())) {
3092 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3093 if (via_send_only) {
3094 *via_send_only = false;
3101 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3103 boost::shared_ptr<IOProcessor> iop;
3105 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3106 if (iop->feeds (other)) {
3107 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3108 if (via_send_only) {
3109 *via_send_only = true;
3113 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3116 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3121 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3126 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3128 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3131 /** Called from the (non-realtime) butler thread when the transport is stopped */
3133 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3135 framepos_t now = _session.transport_frame();
3138 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3140 Automatable::transport_stopped (now);
3142 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3144 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3148 (*i)->transport_stopped (now);
3152 _roll_delay = _initial_delay;
3156 Route::input_change_handler (IOChange change, void * /*src*/)
3158 bool need_to_queue_solo_change = true;
3160 if ((change.type & IOChange::ConfigurationChanged)) {
3161 /* This is called with the process lock held if change
3162 contains ConfigurationChanged
3164 need_to_queue_solo_change = false;
3165 configure_processors (0);
3166 _phase_invert.resize (_input->n_ports().n_audio ());
3167 io_changed (); /* EMIT SIGNAL */
3170 if (!_input->connected() && _soloed_by_others_upstream) {
3171 if (need_to_queue_solo_change) {
3172 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3174 cancel_solo_after_disconnect (true);
3180 Route::output_change_handler (IOChange change, void * /*src*/)
3182 bool need_to_queue_solo_change = true;
3183 if (_initial_io_setup) {
3187 if ((change.type & IOChange::ConfigurationChanged)) {
3188 /* This is called with the process lock held if change
3189 contains ConfigurationChanged
3191 need_to_queue_solo_change = false;
3192 configure_processors (0);
3195 _session.reset_monitor_section();
3198 io_changed (); /* EMIT SIGNAL */
3201 if (!_output->connected() && _soloed_by_others_downstream) {
3202 if (need_to_queue_solo_change) {
3203 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3205 cancel_solo_after_disconnect (false);
3211 Route::cancel_solo_after_disconnect (bool upstream)
3214 _soloed_by_others_upstream = 0;
3216 _soloed_by_others_downstream = 0;
3218 set_mute_master_solo ();
3219 solo_changed (false, this);
3223 Route::pans_required () const
3225 if (n_outputs().n_audio() < 2) {
3229 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3233 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3235 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3241 if (n_outputs().n_total() == 0) {
3245 if (!_active || n_inputs() == ChanCount::ZERO) {
3246 silence_unlocked (nframes);
3250 if (session_state_changing) {
3251 if (_session.transport_speed() != 0.0f) {
3252 /* we're rolling but some state is changing (e.g. our diskstream contents)
3253 so we cannot use them. Be silent till this is over.
3255 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3257 silence_unlocked (nframes);
3260 /* we're really not rolling, so we're either delivery silence or actually
3261 monitoring, both of which are safe to do while session_state_changing is true.
3265 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3267 fill_buffers_with_input (bufs, _input, nframes);
3269 if (_meter_point == MeterInput) {
3270 _meter->run (bufs, start_frame, end_frame, nframes, true);
3273 _amp->apply_gain_automation (false);
3274 _trim->apply_gain_automation (false);
3275 passthru (bufs, start_frame, end_frame, nframes, 0);
3281 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3283 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3288 if (n_outputs().n_total() == 0) {
3292 if (!_active || n_inputs().n_total() == 0) {
3293 silence_unlocked (nframes);
3297 framepos_t unused = 0;
3299 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3305 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3307 fill_buffers_with_input (bufs, _input, nframes);
3309 if (_meter_point == MeterInput) {
3310 _meter->run (bufs, start_frame, end_frame, nframes, true);
3313 passthru (bufs, start_frame, end_frame, nframes, declick);
3319 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3326 Route::flush_processors ()
3328 /* XXX shouldn't really try to take this lock, since
3329 this is called from the RT audio thread.
3332 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3334 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3340 __attribute__((annotate("realtime")))
3343 Route::apply_meter_change_rt ()
3345 if (_pending_meter_point != _meter_point) {
3346 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3348 /* meters always have buffers for 'processor_max_streams'
3349 * they can be re-positioned without re-allocation */
3350 set_meter_point_unlocked();
3356 Route::set_meter_point (MeterPoint p, bool force)
3358 if (_pending_meter_point == p && !force) {
3362 if (force || !AudioEngine::instance()->running()) {
3363 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3364 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3365 _pending_meter_point = p;
3366 set_meter_point_unlocked();
3368 _pending_meter_point = p;
3374 __attribute__((annotate("realtime")))
3377 Route::set_meter_point_unlocked ()
3380 /* Caller must hold process and processor write lock */
3381 assert (!AudioEngine::instance()->process_lock().trylock());
3382 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3383 assert (!lm.locked ());
3386 _meter_point = _pending_meter_point;;
3388 bool meter_was_visible_to_user = _meter->display_to_user ();
3390 maybe_note_meter_position ();
3392 if (_meter_point != MeterCustom) {
3394 _meter->set_display_to_user (false);
3396 setup_invisible_processors ();
3400 _meter->set_display_to_user (true);
3402 /* If we have a previous position for the custom meter, try to put it there */
3403 if (_custom_meter_position_noted) {
3404 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3407 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3408 if (i != _processors.end ()) {
3409 _processors.remove (_meter);
3410 _processors.insert (i, _meter);
3412 } else if (_last_custom_meter_was_at_end) {
3413 _processors.remove (_meter);
3414 _processors.push_back (_meter);
3419 /* Set up the meter for its new position */
3421 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3425 if (loc == _processors.begin()) {
3426 m_in = _input->n_ports();
3428 ProcessorList::iterator before = loc;
3430 m_in = (*before)->output_streams ();
3433 _meter->reflect_inputs (m_in);
3435 /* we do not need to reconfigure the processors, because the meter
3436 (a) is always ready to handle processor_max_streams
3437 (b) is always an N-in/N-out processor, and thus moving
3438 it doesn't require any changes to the other processors.
3441 /* these should really be done after releasing the lock
3442 * but all those signals are subscribed to with gui_thread()
3445 meter_change (); /* EMIT SIGNAL */
3446 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3447 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3451 Route::listen_position_changed ()
3454 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3455 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3456 ProcessorState pstate (this);
3458 if (configure_processors_unlocked (0)) {
3460 configure_processors_unlocked (0); // it worked before we tried to add it ...
3465 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3466 _session.set_dirty ();
3469 boost::shared_ptr<CapturingProcessor>
3470 Route::add_export_point()
3472 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3473 if (!_capturing_processor) {
3475 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3476 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3478 _capturing_processor.reset (new CapturingProcessor (_session));
3479 _capturing_processor->activate ();
3481 configure_processors_unlocked (0);
3485 return _capturing_processor;
3489 Route::update_signal_latency ()
3491 framecnt_t l = _output->user_latency();
3492 framecnt_t lamp = 0;
3493 bool before_amp = true;
3494 framecnt_t ltrim = 0;
3495 bool before_trim = true;
3497 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3498 if ((*i)->active ()) {
3499 l += (*i)->signal_latency ();
3504 if ((*i) == _trim) {
3515 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3517 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3518 _signal_latency_at_amp_position = lamp;
3519 _signal_latency_at_trim_position = ltrim;
3521 if (_signal_latency != l) {
3522 _signal_latency = l;
3523 signal_latency_changed (); /* EMIT SIGNAL */
3526 return _signal_latency;
3530 Route::set_user_latency (framecnt_t nframes)
3532 _output->set_user_latency (nframes);
3533 _session.update_latency_compensation ();
3537 Route::set_latency_compensation (framecnt_t longest_session_latency)
3539 framecnt_t old = _initial_delay;
3541 if (_signal_latency < longest_session_latency) {
3542 _initial_delay = longest_session_latency - _signal_latency;
3547 DEBUG_TRACE (DEBUG::Latency, string_compose (
3548 "%1: compensate for maximum latency of %2,"
3549 "given own latency of %3, using initial delay of %4\n",
3550 name(), longest_session_latency, _signal_latency, _initial_delay));
3552 if (_initial_delay != old) {
3553 initial_delay_changed (); /* EMIT SIGNAL */
3556 if (_session.transport_stopped()) {
3557 _roll_delay = _initial_delay;
3561 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3562 : AutomationControl (r->session(),
3563 Evoral::Parameter (SoloAutomation),
3564 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3565 boost::shared_ptr<AutomationList>(), name)
3568 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3569 gl->set_interpolation(Evoral::ControlList::Discrete);
3574 Route::SoloControllable::set_value (double val)
3576 const bool bval = ((val >= 0.5) ? true : false);
3578 boost::shared_ptr<RouteList> rl (new RouteList);
3580 boost::shared_ptr<Route> r = _route.lock ();
3587 if (Config->get_solo_control_is_listen_control()) {
3588 _session.set_listen (rl, bval);
3590 _session.set_solo (rl, bval);
3595 Route::SoloControllable::get_value () const
3597 boost::shared_ptr<Route> r = _route.lock ();
3602 if (Config->get_solo_control_is_listen_control()) {
3603 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3605 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3609 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3610 : AutomationControl (r->session(),
3611 Evoral::Parameter (MuteAutomation),
3612 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3613 boost::shared_ptr<AutomationList>(),
3617 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3618 gl->set_interpolation(Evoral::ControlList::Discrete);
3623 Route::MuteControllable::set_superficial_value(bool muted)
3625 /* Note we can not use AutomationControl::set_value here since it will emit
3626 Changed(), but the value will not be correct to the observer. */
3628 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3630 Control::set_double (muted, _session.transport_frame(), to_list);
3634 Route::MuteControllable::set_value (double val)
3636 const bool bval = ((val >= 0.5) ? true : false);
3638 boost::shared_ptr<Route> r = _route.lock ();
3643 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3644 // Playing back automation, set route mute directly
3645 r->set_mute (bval, this);
3647 // Set from user, queue mute event
3648 boost::shared_ptr<RouteList> rl (new RouteList);
3650 _session.set_mute (rl, bval, Session::rt_cleanup);
3653 // Set superficial/automation value to drive controller (and possibly record)
3654 set_superficial_value(bval);
3658 Route::MuteControllable::get_value () const
3660 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3661 // Playing back automation, get the value from the list
3662 return AutomationControl::get_value();
3665 // Not playing back automation, get the actual route mute value
3666 boost::shared_ptr<Route> r = _route.lock ();
3667 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3671 Route::set_block_size (pframes_t nframes)
3673 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3674 (*i)->set_block_size (nframes);
3677 _session.ensure_buffers (n_process_buffers ());
3681 Route::protect_automation ()
3683 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3684 (*i)->protect_automation();
3687 /** @param declick 1 to set a pending declick fade-in,
3688 * -1 to set a pending declick fade-out
3691 Route::set_pending_declick (int declick)
3694 /* this call is not allowed to turn off a pending declick */
3696 _pending_declick = declick;
3699 _pending_declick = 0;
3703 /** Shift automation forwards from a particular place, thereby inserting time.
3704 * Adds undo commands for any shifts that are performed.
3706 * @param pos Position to start shifting from.
3707 * @param frames Amount to shift forwards by.
3711 Route::shift (framepos_t pos, framecnt_t frames)
3713 /* gain automation */
3715 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3717 XMLNode &before = gc->alist()->get_state ();
3718 gc->alist()->shift (pos, frames);
3719 XMLNode &after = gc->alist()->get_state ();
3720 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3723 /* gain automation */
3725 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3727 XMLNode &before = gc->alist()->get_state ();
3728 gc->alist()->shift (pos, frames);
3729 XMLNode &after = gc->alist()->get_state ();
3730 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3733 // TODO mute automation ??
3735 /* pan automation */
3737 ControlSet::Controls& c (_pannable->controls());
3739 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3740 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3742 boost::shared_ptr<AutomationList> al = pc->alist();
3743 XMLNode& before = al->get_state ();
3744 al->shift (pos, frames);
3745 XMLNode& after = al->get_state ();
3746 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3751 /* redirect automation */
3753 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3754 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3756 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3758 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3759 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3761 boost::shared_ptr<AutomationList> al = ac->alist();
3762 XMLNode &before = al->get_state ();
3763 al->shift (pos, frames);
3764 XMLNode &after = al->get_state ();
3765 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3774 Route::save_as_template (const string& path, const string& name)
3776 XMLNode& node (state (false));
3779 IO::set_name_in_state (*node.children().front(), name);
3781 tree.set_root (&node);
3782 return tree.write (path.c_str());
3787 Route::set_name (const string& str)
3789 if (str == name()) {
3793 string name = Route::ensure_track_or_route_name (str, _session);
3794 SessionObject::set_name (name);
3796 bool ret = (_input->set_name(name) && _output->set_name(name));
3799 /* rename the main outs. Leave other IO processors
3800 * with whatever name they already have, because its
3801 * just fine as it is (it will not contain the route
3802 * name if its a port insert, port send or port return).
3806 if (_main_outs->set_name (name)) {
3807 /* XXX returning false here is stupid because
3808 we already changed the route name.
3818 /** Set the name of a route in an XML description.
3819 * @param node XML <Route> node to set the name in.
3820 * @param name New name.
3823 Route::set_name_in_state (XMLNode& node, string const & name)
3825 node.add_property (X_("name"), name);
3827 XMLNodeList children = node.children();
3828 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3830 if ((*i)->name() == X_("IO")) {
3832 IO::set_name_in_state (**i, name);
3834 } else if ((*i)->name() == X_("Processor")) {
3836 XMLProperty* role = (*i)->property (X_("role"));
3837 if (role && role->value() == X_("Main")) {
3838 (*i)->add_property (X_("name"), name);
3841 } else if ((*i)->name() == X_("Diskstream")) {
3843 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3844 (*i)->add_property (X_("name"), name);
3850 boost::shared_ptr<Send>
3851 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3853 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3855 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3856 boost::shared_ptr<InternalSend> send;
3858 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3859 if (send->target_route() == target) {
3865 return boost::shared_ptr<Send>();
3868 /** @param c Audio channel index.
3869 * @param yn true to invert phase, otherwise false.
3872 Route::set_phase_invert (uint32_t c, bool yn)
3874 if (_phase_invert[c] != yn) {
3875 _phase_invert[c] = yn;
3876 phase_invert_changed (); /* EMIT SIGNAL */
3877 _session.set_dirty ();
3882 Route::set_phase_invert (boost::dynamic_bitset<> p)
3884 if (_phase_invert != p) {
3886 phase_invert_changed (); /* EMIT SIGNAL */
3887 _session.set_dirty ();
3892 Route::phase_invert (uint32_t c) const
3894 return _phase_invert[c];
3897 boost::dynamic_bitset<>
3898 Route::phase_invert () const
3900 return _phase_invert;
3904 Route::set_denormal_protection (bool yn)
3906 if (_denormal_protection != yn) {
3907 _denormal_protection = yn;
3908 denormal_protection_changed (); /* EMIT SIGNAL */
3913 Route::denormal_protection () const
3915 return _denormal_protection;
3919 Route::set_active (bool yn, void* src)
3921 if (_session.transport_rolling()) {
3925 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3926 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3930 if (_active != yn) {
3932 _input->set_active (yn);
3933 _output->set_active (yn);
3934 active_changed (); // EMIT SIGNAL
3935 _session.set_dirty ();
3942 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3948 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3950 boost::shared_ptr<Send> s;
3951 boost::shared_ptr<Return> r;
3953 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3954 s->meter()->meter();
3955 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3956 r->meter()->meter ();
3961 boost::shared_ptr<Pannable>
3962 Route::pannable() const
3967 boost::shared_ptr<Panner>
3968 Route::panner() const
3971 return _main_outs->panner_shell()->panner();
3974 boost::shared_ptr<PannerShell>
3975 Route::panner_shell() const
3977 return _main_outs->panner_shell();
3980 boost::shared_ptr<AutomationControl>
3981 Route::gain_control() const
3983 return _amp->gain_control();
3986 boost::shared_ptr<AutomationControl>
3987 Route::get_control (const Evoral::Parameter& param)
3989 /* either we own the control or .... */
3991 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3995 /* maybe one of our processors does or ... */
3997 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3998 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3999 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4007 /* nobody does so we'll make a new one */
4009 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4016 boost::shared_ptr<Processor>
4017 Route::nth_plugin (uint32_t n)
4019 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4020 ProcessorList::iterator i;
4022 for (i = _processors.begin(); i != _processors.end(); ++i) {
4023 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4030 return boost::shared_ptr<Processor> ();
4033 boost::shared_ptr<Processor>
4034 Route::nth_send (uint32_t n)
4036 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4037 ProcessorList::iterator i;
4039 for (i = _processors.begin(); i != _processors.end(); ++i) {
4040 if (boost::dynamic_pointer_cast<Send> (*i)) {
4047 return boost::shared_ptr<Processor> ();
4051 Route::has_io_processor_named (const string& name)
4053 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4054 ProcessorList::iterator i;
4056 for (i = _processors.begin(); i != _processors.end(); ++i) {
4057 if (boost::dynamic_pointer_cast<Send> (*i) ||
4058 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4059 if ((*i)->name() == name) {
4068 MuteMaster::MutePoint
4069 Route::mute_points () const
4071 return _mute_master->mute_points ();
4075 Route::set_processor_positions ()
4077 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4079 bool had_amp = false;
4080 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4081 (*i)->set_pre_fader (!had_amp);
4082 if (boost::dynamic_pointer_cast<Amp> (*i)) {
4088 /** Called when there is a proposed change to the input port count */
4090 Route::input_port_count_changing (ChanCount to)
4092 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4094 /* The processors cannot be configured with the new input arrangement, so
4100 /* The change is ok */
4104 /** Called when there is a proposed change to the output port count */
4106 Route::output_port_count_changing (ChanCount to)
4108 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4109 if (processor_out_streams.get(*t) > to.get(*t)) {
4113 /* The change is ok */
4118 Route::unknown_processors () const
4122 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4123 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4124 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4125 p.push_back ((*i)->name ());
4134 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4136 /* we assume that all our input ports feed all our output ports. its not
4137 universally true, but the alternative is way too corner-case to worry about.
4140 LatencyRange all_connections;
4143 all_connections.min = 0;
4144 all_connections.max = 0;
4146 all_connections.min = ~((pframes_t) 0);
4147 all_connections.max = 0;
4149 /* iterate over all "from" ports and determine the latency range for all of their
4150 connections to the "outside" (outside of this Route).
4153 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4157 p->get_connected_latency_range (range, playback);
4159 all_connections.min = min (all_connections.min, range.min);
4160 all_connections.max = max (all_connections.max, range.max);
4164 /* set the "from" port latencies to the max/min range of all their connections */
4166 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4167 p->set_private_latency_range (all_connections, playback);
4170 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4172 all_connections.min += our_latency;
4173 all_connections.max += our_latency;
4175 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4176 p->set_private_latency_range (all_connections, playback);
4179 return all_connections.max;
4183 Route::set_private_port_latencies (bool playback) const
4185 framecnt_t own_latency = 0;
4187 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4188 OR LATENCY CALLBACK.
4190 This is called (early) from the latency callback. It computes the REAL
4191 latency associated with each port and stores the result as the "private"
4192 latency of the port. A later call to Route::set_public_port_latencies()
4193 sets all ports to the same value to reflect the fact that we do latency
4194 compensation and so all signals are delayed by the same amount as they
4195 flow through ardour.
4198 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4199 if ((*i)->active ()) {
4200 own_latency += (*i)->signal_latency ();
4205 /* playback: propagate latency from "outside the route" to outputs to inputs */
4206 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4208 /* capture: propagate latency from "outside the route" to inputs to outputs */
4209 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4214 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4216 /* this is called to set the JACK-visible port latencies, which take
4217 latency compensation into account.
4226 const PortSet& ports (_input->ports());
4227 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4228 p->set_public_latency_range (range, playback);
4233 const PortSet& ports (_output->ports());
4234 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4235 p->set_public_latency_range (range, playback);
4240 /** Put the invisible processors in the right place in _processors.
4241 * Must be called with a writer lock on _processor_lock held.
4244 __attribute__((annotate("realtime")))
4247 Route::setup_invisible_processors ()
4250 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4251 assert (!lm.locked ());
4255 /* too early to be doing this stuff */
4259 /* we'll build this new list here and then use it
4261 * TODO put the ProcessorList is on the stack for RT-safety.
4264 ProcessorList new_processors;
4266 /* find visible processors */
4268 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4269 if ((*i)->display_to_user ()) {
4270 new_processors.push_back (*i);
4276 ProcessorList::iterator amp = new_processors.begin ();
4277 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
4281 assert (amp != new_processors.end ());
4283 /* and the processor after the amp */
4285 ProcessorList::iterator after_amp = amp;
4291 switch (_meter_point) {
4293 assert (!_meter->display_to_user ());
4294 new_processors.push_front (_meter);
4297 assert (!_meter->display_to_user ());
4298 new_processors.insert (amp, _meter);
4300 case MeterPostFader:
4301 /* do nothing here */
4304 /* do nothing here */
4307 /* the meter is visible, so we don't touch it here */
4314 assert (_main_outs);
4315 assert (!_main_outs->display_to_user ());
4316 new_processors.push_back (_main_outs);
4318 /* iterator for the main outs */
4320 ProcessorList::iterator main = new_processors.end();
4323 /* OUTPUT METERING */
4325 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4326 assert (!_meter->display_to_user ());
4328 /* add the processor just before or just after the main outs */
4330 ProcessorList::iterator meter_point = main;
4332 if (_meter_point == MeterOutput) {
4335 new_processors.insert (meter_point, _meter);
4340 if (_monitor_send && !is_monitor ()) {
4341 assert (!_monitor_send->display_to_user ());
4342 if (Config->get_solo_control_is_listen_control()) {
4343 switch (Config->get_listen_position ()) {
4344 case PreFaderListen:
4345 switch (Config->get_pfl_position ()) {
4346 case PFLFromBeforeProcessors:
4347 new_processors.push_front (_monitor_send);
4349 case PFLFromAfterProcessors:
4350 new_processors.insert (amp, _monitor_send);
4353 _monitor_send->set_can_pan (false);
4355 case AfterFaderListen:
4356 switch (Config->get_afl_position ()) {
4357 case AFLFromBeforeProcessors:
4358 new_processors.insert (after_amp, _monitor_send);
4360 case AFLFromAfterProcessors:
4361 new_processors.insert (new_processors.end(), _monitor_send);
4364 _monitor_send->set_can_pan (true);
4368 new_processors.insert (new_processors.end(), _monitor_send);
4369 _monitor_send->set_can_pan (false);
4373 #if 0 // not used - just yet
4374 if (!is_master() && !is_monitor() && !is_auditioner()) {
4375 new_processors.push_front (_delayline);
4379 /* MONITOR CONTROL */
4381 if (_monitor_control && is_monitor ()) {
4382 assert (!_monitor_control->display_to_user ());
4383 new_processors.push_front (_monitor_control);
4386 /* INTERNAL RETURN */
4388 /* doing this here means that any monitor control will come just after
4393 assert (!_intreturn->display_to_user ());
4394 new_processors.push_front (_intreturn);
4397 if (_trim && _trim->active()) {
4398 assert (!_trim->display_to_user ());
4399 new_processors.push_front (_trim);
4401 /* EXPORT PROCESSOR */
4403 if (_capturing_processor) {
4404 assert (!_capturing_processor->display_to_user ());
4405 new_processors.push_front (_capturing_processor);
4408 _processors = new_processors;
4410 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4411 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4412 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4419 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4420 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4424 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4425 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4432 /** If the meter point is `Custom', make a note of where the meter is.
4433 * This is so that if the meter point is subsequently set to something else,
4434 * and then back to custom, we can put the meter back where it was last time
4435 * custom was enabled.
4437 * Must be called with the _processor_lock held.
4440 Route::maybe_note_meter_position ()
4442 if (_meter_point != MeterCustom) {
4446 _custom_meter_position_noted = true;
4447 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4448 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4449 ProcessorList::iterator j = i;
4451 if (j != _processors.end ()) {
4452 _processor_after_last_custom_meter = *j;
4453 _last_custom_meter_was_at_end = false;
4455 _last_custom_meter_was_at_end = true;
4461 boost::shared_ptr<Processor>
4462 Route::processor_by_id (PBD::ID id) const
4464 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4465 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4466 if ((*i)->id() == id) {
4471 return boost::shared_ptr<Processor> ();
4474 /** @return the monitoring state, or in other words what data we are pushing
4475 * into the route (data from the inputs, data from disk or silence)
4478 Route::monitoring_state () const
4480 return MonitoringInput;
4483 /** @return what we should be metering; either the data coming from the input
4484 * IO or the data that is flowing through the route.
4487 Route::metering_state () const
4489 return MeteringRoute;
4493 Route::has_external_redirects () const
4495 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4497 /* ignore inactive processors and obviously ignore the main
4498 * outs since everything has them and we don't care.
4501 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4509 boost::shared_ptr<Processor>
4510 Route::the_instrument () const
4512 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4513 return the_instrument_unlocked ();
4516 boost::shared_ptr<Processor>
4517 Route::the_instrument_unlocked () const
4519 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4520 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4521 if ((*i)->input_streams().n_midi() > 0 &&
4522 (*i)->output_streams().n_audio() > 0) {
4527 return boost::shared_ptr<Processor>();
4533 Route::non_realtime_locate (framepos_t pos)
4536 _pannable->transport_located (pos);
4539 if (_delayline.get()) {
4540 _delayline.get()->flush();
4544 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4545 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4547 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4548 (*i)->transport_located (pos);
4554 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4561 * We don't currently mix MIDI input together, so we don't need the
4562 * complex logic of the audio case.
4565 n_buffers = bufs.count().n_midi ();
4567 for (i = 0; i < n_buffers; ++i) {
4569 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4570 MidiBuffer& buf (bufs.get_midi (i));
4573 buf.copy (source_port->get_midi_buffer(nframes));
4575 buf.silence (nframes);
4581 n_buffers = bufs.count().n_audio();
4583 size_t n_ports = io->n_ports().n_audio();
4584 float scaling = 1.0f;
4586 if (n_ports > n_buffers) {
4587 scaling = ((float) n_buffers) / n_ports;
4590 for (i = 0; i < n_ports; ++i) {
4592 /* if there are more ports than buffers, map them onto buffers
4593 * in a round-robin fashion
4596 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4597 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4600 if (i < n_buffers) {
4602 /* first time through just copy a channel into
4606 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4608 if (scaling != 1.0f) {
4609 buf.apply_gain (scaling, nframes);
4614 /* on subsequent times around, merge data from
4615 * the port with what is already there
4618 if (scaling != 1.0f) {
4619 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4621 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4626 /* silence any remaining buffers */
4628 for (; i < n_buffers; ++i) {
4629 AudioBuffer& buf (bufs.get_audio (i));
4630 buf.silence (nframes);
4633 /* establish the initial setup of the buffer set, reflecting what was
4634 copied into it. unless, of course, we are the auditioner, in which
4635 case nothing was fed into it from the inputs at all.
4638 if (!is_auditioner()) {
4639 bufs.set_count (io->n_ports());