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 , _meter_type (MeterPeak)
93 , _soloed_by_others_upstream (0)
94 , _soloed_by_others_downstream (0)
96 , _denormal_protection (false)
99 , _declickable (false)
100 , _mute_master (new MuteMaster (sess, name))
101 , _have_internal_generator (false)
103 , _default_type (default_type)
105 , _has_order_key (false)
106 , _remote_control_id (0)
108 , _in_configure_processors (false)
109 , _initial_io_setup (false)
110 , _custom_meter_position_noted (false)
111 , _last_custom_meter_was_at_end (false)
114 _meter_type = MeterK20;
116 processor_max_streams.reset();
122 /* add standard controls */
124 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
125 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
127 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
128 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
130 add_control (_solo_control);
131 add_control (_mute_control);
135 if (!(_flags & Route::MonitorOut)) {
136 _pannable.reset (new Pannable (_session));
139 /* input and output objects */
141 _input.reset (new IO (_session, _name, IO::Input, _default_type));
142 _output.reset (new IO (_session, _name, IO::Output, _default_type));
144 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
145 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
147 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
148 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
150 #if 0 // not used - just yet
151 if (!is_master() && !is_monitor() && !is_auditioner()) {
152 _delayline.reset (new DelayLine (_session, _name));
153 add_processor (_delayline, PreFader);
157 /* add amp processor */
159 _amp.reset (new Amp (_session));
160 add_processor (_amp, PostFader);
163 _trim.reset (new Amp (_session, "trim"));
164 _trim->set_display_to_user (false);
166 if (dynamic_cast<AudioTrack*>(this)) {
167 /* we can't do this in the AudioTrack's constructor
168 * because _trim does not exit then
172 else if (!dynamic_cast<Track*>(this) && ! (is_master() || is_monitor() || is_auditioner())) {
177 /* create standard processors: meter, main outs, monitor out;
178 they will be added to _processors by setup_invisible_processors ()
181 _meter.reset (new PeakMeter (_session, _name));
182 _meter->set_owner (this);
183 _meter->set_display_to_user (false);
186 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
187 _main_outs->activate ();
190 /* where we listen to tracks */
191 _intreturn.reset (new InternalReturn (_session));
192 _intreturn->activate ();
194 /* the thing that provides proper control over a control/monitor/listen bus
195 (such as per-channel cut, dim, solo, invert, etc).
197 _monitor_control.reset (new MonitorProcessor (_session));
198 _monitor_control->activate ();
201 if (is_master() || is_monitor() || is_auditioner()) {
202 _mute_master->set_solo_ignore (true);
205 /* now that we have _meter, its safe to connect to this */
207 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
210 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
211 configure_processors (0);
219 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
221 /* do this early so that we don't get incoming signals as we are going through destruction
226 /* don't use clear_processors here, as it depends on the session which may
227 be half-destroyed by now
230 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
231 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
232 (*i)->drop_references ();
235 _processors.clear ();
239 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
241 if (Config->get_remote_model() != UserOrdered) {
245 set_remote_control_id_internal (id, notify_class_listeners);
249 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
251 /* force IDs for master/monitor busses and prevent
252 any other route from accidentally getting these IDs
253 (i.e. legacy sessions)
256 if (is_master() && id != MasterBusRemoteControlID) {
257 id = MasterBusRemoteControlID;
260 if (is_monitor() && id != MonitorBusRemoteControlID) {
261 id = MonitorBusRemoteControlID;
268 /* don't allow it to collide */
270 if (!is_master () && !is_monitor() &&
271 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
272 id += MonitorBusRemoteControlID;
275 if (id != remote_control_id()) {
276 _remote_control_id = id;
277 RemoteControlIDChanged ();
279 if (notify_class_listeners) {
280 RemoteControlIDChange ();
286 Route::remote_control_id() const
289 return MasterBusRemoteControlID;
293 return MonitorBusRemoteControlID;
296 return _remote_control_id;
300 Route::has_order_key () const
302 return _has_order_key;
306 Route::order_key () const
312 Route::set_remote_control_id_explicit (uint32_t rid)
314 if (is_master() || is_monitor() || is_auditioner()) {
315 /* hard-coded remote IDs, or no remote ID */
319 if (_remote_control_id != rid) {
320 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
321 _remote_control_id = rid;
322 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
325 /* don't emit the class-level RID signal RemoteControlIDChange here,
326 leave that to the entity that changed the order key, so that we
327 don't get lots of emissions for no good reasons (e.g. when changing
328 all route order keys).
330 See Session::sync_remote_id_from_order_keys() for the (primary|only)
331 spot where that is emitted.
336 Route::set_order_key (uint32_t n)
338 _has_order_key = true;
340 if (_order_key == n) {
346 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
347 name(), order_key ()));
349 _session.set_dirty ();
353 Route::ensure_track_or_route_name(string name, Session &session)
355 string newname = name;
357 while (!session.io_name_is_legal (newname)) {
358 newname = bump_name_once (newname, '.');
365 Route::inc_gain (gain_t fraction, void *src)
367 _amp->inc_gain (fraction, src);
371 Route::set_gain (gain_t val, void *src)
373 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
375 if (_route_group->is_relative()) {
377 gain_t usable_gain = _amp->gain();
378 if (usable_gain < 0.000001f) {
379 usable_gain = 0.000001f;
383 if (delta < 0.000001f) {
387 delta -= usable_gain;
392 gain_t factor = delta / usable_gain;
395 factor = _route_group->get_max_factor(factor);
396 if (factor == 0.0f) {
397 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
401 factor = _route_group->get_min_factor(factor);
402 if (factor == 0.0f) {
403 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
408 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
412 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
418 if (val == _amp->gain()) {
422 _amp->set_gain (val, src);
426 Route::inc_trim (gain_t fraction, void *src)
428 _trim->inc_gain (fraction, src);
432 Route::set_trim (gain_t val, void * /* src */)
434 // TODO route group, see set_gain()
435 _trim->set_gain (val, 0);
439 Route::maybe_declick (BufferSet&, framecnt_t, int)
441 /* this is the "bus" implementation and they never declick.
446 /** Process this route for one (sub) cycle (process thread)
448 * @param bufs Scratch buffers to use for the signal path
449 * @param start_frame Initial transport frame
450 * @param end_frame Final transport frame
451 * @param nframes Number of frames to output (to ports)
453 * Note that (end_frame - start_frame) may not be equal to nframes when the
454 * transport speed isn't 1.0 (eg varispeed).
457 Route::process_output_buffers (BufferSet& bufs,
458 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
459 int declick, bool gain_automation_ok)
461 /* Caller must hold process lock */
462 assert (!AudioEngine::instance()->process_lock().trylock());
464 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
466 bufs.silence (nframes, 0);
470 /* figure out if we're going to use gain automation */
471 if (gain_automation_ok) {
472 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
473 _amp->setup_gain_automation (
474 start_frame + _signal_latency_at_amp_position,
475 end_frame + _signal_latency_at_amp_position,
478 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
479 _trim->setup_gain_automation (
480 start_frame + _signal_latency_at_trim_position,
481 end_frame + _signal_latency_at_trim_position,
484 _amp->apply_gain_automation (false);
485 _trim->apply_gain_automation (false);
488 /* Tell main outs what to do about monitoring. We do this so that
489 on a transition between monitoring states we get a de-clicking gain
490 change in the _main_outs delivery.
492 bool silence = monitoring_state () == MonitoringSilence;
494 //but we override this in the case where we have an internal generator
495 if ( _have_internal_generator )
498 _main_outs->no_outs_cuz_we_no_monitor (silence);
500 /* -------------------------------------------------------------------------------------------
501 GLOBAL DECLICK (for transport changes etc.)
502 ----------------------------------------------------------------------------------------- */
504 maybe_declick (bufs, nframes, declick);
505 _pending_declick = 0;
507 /* -------------------------------------------------------------------------------------------
508 DENORMAL CONTROL/PHASE INVERT
509 ----------------------------------------------------------------------------------------- */
511 if (_phase_invert.any ()) {
515 if (_denormal_protection || Config->get_denormal_protection()) {
517 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
518 Sample* const sp = i->data();
520 if (_phase_invert[chn]) {
521 for (pframes_t nx = 0; nx < nframes; ++nx) {
526 for (pframes_t nx = 0; nx < nframes; ++nx) {
534 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
535 Sample* const sp = i->data();
537 if (_phase_invert[chn]) {
538 for (pframes_t nx = 0; nx < nframes; ++nx) {
547 if (_denormal_protection || Config->get_denormal_protection()) {
549 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
550 Sample* const sp = i->data();
551 for (pframes_t nx = 0; nx < nframes; ++nx) {
559 /* -------------------------------------------------------------------------------------------
561 ----------------------------------------------------------------------------------------- */
563 /* set this to be true if the meter will already have been ::run() earlier */
564 bool const meter_already_run = metering_state() == MeteringInput;
566 framecnt_t latency = 0;
568 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
570 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
571 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
576 /* if it has any inputs, make sure they match */
577 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
578 if (bufs.count() != (*i)->input_streams()) {
580 DEBUG::Processors, string_compose (
581 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
582 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
589 /* should we NOT run plugins here if the route is inactive?
590 do we catch route != active somewhere higher?
593 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
594 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
597 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
598 bufs.set_count ((*i)->output_streams());
600 if ((*i)->active ()) {
601 latency += (*i)->signal_latency ();
607 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
608 boost::shared_ptr<Processor> endpoint,
609 bool include_endpoint, bool for_export, bool for_freeze)
611 /* If no processing is required, there's no need to go any further. */
612 if (!endpoint && !include_endpoint) {
616 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
617 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
618 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
620 /* trim is always at the top, for bounce no latency compensation is needed */
621 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
622 _trim->setup_gain_automation (start, start + nframes, nframes);
625 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
627 if (!include_endpoint && (*i) == endpoint) {
631 /* if we're not exporting, stop processing if we come across a routing processor. */
632 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
635 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
639 /* don't run any processors that does routing.
640 * oh, and don't bother with the peak meter either.
642 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
643 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
644 buffers.set_count ((*i)->output_streams());
645 latency += (*i)->signal_latency ();
648 if ((*i) == endpoint) {
655 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
656 bool include_endpoint, bool for_export, bool for_freeze) const
658 framecnt_t latency = 0;
659 if (!endpoint && !include_endpoint) {
663 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
664 if (!include_endpoint && (*i) == endpoint) {
667 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
670 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
673 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
674 latency += (*i)->signal_latency ();
676 if ((*i) == endpoint) {
684 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
685 bool include_endpoint, bool for_export, bool for_freeze) const
687 if (!endpoint && !include_endpoint) {
691 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
692 if (!include_endpoint && (*i) == endpoint) {
695 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
698 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
701 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
702 cc = (*i)->output_streams();
704 if ((*i) == endpoint) {
712 Route::n_process_buffers ()
714 return max (_input->n_ports(), processor_max_streams);
718 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
720 assert (is_monitor());
721 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
722 fill_buffers_with_input (bufs, _input, nframes);
723 passthru (bufs, start_frame, end_frame, nframes, declick);
727 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
731 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
733 /* control/monitor bus ignores input ports when something is
734 feeding the listen "stream". data will "arrive" into the
735 route from the intreturn processor element.
738 bufs.silence (nframes, 0);
741 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
742 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
746 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
748 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
750 bufs.set_count (_input->n_ports());
751 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
752 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
756 Route::set_listen (bool yn, void* src)
762 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
763 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
768 if (yn != _monitor_send->active()) {
770 _monitor_send->activate ();
771 _mute_master->set_soloed (true);
773 _monitor_send->deactivate ();
774 _mute_master->set_soloed (false);
777 listen_changed (src); /* EMIT SIGNAL */
783 Route::listening_via_monitor () const
786 return _monitor_send->active ();
793 Route::set_solo_safe (bool yn, void *src)
795 if (_solo_safe != yn) {
797 solo_safe_changed (src);
802 Route::solo_safe() const
808 Route::set_solo (bool yn, void *src)
811 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
815 if (is_master() || is_monitor() || is_auditioner()) {
816 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
820 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
821 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
825 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
826 name(), yn, src, (src == _route_group), self_soloed()));
828 if (self_soloed() != yn) {
830 set_mute_master_solo ();
831 solo_changed (true, src); /* EMIT SIGNAL */
832 _solo_control->Changed (); /* EMIT SIGNAL */
837 Route::set_self_solo (bool yn)
839 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
844 Route::mod_solo_by_others_upstream (int32_t delta)
847 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
851 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
852 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
854 uint32_t old_sbu = _soloed_by_others_upstream;
857 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
858 _soloed_by_others_upstream += delta;
860 _soloed_by_others_upstream = 0;
863 _soloed_by_others_upstream += delta;
866 DEBUG_TRACE (DEBUG::Solo, string_compose (
867 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
868 name(), delta, _soloed_by_others_upstream, old_sbu,
869 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
871 /* push the inverse solo change to everything that feeds us.
873 This is important for solo-within-group. When we solo 1 track out of N that
874 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
875 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
876 tracks that feed it. This will silence them if they were audible because
877 of a bus solo, but the newly soloed track will still be audible (because
880 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
884 if ((_self_solo || _soloed_by_others_downstream) &&
885 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
886 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
888 if (delta > 0 || !Config->get_exclusive_solo()) {
889 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
890 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
891 boost::shared_ptr<Route> sr = i->r.lock();
893 sr->mod_solo_by_others_downstream (-delta);
899 set_mute_master_solo ();
900 solo_changed (false, this);
904 Route::mod_solo_by_others_downstream (int32_t delta)
907 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
911 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
912 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
915 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
916 _soloed_by_others_downstream += delta;
918 _soloed_by_others_downstream = 0;
921 _soloed_by_others_downstream += delta;
924 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
926 set_mute_master_solo ();
927 solo_changed (false, this);
931 Route::set_mute_master_solo ()
933 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
937 Route::set_solo_isolated (bool yn, void *src)
939 if (is_master() || is_monitor() || is_auditioner()) {
943 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
944 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
948 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
950 boost::shared_ptr<RouteList> routes = _session.get_routes ();
951 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
953 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
958 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
960 if (does_feed && !sends_only) {
961 (*i)->set_solo_isolated (yn, (*i)->route_group());
965 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
967 bool changed = false;
970 if (_solo_isolated == 0) {
971 _mute_master->set_solo_ignore (true);
976 if (_solo_isolated > 0) {
978 if (_solo_isolated == 0) {
979 _mute_master->set_solo_ignore (false);
986 solo_isolated_changed (src);
991 Route::solo_isolated () const
993 return _solo_isolated > 0;
997 Route::set_mute_points (MuteMaster::MutePoint mp)
999 _mute_master->set_mute_points (mp);
1000 mute_points_changed (); /* EMIT SIGNAL */
1002 if (_mute_master->muted_by_self()) {
1003 mute_changed (this); /* EMIT SIGNAL */
1004 _mute_control->Changed (); /* EMIT SIGNAL */
1009 Route::set_mute (bool yn, void *src)
1011 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1012 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1016 if (muted() != yn) {
1017 _mute_master->set_muted_by_self (yn);
1018 /* allow any derived classes to respond to the mute change
1019 before anybody else knows about it.
1022 /* tell everyone else */
1023 mute_changed (src); /* EMIT SIGNAL */
1024 _mute_control->Changed (); /* EMIT SIGNAL */
1029 Route::muted () const
1031 return _mute_master->muted_by_self();
1036 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1038 cerr << name << " {" << endl;
1039 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1040 p != procs.end(); ++p) {
1041 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1043 cerr << "}" << endl;
1047 /** Supposing that we want to insert a Processor at a given Placement, return
1048 * the processor to add the new one before (or 0 to add at the end).
1050 boost::shared_ptr<Processor>
1051 Route::before_processor_for_placement (Placement p)
1053 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1055 ProcessorList::iterator loc;
1057 if (p == PreFader) {
1058 /* generic pre-fader: insert immediately before the amp */
1059 loc = find (_processors.begin(), _processors.end(), _amp);
1061 /* generic post-fader: insert right before the main outs */
1062 loc = find (_processors.begin(), _processors.end(), _main_outs);
1065 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1068 /** Supposing that we want to insert a Processor at a given index, return
1069 * the processor to add the new one before (or 0 to add at the end).
1071 boost::shared_ptr<Processor>
1072 Route::before_processor_for_index (int index)
1075 return boost::shared_ptr<Processor> ();
1078 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1080 ProcessorList::iterator i = _processors.begin ();
1082 while (i != _processors.end() && j < index) {
1083 if ((*i)->display_to_user()) {
1090 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1093 /** Add a processor either pre- or post-fader
1094 * @return 0 on success, non-0 on failure.
1097 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1099 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1103 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1104 * @param index Index to add the processor at, or -1 to add at the end of the list.
1105 * @return 0 on success, non-0 on failure.
1108 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1110 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1113 /** Add a processor to the route.
1114 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1115 * @return 0 on success, non-0 on failure.
1118 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1120 assert (processor != _meter);
1121 assert (processor != _main_outs);
1123 DEBUG_TRACE (DEBUG::Processors, string_compose (
1124 "%1 adding processor %2\n", name(), processor->name()));
1126 if (!AudioEngine::instance()->connected() || !processor) {
1131 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1132 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1133 ProcessorState pstate (this);
1135 boost::shared_ptr<PluginInsert> pi;
1136 boost::shared_ptr<PortInsert> porti;
1138 if (processor == _amp) {
1139 /* Ensure that only one amp is in the list at any time */
1140 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1141 if (check != _processors.end()) {
1142 if (before == _amp) {
1143 /* Already in position; all is well */
1146 _processors.erase (check);
1151 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1153 ProcessorList::iterator loc;
1155 /* inserting before a processor; find it */
1156 loc = find (_processors.begin(), _processors.end(), before);
1157 if (loc == _processors.end ()) {
1162 /* inserting at end */
1163 loc = _processors.end ();
1166 _processors.insert (loc, processor);
1167 processor->set_owner (this);
1169 // Set up processor list channels. This will set processor->[input|output]_streams(),
1170 // configure redirect ports properly, etc.
1173 if (configure_processors_unlocked (err)) {
1175 configure_processors_unlocked (0); // it worked before we tried to add it ...
1180 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1182 if (pi->has_no_inputs ()) {
1183 /* generator plugin */
1184 _have_internal_generator = true;
1189 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1190 processor->activate ();
1193 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1195 _output->set_user_latency (0);
1198 reset_instrument_info ();
1199 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1200 set_processor_positions ();
1206 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1208 const XMLProperty *prop;
1211 boost::shared_ptr<Processor> processor;
1213 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1214 so that we can add the processor in the right place (pre/post-fader)
1217 XMLNodeList const & children = node.children ();
1218 XMLNodeList::const_iterator i = children.begin ();
1220 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1224 Placement placement = PreFader;
1226 if (i != children.end()) {
1227 if ((prop = (*i)->property (X_("placement"))) != 0) {
1228 placement = Placement (string_2_enum (prop->value(), placement));
1232 if (node.name() == "Insert") {
1234 if ((prop = node.property ("type")) != 0) {
1236 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1237 prop->value() == "lv2" ||
1238 prop->value() == "windows-vst" ||
1239 prop->value() == "lxvst" ||
1240 prop->value() == "audiounit") {
1242 processor.reset (new PluginInsert (_session));
1246 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1251 } else if (node.name() == "Send") {
1253 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1254 processor.reset (new Send (_session, sendpan, _mute_master));
1258 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1262 if (processor->set_state (node, version)) {
1266 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1267 if (i != children.end()) {
1268 if ((prop = (*i)->property (X_("active"))) != 0) {
1269 if ( string_is_affirmative (prop->value()) && !_session.get_disable_all_loaded_plugins() )
1270 processor->activate();
1272 processor->deactivate();
1276 return (add_processor (processor, placement, 0, false) == 0);
1279 catch (failed_constructor &err) {
1280 warning << _("processor could not be created. Ignored.") << endmsg;
1286 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1288 /* NOTE: this is intended to be used ONLY when copying
1289 processors from another Route. Hence the subtle
1290 differences between this and ::add_processor()
1293 ProcessorList::iterator loc;
1296 loc = find(_processors.begin(), _processors.end(), before);
1298 /* nothing specified - at end */
1299 loc = _processors.end ();
1302 if (!_session.engine().connected()) {
1306 if (others.empty()) {
1311 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1312 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1313 ProcessorState pstate (this);
1315 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1321 boost::shared_ptr<PluginInsert> pi;
1323 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1327 _processors.insert (loc, *i);
1328 (*i)->set_owner (this);
1330 if ((*i)->active()) {
1334 /* Think: does this really need to be called for every processor in the loop? */
1336 if (configure_processors_unlocked (err)) {
1338 configure_processors_unlocked (0); // it worked before we tried to add it ...
1343 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1346 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1347 boost::shared_ptr<PluginInsert> pi;
1349 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1350 if (pi->has_no_inputs ()) {
1351 _have_internal_generator = true;
1357 _output->set_user_latency (0);
1360 reset_instrument_info ();
1361 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1362 set_processor_positions ();
1368 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1370 if (p == PreFader) {
1371 start = _processors.begin();
1372 end = find(_processors.begin(), _processors.end(), _amp);
1374 start = find(_processors.begin(), _processors.end(), _amp);
1376 end = _processors.end();
1380 /** Turn off all processors with a given placement
1381 * @param p Placement of processors to disable
1384 Route::disable_processors (Placement p)
1386 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1388 ProcessorList::iterator start, end;
1389 placement_range(p, start, end);
1391 for (ProcessorList::iterator i = start; i != end; ++i) {
1392 (*i)->deactivate ();
1395 _session.set_dirty ();
1398 /** Turn off all redirects
1401 Route::disable_processors ()
1403 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1405 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1406 (*i)->deactivate ();
1409 _session.set_dirty ();
1412 /** Turn off all redirects with a given placement
1413 * @param p Placement of redirects to disable
1416 Route::disable_plugins (Placement p)
1418 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1420 ProcessorList::iterator start, end;
1421 placement_range(p, start, end);
1423 for (ProcessorList::iterator i = start; i != end; ++i) {
1424 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1425 (*i)->deactivate ();
1429 _session.set_dirty ();
1432 /** Turn off all plugins
1435 Route::disable_plugins ()
1437 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1439 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1440 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1441 (*i)->deactivate ();
1445 _session.set_dirty ();
1450 Route::ab_plugins (bool forward)
1452 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1456 /* forward = turn off all active redirects, and mark them so that the next time
1457 we go the other way, we will revert them
1460 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1461 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1465 if ((*i)->active()) {
1466 (*i)->deactivate ();
1467 (*i)->set_next_ab_is_active (true);
1469 (*i)->set_next_ab_is_active (false);
1475 /* backward = if the redirect was marked to go active on the next ab, do so */
1477 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1479 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1483 if ((*i)->get_next_ab_is_active()) {
1486 (*i)->deactivate ();
1491 _session.set_dirty ();
1495 /** Remove processors with a given placement.
1496 * @param p Placement of processors to remove.
1499 Route::clear_processors (Placement p)
1501 if (!_session.engine().connected()) {
1505 bool already_deleting = _session.deletion_in_progress();
1506 if (!already_deleting) {
1507 _session.set_deletion_in_progress();
1511 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1512 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1513 ProcessorList new_list;
1514 ProcessorStreams err;
1515 bool seen_amp = false;
1517 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1523 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1525 /* you can't remove these */
1527 new_list.push_back (*i);
1534 new_list.push_back (*i);
1537 (*i)->drop_references ();
1545 (*i)->drop_references ();
1548 new_list.push_back (*i);
1555 _processors = new_list;
1556 configure_processors_unlocked (&err); // this can't fail
1559 processor_max_streams.reset();
1560 _have_internal_generator = false;
1561 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1562 set_processor_positions ();
1564 reset_instrument_info ();
1566 if (!already_deleting) {
1567 _session.clear_deletion_in_progress();
1572 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1574 // TODO once the export point can be configured properly, do something smarter here
1575 if (processor == _capturing_processor) {
1576 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1577 if (need_process_lock) {
1581 _capturing_processor.reset();
1583 if (need_process_lock) {
1588 /* these can never be removed */
1590 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1594 if (!_session.engine().connected()) {
1598 processor_max_streams.reset();
1601 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1602 if (need_process_lock) {
1606 /* Caller must hold process lock */
1607 assert (!AudioEngine::instance()->process_lock().trylock());
1609 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1611 ProcessorState pstate (this);
1613 ProcessorList::iterator i;
1614 bool removed = false;
1616 for (i = _processors.begin(); i != _processors.end(); ) {
1617 if (*i == processor) {
1619 /* move along, see failure case for configure_processors()
1620 where we may need to reconfigure the processor.
1623 /* stop redirects that send signals to JACK ports
1624 from causing noise as a result of no longer being
1628 boost::shared_ptr<IOProcessor> iop;
1630 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1634 i = _processors.erase (i);
1642 _output->set_user_latency (0);
1650 if (configure_processors_unlocked (err)) {
1652 /* we know this will work, because it worked before :) */
1653 configure_processors_unlocked (0);
1657 _have_internal_generator = false;
1659 for (i = _processors.begin(); i != _processors.end(); ++i) {
1660 boost::shared_ptr<PluginInsert> pi;
1662 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1663 if (pi->has_no_inputs ()) {
1664 _have_internal_generator = true;
1669 if (need_process_lock) {
1674 reset_instrument_info ();
1675 processor->drop_references ();
1676 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1677 set_processor_positions ();
1683 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1685 ProcessorList deleted;
1687 if (!_session.engine().connected()) {
1691 processor_max_streams.reset();
1694 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1695 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1696 ProcessorState pstate (this);
1698 ProcessorList::iterator i;
1699 boost::shared_ptr<Processor> processor;
1701 for (i = _processors.begin(); i != _processors.end(); ) {
1705 /* these can never be removed */
1707 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1712 /* see if its in the list of processors to delete */
1714 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1719 /* stop IOProcessors that send to JACK ports
1720 from causing noise as a result of no longer being
1724 boost::shared_ptr<IOProcessor> iop;
1726 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1730 deleted.push_back (processor);
1731 i = _processors.erase (i);
1734 if (deleted.empty()) {
1735 /* none of those in the requested list were found */
1739 _output->set_user_latency (0);
1741 if (configure_processors_unlocked (err)) {
1743 /* we know this will work, because it worked before :) */
1744 configure_processors_unlocked (0);
1749 _have_internal_generator = false;
1751 for (i = _processors.begin(); i != _processors.end(); ++i) {
1752 boost::shared_ptr<PluginInsert> pi;
1754 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1755 if (pi->has_no_inputs ()) {
1756 _have_internal_generator = true;
1763 /* now try to do what we need to so that those that were removed will be deleted */
1765 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1766 (*i)->drop_references ();
1769 reset_instrument_info ();
1770 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1771 set_processor_positions ();
1777 Route::reset_instrument_info ()
1779 boost::shared_ptr<Processor> instr = the_instrument();
1781 _instrument_info.set_internal_instrument (instr);
1785 /** Caller must hold process lock */
1787 Route::configure_processors (ProcessorStreams* err)
1789 #ifndef PLATFORM_WINDOWS
1790 assert (!AudioEngine::instance()->process_lock().trylock());
1793 if (!_in_configure_processors) {
1794 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1795 return configure_processors_unlocked (err);
1802 Route::input_streams () const
1804 return _input->n_ports ();
1807 list<pair<ChanCount, ChanCount> >
1808 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1810 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1812 return try_configure_processors_unlocked (in, err);
1815 list<pair<ChanCount, ChanCount> >
1816 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1818 // Check each processor in order to see if we can configure as requested
1820 list<pair<ChanCount, ChanCount> > configuration;
1823 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1824 DEBUG_TRACE (DEBUG::Processors, "{\n");
1826 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1828 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1829 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1830 DEBUG_TRACE (DEBUG::Processors, "}\n");
1831 return list<pair<ChanCount, ChanCount> > ();
1834 if ((*p)->can_support_io_configuration(in, out)) {
1835 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1836 configuration.push_back(make_pair(in, out));
1843 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1844 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1845 DEBUG_TRACE (DEBUG::Processors, "}\n");
1846 return list<pair<ChanCount, ChanCount> > ();
1850 DEBUG_TRACE (DEBUG::Processors, "}\n");
1852 return configuration;
1855 /** Set the input/output configuration of each processor in the processors list.
1856 * Caller must hold process lock.
1857 * Return 0 on success, otherwise configuration is impossible.
1860 Route::configure_processors_unlocked (ProcessorStreams* err)
1862 #ifndef PLATFORM_WINDOWS
1863 assert (!AudioEngine::instance()->process_lock().trylock());
1866 if (_in_configure_processors) {
1870 /* put invisible processors where they should be */
1871 setup_invisible_processors ();
1873 _in_configure_processors = true;
1875 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1877 if (configuration.empty ()) {
1878 _in_configure_processors = false;
1883 bool seen_mains_out = false;
1884 processor_out_streams = _input->n_ports();
1885 processor_max_streams.reset();
1887 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1888 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1890 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1894 (*p)->configure_io(c->first, c->second);
1895 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1896 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1899 if (boost::dynamic_pointer_cast<Delivery> (*p)
1900 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1901 /* main delivery will increase port count to match input.
1902 * the Delivery::Main is usually the last processor - followed only by
1905 seen_mains_out = true;
1907 if (!seen_mains_out) {
1908 processor_out_streams = out;
1914 _meter->reset_max_channels (processor_max_streams);
1917 /* make sure we have sufficient scratch buffers to cope with the new processor
1920 _session.ensure_buffers (n_process_buffers ());
1922 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1924 _in_configure_processors = false;
1928 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1929 * @param state New active state for those processors.
1932 Route::all_visible_processors_active (bool state)
1934 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1936 if (_processors.empty()) {
1940 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1941 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1948 (*i)->deactivate ();
1952 _session.set_dirty ();
1956 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1958 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1959 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1960 processors in the current actual processor list that are hidden. Any visible processors
1961 in the current list but not in "new_order" will be assumed to be deleted.
1965 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1966 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1967 ProcessorState pstate (this);
1969 ProcessorList::iterator oiter;
1970 ProcessorList::const_iterator niter;
1971 ProcessorList as_it_will_be;
1973 oiter = _processors.begin();
1974 niter = new_order.begin();
1976 while (niter != new_order.end()) {
1978 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1979 then append it to the temp list.
1981 Otherwise, see if the next processor in the old list is in the new list. if not,
1982 its been deleted. If its there, append it to the temp list.
1985 if (oiter == _processors.end()) {
1987 /* no more elements in the old list, so just stick the rest of
1988 the new order onto the temp list.
1991 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1992 while (niter != new_order.end()) {
1999 if (!(*oiter)->display_to_user()) {
2001 as_it_will_be.push_back (*oiter);
2005 /* visible processor: check that its in the new order */
2007 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2008 /* deleted: do nothing, shared_ptr<> will clean up */
2010 /* ignore this one, and add the next item from the new order instead */
2011 as_it_will_be.push_back (*niter);
2016 /* now remove from old order - its taken care of no matter what */
2017 oiter = _processors.erase (oiter);
2022 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2024 /* If the meter is in a custom position, find it and make a rough note of its position */
2025 maybe_note_meter_position ();
2027 if (configure_processors_unlocked (err)) {
2033 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2034 set_processor_positions ();
2046 Route::get_template()
2048 return state(false);
2052 Route::state(bool full_state)
2054 XMLNode *node = new XMLNode("Route");
2055 ProcessorList::iterator i;
2058 id().print (buf, sizeof (buf));
2059 node->add_property("id", buf);
2060 node->add_property ("name", _name);
2061 node->add_property("default-type", _default_type.to_string());
2064 node->add_property("flags", enum_2_string (_flags));
2067 node->add_property("active", _active?"yes":"no");
2069 boost::to_string (_phase_invert, p);
2070 node->add_property("phase-invert", p);
2071 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2072 node->add_property("meter-point", enum_2_string (_meter_point));
2074 node->add_property("meter-type", enum_2_string (_meter_type));
2077 node->add_property("route-group", _route_group->name());
2080 snprintf (buf, sizeof (buf), "%d", _order_key);
2081 node->add_property ("order-key", buf);
2082 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2083 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2084 node->add_property ("soloed-by-upstream", buf);
2085 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2086 node->add_property ("soloed-by-downstream", buf);
2087 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2088 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2090 node->add_child_nocopy (_input->state (full_state));
2091 node->add_child_nocopy (_output->state (full_state));
2092 node->add_child_nocopy (_solo_control->get_state ());
2093 node->add_child_nocopy (_mute_control->get_state ());
2094 node->add_child_nocopy (_mute_master->get_state ());
2097 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2100 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2101 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2102 remote_control_node->add_property (X_("id"), buf);
2103 node->add_child_nocopy (*remote_control_node);
2105 if (_comment.length()) {
2106 XMLNode *cmt = node->add_child ("Comment");
2107 cmt->add_content (_comment);
2111 node->add_child_nocopy (_pannable->state (full_state));
2114 for (i = _processors.begin(); i != _processors.end(); ++i) {
2116 /* template save: do not include internal sends functioning as
2117 aux sends because the chance of the target ID
2118 in the session where this template is used
2121 similarly, do not save listen sends which connect to
2122 the monitor section, because these will always be
2125 boost::shared_ptr<InternalSend> is;
2127 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2128 if (is->role() == Delivery::Listen) {
2133 node->add_child_nocopy((*i)->state (full_state));
2137 node->add_child_copy (*_extra_xml);
2140 if (_custom_meter_position_noted) {
2141 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2143 after->id().print (buf, sizeof (buf));
2144 node->add_property (X_("processor-after-last-custom-meter"), buf);
2147 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
2154 Route::set_state (const XMLNode& node, int version)
2156 if (version < 3000) {
2157 return set_state_2X (node, version);
2161 XMLNodeConstIterator niter;
2163 const XMLProperty *prop;
2165 if (node.name() != "Route"){
2166 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2170 if ((prop = node.property (X_("name"))) != 0) {
2171 Route::set_name (prop->value());
2175 _initial_io_setup = true;
2177 if ((prop = node.property (X_("flags"))) != 0) {
2178 _flags = Flag (string_2_enum (prop->value(), _flags));
2183 if (is_master() || is_monitor() || is_auditioner()) {
2184 _mute_master->set_solo_ignore (true);
2188 /* monitor bus does not get a panner, but if (re)created
2189 via XML, it will already have one by the time we
2190 call ::set_state(). so ... remove it.
2195 /* add all processors (except amp, which is always present) */
2197 nlist = node.children();
2198 XMLNode processor_state (X_("processor_state"));
2200 Stateful::save_extra_xml (node);
2202 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2206 if (child->name() == IO::state_node_name) {
2207 if ((prop = child->property (X_("direction"))) == 0) {
2211 if (prop->value() == "Input") {
2212 _input->set_state (*child, version);
2213 } else if (prop->value() == "Output") {
2214 _output->set_state (*child, version);
2218 if (child->name() == X_("Processor")) {
2219 processor_state.add_child_copy (*child);
2222 if (child->name() == X_("Pannable")) {
2224 _pannable->set_state (*child, version);
2226 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2231 if ((prop = node.property (X_("meter-point"))) != 0) {
2232 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2233 set_meter_point (mp, true);
2235 _meter->set_display_to_user (_meter_point == MeterCustom);
2239 if ((prop = node.property (X_("meter-type"))) != 0) {
2240 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2243 _initial_io_setup = false;
2245 set_processor_state (processor_state);
2247 // this looks up the internal instrument in processors
2248 reset_instrument_info();
2250 if ((prop = node.property ("self-solo")) != 0) {
2251 set_self_solo (string_is_affirmative (prop->value()));
2254 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2255 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2256 mod_solo_by_others_upstream (atoi (prop->value()));
2259 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2260 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2261 mod_solo_by_others_downstream (atoi (prop->value()));
2264 if ((prop = node.property ("solo-isolated")) != 0) {
2265 set_solo_isolated (string_is_affirmative (prop->value()), this);
2268 if ((prop = node.property ("solo-safe")) != 0) {
2269 set_solo_safe (string_is_affirmative (prop->value()), this);
2272 if ((prop = node.property (X_("phase-invert"))) != 0) {
2273 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2276 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2277 set_denormal_protection (string_is_affirmative (prop->value()));
2280 if ((prop = node.property (X_("active"))) != 0) {
2281 bool yn = string_is_affirmative (prop->value());
2282 _active = !yn; // force switch
2283 set_active (yn, this);
2286 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2287 set_order_key (atoi(prop->value()));
2290 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2294 string::size_type colon, equal;
2295 string remaining = prop->value();
2297 while (remaining.length()) {
2299 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2300 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2303 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2304 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2307 string keyname = remaining.substr (0, equal);
2309 if ((keyname == "EditorSort") || (keyname == "editor")) {
2310 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2316 colon = remaining.find_first_of (':');
2318 if (colon != string::npos) {
2319 remaining = remaining.substr (colon+1);
2326 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2327 PBD::ID id (prop->value ());
2328 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2329 ProcessorList::const_iterator i = _processors.begin ();
2330 while (i != _processors.end() && (*i)->id() != id) {
2334 if (i != _processors.end ()) {
2335 _processor_after_last_custom_meter = *i;
2336 _custom_meter_position_noted = true;
2340 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2341 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2344 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2347 if (child->name() == X_("Comment")) {
2349 /* XXX this is a terrible API design in libxml++ */
2351 XMLNode *cmt = *(child->children().begin());
2352 _comment = cmt->content();
2354 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2355 if (prop->value() == "solo") {
2356 _solo_control->set_state (*child, version);
2357 } else if (prop->value() == "mute") {
2358 _mute_control->set_state (*child, version);
2361 } else if (child->name() == X_("RemoteControl")) {
2362 if ((prop = child->property (X_("id"))) != 0) {
2364 sscanf (prop->value().c_str(), "%d", &x);
2365 set_remote_control_id_internal (x);
2368 } else if (child->name() == X_("MuteMaster")) {
2369 _mute_master->set_state (*child, version);
2371 } else if (child->name() == Automatable::xml_node_name) {
2372 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2380 Route::set_state_2X (const XMLNode& node, int version)
2382 LocaleGuard lg (X_("C"));
2384 XMLNodeConstIterator niter;
2386 const XMLProperty *prop;
2388 /* 2X things which still remain to be handled:
2394 if (node.name() != "Route") {
2395 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2399 if ((prop = node.property (X_("flags"))) != 0) {
2400 string f = prop->value ();
2401 boost::replace_all (f, "ControlOut", "MonitorOut");
2402 _flags = Flag (string_2_enum (f, _flags));
2407 if (is_master() || is_monitor() || is_auditioner()) {
2408 _mute_master->set_solo_ignore (true);
2411 if ((prop = node.property (X_("phase-invert"))) != 0) {
2412 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2413 if (string_is_affirmative (prop->value ())) {
2416 set_phase_invert (p);
2419 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2420 set_denormal_protection (string_is_affirmative (prop->value()));
2423 if ((prop = node.property (X_("soloed"))) != 0) {
2424 bool yn = string_is_affirmative (prop->value());
2426 /* XXX force reset of solo status */
2428 set_solo (yn, this);
2431 if ((prop = node.property (X_("muted"))) != 0) {
2434 bool muted = string_is_affirmative (prop->value());
2440 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2442 if (string_is_affirmative (prop->value())){
2443 mute_point = mute_point + "PreFader";
2448 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2450 if (string_is_affirmative (prop->value())){
2453 mute_point = mute_point + ",";
2456 mute_point = mute_point + "PostFader";
2461 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2463 if (string_is_affirmative (prop->value())){
2466 mute_point = mute_point + ",";
2469 mute_point = mute_point + "Listen";
2474 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2476 if (string_is_affirmative (prop->value())){
2479 mute_point = mute_point + ",";
2482 mute_point = mute_point + "Main";
2486 _mute_master->set_mute_points (mute_point);
2487 _mute_master->set_muted_by_self (true);
2491 if ((prop = node.property (X_("meter-point"))) != 0) {
2492 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2495 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2496 don't mean the same thing.
2499 if ((prop = node.property (X_("order-keys"))) != 0) {
2503 string::size_type colon, equal;
2504 string remaining = prop->value();
2506 while (remaining.length()) {
2508 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2509 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2512 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2513 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2516 string keyname = remaining.substr (0, equal);
2518 if (keyname == "EditorSort" || keyname == "editor") {
2519 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2525 colon = remaining.find_first_of (':');
2527 if (colon != string::npos) {
2528 remaining = remaining.substr (colon+1);
2537 nlist = node.children ();
2538 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2542 if (child->name() == IO::state_node_name) {
2544 /* there is a note in IO::set_state_2X() about why we have to call
2548 _input->set_state_2X (*child, version, true);
2549 _output->set_state_2X (*child, version, false);
2551 if ((prop = child->property (X_("name"))) != 0) {
2552 Route::set_name (prop->value ());
2557 if ((prop = child->property (X_("active"))) != 0) {
2558 bool yn = string_is_affirmative (prop->value());
2559 _active = !yn; // force switch
2560 set_active (yn, this);
2563 if ((prop = child->property (X_("gain"))) != 0) {
2566 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2567 _amp->gain_control()->set_value (val);
2571 /* Set up Panners in the IO */
2572 XMLNodeList io_nlist = child->children ();
2574 XMLNodeConstIterator io_niter;
2577 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2579 io_child = *io_niter;
2581 if (io_child->name() == X_("Panner")) {
2582 _main_outs->panner_shell()->set_state(*io_child, version);
2583 } else if (io_child->name() == X_("Automation")) {
2584 /* IO's automation is for the fader */
2585 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2591 XMLNodeList redirect_nodes;
2593 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2597 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2598 redirect_nodes.push_back(child);
2603 set_processor_state_2X (redirect_nodes, version);
2605 Stateful::save_extra_xml (node);
2607 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2610 if (child->name() == X_("Comment")) {
2612 /* XXX this is a terrible API design in libxml++ */
2614 XMLNode *cmt = *(child->children().begin());
2615 _comment = cmt->content();
2617 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2618 if (prop->value() == X_("solo")) {
2619 _solo_control->set_state (*child, version);
2620 } else if (prop->value() == X_("mute")) {
2621 _mute_control->set_state (*child, version);
2624 } else if (child->name() == X_("RemoteControl")) {
2625 if ((prop = child->property (X_("id"))) != 0) {
2627 sscanf (prop->value().c_str(), "%d", &x);
2628 set_remote_control_id_internal (x);
2638 Route::get_processor_state ()
2640 XMLNode* root = new XMLNode (X_("redirects"));
2641 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2642 root->add_child_nocopy ((*i)->state (true));
2649 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2651 /* We don't bother removing existing processors not in nList, as this
2652 method will only be called when creating a Route from scratch, not
2653 for undo purposes. Just put processors in at the appropriate place
2657 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2658 add_processor_from_xml_2X (**i, version);
2663 Route::set_processor_state (const XMLNode& node)
2665 const XMLNodeList &nlist = node.children();
2666 XMLNodeConstIterator niter;
2667 ProcessorList new_order;
2668 bool must_configure = false;
2670 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2672 XMLProperty* prop = (*niter)->property ("type");
2674 if (prop->value() == "amp") {
2675 _amp->set_state (**niter, Stateful::current_state_version);
2676 new_order.push_back (_amp);
2677 } else if (prop->value() == "trim") {
2678 _trim->set_state (**niter, Stateful::current_state_version);
2679 new_order.push_back (_trim);
2680 } else if (prop->value() == "meter") {
2681 _meter->set_state (**niter, Stateful::current_state_version);
2682 new_order.push_back (_meter);
2683 } else if (prop->value() == "delay") {
2685 _delayline->set_state (**niter, Stateful::current_state_version);
2686 new_order.push_back (_delayline);
2688 } else if (prop->value() == "main-outs") {
2689 _main_outs->set_state (**niter, Stateful::current_state_version);
2690 } else if (prop->value() == "intreturn") {
2692 _intreturn.reset (new InternalReturn (_session));
2693 must_configure = true;
2695 _intreturn->set_state (**niter, Stateful::current_state_version);
2696 } else if (is_monitor() && prop->value() == "monitor") {
2697 if (!_monitor_control) {
2698 _monitor_control.reset (new MonitorProcessor (_session));
2699 must_configure = true;
2701 _monitor_control->set_state (**niter, Stateful::current_state_version);
2702 } else if (prop->value() == "capture") {
2703 /* CapturingProcessor should never be restored, it's always
2704 added explicitly when needed */
2706 ProcessorList::iterator o;
2708 for (o = _processors.begin(); o != _processors.end(); ++o) {
2709 XMLProperty* id_prop = (*niter)->property(X_("id"));
2710 if (id_prop && (*o)->id() == id_prop->value()) {
2711 (*o)->set_state (**niter, Stateful::current_state_version);
2712 new_order.push_back (*o);
2717 // If the processor (*niter) is not on the route then create it
2719 if (o == _processors.end()) {
2721 boost::shared_ptr<Processor> processor;
2723 if (prop->value() == "intsend") {
2725 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2727 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2728 prop->value() == "lv2" ||
2729 prop->value() == "windows-vst" ||
2730 prop->value() == "lxvst" ||
2731 prop->value() == "audiounit") {
2733 processor.reset (new PluginInsert(_session));
2735 } else if (prop->value() == "port") {
2737 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2739 } else if (prop->value() == "send") {
2741 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2744 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2748 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2749 /* This processor could not be configured. Turn it into a UnknownProcessor */
2750 processor.reset (new UnknownProcessor (_session, **niter));
2753 /* we have to note the monitor send here, otherwise a new one will be created
2754 and the state of this one will be lost.
2756 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2757 if (isend && isend->role() == Delivery::Listen) {
2758 _monitor_send = isend;
2761 /* it doesn't matter if invisible processors are added here, as they
2762 will be sorted out by setup_invisible_processors () shortly.
2765 new_order.push_back (processor);
2766 must_configure = true;
2772 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2773 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2774 _processors = new_order;
2776 if (must_configure) {
2777 configure_processors_unlocked (0);
2780 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2782 (*i)->set_owner (this);
2783 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2785 boost::shared_ptr<PluginInsert> pi;
2787 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2788 if (pi->has_no_inputs ()) {
2789 _have_internal_generator = true;
2796 reset_instrument_info ();
2797 processors_changed (RouteProcessorChange ());
2798 set_processor_positions ();
2802 Route::curve_reallocate ()
2804 // _gain_automation_curve.finish_resize ();
2805 // _pan_automation_curve.finish_resize ();
2809 Route::silence (framecnt_t nframes)
2811 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2816 silence_unlocked (nframes);
2820 Route::silence_unlocked (framecnt_t nframes)
2822 /* Must be called with the processor lock held */
2826 _output->silence (nframes);
2828 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2829 boost::shared_ptr<PluginInsert> pi;
2831 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2832 // skip plugins, they don't need anything when we're not active
2836 (*i)->silence (nframes);
2839 if (nframes == _session.get_block_size()) {
2846 Route::add_internal_return ()
2849 _intreturn.reset (new InternalReturn (_session));
2850 add_processor (_intreturn, PreFader);
2855 Route::add_send_to_internal_return (InternalSend* send)
2857 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2859 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2860 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2863 return d->add_send (send);
2869 Route::remove_send_from_internal_return (InternalSend* send)
2871 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2873 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2874 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2877 return d->remove_send (send);
2883 Route::enable_monitor_send ()
2885 /* Caller must hold process lock */
2886 assert (!AudioEngine::instance()->process_lock().trylock());
2888 /* master never sends to monitor section via the normal mechanism */
2889 assert (!is_master ());
2890 assert (!is_monitor ());
2892 /* make sure we have one */
2893 if (!_monitor_send) {
2894 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
2895 _monitor_send->set_display_to_user (false);
2899 configure_processors (0);
2902 /** Add an aux send to a route.
2903 * @param route route to send to.
2904 * @param before Processor to insert before, or 0 to insert at the end.
2907 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2909 assert (route != _session.monitor_out ());
2912 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2914 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2916 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2918 if (d && d->target_route() == route) {
2919 /* already listening via the specified IO: do nothing */
2927 boost::shared_ptr<InternalSend> listener;
2930 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2931 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
2932 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
2935 add_processor (listener, before);
2937 } catch (failed_constructor& err) {
2945 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2947 ProcessorStreams err;
2948 ProcessorList::iterator tmp;
2951 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2953 /* have to do this early because otherwise processor reconfig
2954 * will put _monitor_send back in the list
2957 if (route == _session.monitor_out()) {
2958 _monitor_send.reset ();
2962 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2964 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2966 if (d && d->target_route() == route) {
2968 remove_processor (*x, &err, false);
2971 /* list could have been demolished while we dropped the lock
2982 Route::set_comment (string cmt, void *src)
2985 comment_changed (src);
2986 _session.set_dirty ();
2990 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2992 FeedRecord fr (other, via_sends_only);
2994 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2996 if (!result.second) {
2998 /* already a record for "other" - make sure sends-only information is correct */
2999 if (!via_sends_only && result.first->sends_only) {
3000 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3001 frp->sends_only = false;
3005 return result.second;
3009 Route::clear_fed_by ()
3015 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3017 const FedBy& fed_by (other->fed_by());
3019 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3020 boost::shared_ptr<Route> sr = f->r.lock();
3022 if (sr && (sr.get() == this)) {
3024 if (via_sends_only) {
3025 *via_sends_only = f->sends_only;
3036 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3038 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3040 if (_output->connected_to (other->input())) {
3041 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3042 if (via_send_only) {
3043 *via_send_only = false;
3050 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3052 boost::shared_ptr<IOProcessor> iop;
3054 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3055 if (iop->feeds (other)) {
3056 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3057 if (via_send_only) {
3058 *via_send_only = true;
3062 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3065 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3070 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3075 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3077 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3080 /** Called from the (non-realtime) butler thread when the transport is stopped */
3082 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3084 framepos_t now = _session.transport_frame();
3087 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3089 Automatable::transport_stopped (now);
3091 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3093 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3097 (*i)->transport_stopped (now);
3101 _roll_delay = _initial_delay;
3105 Route::input_change_handler (IOChange change, void * /*src*/)
3107 bool need_to_queue_solo_change = true;
3109 if ((change.type & IOChange::ConfigurationChanged)) {
3110 /* This is called with the process lock held if change
3111 contains ConfigurationChanged
3113 need_to_queue_solo_change = false;
3114 configure_processors (0);
3115 _phase_invert.resize (_input->n_ports().n_audio ());
3116 io_changed (); /* EMIT SIGNAL */
3119 if (!_input->connected() && _soloed_by_others_upstream) {
3120 if (need_to_queue_solo_change) {
3121 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3123 cancel_solo_after_disconnect (true);
3129 Route::output_change_handler (IOChange change, void * /*src*/)
3131 bool need_to_queue_solo_change = true;
3132 if (_initial_io_setup) {
3136 if ((change.type & IOChange::ConfigurationChanged)) {
3137 /* This is called with the process lock held if change
3138 contains ConfigurationChanged
3140 need_to_queue_solo_change = false;
3141 configure_processors (0);
3144 _session.reset_monitor_section();
3147 io_changed (); /* EMIT SIGNAL */
3150 if (!_output->connected() && _soloed_by_others_downstream) {
3151 if (need_to_queue_solo_change) {
3152 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3154 cancel_solo_after_disconnect (false);
3160 Route::cancel_solo_after_disconnect (bool upstream)
3163 _soloed_by_others_upstream = 0;
3165 _soloed_by_others_downstream = 0;
3167 set_mute_master_solo ();
3168 solo_changed (false, this);
3172 Route::pans_required () const
3174 if (n_outputs().n_audio() < 2) {
3178 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3182 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3184 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3190 if (n_outputs().n_total() == 0) {
3194 if (!_active || n_inputs() == ChanCount::ZERO) {
3195 silence_unlocked (nframes);
3199 if (session_state_changing) {
3200 if (_session.transport_speed() != 0.0f) {
3201 /* we're rolling but some state is changing (e.g. our diskstream contents)
3202 so we cannot use them. Be silent till this is over.
3204 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3206 silence_unlocked (nframes);
3209 /* we're really not rolling, so we're either delivery silence or actually
3210 monitoring, both of which are safe to do while session_state_changing is true.
3214 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3216 fill_buffers_with_input (bufs, _input, nframes);
3218 if (_meter_point == MeterInput) {
3219 _meter->run (bufs, start_frame, end_frame, nframes, true);
3222 _amp->apply_gain_automation (false);
3223 _trim->apply_gain_automation (false);
3224 passthru (bufs, start_frame, end_frame, nframes, 0);
3230 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3232 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3237 if (n_outputs().n_total() == 0) {
3241 if (!_active || n_inputs().n_total() == 0) {
3242 silence_unlocked (nframes);
3246 framepos_t unused = 0;
3248 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3254 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3256 fill_buffers_with_input (bufs, _input, nframes);
3258 if (_meter_point == MeterInput) {
3259 _meter->run (bufs, start_frame, end_frame, nframes, true);
3262 passthru (bufs, start_frame, end_frame, nframes, declick);
3268 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3275 Route::flush_processors ()
3277 /* XXX shouldn't really try to take this lock, since
3278 this is called from the RT audio thread.
3281 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3283 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3289 Route::set_meter_point (MeterPoint p, bool force)
3291 if (_meter_point == p && !force) {
3295 bool meter_was_visible_to_user = _meter->display_to_user ();
3298 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3299 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3301 maybe_note_meter_position ();
3305 if (_meter_point != MeterCustom) {
3307 _meter->set_display_to_user (false);
3309 setup_invisible_processors ();
3313 _meter->set_display_to_user (true);
3315 /* If we have a previous position for the custom meter, try to put it there */
3316 if (_custom_meter_position_noted) {
3317 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3320 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3321 if (i != _processors.end ()) {
3322 _processors.remove (_meter);
3323 _processors.insert (i, _meter);
3325 } else if (_last_custom_meter_was_at_end) {
3326 _processors.remove (_meter);
3327 _processors.push_back (_meter);
3332 /* Set up the meter for its new position */
3334 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3338 if (loc == _processors.begin()) {
3339 m_in = _input->n_ports();
3341 ProcessorList::iterator before = loc;
3343 m_in = (*before)->output_streams ();
3346 _meter->reflect_inputs (m_in);
3348 /* we do not need to reconfigure the processors, because the meter
3349 (a) is always ready to handle processor_max_streams
3350 (b) is always an N-in/N-out processor, and thus moving
3351 it doesn't require any changes to the other processors.
3355 meter_change (); /* EMIT SIGNAL */
3357 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3359 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3363 Route::listen_position_changed ()
3366 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3367 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3368 ProcessorState pstate (this);
3370 if (configure_processors_unlocked (0)) {
3372 configure_processors_unlocked (0); // it worked before we tried to add it ...
3377 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3378 _session.set_dirty ();
3381 boost::shared_ptr<CapturingProcessor>
3382 Route::add_export_point()
3384 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3385 if (!_capturing_processor) {
3387 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3388 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3390 _capturing_processor.reset (new CapturingProcessor (_session));
3391 _capturing_processor->activate ();
3393 configure_processors_unlocked (0);
3397 return _capturing_processor;
3401 Route::update_signal_latency ()
3403 framecnt_t l = _output->user_latency();
3404 framecnt_t lamp = 0;
3405 bool before_amp = true;
3406 framecnt_t ltrim = 0;
3407 bool before_trim = true;
3409 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3410 if ((*i)->active ()) {
3411 l += (*i)->signal_latency ();
3416 if ((*i) == _trim) {
3427 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3429 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3430 _signal_latency_at_amp_position = lamp;
3431 _signal_latency_at_trim_position = ltrim;
3433 if (_signal_latency != l) {
3434 _signal_latency = l;
3435 signal_latency_changed (); /* EMIT SIGNAL */
3438 return _signal_latency;
3442 Route::set_user_latency (framecnt_t nframes)
3444 _output->set_user_latency (nframes);
3445 _session.update_latency_compensation ();
3449 Route::set_latency_compensation (framecnt_t longest_session_latency)
3451 framecnt_t old = _initial_delay;
3453 if (_signal_latency < longest_session_latency) {
3454 _initial_delay = longest_session_latency - _signal_latency;
3459 DEBUG_TRACE (DEBUG::Latency, string_compose (
3460 "%1: compensate for maximum latency of %2,"
3461 "given own latency of %3, using initial delay of %4\n",
3462 name(), longest_session_latency, _signal_latency, _initial_delay));
3464 if (_initial_delay != old) {
3465 initial_delay_changed (); /* EMIT SIGNAL */
3468 if (_session.transport_stopped()) {
3469 _roll_delay = _initial_delay;
3473 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3474 : AutomationControl (r->session(),
3475 Evoral::Parameter (SoloAutomation),
3476 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3477 boost::shared_ptr<AutomationList>(), name)
3480 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3481 gl->set_interpolation(Evoral::ControlList::Discrete);
3486 Route::SoloControllable::set_value (double val)
3488 const bool bval = ((val >= 0.5) ? true : false);
3490 boost::shared_ptr<RouteList> rl (new RouteList);
3492 boost::shared_ptr<Route> r = _route.lock ();
3499 if (Config->get_solo_control_is_listen_control()) {
3500 _session.set_listen (rl, bval);
3502 _session.set_solo (rl, bval);
3507 Route::SoloControllable::get_value () const
3509 boost::shared_ptr<Route> r = _route.lock ();
3514 if (Config->get_solo_control_is_listen_control()) {
3515 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3517 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3521 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3522 : AutomationControl (r->session(),
3523 Evoral::Parameter (MuteAutomation),
3524 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3525 boost::shared_ptr<AutomationList>(),
3529 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3530 gl->set_interpolation(Evoral::ControlList::Discrete);
3535 Route::MuteControllable::set_superficial_value(bool muted)
3537 /* Note we can not use AutomationControl::set_value here since it will emit
3538 Changed(), but the value will not be correct to the observer. */
3540 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3542 Control::set_double (muted, _session.transport_frame(), to_list);
3546 Route::MuteControllable::set_value (double val)
3548 const bool bval = ((val >= 0.5) ? true : false);
3550 boost::shared_ptr<Route> r = _route.lock ();
3555 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3556 // Playing back automation, set route mute directly
3557 r->set_mute (bval, this);
3559 // Set from user, queue mute event
3560 boost::shared_ptr<RouteList> rl (new RouteList);
3562 _session.set_mute (rl, bval, Session::rt_cleanup);
3565 // Set superficial/automation value to drive controller (and possibly record)
3566 set_superficial_value(bval);
3570 Route::MuteControllable::get_value () const
3572 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3573 // Playing back automation, get the value from the list
3574 return AutomationControl::get_value();
3577 // Not playing back automation, get the actual route mute value
3578 boost::shared_ptr<Route> r = _route.lock ();
3579 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3583 Route::set_block_size (pframes_t nframes)
3585 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3586 (*i)->set_block_size (nframes);
3589 _session.ensure_buffers (n_process_buffers ());
3593 Route::protect_automation ()
3595 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3596 (*i)->protect_automation();
3599 /** @param declick 1 to set a pending declick fade-in,
3600 * -1 to set a pending declick fade-out
3603 Route::set_pending_declick (int declick)
3606 /* this call is not allowed to turn off a pending declick */
3608 _pending_declick = declick;
3611 _pending_declick = 0;
3615 /** Shift automation forwards from a particular place, thereby inserting time.
3616 * Adds undo commands for any shifts that are performed.
3618 * @param pos Position to start shifting from.
3619 * @param frames Amount to shift forwards by.
3623 Route::shift (framepos_t pos, framecnt_t frames)
3625 /* gain automation */
3627 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3629 XMLNode &before = gc->alist()->get_state ();
3630 gc->alist()->shift (pos, frames);
3631 XMLNode &after = gc->alist()->get_state ();
3632 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3635 /* gain automation */
3637 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3639 XMLNode &before = gc->alist()->get_state ();
3640 gc->alist()->shift (pos, frames);
3641 XMLNode &after = gc->alist()->get_state ();
3642 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3645 // TODO mute automation ??
3647 /* pan automation */
3649 ControlSet::Controls& c (_pannable->controls());
3651 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3652 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3654 boost::shared_ptr<AutomationList> al = pc->alist();
3655 XMLNode& before = al->get_state ();
3656 al->shift (pos, frames);
3657 XMLNode& after = al->get_state ();
3658 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3663 /* redirect automation */
3665 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3666 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3668 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3670 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3671 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3673 boost::shared_ptr<AutomationList> al = ac->alist();
3674 XMLNode &before = al->get_state ();
3675 al->shift (pos, frames);
3676 XMLNode &after = al->get_state ();
3677 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3686 Route::save_as_template (const string& path, const string& name)
3688 XMLNode& node (state (false));
3691 IO::set_name_in_state (*node.children().front(), name);
3693 tree.set_root (&node);
3694 return tree.write (path.c_str());
3699 Route::set_name (const string& str)
3701 if (str == name()) {
3705 string name = Route::ensure_track_or_route_name (str, _session);
3706 SessionObject::set_name (name);
3708 bool ret = (_input->set_name(name) && _output->set_name(name));
3711 /* rename the main outs. Leave other IO processors
3712 * with whatever name they already have, because its
3713 * just fine as it is (it will not contain the route
3714 * name if its a port insert, port send or port return).
3718 if (_main_outs->set_name (name)) {
3719 /* XXX returning false here is stupid because
3720 we already changed the route name.
3730 /** Set the name of a route in an XML description.
3731 * @param node XML <Route> node to set the name in.
3732 * @param name New name.
3735 Route::set_name_in_state (XMLNode& node, string const & name)
3737 node.add_property (X_("name"), name);
3739 XMLNodeList children = node.children();
3740 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3742 if ((*i)->name() == X_("IO")) {
3744 IO::set_name_in_state (**i, name);
3746 } else if ((*i)->name() == X_("Processor")) {
3748 XMLProperty* role = (*i)->property (X_("role"));
3749 if (role && role->value() == X_("Main")) {
3750 (*i)->add_property (X_("name"), name);
3753 } else if ((*i)->name() == X_("Diskstream")) {
3755 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3756 (*i)->add_property (X_("name"), name);
3762 boost::shared_ptr<Send>
3763 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3765 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3767 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3768 boost::shared_ptr<InternalSend> send;
3770 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3771 if (send->target_route() == target) {
3777 return boost::shared_ptr<Send>();
3780 /** @param c Audio channel index.
3781 * @param yn true to invert phase, otherwise false.
3784 Route::set_phase_invert (uint32_t c, bool yn)
3786 if (_phase_invert[c] != yn) {
3787 _phase_invert[c] = yn;
3788 phase_invert_changed (); /* EMIT SIGNAL */
3789 _session.set_dirty ();
3794 Route::set_phase_invert (boost::dynamic_bitset<> p)
3796 if (_phase_invert != p) {
3798 phase_invert_changed (); /* EMIT SIGNAL */
3799 _session.set_dirty ();
3804 Route::phase_invert (uint32_t c) const
3806 return _phase_invert[c];
3809 boost::dynamic_bitset<>
3810 Route::phase_invert () const
3812 return _phase_invert;
3816 Route::set_denormal_protection (bool yn)
3818 if (_denormal_protection != yn) {
3819 _denormal_protection = yn;
3820 denormal_protection_changed (); /* EMIT SIGNAL */
3825 Route::denormal_protection () const
3827 return _denormal_protection;
3831 Route::set_active (bool yn, void* src)
3833 if (_session.transport_rolling()) {
3837 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3838 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3842 if (_active != yn) {
3844 _input->set_active (yn);
3845 _output->set_active (yn);
3846 active_changed (); // EMIT SIGNAL
3847 _session.set_dirty ();
3854 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3860 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3862 boost::shared_ptr<Send> s;
3863 boost::shared_ptr<Return> r;
3865 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3866 s->meter()->meter();
3867 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3868 r->meter()->meter ();
3873 boost::shared_ptr<Pannable>
3874 Route::pannable() const
3879 boost::shared_ptr<Panner>
3880 Route::panner() const
3883 return _main_outs->panner_shell()->panner();
3886 boost::shared_ptr<PannerShell>
3887 Route::panner_shell() const
3889 return _main_outs->panner_shell();
3892 boost::shared_ptr<AutomationControl>
3893 Route::gain_control() const
3895 return _amp->gain_control();
3898 boost::shared_ptr<AutomationControl>
3899 Route::get_control (const Evoral::Parameter& param)
3901 /* either we own the control or .... */
3903 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3907 /* maybe one of our processors does or ... */
3909 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3910 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3911 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3919 /* nobody does so we'll make a new one */
3921 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3928 boost::shared_ptr<Processor>
3929 Route::nth_plugin (uint32_t n)
3931 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3932 ProcessorList::iterator i;
3934 for (i = _processors.begin(); i != _processors.end(); ++i) {
3935 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3942 return boost::shared_ptr<Processor> ();
3945 boost::shared_ptr<Processor>
3946 Route::nth_send (uint32_t n)
3948 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3949 ProcessorList::iterator i;
3951 for (i = _processors.begin(); i != _processors.end(); ++i) {
3952 if (boost::dynamic_pointer_cast<Send> (*i)) {
3959 return boost::shared_ptr<Processor> ();
3963 Route::has_io_processor_named (const string& name)
3965 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3966 ProcessorList::iterator i;
3968 for (i = _processors.begin(); i != _processors.end(); ++i) {
3969 if (boost::dynamic_pointer_cast<Send> (*i) ||
3970 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3971 if ((*i)->name() == name) {
3980 MuteMaster::MutePoint
3981 Route::mute_points () const
3983 return _mute_master->mute_points ();
3987 Route::set_processor_positions ()
3989 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3991 bool had_amp = false;
3992 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3993 (*i)->set_pre_fader (!had_amp);
3994 if (boost::dynamic_pointer_cast<Amp> (*i)) {
4000 /** Called when there is a proposed change to the input port count */
4002 Route::input_port_count_changing (ChanCount to)
4004 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4006 /* The processors cannot be configured with the new input arrangement, so
4012 /* The change is ok */
4016 /** Called when there is a proposed change to the output port count */
4018 Route::output_port_count_changing (ChanCount to)
4020 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4021 if (processor_out_streams.get(*t) > to.get(*t)) {
4025 /* The change is ok */
4030 Route::unknown_processors () const
4034 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4035 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4036 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4037 p.push_back ((*i)->name ());
4046 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4048 /* we assume that all our input ports feed all our output ports. its not
4049 universally true, but the alternative is way too corner-case to worry about.
4052 LatencyRange all_connections;
4055 all_connections.min = 0;
4056 all_connections.max = 0;
4058 all_connections.min = ~((pframes_t) 0);
4059 all_connections.max = 0;
4061 /* iterate over all "from" ports and determine the latency range for all of their
4062 connections to the "outside" (outside of this Route).
4065 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4069 p->get_connected_latency_range (range, playback);
4071 all_connections.min = min (all_connections.min, range.min);
4072 all_connections.max = max (all_connections.max, range.max);
4076 /* set the "from" port latencies to the max/min range of all their connections */
4078 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4079 p->set_private_latency_range (all_connections, playback);
4082 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4084 all_connections.min += our_latency;
4085 all_connections.max += our_latency;
4087 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4088 p->set_private_latency_range (all_connections, playback);
4091 return all_connections.max;
4095 Route::set_private_port_latencies (bool playback) const
4097 framecnt_t own_latency = 0;
4099 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4100 OR LATENCY CALLBACK.
4102 This is called (early) from the latency callback. It computes the REAL
4103 latency associated with each port and stores the result as the "private"
4104 latency of the port. A later call to Route::set_public_port_latencies()
4105 sets all ports to the same value to reflect the fact that we do latency
4106 compensation and so all signals are delayed by the same amount as they
4107 flow through ardour.
4110 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4111 if ((*i)->active ()) {
4112 own_latency += (*i)->signal_latency ();
4117 /* playback: propagate latency from "outside the route" to outputs to inputs */
4118 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4120 /* capture: propagate latency from "outside the route" to inputs to outputs */
4121 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4126 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4128 /* this is called to set the JACK-visible port latencies, which take
4129 latency compensation into account.
4138 const PortSet& ports (_input->ports());
4139 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4140 p->set_public_latency_range (range, playback);
4145 const PortSet& ports (_output->ports());
4146 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4147 p->set_public_latency_range (range, playback);
4152 /** Put the invisible processors in the right place in _processors.
4153 * Must be called with a writer lock on _processor_lock held.
4156 Route::setup_invisible_processors ()
4159 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4160 assert (!lm.locked ());
4164 /* too early to be doing this stuff */
4168 /* we'll build this new list here and then use it */
4170 ProcessorList new_processors;
4172 /* find visible processors */
4174 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4175 if ((*i)->display_to_user ()) {
4176 new_processors.push_back (*i);
4182 ProcessorList::iterator amp = new_processors.begin ();
4183 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
4187 assert (amp != new_processors.end ());
4189 /* and the processor after the amp */
4191 ProcessorList::iterator after_amp = amp;
4197 switch (_meter_point) {
4199 assert (!_meter->display_to_user ());
4200 new_processors.push_front (_meter);
4203 assert (!_meter->display_to_user ());
4204 new_processors.insert (amp, _meter);
4206 case MeterPostFader:
4207 /* do nothing here */
4210 /* do nothing here */
4213 /* the meter is visible, so we don't touch it here */
4220 assert (_main_outs);
4221 assert (!_main_outs->display_to_user ());
4222 new_processors.push_back (_main_outs);
4224 /* iterator for the main outs */
4226 ProcessorList::iterator main = new_processors.end();
4229 /* OUTPUT METERING */
4231 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4232 assert (!_meter->display_to_user ());
4234 /* add the processor just before or just after the main outs */
4236 ProcessorList::iterator meter_point = main;
4238 if (_meter_point == MeterOutput) {
4241 new_processors.insert (meter_point, _meter);
4246 if (_monitor_send && !is_monitor ()) {
4247 assert (!_monitor_send->display_to_user ());
4248 if (Config->get_solo_control_is_listen_control()) {
4249 switch (Config->get_listen_position ()) {
4250 case PreFaderListen:
4251 switch (Config->get_pfl_position ()) {
4252 case PFLFromBeforeProcessors:
4253 new_processors.push_front (_monitor_send);
4255 case PFLFromAfterProcessors:
4256 new_processors.insert (amp, _monitor_send);
4259 _monitor_send->set_can_pan (false);
4261 case AfterFaderListen:
4262 switch (Config->get_afl_position ()) {
4263 case AFLFromBeforeProcessors:
4264 new_processors.insert (after_amp, _monitor_send);
4266 case AFLFromAfterProcessors:
4267 new_processors.insert (new_processors.end(), _monitor_send);
4270 _monitor_send->set_can_pan (true);
4274 new_processors.insert (new_processors.end(), _monitor_send);
4275 _monitor_send->set_can_pan (false);
4279 #if 0 // not used - just yet
4280 if (!is_master() && !is_monitor() && !is_auditioner()) {
4281 new_processors.push_front (_delayline);
4285 /* MONITOR CONTROL */
4287 if (_monitor_control && is_monitor ()) {
4288 assert (!_monitor_control->display_to_user ());
4289 new_processors.push_front (_monitor_control);
4292 /* INTERNAL RETURN */
4294 /* doing this here means that any monitor control will come just after
4299 assert (!_intreturn->display_to_user ());
4300 new_processors.push_front (_intreturn);
4303 if (_trim && _trim->active()) {
4304 assert (!_trim->display_to_user ());
4305 new_processors.push_front (_trim);
4307 /* EXPORT PROCESSOR */
4309 if (_capturing_processor) {
4310 assert (!_capturing_processor->display_to_user ());
4311 new_processors.push_front (_capturing_processor);
4314 _processors = new_processors;
4316 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4317 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4318 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4325 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4326 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4330 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4331 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4338 /** If the meter point is `Custom', make a note of where the meter is.
4339 * This is so that if the meter point is subsequently set to something else,
4340 * and then back to custom, we can put the meter back where it was last time
4341 * custom was enabled.
4343 * Must be called with the _processor_lock held.
4346 Route::maybe_note_meter_position ()
4348 if (_meter_point != MeterCustom) {
4352 _custom_meter_position_noted = true;
4353 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4354 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4355 ProcessorList::iterator j = i;
4357 if (j != _processors.end ()) {
4358 _processor_after_last_custom_meter = *j;
4359 _last_custom_meter_was_at_end = false;
4361 _last_custom_meter_was_at_end = true;
4367 boost::shared_ptr<Processor>
4368 Route::processor_by_id (PBD::ID id) const
4370 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4371 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4372 if ((*i)->id() == id) {
4377 return boost::shared_ptr<Processor> ();
4380 /** @return the monitoring state, or in other words what data we are pushing
4381 * into the route (data from the inputs, data from disk or silence)
4384 Route::monitoring_state () const
4386 return MonitoringInput;
4389 /** @return what we should be metering; either the data coming from the input
4390 * IO or the data that is flowing through the route.
4393 Route::metering_state () const
4395 return MeteringRoute;
4399 Route::has_external_redirects () const
4401 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4403 /* ignore inactive processors and obviously ignore the main
4404 * outs since everything has them and we don't care.
4407 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4415 boost::shared_ptr<Processor>
4416 Route::the_instrument () const
4418 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4419 return the_instrument_unlocked ();
4422 boost::shared_ptr<Processor>
4423 Route::the_instrument_unlocked () const
4425 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4426 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4427 if ((*i)->input_streams().n_midi() > 0 &&
4428 (*i)->output_streams().n_audio() > 0) {
4433 return boost::shared_ptr<Processor>();
4439 Route::non_realtime_locate (framepos_t pos)
4442 _pannable->transport_located (pos);
4445 if (_delayline.get()) {
4446 _delayline.get()->flush();
4450 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4451 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4453 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4454 (*i)->transport_located (pos);
4460 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4467 * We don't currently mix MIDI input together, so we don't need the
4468 * complex logic of the audio case.
4471 n_buffers = bufs.count().n_midi ();
4473 for (i = 0; i < n_buffers; ++i) {
4475 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4476 MidiBuffer& buf (bufs.get_midi (i));
4479 buf.copy (source_port->get_midi_buffer(nframes));
4481 buf.silence (nframes);
4487 n_buffers = bufs.count().n_audio();
4489 size_t n_ports = io->n_ports().n_audio();
4490 float scaling = 1.0f;
4492 if (n_ports > n_buffers) {
4493 scaling = ((float) n_buffers) / n_ports;
4496 for (i = 0; i < n_ports; ++i) {
4498 /* if there are more ports than buffers, map them onto buffers
4499 * in a round-robin fashion
4502 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4503 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4506 if (i < n_buffers) {
4508 /* first time through just copy a channel into
4512 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4514 if (scaling != 1.0f) {
4515 buf.apply_gain (scaling, nframes);
4520 /* on subsequent times around, merge data from
4521 * the port with what is already there
4524 if (scaling != 1.0f) {
4525 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4527 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4532 /* silence any remaining buffers */
4534 for (; i < n_buffers; ++i) {
4535 AudioBuffer& buf (bufs.get_audio (i));
4536 buf.silence (nframes);
4539 /* establish the initial setup of the buffer set, reflecting what was
4540 copied into it. unless, of course, we are the auditioner, in which
4541 case nothing was fed into it from the inputs at all.
4544 if (!is_auditioner()) {
4545 bufs.set_count (io->n_ports());