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_port.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/buffer.h"
43 #include "ardour/buffer_set.h"
44 #include "ardour/capturing_processor.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/internal_return.h"
48 #include "ardour/internal_send.h"
49 #include "ardour/meter.h"
50 #include "ardour/delayline.h"
51 #include "ardour/midi_buffer.h"
52 #include "ardour/midi_port.h"
53 #include "ardour/monitor_processor.h"
54 #include "ardour/pannable.h"
55 #include "ardour/panner.h"
56 #include "ardour/panner_shell.h"
57 #include "ardour/plugin_insert.h"
58 #include "ardour/port.h"
59 #include "ardour/port_insert.h"
60 #include "ardour/processor.h"
61 #include "ardour/route.h"
62 #include "ardour/route_group.h"
63 #include "ardour/send.h"
64 #include "ardour/session.h"
65 #include "ardour/unknown_processor.h"
66 #include "ardour/utils.h"
71 using namespace ARDOUR;
74 PBD::Signal0<void> Route::SyncOrderKeys;
75 PBD::Signal0<void> Route::RemoteControlIDChange;
77 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
78 : SessionObject (sess, name)
80 , GraphNode (sess._process_graph)
86 , _pending_declick (true)
87 , _meter_point (MeterPostFader)
88 , _meter_type (MeterPeak)
90 , _soloed_by_others_upstream (0)
91 , _soloed_by_others_downstream (0)
93 , _denormal_protection (false)
96 , _declickable (false)
97 , _mute_master (new MuteMaster (sess, name))
98 , _have_internal_generator (false)
100 , _default_type (default_type)
102 , _has_order_key (false)
103 , _remote_control_id (0)
104 , _in_configure_processors (false)
105 , _initial_io_setup (false)
106 , _custom_meter_position_noted (false)
107 , _last_custom_meter_was_at_end (false)
110 _meter_type = MeterK20;
112 processor_max_streams.reset();
118 /* add standard controls */
120 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
121 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
123 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
124 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
126 add_control (_solo_control);
127 add_control (_mute_control);
131 if (!(_flags & Route::MonitorOut)) {
132 _pannable.reset (new Pannable (_session));
135 /* input and output objects */
137 _input.reset (new IO (_session, _name, IO::Input, _default_type));
138 _output.reset (new IO (_session, _name, IO::Output, _default_type));
140 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
141 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
143 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
144 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
146 if (!is_master() && !is_monitor() && !is_auditioner()) {
147 _delayline.reset (new DelayLine (_session, _name));
148 add_processor (_delayline, PreFader);
151 /* add amp processor */
153 _amp.reset (new Amp (_session));
154 add_processor (_amp, PostFader);
156 /* create standard processors: meter, main outs, monitor out;
157 they will be added to _processors by setup_invisible_processors ()
160 _meter.reset (new PeakMeter (_session, _name));
161 _meter->set_owner (this);
162 _meter->set_display_to_user (false);
165 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
166 _main_outs->activate ();
169 /* where we listen to tracks */
170 _intreturn.reset (new InternalReturn (_session));
171 _intreturn->activate ();
173 /* the thing that provides proper control over a control/monitor/listen bus
174 (such as per-channel cut, dim, solo, invert, etc).
176 _monitor_control.reset (new MonitorProcessor (_session));
177 _monitor_control->activate ();
180 if (is_master() || is_monitor() || is_auditioner()) {
181 _mute_master->set_solo_ignore (true);
184 /* now that we have _meter, its safe to connect to this */
186 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
189 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
190 configure_processors (0);
198 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
200 /* do this early so that we don't get incoming signals as we are going through destruction
205 /* don't use clear_processors here, as it depends on the session which may
206 be half-destroyed by now
209 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
210 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
211 (*i)->drop_references ();
214 _processors.clear ();
218 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
220 if (Config->get_remote_model() != UserOrdered) {
224 set_remote_control_id_internal (id, notify_class_listeners);
228 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
230 /* force IDs for master/monitor busses and prevent
231 any other route from accidentally getting these IDs
232 (i.e. legacy sessions)
235 if (is_master() && id != MasterBusRemoteControlID) {
236 id = MasterBusRemoteControlID;
239 if (is_monitor() && id != MonitorBusRemoteControlID) {
240 id = MonitorBusRemoteControlID;
247 /* don't allow it to collide */
249 if (!is_master () && !is_monitor() &&
250 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
251 id += MonitorBusRemoteControlID;
254 if (id != remote_control_id()) {
255 _remote_control_id = id;
256 RemoteControlIDChanged ();
258 if (notify_class_listeners) {
259 RemoteControlIDChange ();
265 Route::remote_control_id() const
268 return MasterBusRemoteControlID;
272 return MonitorBusRemoteControlID;
275 return _remote_control_id;
279 Route::has_order_key () const
281 return _has_order_key;
285 Route::order_key () const
291 Route::set_remote_control_id_explicit (uint32_t rid)
293 if (is_master() || is_monitor() || is_auditioner()) {
294 /* hard-coded remote IDs, or no remote ID */
298 if (_remote_control_id != rid) {
299 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
300 _remote_control_id = rid;
301 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
304 /* don't emit the class-level RID signal RemoteControlIDChange here,
305 leave that to the entity that changed the order key, so that we
306 don't get lots of emissions for no good reasons (e.g. when changing
307 all route order keys).
309 See Session::sync_remote_id_from_order_keys() for the (primary|only)
310 spot where that is emitted.
315 Route::set_order_key (uint32_t n)
317 _has_order_key = true;
319 if (_order_key == n) {
325 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
326 name(), order_key ()));
328 _session.set_dirty ();
332 Route::ensure_track_or_route_name(string name, Session &session)
334 string newname = name;
336 while (!session.io_name_is_legal (newname)) {
337 newname = bump_name_once (newname, '.');
345 Route::inc_gain (gain_t fraction, void *src)
347 _amp->inc_gain (fraction, src);
351 Route::set_gain (gain_t val, void *src)
353 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
355 if (_route_group->is_relative()) {
357 gain_t usable_gain = _amp->gain();
358 if (usable_gain < 0.000001f) {
359 usable_gain = 0.000001f;
363 if (delta < 0.000001f) {
367 delta -= usable_gain;
372 gain_t factor = delta / usable_gain;
375 factor = _route_group->get_max_factor(factor);
376 if (factor == 0.0f) {
377 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
381 factor = _route_group->get_min_factor(factor);
382 if (factor == 0.0f) {
383 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
388 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
392 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
398 if (val == _amp->gain()) {
402 _amp->set_gain (val, src);
406 Route::maybe_declick (BufferSet&, framecnt_t, int)
408 /* this is the "bus" implementation and they never declick.
413 /** Process this route for one (sub) cycle (process thread)
415 * @param bufs Scratch buffers to use for the signal path
416 * @param start_frame Initial transport frame
417 * @param end_frame Final transport frame
418 * @param nframes Number of frames to output (to ports)
420 * Note that (end_frame - start_frame) may not be equal to nframes when the
421 * transport speed isn't 1.0 (eg varispeed).
424 Route::process_output_buffers (BufferSet& bufs,
425 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
426 int declick, bool gain_automation_ok)
428 /* Caller must hold process lock */
429 assert (!AudioEngine::instance()->process_lock().trylock());
431 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
434 /* figure out if we're going to use gain automation */
435 if (gain_automation_ok) {
436 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
437 _amp->setup_gain_automation (start_frame, end_frame, nframes);
439 _amp->apply_gain_automation (false);
442 /* Tell main outs what to do about monitoring. We do this so that
443 on a transition between monitoring states we get a de-clicking gain
444 change in the _main_outs delivery.
447 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
449 /* -------------------------------------------------------------------------------------------
450 GLOBAL DECLICK (for transport changes etc.)
451 ----------------------------------------------------------------------------------------- */
453 maybe_declick (bufs, nframes, declick);
454 _pending_declick = 0;
456 /* -------------------------------------------------------------------------------------------
457 DENORMAL CONTROL/PHASE INVERT
458 ----------------------------------------------------------------------------------------- */
460 if (_phase_invert.any ()) {
464 if (_denormal_protection || Config->get_denormal_protection()) {
466 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
467 Sample* const sp = i->data();
469 if (_phase_invert[chn]) {
470 for (pframes_t nx = 0; nx < nframes; ++nx) {
475 for (pframes_t nx = 0; nx < nframes; ++nx) {
483 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
484 Sample* const sp = i->data();
486 if (_phase_invert[chn]) {
487 for (pframes_t nx = 0; nx < nframes; ++nx) {
496 if (_denormal_protection || Config->get_denormal_protection()) {
498 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
499 Sample* const sp = i->data();
500 for (pframes_t nx = 0; nx < nframes; ++nx) {
508 /* -------------------------------------------------------------------------------------------
510 ----------------------------------------------------------------------------------------- */
512 /* set this to be true if the meter will already have been ::run() earlier */
513 bool const meter_already_run = metering_state() == MeteringInput;
515 framecnt_t latency = 0;
517 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
519 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
520 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
525 /* if it has any inputs, make sure they match */
526 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
527 if (bufs.count() != (*i)->input_streams()) {
529 DEBUG::Processors, string_compose (
530 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
531 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
538 /* should we NOT run plugins here if the route is inactive?
539 do we catch route != active somewhere higher?
542 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
543 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
546 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
547 bufs.set_count ((*i)->output_streams());
549 if ((*i)->active ()) {
550 latency += (*i)->signal_latency ();
556 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
557 boost::shared_ptr<Processor> endpoint,
558 bool include_endpoint, bool for_export, bool for_freeze)
560 /* If no processing is required, there's no need to go any further. */
561 if (!endpoint && !include_endpoint) {
565 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
566 _amp->setup_gain_automation (start, start + nframes, nframes);
568 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
570 if (!include_endpoint && (*i) == endpoint) {
574 /* if we're not exporting, stop processing if we come across a routing processor. */
575 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
578 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
582 /* don't run any processors that does routing.
583 * oh, and don't bother with the peak meter either.
585 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
586 (*i)->run (buffers, start, start+nframes, nframes, true);
587 buffers.set_count ((*i)->output_streams());
590 if ((*i) == endpoint) {
597 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
598 bool include_endpoint, bool for_export, bool for_freeze) const
600 framecnt_t latency = 0;
601 if (!endpoint && !include_endpoint) {
605 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
606 if (!include_endpoint && (*i) == endpoint) {
609 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
612 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
615 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
616 latency += (*i)->signal_latency ();
618 if ((*i) == endpoint) {
626 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
627 bool include_endpoint, bool for_export, bool for_freeze) const
629 if (!endpoint && !include_endpoint) {
633 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
634 if (!include_endpoint && (*i) == endpoint) {
637 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
640 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
643 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
644 cc = (*i)->output_streams();
646 if ((*i) == endpoint) {
654 Route::n_process_buffers ()
656 return max (_input->n_ports(), processor_max_streams);
660 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
662 assert (is_monitor());
663 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
664 fill_buffers_with_input (bufs, _input, nframes);
665 passthru (bufs, start_frame, end_frame, nframes, declick);
669 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
673 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
675 /* control/monitor bus ignores input ports when something is
676 feeding the listen "stream". data will "arrive" into the
677 route from the intreturn processor element.
680 bufs.silence (nframes, 0);
683 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
684 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
688 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
690 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
692 bufs.set_count (_input->n_ports());
693 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
694 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
698 Route::set_listen (bool yn, void* src)
704 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
705 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
710 if (yn != _monitor_send->active()) {
712 _monitor_send->activate ();
713 _mute_master->set_soloed (true);
715 _monitor_send->deactivate ();
716 _mute_master->set_soloed (false);
719 listen_changed (src); /* EMIT SIGNAL */
725 Route::listening_via_monitor () const
728 return _monitor_send->active ();
735 Route::set_solo_safe (bool yn, void *src)
737 if (_solo_safe != yn) {
739 solo_safe_changed (src);
744 Route::solo_safe() const
750 Route::set_solo (bool yn, void *src)
753 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
757 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
758 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
762 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
763 name(), yn, src, (src == _route_group), self_soloed()));
765 if (self_soloed() != yn) {
767 set_mute_master_solo ();
768 solo_changed (true, src); /* EMIT SIGNAL */
769 _solo_control->Changed (); /* EMIT SIGNAL */
774 Route::set_self_solo (bool yn)
776 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
781 Route::mod_solo_by_others_upstream (int32_t delta)
784 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
788 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
789 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
791 uint32_t old_sbu = _soloed_by_others_upstream;
794 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
795 _soloed_by_others_upstream += delta;
797 _soloed_by_others_upstream = 0;
800 _soloed_by_others_upstream += delta;
803 DEBUG_TRACE (DEBUG::Solo, string_compose (
804 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
805 name(), delta, _soloed_by_others_upstream, old_sbu,
806 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
808 /* push the inverse solo change to everything that feeds us.
810 This is important for solo-within-group. When we solo 1 track out of N that
811 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
812 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
813 tracks that feed it. This will silence them if they were audible because
814 of a bus solo, but the newly soloed track will still be audible (because
817 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
821 if ((_self_solo || _soloed_by_others_downstream) &&
822 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
823 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
825 if (delta > 0 || !Config->get_exclusive_solo()) {
826 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
827 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
828 boost::shared_ptr<Route> sr = i->r.lock();
830 sr->mod_solo_by_others_downstream (-delta);
836 set_mute_master_solo ();
837 solo_changed (false, this);
841 Route::mod_solo_by_others_downstream (int32_t delta)
844 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
848 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
849 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
852 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
853 _soloed_by_others_downstream += delta;
855 _soloed_by_others_downstream = 0;
858 _soloed_by_others_downstream += delta;
861 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
863 set_mute_master_solo ();
864 solo_changed (false, this);
868 Route::set_mute_master_solo ()
870 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
874 Route::set_solo_isolated (bool yn, void *src)
876 if (is_master() || is_monitor() || is_auditioner()) {
880 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
881 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
885 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
887 boost::shared_ptr<RouteList> routes = _session.get_routes ();
888 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
890 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
895 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
897 if (does_feed && !sends_only) {
898 (*i)->set_solo_isolated (yn, (*i)->route_group());
902 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
904 bool changed = false;
907 if (_solo_isolated == 0) {
908 _mute_master->set_solo_ignore (true);
913 if (_solo_isolated > 0) {
915 if (_solo_isolated == 0) {
916 _mute_master->set_solo_ignore (false);
923 solo_isolated_changed (src);
928 Route::solo_isolated () const
930 return _solo_isolated > 0;
934 Route::set_mute_points (MuteMaster::MutePoint mp)
936 _mute_master->set_mute_points (mp);
937 mute_points_changed (); /* EMIT SIGNAL */
939 if (_mute_master->muted_by_self()) {
940 mute_changed (this); /* EMIT SIGNAL */
941 _mute_control->Changed (); /* EMIT SIGNAL */
946 Route::set_mute (bool yn, void *src)
948 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
949 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
954 _mute_master->set_muted_by_self (yn);
955 /* allow any derived classes to respond to the mute change
956 before anybody else knows about it.
959 /* tell everyone else */
960 mute_changed (src); /* EMIT SIGNAL */
961 _mute_control->Changed (); /* EMIT SIGNAL */
966 Route::muted () const
968 return _mute_master->muted_by_self();
973 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
975 cerr << name << " {" << endl;
976 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
977 p != procs.end(); ++p) {
978 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
984 /** Supposing that we want to insert a Processor at a given Placement, return
985 * the processor to add the new one before (or 0 to add at the end).
987 boost::shared_ptr<Processor>
988 Route::before_processor_for_placement (Placement p)
990 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
992 ProcessorList::iterator loc;
995 /* generic pre-fader: insert immediately before the amp */
996 loc = find (_processors.begin(), _processors.end(), _amp);
998 /* generic post-fader: insert right before the main outs */
999 loc = find (_processors.begin(), _processors.end(), _main_outs);
1002 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1005 /** Supposing that we want to insert a Processor at a given index, return
1006 * the processor to add the new one before (or 0 to add at the end).
1008 boost::shared_ptr<Processor>
1009 Route::before_processor_for_index (int index)
1012 return boost::shared_ptr<Processor> ();
1015 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1017 ProcessorList::iterator i = _processors.begin ();
1019 while (i != _processors.end() && j < index) {
1020 if ((*i)->display_to_user()) {
1027 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1030 /** Add a processor either pre- or post-fader
1031 * @return 0 on success, non-0 on failure.
1034 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1036 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1040 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1041 * @param index Index to add the processor at, or -1 to add at the end of the list.
1042 * @return 0 on success, non-0 on failure.
1045 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1047 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1050 /** Add a processor to the route.
1051 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1052 * @return 0 on success, non-0 on failure.
1055 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1057 assert (processor != _meter);
1058 assert (processor != _main_outs);
1060 DEBUG_TRACE (DEBUG::Processors, string_compose (
1061 "%1 adding processor %2\n", name(), processor->name()));
1063 if (!AudioEngine::instance()->connected() || !processor) {
1068 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1069 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1070 ProcessorState pstate (this);
1072 boost::shared_ptr<PluginInsert> pi;
1073 boost::shared_ptr<PortInsert> porti;
1075 if (processor == _amp) {
1076 /* Ensure that only one amp is in the list at any time */
1077 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1078 if (check != _processors.end()) {
1079 if (before == _amp) {
1080 /* Already in position; all is well */
1083 _processors.erase (check);
1088 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1090 ProcessorList::iterator loc;
1092 /* inserting before a processor; find it */
1093 loc = find (_processors.begin(), _processors.end(), before);
1094 if (loc == _processors.end ()) {
1099 /* inserting at end */
1100 loc = _processors.end ();
1103 _processors.insert (loc, processor);
1104 processor->set_owner (this);
1106 // Set up processor list channels. This will set processor->[input|output]_streams(),
1107 // configure redirect ports properly, etc.
1110 if (configure_processors_unlocked (err)) {
1112 configure_processors_unlocked (0); // it worked before we tried to add it ...
1117 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1119 if (pi->has_no_inputs ()) {
1120 /* generator plugin */
1121 _have_internal_generator = true;
1126 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1127 processor->activate ();
1130 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1132 _output->set_user_latency (0);
1135 reset_instrument_info ();
1136 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1137 set_processor_positions ();
1143 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1145 const XMLProperty *prop;
1148 boost::shared_ptr<Processor> processor;
1150 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1151 so that we can add the processor in the right place (pre/post-fader)
1154 XMLNodeList const & children = node.children ();
1155 XMLNodeList::const_iterator i = children.begin ();
1157 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1161 Placement placement = PreFader;
1163 if (i != children.end()) {
1164 if ((prop = (*i)->property (X_("placement"))) != 0) {
1165 placement = Placement (string_2_enum (prop->value(), placement));
1169 if (node.name() == "Insert") {
1171 if ((prop = node.property ("type")) != 0) {
1173 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1174 prop->value() == "lv2" ||
1175 prop->value() == "windows-vst" ||
1176 prop->value() == "lxvst" ||
1177 prop->value() == "audiounit") {
1179 processor.reset (new PluginInsert (_session));
1183 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1188 } else if (node.name() == "Send") {
1190 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1191 processor.reset (new Send (_session, sendpan, _mute_master));
1195 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1199 if (processor->set_state (node, version)) {
1203 return (add_processor (processor, placement) == 0);
1206 catch (failed_constructor &err) {
1207 warning << _("processor could not be created. Ignored.") << endmsg;
1213 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1215 /* NOTE: this is intended to be used ONLY when copying
1216 processors from another Route. Hence the subtle
1217 differences between this and ::add_processor()
1220 ProcessorList::iterator loc;
1223 loc = find(_processors.begin(), _processors.end(), before);
1225 /* nothing specified - at end */
1226 loc = _processors.end ();
1229 if (!_session.engine().connected()) {
1233 if (others.empty()) {
1238 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1239 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1240 ProcessorState pstate (this);
1242 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1248 boost::shared_ptr<PluginInsert> pi;
1250 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1254 _processors.insert (loc, *i);
1255 (*i)->set_owner (this);
1257 if ((*i)->active()) {
1261 /* Think: does this really need to be called for every processor in the loop? */
1263 if (configure_processors_unlocked (err)) {
1265 configure_processors_unlocked (0); // it worked before we tried to add it ...
1270 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1273 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1274 boost::shared_ptr<PluginInsert> pi;
1276 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1277 if (pi->has_no_inputs ()) {
1278 _have_internal_generator = true;
1284 _output->set_user_latency (0);
1287 reset_instrument_info ();
1288 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1289 set_processor_positions ();
1295 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1297 if (p == PreFader) {
1298 start = _processors.begin();
1299 end = find(_processors.begin(), _processors.end(), _amp);
1301 start = find(_processors.begin(), _processors.end(), _amp);
1303 end = _processors.end();
1307 /** Turn off all processors with a given placement
1308 * @param p Placement of processors to disable
1311 Route::disable_processors (Placement p)
1313 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1315 ProcessorList::iterator start, end;
1316 placement_range(p, start, end);
1318 for (ProcessorList::iterator i = start; i != end; ++i) {
1319 (*i)->deactivate ();
1322 _session.set_dirty ();
1325 /** Turn off all redirects
1328 Route::disable_processors ()
1330 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1332 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1333 (*i)->deactivate ();
1336 _session.set_dirty ();
1339 /** Turn off all redirects with a given placement
1340 * @param p Placement of redirects to disable
1343 Route::disable_plugins (Placement p)
1345 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1347 ProcessorList::iterator start, end;
1348 placement_range(p, start, end);
1350 for (ProcessorList::iterator i = start; i != end; ++i) {
1351 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1352 (*i)->deactivate ();
1356 _session.set_dirty ();
1359 /** Turn off all plugins
1362 Route::disable_plugins ()
1364 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1366 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1367 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1368 (*i)->deactivate ();
1372 _session.set_dirty ();
1377 Route::ab_plugins (bool forward)
1379 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1383 /* forward = turn off all active redirects, and mark them so that the next time
1384 we go the other way, we will revert them
1387 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1388 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1392 if ((*i)->active()) {
1393 (*i)->deactivate ();
1394 (*i)->set_next_ab_is_active (true);
1396 (*i)->set_next_ab_is_active (false);
1402 /* backward = if the redirect was marked to go active on the next ab, do so */
1404 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1406 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1410 if ((*i)->get_next_ab_is_active()) {
1413 (*i)->deactivate ();
1418 _session.set_dirty ();
1422 /** Remove processors with a given placement.
1423 * @param p Placement of processors to remove.
1426 Route::clear_processors (Placement p)
1428 if (!_session.engine().connected()) {
1432 bool already_deleting = _session.deletion_in_progress();
1433 if (!already_deleting) {
1434 _session.set_deletion_in_progress();
1438 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1439 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1440 ProcessorList new_list;
1441 ProcessorStreams err;
1442 bool seen_amp = false;
1444 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1450 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline) {
1452 /* you can't remove these */
1454 new_list.push_back (*i);
1461 new_list.push_back (*i);
1464 (*i)->drop_references ();
1472 (*i)->drop_references ();
1475 new_list.push_back (*i);
1482 _processors = new_list;
1483 configure_processors_unlocked (&err); // this can't fail
1486 processor_max_streams.reset();
1487 _have_internal_generator = false;
1488 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1489 set_processor_positions ();
1491 reset_instrument_info ();
1493 if (!already_deleting) {
1494 _session.clear_deletion_in_progress();
1499 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1501 // TODO once the export point can be configured properly, do something smarter here
1502 if (processor == _capturing_processor) {
1503 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1504 if (need_process_lock) {
1508 _capturing_processor.reset();
1510 if (need_process_lock) {
1515 /* these can never be removed */
1517 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline) {
1521 if (!_session.engine().connected()) {
1525 processor_max_streams.reset();
1528 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1529 if (need_process_lock) {
1533 /* Caller must hold process lock */
1534 assert (!AudioEngine::instance()->process_lock().trylock());
1536 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1538 ProcessorState pstate (this);
1540 ProcessorList::iterator i;
1541 bool removed = false;
1543 for (i = _processors.begin(); i != _processors.end(); ) {
1544 if (*i == processor) {
1546 /* move along, see failure case for configure_processors()
1547 where we may need to reconfigure the processor.
1550 /* stop redirects that send signals to JACK ports
1551 from causing noise as a result of no longer being
1555 boost::shared_ptr<IOProcessor> iop;
1557 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1561 i = _processors.erase (i);
1569 _output->set_user_latency (0);
1577 if (configure_processors_unlocked (err)) {
1579 /* we know this will work, because it worked before :) */
1580 configure_processors_unlocked (0);
1584 _have_internal_generator = false;
1586 for (i = _processors.begin(); i != _processors.end(); ++i) {
1587 boost::shared_ptr<PluginInsert> pi;
1589 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1590 if (pi->has_no_inputs ()) {
1591 _have_internal_generator = true;
1596 if (need_process_lock) {
1601 reset_instrument_info ();
1602 processor->drop_references ();
1603 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1604 set_processor_positions ();
1610 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1612 ProcessorList deleted;
1614 if (!_session.engine().connected()) {
1618 processor_max_streams.reset();
1621 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1622 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1623 ProcessorState pstate (this);
1625 ProcessorList::iterator i;
1626 boost::shared_ptr<Processor> processor;
1628 for (i = _processors.begin(); i != _processors.end(); ) {
1632 /* these can never be removed */
1634 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline) {
1639 /* see if its in the list of processors to delete */
1641 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1646 /* stop IOProcessors that send to JACK ports
1647 from causing noise as a result of no longer being
1651 boost::shared_ptr<IOProcessor> iop;
1653 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1657 deleted.push_back (processor);
1658 i = _processors.erase (i);
1661 if (deleted.empty()) {
1662 /* none of those in the requested list were found */
1666 _output->set_user_latency (0);
1668 if (configure_processors_unlocked (err)) {
1670 /* we know this will work, because it worked before :) */
1671 configure_processors_unlocked (0);
1676 _have_internal_generator = false;
1678 for (i = _processors.begin(); i != _processors.end(); ++i) {
1679 boost::shared_ptr<PluginInsert> pi;
1681 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1682 if (pi->has_no_inputs ()) {
1683 _have_internal_generator = true;
1690 /* now try to do what we need to so that those that were removed will be deleted */
1692 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1693 (*i)->drop_references ();
1696 reset_instrument_info ();
1697 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1698 set_processor_positions ();
1704 Route::reset_instrument_info ()
1706 boost::shared_ptr<Processor> instr = the_instrument();
1708 _instrument_info.set_internal_instrument (instr);
1712 /** Caller must hold process lock */
1714 Route::configure_processors (ProcessorStreams* err)
1716 #ifndef PLATFORM_WINDOWS
1717 assert (!AudioEngine::instance()->process_lock().trylock());
1720 if (!_in_configure_processors) {
1721 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1722 return configure_processors_unlocked (err);
1729 Route::input_streams () const
1731 return _input->n_ports ();
1734 list<pair<ChanCount, ChanCount> >
1735 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1737 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1739 return try_configure_processors_unlocked (in, err);
1742 list<pair<ChanCount, ChanCount> >
1743 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1745 // Check each processor in order to see if we can configure as requested
1747 list<pair<ChanCount, ChanCount> > configuration;
1750 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1751 DEBUG_TRACE (DEBUG::Processors, "{\n");
1753 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1755 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1756 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1757 DEBUG_TRACE (DEBUG::Processors, "}\n");
1758 return list<pair<ChanCount, ChanCount> > ();
1761 if ((*p)->can_support_io_configuration(in, out)) {
1762 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1763 configuration.push_back(make_pair(in, out));
1770 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1771 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1772 DEBUG_TRACE (DEBUG::Processors, "}\n");
1773 return list<pair<ChanCount, ChanCount> > ();
1777 DEBUG_TRACE (DEBUG::Processors, "}\n");
1779 return configuration;
1782 /** Set the input/output configuration of each processor in the processors list.
1783 * Caller must hold process lock.
1784 * Return 0 on success, otherwise configuration is impossible.
1787 Route::configure_processors_unlocked (ProcessorStreams* err)
1789 #ifndef PLATFORM_WINDOWS
1790 assert (!AudioEngine::instance()->process_lock().trylock());
1793 if (_in_configure_processors) {
1797 /* put invisible processors where they should be */
1798 setup_invisible_processors ();
1800 _in_configure_processors = true;
1802 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1804 if (configuration.empty ()) {
1805 _in_configure_processors = false;
1810 bool seen_mains_out = false;
1811 processor_out_streams = _input->n_ports();
1812 processor_max_streams.reset();
1814 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1815 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1817 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1821 (*p)->configure_io(c->first, c->second);
1822 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1823 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1826 if (boost::dynamic_pointer_cast<Delivery> (*p)
1827 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1828 /* main delivery will increase port count to match input.
1829 * the Delivery::Main is usually the last processor - followed only by
1832 seen_mains_out = true;
1834 if (!seen_mains_out) {
1835 processor_out_streams = out;
1841 _meter->reset_max_channels (processor_max_streams);
1844 /* make sure we have sufficient scratch buffers to cope with the new processor
1847 _session.ensure_buffers (n_process_buffers ());
1849 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1851 _in_configure_processors = false;
1855 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1856 * @param state New active state for those processors.
1859 Route::all_visible_processors_active (bool state)
1861 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1863 if (_processors.empty()) {
1867 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1868 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1875 (*i)->deactivate ();
1879 _session.set_dirty ();
1883 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1885 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1886 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1887 processors in the current actual processor list that are hidden. Any visible processors
1888 in the current list but not in "new_order" will be assumed to be deleted.
1892 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1893 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1894 ProcessorState pstate (this);
1896 ProcessorList::iterator oiter;
1897 ProcessorList::const_iterator niter;
1898 ProcessorList as_it_will_be;
1900 oiter = _processors.begin();
1901 niter = new_order.begin();
1903 while (niter != new_order.end()) {
1905 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1906 then append it to the temp list.
1908 Otherwise, see if the next processor in the old list is in the new list. if not,
1909 its been deleted. If its there, append it to the temp list.
1912 if (oiter == _processors.end()) {
1914 /* no more elements in the old list, so just stick the rest of
1915 the new order onto the temp list.
1918 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1919 while (niter != new_order.end()) {
1926 if (!(*oiter)->display_to_user()) {
1928 as_it_will_be.push_back (*oiter);
1932 /* visible processor: check that its in the new order */
1934 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1935 /* deleted: do nothing, shared_ptr<> will clean up */
1937 /* ignore this one, and add the next item from the new order instead */
1938 as_it_will_be.push_back (*niter);
1943 /* now remove from old order - its taken care of no matter what */
1944 oiter = _processors.erase (oiter);
1949 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1951 /* If the meter is in a custom position, find it and make a rough note of its position */
1952 maybe_note_meter_position ();
1954 if (configure_processors_unlocked (err)) {
1960 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1961 set_processor_positions ();
1973 Route::get_template()
1975 return state(false);
1979 Route::state(bool full_state)
1981 XMLNode *node = new XMLNode("Route");
1982 ProcessorList::iterator i;
1985 id().print (buf, sizeof (buf));
1986 node->add_property("id", buf);
1987 node->add_property ("name", _name);
1988 node->add_property("default-type", _default_type.to_string());
1991 node->add_property("flags", enum_2_string (_flags));
1994 node->add_property("active", _active?"yes":"no");
1996 boost::to_string (_phase_invert, p);
1997 node->add_property("phase-invert", p);
1998 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1999 node->add_property("meter-point", enum_2_string (_meter_point));
2001 node->add_property("meter-type", enum_2_string (_meter_type));
2004 node->add_property("route-group", _route_group->name());
2007 snprintf (buf, sizeof (buf), "%d", _order_key);
2008 node->add_property ("order-key", buf);
2009 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2010 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2011 node->add_property ("soloed-by-upstream", buf);
2012 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2013 node->add_property ("soloed-by-downstream", buf);
2014 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2015 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2017 node->add_child_nocopy (_input->state (full_state));
2018 node->add_child_nocopy (_output->state (full_state));
2019 node->add_child_nocopy (_solo_control->get_state ());
2020 node->add_child_nocopy (_mute_control->get_state ());
2021 node->add_child_nocopy (_mute_master->get_state ());
2023 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2024 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2025 remote_control_node->add_property (X_("id"), buf);
2026 node->add_child_nocopy (*remote_control_node);
2028 if (_comment.length()) {
2029 XMLNode *cmt = node->add_child ("Comment");
2030 cmt->add_content (_comment);
2034 node->add_child_nocopy (_pannable->state (full_state));
2037 for (i = _processors.begin(); i != _processors.end(); ++i) {
2039 /* template save: do not include internal sends functioning as
2040 aux sends because the chance of the target ID
2041 in the session where this template is used
2044 similarly, do not save listen sends which connect to
2045 the monitor section, because these will always be
2048 boost::shared_ptr<InternalSend> is;
2050 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2051 if (is->role() == Delivery::Listen) {
2056 node->add_child_nocopy((*i)->state (full_state));
2060 node->add_child_copy (*_extra_xml);
2063 if (_custom_meter_position_noted) {
2064 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2066 after->id().print (buf, sizeof (buf));
2067 node->add_property (X_("processor-after-last-custom-meter"), buf);
2070 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
2077 Route::set_state (const XMLNode& node, int version)
2079 if (version < 3000) {
2080 return set_state_2X (node, version);
2084 XMLNodeConstIterator niter;
2086 const XMLProperty *prop;
2088 if (node.name() != "Route"){
2089 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2093 if ((prop = node.property (X_("name"))) != 0) {
2094 Route::set_name (prop->value());
2098 _initial_io_setup = true;
2100 if ((prop = node.property (X_("flags"))) != 0) {
2101 _flags = Flag (string_2_enum (prop->value(), _flags));
2106 if (is_master() || is_monitor() || is_auditioner()) {
2107 _mute_master->set_solo_ignore (true);
2111 /* monitor bus does not get a panner, but if (re)created
2112 via XML, it will already have one by the time we
2113 call ::set_state(). so ... remove it.
2118 /* add all processors (except amp, which is always present) */
2120 nlist = node.children();
2121 XMLNode processor_state (X_("processor_state"));
2123 Stateful::save_extra_xml (node);
2125 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2129 if (child->name() == IO::state_node_name) {
2130 if ((prop = child->property (X_("direction"))) == 0) {
2134 if (prop->value() == "Input") {
2135 _input->set_state (*child, version);
2136 } else if (prop->value() == "Output") {
2137 _output->set_state (*child, version);
2141 if (child->name() == X_("Processor")) {
2142 processor_state.add_child_copy (*child);
2145 if (child->name() == X_("Pannable")) {
2147 _pannable->set_state (*child, version);
2149 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2154 if ((prop = node.property (X_("meter-point"))) != 0) {
2155 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2156 set_meter_point (mp, true);
2158 _meter->set_display_to_user (_meter_point == MeterCustom);
2162 if ((prop = node.property (X_("meter-type"))) != 0) {
2163 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2166 _initial_io_setup = false;
2168 set_processor_state (processor_state);
2170 // this looks up the internal instrument in processors
2171 reset_instrument_info();
2173 if ((prop = node.property ("self-solo")) != 0) {
2174 set_self_solo (string_is_affirmative (prop->value()));
2177 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2178 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2179 mod_solo_by_others_upstream (atoi (prop->value()));
2182 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2183 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2184 mod_solo_by_others_downstream (atoi (prop->value()));
2187 if ((prop = node.property ("solo-isolated")) != 0) {
2188 set_solo_isolated (string_is_affirmative (prop->value()), this);
2191 if ((prop = node.property ("solo-safe")) != 0) {
2192 set_solo_safe (string_is_affirmative (prop->value()), this);
2195 if ((prop = node.property (X_("phase-invert"))) != 0) {
2196 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2199 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2200 set_denormal_protection (string_is_affirmative (prop->value()));
2203 if ((prop = node.property (X_("active"))) != 0) {
2204 bool yn = string_is_affirmative (prop->value());
2205 _active = !yn; // force switch
2206 set_active (yn, this);
2209 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2210 set_order_key (atoi(prop->value()));
2213 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2217 string::size_type colon, equal;
2218 string remaining = prop->value();
2220 while (remaining.length()) {
2222 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2223 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2226 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2227 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2230 string keyname = remaining.substr (0, equal);
2232 if ((keyname == "EditorSort") || (keyname == "editor")) {
2233 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2239 colon = remaining.find_first_of (':');
2241 if (colon != string::npos) {
2242 remaining = remaining.substr (colon+1);
2249 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2250 PBD::ID id (prop->value ());
2251 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2252 ProcessorList::const_iterator i = _processors.begin ();
2253 while (i != _processors.end() && (*i)->id() != id) {
2257 if (i != _processors.end ()) {
2258 _processor_after_last_custom_meter = *i;
2259 _custom_meter_position_noted = true;
2263 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2264 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2267 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2270 if (child->name() == X_("Comment")) {
2272 /* XXX this is a terrible API design in libxml++ */
2274 XMLNode *cmt = *(child->children().begin());
2275 _comment = cmt->content();
2277 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2278 if (prop->value() == "solo") {
2279 _solo_control->set_state (*child, version);
2280 } else if (prop->value() == "mute") {
2281 _mute_control->set_state (*child, version);
2284 } else if (child->name() == X_("RemoteControl")) {
2285 if ((prop = child->property (X_("id"))) != 0) {
2287 sscanf (prop->value().c_str(), "%d", &x);
2288 set_remote_control_id_internal (x);
2291 } else if (child->name() == X_("MuteMaster")) {
2292 _mute_master->set_state (*child, version);
2300 Route::set_state_2X (const XMLNode& node, int version)
2303 XMLNodeConstIterator niter;
2305 const XMLProperty *prop;
2307 /* 2X things which still remain to be handled:
2313 if (node.name() != "Route") {
2314 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2318 if ((prop = node.property (X_("flags"))) != 0) {
2319 string f = prop->value ();
2320 boost::replace_all (f, "ControlOut", "MonitorOut");
2321 _flags = Flag (string_2_enum (f, _flags));
2326 if (is_master() || is_monitor() || is_auditioner()) {
2327 _mute_master->set_solo_ignore (true);
2330 if ((prop = node.property (X_("phase-invert"))) != 0) {
2331 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2332 if (string_is_affirmative (prop->value ())) {
2335 set_phase_invert (p);
2338 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2339 set_denormal_protection (string_is_affirmative (prop->value()));
2342 if ((prop = node.property (X_("soloed"))) != 0) {
2343 bool yn = string_is_affirmative (prop->value());
2345 /* XXX force reset of solo status */
2347 set_solo (yn, this);
2350 if ((prop = node.property (X_("muted"))) != 0) {
2353 bool muted = string_is_affirmative (prop->value());
2359 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2361 if (string_is_affirmative (prop->value())){
2362 mute_point = mute_point + "PreFader";
2367 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2369 if (string_is_affirmative (prop->value())){
2372 mute_point = mute_point + ",";
2375 mute_point = mute_point + "PostFader";
2380 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2382 if (string_is_affirmative (prop->value())){
2385 mute_point = mute_point + ",";
2388 mute_point = mute_point + "Listen";
2393 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2395 if (string_is_affirmative (prop->value())){
2398 mute_point = mute_point + ",";
2401 mute_point = mute_point + "Main";
2405 _mute_master->set_mute_points (mute_point);
2406 _mute_master->set_muted_by_self (true);
2410 if ((prop = node.property (X_("meter-point"))) != 0) {
2411 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2414 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2415 don't mean the same thing.
2418 if ((prop = node.property (X_("order-keys"))) != 0) {
2422 string::size_type colon, equal;
2423 string remaining = prop->value();
2425 while (remaining.length()) {
2427 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2428 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2431 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2432 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2435 string keyname = remaining.substr (0, equal);
2437 if (keyname == "EditorSort" || keyname == "editor") {
2438 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2444 colon = remaining.find_first_of (':');
2446 if (colon != string::npos) {
2447 remaining = remaining.substr (colon+1);
2456 nlist = node.children ();
2457 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2461 if (child->name() == IO::state_node_name) {
2463 /* there is a note in IO::set_state_2X() about why we have to call
2467 _input->set_state_2X (*child, version, true);
2468 _output->set_state_2X (*child, version, false);
2470 if ((prop = child->property (X_("name"))) != 0) {
2471 Route::set_name (prop->value ());
2476 if ((prop = child->property (X_("active"))) != 0) {
2477 bool yn = string_is_affirmative (prop->value());
2478 _active = !yn; // force switch
2479 set_active (yn, this);
2482 if ((prop = child->property (X_("gain"))) != 0) {
2485 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2486 _amp->gain_control()->set_value (val);
2490 /* Set up Panners in the IO */
2491 XMLNodeList io_nlist = child->children ();
2493 XMLNodeConstIterator io_niter;
2496 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2498 io_child = *io_niter;
2500 if (io_child->name() == X_("Panner")) {
2501 _main_outs->panner_shell()->set_state(*io_child, version);
2502 } else if (io_child->name() == X_("Automation")) {
2503 /* IO's automation is for the fader */
2504 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2510 XMLNodeList redirect_nodes;
2512 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2516 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2517 redirect_nodes.push_back(child);
2522 set_processor_state_2X (redirect_nodes, version);
2524 Stateful::save_extra_xml (node);
2526 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2529 if (child->name() == X_("Comment")) {
2531 /* XXX this is a terrible API design in libxml++ */
2533 XMLNode *cmt = *(child->children().begin());
2534 _comment = cmt->content();
2536 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2537 if (prop->value() == X_("solo")) {
2538 _solo_control->set_state (*child, version);
2539 } else if (prop->value() == X_("mute")) {
2540 _mute_control->set_state (*child, version);
2543 } else if (child->name() == X_("RemoteControl")) {
2544 if ((prop = child->property (X_("id"))) != 0) {
2546 sscanf (prop->value().c_str(), "%d", &x);
2547 set_remote_control_id_internal (x);
2557 Route::get_processor_state ()
2559 XMLNode* root = new XMLNode (X_("redirects"));
2560 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2561 root->add_child_nocopy ((*i)->state (true));
2568 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2570 /* We don't bother removing existing processors not in nList, as this
2571 method will only be called when creating a Route from scratch, not
2572 for undo purposes. Just put processors in at the appropriate place
2576 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2577 add_processor_from_xml_2X (**i, version);
2582 Route::set_processor_state (const XMLNode& node)
2584 const XMLNodeList &nlist = node.children();
2585 XMLNodeConstIterator niter;
2586 ProcessorList new_order;
2587 bool must_configure = false;
2589 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2591 XMLProperty* prop = (*niter)->property ("type");
2593 if (prop->value() == "amp") {
2594 _amp->set_state (**niter, Stateful::current_state_version);
2595 new_order.push_back (_amp);
2596 } else if (prop->value() == "meter") {
2597 _meter->set_state (**niter, Stateful::current_state_version);
2598 new_order.push_back (_meter);
2599 } else if (prop->value() == "delay") {
2600 _delayline->set_state (**niter, Stateful::current_state_version);
2601 new_order.push_back (_delayline);
2602 } else if (prop->value() == "main-outs") {
2603 _main_outs->set_state (**niter, Stateful::current_state_version);
2604 } else if (prop->value() == "intreturn") {
2606 _intreturn.reset (new InternalReturn (_session));
2607 must_configure = true;
2609 _intreturn->set_state (**niter, Stateful::current_state_version);
2610 } else if (is_monitor() && prop->value() == "monitor") {
2611 if (!_monitor_control) {
2612 _monitor_control.reset (new MonitorProcessor (_session));
2613 must_configure = true;
2615 _monitor_control->set_state (**niter, Stateful::current_state_version);
2616 } else if (prop->value() == "capture") {
2617 /* CapturingProcessor should never be restored, it's always
2618 added explicitly when needed */
2620 ProcessorList::iterator o;
2622 for (o = _processors.begin(); o != _processors.end(); ++o) {
2623 XMLProperty* id_prop = (*niter)->property(X_("id"));
2624 if (id_prop && (*o)->id() == id_prop->value()) {
2625 (*o)->set_state (**niter, Stateful::current_state_version);
2626 new_order.push_back (*o);
2631 // If the processor (*niter) is not on the route then create it
2633 if (o == _processors.end()) {
2635 boost::shared_ptr<Processor> processor;
2637 if (prop->value() == "intsend") {
2639 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Aux, true));
2641 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2642 prop->value() == "lv2" ||
2643 prop->value() == "windows-vst" ||
2644 prop->value() == "lxvst" ||
2645 prop->value() == "audiounit") {
2647 processor.reset (new PluginInsert(_session));
2649 } else if (prop->value() == "port") {
2651 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2653 } else if (prop->value() == "send") {
2655 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2658 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2662 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2663 /* This processor could not be configured. Turn it into a UnknownProcessor */
2664 processor.reset (new UnknownProcessor (_session, **niter));
2667 /* we have to note the monitor send here, otherwise a new one will be created
2668 and the state of this one will be lost.
2670 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2671 if (isend && isend->role() == Delivery::Listen) {
2672 _monitor_send = isend;
2675 /* it doesn't matter if invisible processors are added here, as they
2676 will be sorted out by setup_invisible_processors () shortly.
2679 new_order.push_back (processor);
2680 must_configure = true;
2686 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2687 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2688 _processors = new_order;
2690 if (must_configure) {
2691 configure_processors_unlocked (0);
2694 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2696 (*i)->set_owner (this);
2697 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2699 boost::shared_ptr<PluginInsert> pi;
2701 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2702 if (pi->has_no_inputs ()) {
2703 _have_internal_generator = true;
2710 reset_instrument_info ();
2711 processors_changed (RouteProcessorChange ());
2712 set_processor_positions ();
2716 Route::curve_reallocate ()
2718 // _gain_automation_curve.finish_resize ();
2719 // _pan_automation_curve.finish_resize ();
2723 Route::silence (framecnt_t nframes)
2725 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2730 silence_unlocked (nframes);
2734 Route::silence_unlocked (framecnt_t nframes)
2736 /* Must be called with the processor lock held */
2740 _output->silence (nframes);
2742 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2743 boost::shared_ptr<PluginInsert> pi;
2745 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2746 // skip plugins, they don't need anything when we're not active
2750 (*i)->silence (nframes);
2753 if (nframes == _session.get_block_size()) {
2760 Route::add_internal_return ()
2763 _intreturn.reset (new InternalReturn (_session));
2764 add_processor (_intreturn, PreFader);
2769 Route::add_send_to_internal_return (InternalSend* send)
2771 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2773 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2774 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2777 return d->add_send (send);
2783 Route::remove_send_from_internal_return (InternalSend* send)
2785 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2787 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2788 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2791 return d->remove_send (send);
2797 Route::enable_monitor_send ()
2799 /* Caller must hold process lock */
2800 assert (!AudioEngine::instance()->process_lock().trylock());
2802 /* master never sends to monitor section via the normal mechanism */
2803 assert (!is_master ());
2804 assert (!is_monitor ());
2806 /* make sure we have one */
2807 if (!_monitor_send) {
2808 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2809 _monitor_send->set_display_to_user (false);
2813 configure_processors (0);
2816 /** Add an aux send to a route.
2817 * @param route route to send to.
2818 * @param before Processor to insert before, or 0 to insert at the end.
2821 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2823 assert (route != _session.monitor_out ());
2826 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2828 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2830 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2832 if (d && d->target_route() == route) {
2833 /* already listening via the specified IO: do nothing */
2841 boost::shared_ptr<InternalSend> listener;
2844 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2845 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
2846 listener.reset (new InternalSend (_session, sendpan, _mute_master, route, Delivery::Aux));
2849 add_processor (listener, before);
2851 } catch (failed_constructor& err) {
2859 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2861 ProcessorStreams err;
2862 ProcessorList::iterator tmp;
2865 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2867 /* have to do this early because otherwise processor reconfig
2868 * will put _monitor_send back in the list
2871 if (route == _session.monitor_out()) {
2872 _monitor_send.reset ();
2876 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2878 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2880 if (d && d->target_route() == route) {
2882 remove_processor (*x, &err, false);
2885 /* list could have been demolished while we dropped the lock
2896 Route::set_comment (string cmt, void *src)
2899 comment_changed (src);
2900 _session.set_dirty ();
2904 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2906 FeedRecord fr (other, via_sends_only);
2908 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2910 if (!result.second) {
2912 /* already a record for "other" - make sure sends-only information is correct */
2913 if (!via_sends_only && result.first->sends_only) {
2914 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2915 frp->sends_only = false;
2919 return result.second;
2923 Route::clear_fed_by ()
2929 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2931 const FedBy& fed_by (other->fed_by());
2933 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2934 boost::shared_ptr<Route> sr = f->r.lock();
2936 if (sr && (sr.get() == this)) {
2938 if (via_sends_only) {
2939 *via_sends_only = f->sends_only;
2950 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2952 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2954 if (_output->connected_to (other->input())) {
2955 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2956 if (via_send_only) {
2957 *via_send_only = false;
2964 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2966 boost::shared_ptr<IOProcessor> iop;
2968 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2969 if (iop->feeds (other)) {
2970 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2971 if (via_send_only) {
2972 *via_send_only = true;
2976 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2979 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2984 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2989 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2991 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2994 /** Called from the (non-realtime) butler thread when the transport is stopped */
2996 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
2998 framepos_t now = _session.transport_frame();
3001 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3003 Automatable::transport_stopped (now);
3005 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3007 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3011 (*i)->transport_stopped (now);
3015 _roll_delay = _initial_delay;
3019 Route::input_change_handler (IOChange change, void * /*src*/)
3021 bool need_to_queue_solo_change = true;
3023 if ((change.type & IOChange::ConfigurationChanged)) {
3024 /* This is called with the process lock held if change
3025 contains ConfigurationChanged
3027 need_to_queue_solo_change = false;
3028 configure_processors (0);
3029 _phase_invert.resize (_input->n_ports().n_audio ());
3030 io_changed (); /* EMIT SIGNAL */
3033 if (!_input->connected() && _soloed_by_others_upstream) {
3034 if (need_to_queue_solo_change) {
3035 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3037 cancel_solo_after_disconnect (true);
3043 Route::output_change_handler (IOChange change, void * /*src*/)
3045 bool need_to_queue_solo_change = true;
3046 if (_initial_io_setup) {
3050 if ((change.type & IOChange::ConfigurationChanged)) {
3051 /* This is called with the process lock held if change
3052 contains ConfigurationChanged
3054 need_to_queue_solo_change = false;
3055 configure_processors (0);
3056 io_changed (); /* EMIT SIGNAL */
3059 if (!_output->connected() && _soloed_by_others_downstream) {
3060 if (need_to_queue_solo_change) {
3061 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3063 cancel_solo_after_disconnect (false);
3069 Route::cancel_solo_after_disconnect (bool upstream)
3072 _soloed_by_others_upstream = 0;
3074 _soloed_by_others_downstream = 0;
3076 set_mute_master_solo ();
3077 solo_changed (false, this);
3081 Route::pans_required () const
3083 if (n_outputs().n_audio() < 2) {
3087 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3091 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3093 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3099 if (n_outputs().n_total() == 0) {
3103 if (!_active || n_inputs() == ChanCount::ZERO) {
3104 silence_unlocked (nframes);
3108 if (session_state_changing) {
3109 if (_session.transport_speed() != 0.0f) {
3110 /* we're rolling but some state is changing (e.g. our diskstream contents)
3111 so we cannot use them. Be silent till this is over.
3113 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3115 silence_unlocked (nframes);
3118 /* we're really not rolling, so we're either delivery silence or actually
3119 monitoring, both of which are safe to do while session_state_changing is true.
3123 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3125 fill_buffers_with_input (bufs, _input, nframes);
3127 if (_meter_point == MeterInput) {
3128 _meter->run (bufs, start_frame, end_frame, nframes, true);
3131 _amp->apply_gain_automation (false);
3132 passthru (bufs, start_frame, end_frame, nframes, 0);
3138 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3140 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3145 if (n_outputs().n_total() == 0) {
3149 if (!_active || n_inputs().n_total() == 0) {
3150 silence_unlocked (nframes);
3154 framepos_t unused = 0;
3156 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3162 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3164 fill_buffers_with_input (bufs, _input, nframes);
3166 if (_meter_point == MeterInput) {
3167 _meter->run (bufs, start_frame, end_frame, nframes, true);
3170 passthru (bufs, start_frame, end_frame, nframes, declick);
3176 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3183 Route::flush_processors ()
3185 /* XXX shouldn't really try to take this lock, since
3186 this is called from the RT audio thread.
3189 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3191 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3197 Route::set_meter_point (MeterPoint p, bool force)
3199 if (_meter_point == p && !force) {
3203 bool meter_was_visible_to_user = _meter->display_to_user ();
3206 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3207 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3209 maybe_note_meter_position ();
3213 if (_meter_point != MeterCustom) {
3215 _meter->set_display_to_user (false);
3217 setup_invisible_processors ();
3221 _meter->set_display_to_user (true);
3223 /* If we have a previous position for the custom meter, try to put it there */
3224 if (_custom_meter_position_noted) {
3225 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3228 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3229 if (i != _processors.end ()) {
3230 _processors.remove (_meter);
3231 _processors.insert (i, _meter);
3233 } else if (_last_custom_meter_was_at_end) {
3234 _processors.remove (_meter);
3235 _processors.push_back (_meter);
3240 /* Set up the meter for its new position */
3242 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3246 if (loc == _processors.begin()) {
3247 m_in = _input->n_ports();
3249 ProcessorList::iterator before = loc;
3251 m_in = (*before)->output_streams ();
3254 _meter->reflect_inputs (m_in);
3256 /* we do not need to reconfigure the processors, because the meter
3257 (a) is always ready to handle processor_max_streams
3258 (b) is always an N-in/N-out processor, and thus moving
3259 it doesn't require any changes to the other processors.
3263 meter_change (); /* EMIT SIGNAL */
3265 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3267 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3271 Route::listen_position_changed ()
3274 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3275 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3276 ProcessorState pstate (this);
3278 if (configure_processors_unlocked (0)) {
3280 configure_processors_unlocked (0); // it worked before we tried to add it ...
3285 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3286 _session.set_dirty ();
3289 boost::shared_ptr<CapturingProcessor>
3290 Route::add_export_point()
3292 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3293 if (!_capturing_processor) {
3295 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3296 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3298 _capturing_processor.reset (new CapturingProcessor (_session));
3299 _capturing_processor->activate ();
3301 configure_processors_unlocked (0);
3305 return _capturing_processor;
3309 Route::update_signal_latency ()
3311 framecnt_t l = _output->user_latency();
3313 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3314 if ((*i)->active ()) {
3315 l += (*i)->signal_latency ();
3319 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3321 if (_signal_latency != l) {
3322 _signal_latency = l;
3323 signal_latency_changed (); /* EMIT SIGNAL */
3326 return _signal_latency;
3330 Route::set_user_latency (framecnt_t nframes)
3332 _output->set_user_latency (nframes);
3333 _session.update_latency_compensation ();
3337 Route::set_latency_compensation (framecnt_t longest_session_latency)
3339 framecnt_t old = _initial_delay;
3341 if (_signal_latency < longest_session_latency) {
3342 _initial_delay = longest_session_latency - _signal_latency;
3347 DEBUG_TRACE (DEBUG::Latency, string_compose (
3348 "%1: compensate for maximum latency of %2,"
3349 "given own latency of %3, using initial delay of %4\n",
3350 name(), longest_session_latency, _signal_latency, _initial_delay));
3352 if (_initial_delay != old) {
3353 initial_delay_changed (); /* EMIT SIGNAL */
3356 if (_session.transport_stopped()) {
3357 _roll_delay = _initial_delay;
3361 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3362 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3363 boost::shared_ptr<AutomationList>(), name)
3366 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3371 Route::SoloControllable::set_value (double val)
3373 bool bval = ((val >= 0.5f) ? true: false);
3375 boost::shared_ptr<RouteList> rl (new RouteList);
3377 boost::shared_ptr<Route> r = _route.lock ();
3384 if (Config->get_solo_control_is_listen_control()) {
3385 _session.set_listen (rl, bval);
3387 _session.set_solo (rl, bval);
3392 Route::SoloControllable::get_value () const
3394 boost::shared_ptr<Route> r = _route.lock ();
3399 if (Config->get_solo_control_is_listen_control()) {
3400 return r->listening_via_monitor() ? 1.0f : 0.0f;
3402 return r->self_soloed() ? 1.0f : 0.0f;
3406 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3407 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3408 boost::shared_ptr<AutomationList>(), name)
3411 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3416 Route::MuteControllable::set_value (double val)
3418 bool bval = ((val >= 0.5f) ? true: false);
3420 boost::shared_ptr<RouteList> rl (new RouteList);
3422 boost::shared_ptr<Route> r = _route.lock ();
3428 _session.set_mute (rl, bval);
3432 Route::MuteControllable::get_value () const
3434 boost::shared_ptr<Route> r = _route.lock ();
3439 return r->muted() ? 1.0f : 0.0f;
3443 Route::set_block_size (pframes_t nframes)
3445 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3446 (*i)->set_block_size (nframes);
3449 _session.ensure_buffers (n_process_buffers ());
3453 Route::protect_automation ()
3455 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3456 (*i)->protect_automation();
3459 /** @param declick 1 to set a pending declick fade-in,
3460 * -1 to set a pending declick fade-out
3463 Route::set_pending_declick (int declick)
3466 /* this call is not allowed to turn off a pending declick */
3468 _pending_declick = declick;
3471 _pending_declick = 0;
3475 /** Shift automation forwards from a particular place, thereby inserting time.
3476 * Adds undo commands for any shifts that are performed.
3478 * @param pos Position to start shifting from.
3479 * @param frames Amount to shift forwards by.
3483 Route::shift (framepos_t pos, framecnt_t frames)
3485 /* gain automation */
3487 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3489 XMLNode &before = gc->alist()->get_state ();
3490 gc->alist()->shift (pos, frames);
3491 XMLNode &after = gc->alist()->get_state ();
3492 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3495 /* pan automation */
3497 ControlSet::Controls& c (_pannable->controls());
3499 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3500 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3502 boost::shared_ptr<AutomationList> al = pc->alist();
3503 XMLNode& before = al->get_state ();
3504 al->shift (pos, frames);
3505 XMLNode& after = al->get_state ();
3506 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3511 /* redirect automation */
3513 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3514 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3516 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3518 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3519 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3521 boost::shared_ptr<AutomationList> al = ac->alist();
3522 XMLNode &before = al->get_state ();
3523 al->shift (pos, frames);
3524 XMLNode &after = al->get_state ();
3525 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3534 Route::save_as_template (const string& path, const string& name)
3536 XMLNode& node (state (false));
3539 IO::set_name_in_state (*node.children().front(), name);
3541 tree.set_root (&node);
3542 return tree.write (path.c_str());
3547 Route::set_name (const string& str)
3553 name = Route::ensure_track_or_route_name (str, _session);
3554 SessionObject::set_name (name);
3556 ret = (_input->set_name(name) && _output->set_name(name));
3559 /* rename the main outs. Leave other IO processors
3560 * with whatever name they already have, because its
3561 * just fine as it is (it will not contain the route
3562 * name if its a port insert, port send or port return).
3566 if (_main_outs->set_name (name)) {
3567 /* XXX returning false here is stupid because
3568 we already changed the route name.
3578 /** Set the name of a route in an XML description.
3579 * @param node XML <Route> node to set the name in.
3580 * @param name New name.
3583 Route::set_name_in_state (XMLNode& node, string const & name)
3585 node.add_property (X_("name"), name);
3587 XMLNodeList children = node.children();
3588 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3590 if ((*i)->name() == X_("IO")) {
3592 IO::set_name_in_state (**i, name);
3594 } else if ((*i)->name() == X_("Processor")) {
3596 XMLProperty* role = (*i)->property (X_("role"));
3597 if (role && role->value() == X_("Main")) {
3598 (*i)->add_property (X_("name"), name);
3601 } else if ((*i)->name() == X_("Diskstream")) {
3603 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3604 (*i)->add_property (X_("name"), name);
3610 boost::shared_ptr<Send>
3611 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3613 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3615 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3616 boost::shared_ptr<InternalSend> send;
3618 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3619 if (send->target_route() == target) {
3625 return boost::shared_ptr<Send>();
3628 /** @param c Audio channel index.
3629 * @param yn true to invert phase, otherwise false.
3632 Route::set_phase_invert (uint32_t c, bool yn)
3634 if (_phase_invert[c] != yn) {
3635 _phase_invert[c] = yn;
3636 phase_invert_changed (); /* EMIT SIGNAL */
3637 _session.set_dirty ();
3642 Route::set_phase_invert (boost::dynamic_bitset<> p)
3644 if (_phase_invert != p) {
3646 phase_invert_changed (); /* EMIT SIGNAL */
3647 _session.set_dirty ();
3652 Route::phase_invert (uint32_t c) const
3654 return _phase_invert[c];
3657 boost::dynamic_bitset<>
3658 Route::phase_invert () const
3660 return _phase_invert;
3664 Route::set_denormal_protection (bool yn)
3666 if (_denormal_protection != yn) {
3667 _denormal_protection = yn;
3668 denormal_protection_changed (); /* EMIT SIGNAL */
3673 Route::denormal_protection () const
3675 return _denormal_protection;
3679 Route::set_active (bool yn, void* src)
3681 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3682 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3686 if (_active != yn) {
3688 _input->set_active (yn);
3689 _output->set_active (yn);
3690 active_changed (); // EMIT SIGNAL
3691 _session.set_dirty ();
3698 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3704 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3706 boost::shared_ptr<Send> s;
3707 boost::shared_ptr<Return> r;
3709 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3710 s->meter()->meter();
3711 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3712 r->meter()->meter ();
3717 boost::shared_ptr<Pannable>
3718 Route::pannable() const
3723 boost::shared_ptr<Panner>
3724 Route::panner() const
3727 return _main_outs->panner_shell()->panner();
3730 boost::shared_ptr<PannerShell>
3731 Route::panner_shell() const
3733 return _main_outs->panner_shell();
3736 boost::shared_ptr<AutomationControl>
3737 Route::gain_control() const
3739 return _amp->gain_control();
3742 boost::shared_ptr<AutomationControl>
3743 Route::get_control (const Evoral::Parameter& param)
3745 /* either we own the control or .... */
3747 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3751 /* maybe one of our processors does or ... */
3753 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3754 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3755 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3763 /* nobody does so we'll make a new one */
3765 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3772 boost::shared_ptr<Processor>
3773 Route::nth_plugin (uint32_t n)
3775 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3776 ProcessorList::iterator i;
3778 for (i = _processors.begin(); i != _processors.end(); ++i) {
3779 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3786 return boost::shared_ptr<Processor> ();
3789 boost::shared_ptr<Processor>
3790 Route::nth_send (uint32_t n)
3792 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3793 ProcessorList::iterator i;
3795 for (i = _processors.begin(); i != _processors.end(); ++i) {
3796 if (boost::dynamic_pointer_cast<Send> (*i)) {
3803 return boost::shared_ptr<Processor> ();
3807 Route::has_io_processor_named (const string& name)
3809 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3810 ProcessorList::iterator i;
3812 for (i = _processors.begin(); i != _processors.end(); ++i) {
3813 if (boost::dynamic_pointer_cast<Send> (*i) ||
3814 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3815 if ((*i)->name() == name) {
3824 MuteMaster::MutePoint
3825 Route::mute_points () const
3827 return _mute_master->mute_points ();
3831 Route::set_processor_positions ()
3833 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3835 bool had_amp = false;
3836 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3837 (*i)->set_pre_fader (!had_amp);
3838 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3844 /** Called when there is a proposed change to the input port count */
3846 Route::input_port_count_changing (ChanCount to)
3848 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3850 /* The processors cannot be configured with the new input arrangement, so
3856 /* The change is ok */
3860 /** Called when there is a proposed change to the output port count */
3862 Route::output_port_count_changing (ChanCount to)
3864 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3865 if (processor_out_streams.get(*t) > to.get(*t)) {
3869 /* The change is ok */
3874 Route::unknown_processors () const
3878 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3879 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3880 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3881 p.push_back ((*i)->name ());
3890 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3892 /* we assume that all our input ports feed all our output ports. its not
3893 universally true, but the alternative is way too corner-case to worry about.
3896 LatencyRange all_connections;
3899 all_connections.min = 0;
3900 all_connections.max = 0;
3902 all_connections.min = ~((pframes_t) 0);
3903 all_connections.max = 0;
3905 /* iterate over all "from" ports and determine the latency range for all of their
3906 connections to the "outside" (outside of this Route).
3909 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3913 p->get_connected_latency_range (range, playback);
3915 all_connections.min = min (all_connections.min, range.min);
3916 all_connections.max = max (all_connections.max, range.max);
3920 /* set the "from" port latencies to the max/min range of all their connections */
3922 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3923 p->set_private_latency_range (all_connections, playback);
3926 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3928 all_connections.min += our_latency;
3929 all_connections.max += our_latency;
3931 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3932 p->set_private_latency_range (all_connections, playback);
3935 return all_connections.max;
3939 Route::set_private_port_latencies (bool playback) const
3941 framecnt_t own_latency = 0;
3943 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3944 OR LATENCY CALLBACK.
3946 This is called (early) from the latency callback. It computes the REAL
3947 latency associated with each port and stores the result as the "private"
3948 latency of the port. A later call to Route::set_public_port_latencies()
3949 sets all ports to the same value to reflect the fact that we do latency
3950 compensation and so all signals are delayed by the same amount as they
3951 flow through ardour.
3954 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3955 if ((*i)->active ()) {
3956 own_latency += (*i)->signal_latency ();
3961 /* playback: propagate latency from "outside the route" to outputs to inputs */
3962 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3964 /* capture: propagate latency from "outside the route" to inputs to outputs */
3965 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3970 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3972 /* this is called to set the JACK-visible port latencies, which take
3973 latency compensation into account.
3982 const PortSet& ports (_input->ports());
3983 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3984 p->set_public_latency_range (range, playback);
3989 const PortSet& ports (_output->ports());
3990 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3991 p->set_public_latency_range (range, playback);
3996 /** Put the invisible processors in the right place in _processors.
3997 * Must be called with a writer lock on _processor_lock held.
4000 Route::setup_invisible_processors ()
4003 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4004 assert (!lm.locked ());
4008 /* too early to be doing this stuff */
4012 /* we'll build this new list here and then use it */
4014 ProcessorList new_processors;
4016 /* find visible processors */
4018 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4019 if ((*i)->display_to_user ()) {
4020 new_processors.push_back (*i);
4026 ProcessorList::iterator amp = new_processors.begin ();
4027 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
4031 assert (amp != new_processors.end ());
4033 /* and the processor after the amp */
4035 ProcessorList::iterator after_amp = amp;
4041 switch (_meter_point) {
4043 assert (!_meter->display_to_user ());
4044 new_processors.push_front (_meter);
4047 assert (!_meter->display_to_user ());
4048 new_processors.insert (amp, _meter);
4050 case MeterPostFader:
4051 /* do nothing here */
4054 /* do nothing here */
4057 /* the meter is visible, so we don't touch it here */
4064 assert (_main_outs);
4065 assert (!_main_outs->display_to_user ());
4066 new_processors.push_back (_main_outs);
4068 /* iterator for the main outs */
4070 ProcessorList::iterator main = new_processors.end();
4073 /* OUTPUT METERING */
4075 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4076 assert (!_meter->display_to_user ());
4078 /* add the processor just before or just after the main outs */
4080 ProcessorList::iterator meter_point = main;
4082 if (_meter_point == MeterOutput) {
4085 new_processors.insert (meter_point, _meter);
4090 if (_monitor_send && !is_monitor ()) {
4091 assert (!_monitor_send->display_to_user ());
4092 if (Config->get_solo_control_is_listen_control()) {
4093 switch (Config->get_listen_position ()) {
4094 case PreFaderListen:
4095 switch (Config->get_pfl_position ()) {
4096 case PFLFromBeforeProcessors:
4097 new_processors.push_front (_monitor_send);
4099 case PFLFromAfterProcessors:
4100 new_processors.insert (amp, _monitor_send);
4103 _monitor_send->set_can_pan (false);
4105 case AfterFaderListen:
4106 switch (Config->get_afl_position ()) {
4107 case AFLFromBeforeProcessors:
4108 new_processors.insert (after_amp, _monitor_send);
4110 case AFLFromAfterProcessors:
4111 new_processors.insert (new_processors.end(), _monitor_send);
4114 _monitor_send->set_can_pan (true);
4118 new_processors.insert (new_processors.end(), _monitor_send);
4119 _monitor_send->set_can_pan (false);
4123 if (!is_master() && !is_monitor() && !is_auditioner()) {
4124 new_processors.push_front (_delayline);
4127 /* MONITOR CONTROL */
4129 if (_monitor_control && is_monitor ()) {
4130 assert (!_monitor_control->display_to_user ());
4131 new_processors.push_front (_monitor_control);
4134 /* INTERNAL RETURN */
4136 /* doing this here means that any monitor control will come just after
4141 assert (!_intreturn->display_to_user ());
4142 new_processors.push_front (_intreturn);
4145 /* EXPORT PROCESSOR */
4147 if (_capturing_processor) {
4148 assert (!_capturing_processor->display_to_user ());
4149 new_processors.push_front (_capturing_processor);
4152 _processors = new_processors;
4154 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4155 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4156 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4163 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4164 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4168 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4169 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4176 /** If the meter point is `Custom', make a note of where the meter is.
4177 * This is so that if the meter point is subsequently set to something else,
4178 * and then back to custom, we can put the meter back where it was last time
4179 * custom was enabled.
4181 * Must be called with the _processor_lock held.
4184 Route::maybe_note_meter_position ()
4186 if (_meter_point != MeterCustom) {
4190 _custom_meter_position_noted = true;
4191 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4192 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4193 ProcessorList::iterator j = i;
4195 if (j != _processors.end ()) {
4196 _processor_after_last_custom_meter = *j;
4197 _last_custom_meter_was_at_end = false;
4199 _last_custom_meter_was_at_end = true;
4205 boost::shared_ptr<Processor>
4206 Route::processor_by_id (PBD::ID id) const
4208 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4209 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4210 if ((*i)->id() == id) {
4215 return boost::shared_ptr<Processor> ();
4218 /** @return the monitoring state, or in other words what data we are pushing
4219 * into the route (data from the inputs, data from disk or silence)
4222 Route::monitoring_state () const
4224 return MonitoringInput;
4227 /** @return what we should be metering; either the data coming from the input
4228 * IO or the data that is flowing through the route.
4231 Route::metering_state () const
4233 return MeteringRoute;
4237 Route::has_external_redirects () const
4239 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4241 /* ignore inactive processors and obviously ignore the main
4242 * outs since everything has them and we don't care.
4245 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4253 boost::shared_ptr<Processor>
4254 Route::the_instrument () const
4256 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4257 return the_instrument_unlocked ();
4260 boost::shared_ptr<Processor>
4261 Route::the_instrument_unlocked () const
4263 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4264 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4265 if ((*i)->input_streams().n_midi() > 0 &&
4266 (*i)->output_streams().n_audio() > 0) {
4271 return boost::shared_ptr<Processor>();
4277 Route::non_realtime_locate (framepos_t pos)
4280 _pannable->transport_located (pos);
4283 if (_delayline.get()) {
4284 _delayline.get()->flush();
4288 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4289 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4291 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4292 (*i)->transport_located (pos);
4298 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4305 * We don't currently mix MIDI input together, so we don't need the
4306 * complex logic of the audio case.
4309 n_buffers = bufs.count().n_midi ();
4311 for (i = 0; i < n_buffers; ++i) {
4313 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4314 MidiBuffer& buf (bufs.get_midi (i));
4317 buf.copy (source_port->get_midi_buffer(nframes));
4319 buf.silence (nframes);
4325 n_buffers = bufs.count().n_audio();
4327 size_t n_ports = io->n_ports().n_audio();
4328 float scaling = 1.0f;
4330 if (n_ports > n_buffers) {
4331 scaling = ((float) n_buffers) / n_ports;
4334 for (i = 0; i < n_ports; ++i) {
4336 /* if there are more ports than buffers, map them onto buffers
4337 * in a round-robin fashion
4340 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4341 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4344 if (i < n_buffers) {
4346 /* first time through just copy a channel into
4350 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4352 if (scaling != 1.0f) {
4353 buf.apply_gain (scaling, nframes);
4358 /* on subsequent times around, merge data from
4359 * the port with what is already there
4362 if (scaling != 1.0f) {
4363 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4365 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4370 /* silence any remaining buffers */
4372 for (; i < n_buffers; ++i) {
4373 AudioBuffer& buf (bufs.get_audio (i));
4374 buf.silence (nframes);
4377 /* establish the initial setup of the buffer set, reflecting what was
4378 copied into it. unless, of course, we are the auditioner, in which
4379 case nothing was fed into it from the inputs at all.
4382 if (!is_auditioner()) {
4383 bufs.set_count (io->n_ports());