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 "pbd/xml++.h"
30 #include "pbd/enumwriter.h"
31 #include "pbd/memento_command.h"
32 #include "pbd/stacktrace.h"
33 #include "pbd/convert.h"
34 #include "pbd/boost_debug.h"
36 #include "ardour/amp.h"
37 #include "ardour/audio_buffer.h"
38 #include "ardour/audioengine.h"
39 #include "ardour/buffer.h"
40 #include "ardour/buffer_set.h"
41 #include "ardour/capturing_processor.h"
42 #include "ardour/debug.h"
43 #include "ardour/delivery.h"
44 #include "ardour/internal_return.h"
45 #include "ardour/internal_send.h"
46 #include "ardour/meter.h"
47 #include "ardour/monitor_processor.h"
48 #include "ardour/pannable.h"
49 #include "ardour/panner_shell.h"
50 #include "ardour/plugin_insert.h"
51 #include "ardour/port.h"
52 #include "ardour/port_insert.h"
53 #include "ardour/processor.h"
54 #include "ardour/route.h"
55 #include "ardour/route_group.h"
56 #include "ardour/send.h"
57 #include "ardour/session.h"
58 #include "ardour/unknown_processor.h"
59 #include "ardour/utils.h"
64 using namespace ARDOUR;
67 uint32_t Route::order_key_cnt = 0;
68 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
69 PBD::Signal0<void> Route::RemoteControlIDChange;
71 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
72 : SessionObject (sess, name)
74 , GraphNode (sess._process_graph)
80 , _pending_declick (true)
81 , _meter_point (MeterPostFader)
83 , _soloed_by_others_upstream (0)
84 , _soloed_by_others_downstream (0)
86 , _denormal_protection (false)
89 , _declickable (false)
90 , _mute_master (new MuteMaster (sess, name))
91 , _have_internal_generator (false)
93 , _default_type (default_type)
94 , _remote_control_id (0)
95 , _in_configure_processors (false)
96 , _custom_meter_position_noted (false)
97 , _last_custom_meter_was_at_end (false)
99 processor_max_streams.reset();
100 order_keys[N_("signal")] = order_key_cnt++;
103 set_remote_control_id (MasterBusRemoteControlID);
104 } else if (is_monitor()) {
105 set_remote_control_id (MonitorBusRemoteControlID);
113 /* add standard controls */
115 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
116 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
118 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
119 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
121 add_control (_solo_control);
122 add_control (_mute_control);
126 if (!(_flags & Route::MonitorOut)) {
127 _pannable.reset (new Pannable (_session));
130 /* input and output objects */
132 _input.reset (new IO (_session, _name, IO::Input, _default_type));
133 _output.reset (new IO (_session, _name, IO::Output, _default_type));
135 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
136 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
138 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
140 /* add amp processor */
142 _amp.reset (new Amp (_session));
143 add_processor (_amp, PostFader);
145 /* create standard processors: meter, main outs, monitor out;
146 they will be added to _processors by setup_invisible_processors ()
149 _meter.reset (new PeakMeter (_session));
150 _meter->set_display_to_user (false);
153 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
154 _main_outs->activate ();
157 /* where we listen to tracks */
158 _intreturn.reset (new InternalReturn (_session));
159 _intreturn->activate ();
161 /* the thing that provides proper control over a control/monitor/listen bus
162 (such as per-channel cut, dim, solo, invert, etc).
164 _monitor_control.reset (new MonitorProcessor (_session));
165 _monitor_control->activate ();
168 if (is_master() || is_monitor() || is_hidden()) {
169 _mute_master->set_solo_ignore (true);
172 /* now that we have _meter, its safe to connect to this */
174 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
177 /* run a configure so that the invisible processors get set up */
178 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
179 configure_processors (0);
187 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
189 /* do this early so that we don't get incoming signals as we are going through destruction
194 /* don't use clear_processors here, as it depends on the session which may
195 be half-destroyed by now
198 Glib::RWLock::WriterLock lm (_processor_lock);
199 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
200 (*i)->drop_references ();
203 _processors.clear ();
207 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
209 /* force IDs for master/monitor busses and prevent
210 any other route from accidentally getting these IDs
211 (i.e. legacy sessions)
214 if (is_master() && id != MasterBusRemoteControlID) {
215 id = MasterBusRemoteControlID;
218 if (is_monitor() && id != MonitorBusRemoteControlID) {
219 id = MonitorBusRemoteControlID;
222 /* don't allow it to collide */
224 if (!is_master () && !is_monitor() &&
225 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
226 id += MonitorBusRemoteControlID;
229 if (id != _remote_control_id) {
230 _remote_control_id = id;
231 RemoteControlIDChanged ();
232 if (notify_class_listeners) {
233 RemoteControlIDChange ();
239 Route::remote_control_id() const
241 return _remote_control_id;
245 Route::order_key (std::string const & name) const
247 OrderKeys::const_iterator i = order_keys.find (name);
248 if (i == order_keys.end()) {
256 Route::set_order_key (std::string const & name, int32_t n)
258 bool changed = false;
260 /* This method looks more complicated than it should, but
261 it's important that we don't emit order_key_changed unless
262 it actually has, as expensive things happen on receipt of that
266 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
267 order_keys[name] = n;
271 if (Config->get_sync_all_route_ordering()) {
272 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
273 if (x->second != n) {
281 order_key_changed (); /* EMIT SIGNAL */
282 _session.set_dirty ();
286 /** Set all order keys to be the same as that for `base', if such a key
287 * exists in this route.
288 * @param base Base key.
291 Route::sync_order_keys (std::string const & base)
293 if (order_keys.empty()) {
297 OrderKeys::iterator i;
300 if ((i = order_keys.find (base)) == order_keys.end()) {
301 /* key doesn't exist, use the first existing key (during session initialization) */
302 i = order_keys.begin();
306 /* key exists - use it and reset all others (actually, itself included) */
308 i = order_keys.begin();
311 bool changed = false;
313 for (; i != order_keys.end(); ++i) {
314 if (i->second != key) {
321 order_key_changed (); /* EMIT SIGNAL */
326 Route::ensure_track_or_route_name(string name, Session &session)
328 string newname = name;
330 while (!session.io_name_is_legal (newname)) {
331 newname = bump_name_once (newname, '.');
339 Route::inc_gain (gain_t fraction, void *src)
341 _amp->inc_gain (fraction, src);
345 Route::set_gain (gain_t val, void *src)
347 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
349 if (_route_group->is_relative()) {
351 gain_t usable_gain = _amp->gain();
352 if (usable_gain < 0.000001f) {
353 usable_gain = 0.000001f;
357 if (delta < 0.000001f) {
361 delta -= usable_gain;
366 gain_t factor = delta / usable_gain;
369 factor = _route_group->get_max_factor(factor);
370 if (factor == 0.0f) {
371 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
375 factor = _route_group->get_min_factor(factor);
376 if (factor == 0.0f) {
377 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
382 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
386 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
392 if (val == _amp->gain()) {
396 _amp->set_gain (val, src);
400 Route::maybe_declick (BufferSet&, framecnt_t, int)
402 /* this is the "bus" implementation and they never declick.
407 /** Process this route for one (sub) cycle (process thread)
409 * @param bufs Scratch buffers to use for the signal path
410 * @param start_frame Initial transport frame
411 * @param end_frame Final transport frame
412 * @param nframes Number of frames to output (to ports)
414 * Note that (end_frame - start_frame) may not be equal to nframes when the
415 * transport speed isn't 1.0 (eg varispeed).
418 Route::process_output_buffers (BufferSet& bufs,
419 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
420 int declick, bool gain_automation_ok)
422 bufs.set_is_silent (false);
424 /* figure out if we're going to use gain automation */
425 if (gain_automation_ok) {
426 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
427 _amp->setup_gain_automation (start_frame, end_frame, nframes);
429 _amp->apply_gain_automation (false);
432 /* Tell main outs what to do about monitoring. We do this so that
433 on a transition between monitoring states we get a de-clicking gain
434 change in the _main_outs delivery.
436 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
439 /* -------------------------------------------------------------------------------------------
440 GLOBAL DECLICK (for transport changes etc.)
441 ----------------------------------------------------------------------------------------- */
443 maybe_declick (bufs, nframes, declick);
444 _pending_declick = 0;
446 /* -------------------------------------------------------------------------------------------
447 DENORMAL CONTROL/PHASE INVERT
448 ----------------------------------------------------------------------------------------- */
450 if (_phase_invert.any ()) {
454 if (_denormal_protection || Config->get_denormal_protection()) {
456 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
457 Sample* const sp = i->data();
459 if (_phase_invert[chn]) {
460 for (pframes_t nx = 0; nx < nframes; ++nx) {
465 for (pframes_t nx = 0; nx < nframes; ++nx) {
473 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
474 Sample* const sp = i->data();
476 if (_phase_invert[chn]) {
477 for (pframes_t nx = 0; nx < nframes; ++nx) {
486 if (_denormal_protection || Config->get_denormal_protection()) {
488 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
489 Sample* const sp = i->data();
490 for (pframes_t nx = 0; nx < nframes; ++nx) {
498 /* -------------------------------------------------------------------------------------------
500 ----------------------------------------------------------------------------------------- */
502 /* set this to be true if the meter will already have been ::run() earlier */
503 bool const meter_already_run = metering_state() == MeteringInput;
505 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
507 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
508 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
513 /* if it has any inputs, make sure they match */
514 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
515 if (bufs.count() != (*i)->input_streams()) {
517 DEBUG::Processors, string_compose (
518 "%1 bufs = %2 input for %3 = %4\n",
519 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
527 /* should we NOT run plugins here if the route is inactive?
528 do we catch route != active somewhere higher?
531 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
532 bufs.set_count ((*i)->output_streams());
537 Route::n_process_buffers ()
539 return max (_input->n_ports(), processor_max_streams);
543 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
545 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
549 assert (bufs.available() >= input_streams());
551 if (_input->n_ports() == ChanCount::ZERO) {
552 silence_unlocked (nframes);
555 bufs.set_count (input_streams());
557 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
559 /* control/monitor bus ignores input ports when something is
560 feeding the listen "stream". data will "arrive" into the
561 route from the intreturn processor element.
563 bufs.silence (nframes, 0);
567 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
569 BufferSet::iterator o = bufs.begin(*t);
570 PortSet& ports (_input->ports());
572 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
573 o->read_from (i->get_buffer(nframes), nframes);
578 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
579 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
583 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
585 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
587 bufs.set_count (_input->n_ports());
588 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
589 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
593 Route::set_listen (bool yn, void* src)
599 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
600 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
605 if (yn != _monitor_send->active()) {
607 _monitor_send->activate ();
608 _mute_master->set_soloed (true);
610 _monitor_send->deactivate ();
611 _mute_master->set_soloed (false);
614 listen_changed (src); /* EMIT SIGNAL */
620 Route::listening_via_monitor () const
623 return _monitor_send->active ();
630 Route::set_solo_safe (bool yn, void *src)
632 if (_solo_safe != yn) {
634 solo_safe_changed (src);
639 Route::solo_safe() const
645 Route::set_solo (bool yn, void *src)
651 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
652 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
656 if (self_soloed() != yn) {
658 set_mute_master_solo ();
659 solo_changed (true, src); /* EMIT SIGNAL */
660 _solo_control->Changed (); /* EMIT SIGNAL */
665 Route::set_self_solo (bool yn)
671 Route::mod_solo_by_others_upstream (int32_t delta)
677 uint32_t old_sbu = _soloed_by_others_upstream;
680 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
681 _soloed_by_others_upstream += delta;
683 _soloed_by_others_upstream = 0;
686 _soloed_by_others_upstream += delta;
689 DEBUG_TRACE (DEBUG::Solo, string_compose (
690 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
691 name(), delta, _soloed_by_others_upstream, old_sbu,
692 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
694 /* push the inverse solo change to everything that feeds us.
696 This is important for solo-within-group. When we solo 1 track out of N that
697 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
698 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
699 tracks that feed it. This will silence them if they were audible because
700 of a bus solo, but the newly soloed track will still be audible (because
703 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
707 if ((_self_solo || _soloed_by_others_downstream) &&
708 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
709 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
711 if (delta > 0 || !Config->get_exclusive_solo()) {
712 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
713 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
714 boost::shared_ptr<Route> sr = i->r.lock();
716 sr->mod_solo_by_others_downstream (-delta);
722 set_mute_master_solo ();
723 solo_changed (false, this);
727 Route::mod_solo_by_others_downstream (int32_t delta)
734 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
735 _soloed_by_others_downstream += delta;
737 _soloed_by_others_downstream = 0;
740 _soloed_by_others_downstream += delta;
743 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
745 set_mute_master_solo ();
746 solo_changed (false, this);
750 Route::set_mute_master_solo ()
752 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
756 Route::set_solo_isolated (bool yn, void *src)
758 if (is_master() || is_monitor() || is_hidden()) {
762 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
763 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
767 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
769 boost::shared_ptr<RouteList> routes = _session.get_routes ();
770 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
772 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
777 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
779 if (does_feed && !sends_only) {
780 (*i)->set_solo_isolated (yn, (*i)->route_group());
784 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
786 bool changed = false;
789 if (_solo_isolated == 0) {
790 _mute_master->set_solo_ignore (true);
795 if (_solo_isolated > 0) {
797 if (_solo_isolated == 0) {
798 _mute_master->set_solo_ignore (false);
805 solo_isolated_changed (src);
810 Route::solo_isolated () const
812 return _solo_isolated > 0;
816 Route::set_mute_points (MuteMaster::MutePoint mp)
818 _mute_master->set_mute_points (mp);
819 mute_points_changed (); /* EMIT SIGNAL */
821 if (_mute_master->muted_by_self()) {
822 mute_changed (this); /* EMIT SIGNAL */
823 _mute_control->Changed (); /* EMIT SIGNAL */
828 Route::set_mute (bool yn, void *src)
830 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
831 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
836 _mute_master->set_muted_by_self (yn);
837 /* allow any derived classes to respond to the mute change
838 before anybody else knows about it.
841 /* tell everyone else */
842 mute_changed (src); /* EMIT SIGNAL */
843 _mute_control->Changed (); /* EMIT SIGNAL */
848 Route::muted () const
850 return _mute_master->muted_by_self();
855 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
857 cerr << name << " {" << endl;
858 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
859 p != procs.end(); ++p) {
860 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
866 /** Supposing that we want to insert a Processor at a given Placement, return
867 * the processor to add the new one before (or 0 to add at the end).
869 boost::shared_ptr<Processor>
870 Route::before_processor_for_placement (Placement p)
872 Glib::RWLock::ReaderLock lm (_processor_lock);
874 ProcessorList::iterator loc;
877 /* generic pre-fader: insert immediately before the amp */
878 loc = find (_processors.begin(), _processors.end(), _amp);
880 /* generic post-fader: insert right before the main outs */
881 loc = find (_processors.begin(), _processors.end(), _main_outs);
884 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
887 /** Supposing that we want to insert a Processor at a given index, return
888 * the processor to add the new one before (or 0 to add at the end).
890 boost::shared_ptr<Processor>
891 Route::before_processor_for_index (int index)
894 return boost::shared_ptr<Processor> ();
897 Glib::RWLock::ReaderLock lm (_processor_lock);
899 ProcessorList::iterator i = _processors.begin ();
901 while (i != _processors.end() && j < index) {
902 if ((*i)->display_to_user()) {
909 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
912 /** Add a processor either pre- or post-fader
913 * @return 0 on success, non-0 on failure.
916 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
918 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
922 /** Add a processor to a route such that it ends up with a given index into the visible processors.
923 * @param index Index to add the processor at, or -1 to add at the end of the list.
924 * @return 0 on success, non-0 on failure.
927 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
929 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
932 /** Add a processor to the route.
933 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
934 * @return 0 on success, non-0 on failure.
937 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
939 assert (processor != _meter);
940 assert (processor != _main_outs);
942 DEBUG_TRACE (DEBUG::Processors, string_compose (
943 "%1 adding processor %2\n", name(), processor->name()));
945 if (!_session.engine().connected() || !processor) {
950 Glib::RWLock::WriterLock lm (_processor_lock);
951 ProcessorState pstate (this);
953 boost::shared_ptr<PluginInsert> pi;
954 boost::shared_ptr<PortInsert> porti;
956 if (processor == _amp) {
957 /* Ensure that only one amp is in the list at any time */
958 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
959 if (check != _processors.end()) {
960 if (before == _amp) {
961 /* Already in position; all is well */
964 _processors.erase (check);
969 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
971 ProcessorList::iterator loc;
973 /* inserting before a processor; find it */
974 loc = find (_processors.begin(), _processors.end(), before);
975 if (loc == _processors.end ()) {
980 /* inserting at end */
981 loc = _processors.end ();
984 _processors.insert (loc, processor);
986 // Set up processor list channels. This will set processor->[input|output]_streams(),
987 // configure redirect ports properly, etc.
990 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
992 if (configure_processors_unlocked (err)) {
994 configure_processors_unlocked (0); // it worked before we tried to add it ...
999 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1001 if (pi->has_no_inputs ()) {
1002 /* generator plugin */
1003 _have_internal_generator = true;
1008 if (activation_allowed) {
1009 processor->activate ();
1012 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1014 _output->set_user_latency (0);
1017 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1018 set_processor_positions ();
1024 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1026 const XMLProperty *prop;
1029 boost::shared_ptr<Processor> processor;
1031 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1032 so that we can add the processor in the right place (pre/post-fader)
1035 XMLNodeList const & children = node.children ();
1036 XMLNodeList::const_iterator i = children.begin ();
1038 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1042 Placement placement = PreFader;
1044 if (i != children.end()) {
1045 if ((prop = (*i)->property (X_("placement"))) != 0) {
1046 placement = Placement (string_2_enum (prop->value(), placement));
1050 if (node.name() == "Insert") {
1052 if ((prop = node.property ("type")) != 0) {
1054 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1055 prop->value() == "lv2" ||
1056 prop->value() == "vst" ||
1057 prop->value() == "lxvst" ||
1058 prop->value() == "audiounit") {
1060 processor.reset (new PluginInsert (_session));
1064 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1069 } else if (node.name() == "Send") {
1071 processor.reset (new Send (_session, _pannable, _mute_master));
1075 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1079 if (processor->set_state (node, version)) {
1083 return (add_processor (processor, placement) == 0);
1086 catch (failed_constructor &err) {
1087 warning << _("processor could not be created. Ignored.") << endmsg;
1093 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1095 /* NOTE: this is intended to be used ONLY when copying
1096 processors from another Route. Hence the subtle
1097 differences between this and ::add_processor()
1100 ProcessorList::iterator loc;
1103 loc = find(_processors.begin(), _processors.end(), before);
1105 /* nothing specified - at end */
1106 loc = _processors.end ();
1109 if (!_session.engine().connected()) {
1113 if (others.empty()) {
1118 Glib::RWLock::WriterLock lm (_processor_lock);
1119 ProcessorState pstate (this);
1121 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1127 boost::shared_ptr<PluginInsert> pi;
1129 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1133 _processors.insert (loc, *i);
1135 if ((*i)->active()) {
1140 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1141 if (configure_processors_unlocked (err)) {
1143 configure_processors_unlocked (0); // it worked before we tried to add it ...
1148 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1151 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1152 boost::shared_ptr<PluginInsert> pi;
1154 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1155 if (pi->has_no_inputs ()) {
1156 _have_internal_generator = true;
1162 _output->set_user_latency (0);
1165 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1166 set_processor_positions ();
1172 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1174 if (p == PreFader) {
1175 start = _processors.begin();
1176 end = find(_processors.begin(), _processors.end(), _amp);
1178 start = find(_processors.begin(), _processors.end(), _amp);
1180 end = _processors.end();
1184 /** Turn off all processors with a given placement
1185 * @param p Placement of processors to disable
1188 Route::disable_processors (Placement p)
1190 Glib::RWLock::ReaderLock lm (_processor_lock);
1192 ProcessorList::iterator start, end;
1193 placement_range(p, start, end);
1195 for (ProcessorList::iterator i = start; i != end; ++i) {
1196 (*i)->deactivate ();
1199 _session.set_dirty ();
1202 /** Turn off all redirects
1205 Route::disable_processors ()
1207 Glib::RWLock::ReaderLock lm (_processor_lock);
1209 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1210 (*i)->deactivate ();
1213 _session.set_dirty ();
1216 /** Turn off all redirects with a given placement
1217 * @param p Placement of redirects to disable
1220 Route::disable_plugins (Placement p)
1222 Glib::RWLock::ReaderLock lm (_processor_lock);
1224 ProcessorList::iterator start, end;
1225 placement_range(p, start, end);
1227 for (ProcessorList::iterator i = start; i != end; ++i) {
1228 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1229 (*i)->deactivate ();
1233 _session.set_dirty ();
1236 /** Turn off all plugins
1239 Route::disable_plugins ()
1241 Glib::RWLock::ReaderLock lm (_processor_lock);
1243 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1244 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1245 (*i)->deactivate ();
1249 _session.set_dirty ();
1254 Route::ab_plugins (bool forward)
1256 Glib::RWLock::ReaderLock lm (_processor_lock);
1260 /* forward = turn off all active redirects, and mark them so that the next time
1261 we go the other way, we will revert them
1264 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1265 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1269 if ((*i)->active()) {
1270 (*i)->deactivate ();
1271 (*i)->set_next_ab_is_active (true);
1273 (*i)->set_next_ab_is_active (false);
1279 /* backward = if the redirect was marked to go active on the next ab, do so */
1281 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1283 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1287 if ((*i)->get_next_ab_is_active()) {
1290 (*i)->deactivate ();
1295 _session.set_dirty ();
1299 /** Remove processors with a given placement.
1300 * @param p Placement of processors to remove.
1303 Route::clear_processors (Placement p)
1305 if (!_session.engine().connected()) {
1309 bool already_deleting = _session.deletion_in_progress();
1310 if (!already_deleting) {
1311 _session.set_deletion_in_progress();
1315 Glib::RWLock::WriterLock lm (_processor_lock);
1316 ProcessorList new_list;
1317 ProcessorStreams err;
1318 bool seen_amp = false;
1320 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1326 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1328 /* you can't remove these */
1330 new_list.push_back (*i);
1337 new_list.push_back (*i);
1340 (*i)->drop_references ();
1348 (*i)->drop_references ();
1351 new_list.push_back (*i);
1358 _processors = new_list;
1361 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1362 configure_processors_unlocked (&err); // this can't fail
1366 processor_max_streams.reset();
1367 _have_internal_generator = false;
1368 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1369 set_processor_positions ();
1371 if (!already_deleting) {
1372 _session.clear_deletion_in_progress();
1377 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1379 /* these can never be removed */
1381 if (processor == _amp || processor == _meter || processor == _main_outs) {
1385 if (!_session.engine().connected()) {
1389 processor_max_streams.reset();
1392 Glib::RWLock::WriterLock lm (_processor_lock);
1393 ProcessorState pstate (this);
1395 ProcessorList::iterator i;
1396 bool removed = false;
1398 for (i = _processors.begin(); i != _processors.end(); ) {
1399 if (*i == processor) {
1401 /* move along, see failure case for configure_processors()
1402 where we may need to reconfigure the processor.
1405 /* stop redirects that send signals to JACK ports
1406 from causing noise as a result of no longer being
1410 boost::shared_ptr<IOProcessor> iop;
1412 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1414 iop->input()->disconnect (this);
1416 if (iop->output()) {
1417 iop->output()->disconnect (this);
1421 i = _processors.erase (i);
1429 _output->set_user_latency (0);
1437 if (need_process_lock) {
1438 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1440 if (configure_processors_unlocked (err)) {
1442 /* we know this will work, because it worked before :) */
1443 configure_processors_unlocked (0);
1447 if (configure_processors_unlocked (err)) {
1449 /* we know this will work, because it worked before :) */
1450 configure_processors_unlocked (0);
1455 _have_internal_generator = false;
1457 for (i = _processors.begin(); i != _processors.end(); ++i) {
1458 boost::shared_ptr<PluginInsert> pi;
1460 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1461 if (pi->has_no_inputs ()) {
1462 _have_internal_generator = true;
1469 processor->drop_references ();
1470 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1471 set_processor_positions ();
1477 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1479 ProcessorList deleted;
1481 if (!_session.engine().connected()) {
1485 processor_max_streams.reset();
1488 Glib::RWLock::WriterLock lm (_processor_lock);
1489 ProcessorState pstate (this);
1491 ProcessorList::iterator i;
1492 boost::shared_ptr<Processor> processor;
1494 for (i = _processors.begin(); i != _processors.end(); ) {
1498 /* these can never be removed */
1500 if (processor == _amp || processor == _meter || processor == _main_outs) {
1505 /* see if its in the list of processors to delete */
1507 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1512 /* stop IOProcessors that send to JACK ports
1513 from causing noise as a result of no longer being
1517 boost::shared_ptr<IOProcessor> iop;
1519 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1523 deleted.push_back (processor);
1524 i = _processors.erase (i);
1527 if (deleted.empty()) {
1528 /* none of those in the requested list were found */
1532 _output->set_user_latency (0);
1535 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1537 if (configure_processors_unlocked (err)) {
1539 /* we know this will work, because it worked before :) */
1540 configure_processors_unlocked (0);
1545 _have_internal_generator = false;
1547 for (i = _processors.begin(); i != _processors.end(); ++i) {
1548 boost::shared_ptr<PluginInsert> pi;
1550 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1551 if (pi->has_no_inputs ()) {
1552 _have_internal_generator = true;
1559 /* now try to do what we need to so that those that were removed will be deleted */
1561 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1562 (*i)->drop_references ();
1565 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1566 set_processor_positions ();
1571 /** Caller must hold process lock */
1573 Route::configure_processors (ProcessorStreams* err)
1575 assert (!AudioEngine::instance()->process_lock().trylock());
1577 if (!_in_configure_processors) {
1578 Glib::RWLock::WriterLock lm (_processor_lock);
1579 return configure_processors_unlocked (err);
1586 Route::input_streams () const
1588 return _input->n_ports ();
1591 list<pair<ChanCount, ChanCount> >
1592 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1594 Glib::RWLock::ReaderLock lm (_processor_lock);
1596 return try_configure_processors_unlocked (in, err);
1599 list<pair<ChanCount, ChanCount> >
1600 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1602 // Check each processor in order to see if we can configure as requested
1604 list<pair<ChanCount, ChanCount> > configuration;
1607 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1608 DEBUG_TRACE (DEBUG::Processors, "{\n");
1610 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1612 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1613 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1617 if ((*p)->can_support_io_configuration(in, out)) {
1618 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1619 configuration.push_back(make_pair(in, out));
1626 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1627 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1628 DEBUG_TRACE (DEBUG::Processors, "}\n");
1629 return list<pair<ChanCount, ChanCount> > ();
1633 DEBUG_TRACE (DEBUG::Processors, "}\n");
1635 return configuration;
1638 /** Set the input/output configuration of each processor in the processors list.
1639 * Caller must hold process lock.
1640 * Return 0 on success, otherwise configuration is impossible.
1643 Route::configure_processors_unlocked (ProcessorStreams* err)
1645 assert (!AudioEngine::instance()->process_lock().trylock());
1647 if (_in_configure_processors) {
1651 /* put invisible processors where they should be */
1652 setup_invisible_processors ();
1654 _in_configure_processors = true;
1656 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1658 if (configuration.empty ()) {
1659 _in_configure_processors = false;
1665 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1666 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1668 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1672 (*p)->configure_io(c->first, c->second);
1673 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1674 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1679 _meter->reset_max_channels (processor_max_streams);
1682 /* make sure we have sufficient scratch buffers to cope with the new processor
1685 _session.ensure_buffers (n_process_buffers ());
1687 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1689 _in_configure_processors = false;
1693 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1694 * @param state New active state for those processors.
1697 Route::all_visible_processors_active (bool state)
1699 Glib::RWLock::ReaderLock lm (_processor_lock);
1701 if (_processors.empty()) {
1705 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1706 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1713 (*i)->deactivate ();
1717 _session.set_dirty ();
1721 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1723 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1724 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1725 processors in the current actual processor list that are hidden. Any visible processors
1726 in the current list but not in "new_order" will be assumed to be deleted.
1730 Glib::RWLock::WriterLock lm (_processor_lock);
1731 ProcessorState pstate (this);
1733 ProcessorList::iterator oiter;
1734 ProcessorList::const_iterator niter;
1735 ProcessorList as_it_will_be;
1737 oiter = _processors.begin();
1738 niter = new_order.begin();
1740 while (niter != new_order.end()) {
1742 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1743 then append it to the temp list.
1745 Otherwise, see if the next processor in the old list is in the new list. if not,
1746 its been deleted. If its there, append it to the temp list.
1749 if (oiter == _processors.end()) {
1751 /* no more elements in the old list, so just stick the rest of
1752 the new order onto the temp list.
1755 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1756 while (niter != new_order.end()) {
1763 if (!(*oiter)->display_to_user()) {
1765 as_it_will_be.push_back (*oiter);
1769 /* visible processor: check that its in the new order */
1771 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1772 /* deleted: do nothing, shared_ptr<> will clean up */
1774 /* ignore this one, and add the next item from the new order instead */
1775 as_it_will_be.push_back (*niter);
1780 /* now remove from old order - its taken care of no matter what */
1781 oiter = _processors.erase (oiter);
1786 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1788 /* If the meter is in a custom position, find it and make a rough note of its position */
1789 maybe_note_meter_position ();
1792 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1794 if (configure_processors_unlocked (err)) {
1801 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1802 set_processor_positions ();
1814 Route::get_template()
1816 return state(false);
1820 Route::state(bool full_state)
1822 XMLNode *node = new XMLNode("Route");
1823 ProcessorList::iterator i;
1826 id().print (buf, sizeof (buf));
1827 node->add_property("id", buf);
1828 node->add_property ("name", _name);
1829 node->add_property("default-type", _default_type.to_string());
1832 node->add_property("flags", enum_2_string (_flags));
1835 node->add_property("active", _active?"yes":"no");
1837 boost::to_string (_phase_invert, p);
1838 node->add_property("phase-invert", p);
1839 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1840 node->add_property("meter-point", enum_2_string (_meter_point));
1843 node->add_property("route-group", _route_group->name());
1846 string order_string;
1847 OrderKeys::iterator x = order_keys.begin();
1849 while (x != order_keys.end()) {
1850 order_string += string ((*x).first);
1851 order_string += '=';
1852 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1853 order_string += buf;
1857 if (x == order_keys.end()) {
1861 order_string += ':';
1863 node->add_property ("order-keys", order_string);
1864 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1865 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1866 node->add_property ("soloed-by-upstream", buf);
1867 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1868 node->add_property ("soloed-by-downstream", buf);
1869 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1870 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1872 node->add_child_nocopy (_input->state (full_state));
1873 node->add_child_nocopy (_output->state (full_state));
1874 node->add_child_nocopy (_solo_control->get_state ());
1875 node->add_child_nocopy (_mute_control->get_state ());
1876 node->add_child_nocopy (_mute_master->get_state ());
1878 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1879 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1880 remote_control_node->add_property (X_("id"), buf);
1881 node->add_child_nocopy (*remote_control_node);
1883 if (_comment.length()) {
1884 XMLNode *cmt = node->add_child ("Comment");
1885 cmt->add_content (_comment);
1889 node->add_child_nocopy (_pannable->state (full_state));
1892 for (i = _processors.begin(); i != _processors.end(); ++i) {
1894 /* template save: do not include internal sends functioning as
1895 aux sends because the chance of the target ID
1896 in the session where this template is used
1899 similarly, do not save listen sends which connect to
1900 the monitor section, because these will always be
1903 boost::shared_ptr<InternalSend> is;
1905 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1906 if (is->role() == Delivery::Aux || is->role() == Delivery::Listen) {
1911 node->add_child_nocopy((*i)->state (full_state));
1915 node->add_child_copy (*_extra_xml);
1918 if (_custom_meter_position_noted) {
1919 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1921 after->id().print (buf, sizeof (buf));
1922 node->add_property (X_("processor-after-last-custom-meter"), buf);
1925 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1932 Route::set_state (const XMLNode& node, int version)
1934 if (version < 3000) {
1935 return set_state_2X (node, version);
1939 XMLNodeConstIterator niter;
1941 const XMLProperty *prop;
1943 if (node.name() != "Route"){
1944 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1948 if ((prop = node.property (X_("name"))) != 0) {
1949 Route::set_name (prop->value());
1954 if ((prop = node.property (X_("flags"))) != 0) {
1955 _flags = Flag (string_2_enum (prop->value(), _flags));
1960 if (is_master() || is_monitor() || is_hidden()) {
1961 _mute_master->set_solo_ignore (true);
1965 /* monitor bus does not get a panner, but if (re)created
1966 via XML, it will already have one by the time we
1967 call ::set_state(). so ... remove it.
1972 /* add all processors (except amp, which is always present) */
1974 nlist = node.children();
1975 XMLNode processor_state (X_("processor_state"));
1977 Stateful::save_extra_xml (node);
1979 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1983 if (child->name() == IO::state_node_name) {
1984 if ((prop = child->property (X_("direction"))) == 0) {
1988 if (prop->value() == "Input") {
1989 _input->set_state (*child, version);
1990 } else if (prop->value() == "Output") {
1991 _output->set_state (*child, version);
1995 if (child->name() == X_("Processor")) {
1996 processor_state.add_child_copy (*child);
2000 if (child->name() == X_("Pannable")) {
2002 _pannable->set_state (*child, version);
2004 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2009 if ((prop = node.property (X_("meter-point"))) != 0) {
2010 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2011 set_meter_point (mp, true);
2013 _meter->set_display_to_user (_meter_point == MeterCustom);
2017 set_processor_state (processor_state);
2019 if ((prop = node.property ("self-solo")) != 0) {
2020 set_self_solo (string_is_affirmative (prop->value()));
2023 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2024 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2025 mod_solo_by_others_upstream (atoi (prop->value()));
2028 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2029 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2030 mod_solo_by_others_downstream (atoi (prop->value()));
2033 if ((prop = node.property ("solo-isolated")) != 0) {
2034 set_solo_isolated (string_is_affirmative (prop->value()), this);
2037 if ((prop = node.property ("solo-safe")) != 0) {
2038 set_solo_safe (string_is_affirmative (prop->value()), this);
2041 if ((prop = node.property (X_("phase-invert"))) != 0) {
2042 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2045 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2046 set_denormal_protection (string_is_affirmative (prop->value()));
2049 if ((prop = node.property (X_("active"))) != 0) {
2050 bool yn = string_is_affirmative (prop->value());
2051 _active = !yn; // force switch
2052 set_active (yn, this);
2055 if ((prop = node.property (X_("order-keys"))) != 0) {
2059 string::size_type colon, equal;
2060 string remaining = prop->value();
2062 while (remaining.length()) {
2064 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2065 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2068 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2069 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2072 set_order_key (remaining.substr (0, equal), n);
2076 colon = remaining.find_first_of (':');
2078 if (colon != string::npos) {
2079 remaining = remaining.substr (colon+1);
2086 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2087 PBD::ID id (prop->value ());
2088 Glib::RWLock::ReaderLock lm (_processor_lock);
2089 ProcessorList::const_iterator i = _processors.begin ();
2090 while (i != _processors.end() && (*i)->id() != id) {
2094 if (i != _processors.end ()) {
2095 _processor_after_last_custom_meter = *i;
2096 _custom_meter_position_noted = true;
2100 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2101 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2104 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2107 if (child->name() == X_("Comment")) {
2109 /* XXX this is a terrible API design in libxml++ */
2111 XMLNode *cmt = *(child->children().begin());
2112 _comment = cmt->content();
2114 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2115 if (prop->value() == "solo") {
2116 _solo_control->set_state (*child, version);
2119 } else if (child->name() == X_("RemoteControl")) {
2120 if ((prop = child->property (X_("id"))) != 0) {
2122 sscanf (prop->value().c_str(), "%d", &x);
2123 set_remote_control_id (x);
2126 } else if (child->name() == X_("MuteMaster")) {
2127 _mute_master->set_state (*child, version);
2135 Route::set_state_2X (const XMLNode& node, int version)
2138 XMLNodeConstIterator niter;
2140 const XMLProperty *prop;
2142 /* 2X things which still remain to be handled:
2148 if (node.name() != "Route") {
2149 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2153 if ((prop = node.property (X_("flags"))) != 0) {
2154 _flags = Flag (string_2_enum (prop->value(), _flags));
2159 if ((prop = node.property (X_("phase-invert"))) != 0) {
2160 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2161 if (string_is_affirmative (prop->value ())) {
2164 set_phase_invert (p);
2167 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2168 set_denormal_protection (string_is_affirmative (prop->value()));
2171 if ((prop = node.property (X_("soloed"))) != 0) {
2172 bool yn = string_is_affirmative (prop->value());
2174 /* XXX force reset of solo status */
2176 set_solo (yn, this);
2179 if ((prop = node.property (X_("muted"))) != 0) {
2182 bool muted = string_is_affirmative (prop->value());
2188 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2190 if (string_is_affirmative (prop->value())){
2191 mute_point = mute_point + "PreFader";
2196 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2198 if (string_is_affirmative (prop->value())){
2201 mute_point = mute_point + ",";
2204 mute_point = mute_point + "PostFader";
2209 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2211 if (string_is_affirmative (prop->value())){
2214 mute_point = mute_point + ",";
2217 mute_point = mute_point + "Listen";
2222 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2224 if (string_is_affirmative (prop->value())){
2227 mute_point = mute_point + ",";
2230 mute_point = mute_point + "Main";
2234 _mute_master->set_mute_points (mute_point);
2235 _mute_master->set_muted_by_self (true);
2239 if ((prop = node.property (X_("meter-point"))) != 0) {
2240 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2243 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2244 don't mean the same thing.
2247 if ((prop = node.property (X_("order-keys"))) != 0) {
2251 string::size_type colon, equal;
2252 string remaining = prop->value();
2254 while (remaining.length()) {
2256 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2257 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2260 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2261 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2264 set_order_key (remaining.substr (0, equal), n);
2268 colon = remaining.find_first_of (':');
2270 if (colon != string::npos) {
2271 remaining = remaining.substr (colon+1);
2280 nlist = node.children ();
2281 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2285 if (child->name() == IO::state_node_name) {
2287 /* there is a note in IO::set_state_2X() about why we have to call
2291 _input->set_state_2X (*child, version, true);
2292 _output->set_state_2X (*child, version, false);
2294 if ((prop = child->property (X_("name"))) != 0) {
2295 Route::set_name (prop->value ());
2300 if ((prop = child->property (X_("active"))) != 0) {
2301 bool yn = string_is_affirmative (prop->value());
2302 _active = !yn; // force switch
2303 set_active (yn, this);
2306 if ((prop = child->property (X_("gain"))) != 0) {
2309 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2310 _amp->gain_control()->set_value (val);
2314 /* Set up Panners in the IO */
2315 XMLNodeList io_nlist = child->children ();
2317 XMLNodeConstIterator io_niter;
2320 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2322 io_child = *io_niter;
2324 if (io_child->name() == X_("Panner")) {
2325 _main_outs->panner_shell()->set_state(*io_child, version);
2326 } else if (io_child->name() == X_("Automation")) {
2327 /* IO's automation is for the fader */
2328 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2334 XMLNodeList redirect_nodes;
2336 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2340 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2341 redirect_nodes.push_back(child);
2346 set_processor_state_2X (redirect_nodes, version);
2348 Stateful::save_extra_xml (node);
2350 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2353 if (child->name() == X_("Comment")) {
2355 /* XXX this is a terrible API design in libxml++ */
2357 XMLNode *cmt = *(child->children().begin());
2358 _comment = cmt->content();
2360 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2361 if (prop->value() == X_("solo")) {
2362 _solo_control->set_state (*child, version);
2363 } else if (prop->value() == X_("mute")) {
2364 _mute_control->set_state (*child, version);
2367 } else if (child->name() == X_("RemoteControl")) {
2368 if ((prop = child->property (X_("id"))) != 0) {
2370 sscanf (prop->value().c_str(), "%d", &x);
2371 set_remote_control_id (x);
2381 Route::get_processor_state ()
2383 XMLNode* root = new XMLNode (X_("redirects"));
2384 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2385 root->add_child_nocopy ((*i)->state (true));
2392 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2394 /* We don't bother removing existing processors not in nList, as this
2395 method will only be called when creating a Route from scratch, not
2396 for undo purposes. Just put processors in at the appropriate place
2400 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2401 add_processor_from_xml_2X (**i, version);
2406 Route::set_processor_state (const XMLNode& node)
2408 const XMLNodeList &nlist = node.children();
2409 XMLNodeConstIterator niter;
2410 ProcessorList new_order;
2411 bool must_configure = false;
2413 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2415 XMLProperty* prop = (*niter)->property ("type");
2417 if (prop->value() == "amp") {
2418 _amp->set_state (**niter, Stateful::current_state_version);
2419 new_order.push_back (_amp);
2420 } else if (prop->value() == "meter") {
2421 _meter->set_state (**niter, Stateful::current_state_version);
2422 new_order.push_back (_meter);
2423 } else if (prop->value() == "main-outs") {
2424 _main_outs->set_state (**niter, Stateful::current_state_version);
2425 } else if (prop->value() == "intreturn") {
2427 _intreturn.reset (new InternalReturn (_session));
2428 must_configure = true;
2430 _intreturn->set_state (**niter, Stateful::current_state_version);
2431 } else if (is_monitor() && prop->value() == "monitor") {
2432 if (!_monitor_control) {
2433 _monitor_control.reset (new MonitorProcessor (_session));
2434 must_configure = true;
2436 _monitor_control->set_state (**niter, Stateful::current_state_version);
2437 } else if (prop->value() == "capture") {
2438 _capturing_processor.reset (new CapturingProcessor (_session));
2440 ProcessorList::iterator o;
2442 for (o = _processors.begin(); o != _processors.end(); ++o) {
2443 XMLProperty* id_prop = (*niter)->property(X_("id"));
2444 if (id_prop && (*o)->id() == id_prop->value()) {
2445 (*o)->set_state (**niter, Stateful::current_state_version);
2446 new_order.push_back (*o);
2451 // If the processor (*niter) is not on the route then create it
2453 if (o == _processors.end()) {
2455 boost::shared_ptr<Processor> processor;
2457 if (prop->value() == "intsend") {
2459 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2461 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2462 prop->value() == "lv2" ||
2463 prop->value() == "vst" ||
2464 prop->value() == "lxvst" ||
2465 prop->value() == "audiounit") {
2467 processor.reset (new PluginInsert(_session));
2469 } else if (prop->value() == "port") {
2471 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2473 } else if (prop->value() == "send") {
2475 processor.reset (new Send (_session, _pannable, _mute_master));
2478 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2482 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2483 /* This processor could not be configured. Turn it into a UnknownProcessor */
2484 processor.reset (new UnknownProcessor (_session, **niter));
2487 /* we have to note the monitor send here, otherwise a new one will be created
2488 and the state of this one will be lost.
2490 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2491 if (isend && isend->role() == Delivery::Listen) {
2492 _monitor_send = isend;
2495 /* it doesn't matter if invisible processors are added here, as they
2496 will be sorted out by setup_invisible_processors () shortly.
2499 new_order.push_back (processor);
2500 must_configure = true;
2506 Glib::RWLock::WriterLock lm (_processor_lock);
2507 _processors = new_order;
2509 if (must_configure) {
2510 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2511 configure_processors_unlocked (0);
2514 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2516 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2518 boost::shared_ptr<PluginInsert> pi;
2520 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2521 if (pi->has_no_inputs ()) {
2522 _have_internal_generator = true;
2529 processors_changed (RouteProcessorChange ());
2530 set_processor_positions ();
2534 Route::curve_reallocate ()
2536 // _gain_automation_curve.finish_resize ();
2537 // _pan_automation_curve.finish_resize ();
2541 Route::silence (framecnt_t nframes)
2543 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2548 silence_unlocked (nframes);
2552 Route::silence_unlocked (framecnt_t nframes)
2554 /* Must be called with the processor lock held */
2558 _output->silence (nframes);
2560 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2561 boost::shared_ptr<PluginInsert> pi;
2563 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2564 // skip plugins, they don't need anything when we're not active
2568 (*i)->silence (nframes);
2571 if (nframes == _session.get_block_size()) {
2578 Route::add_internal_return ()
2581 _intreturn.reset (new InternalReturn (_session));
2582 add_processor (_intreturn, PreFader);
2587 Route::add_send_to_internal_return (InternalSend* send)
2589 Glib::RWLock::ReaderLock rm (_processor_lock);
2591 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2592 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2595 return d->add_send (send);
2601 Route::remove_send_from_internal_return (InternalSend* send)
2603 Glib::RWLock::ReaderLock rm (_processor_lock);
2605 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2606 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2609 return d->remove_send (send);
2615 Route::enable_monitor_send ()
2617 /* Caller must hold process lock */
2618 assert (!AudioEngine::instance()->process_lock().trylock());
2620 /* master never sends to monitor section via the normal mechanism */
2621 assert (!is_master ());
2623 /* make sure we have one */
2624 if (!_monitor_send) {
2625 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2626 _monitor_send->set_display_to_user (false);
2630 configure_processors (0);
2633 /** Add an aux send to a route.
2634 * @param route route to send to.
2635 * @param before Processor to insert before, or 0 to insert at the end.
2638 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2640 assert (route != _session.monitor_out ());
2643 Glib::RWLock::ReaderLock rm (_processor_lock);
2645 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2647 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2649 if (d && d->target_route() == route) {
2650 /* already listening via the specified IO: do nothing */
2658 boost::shared_ptr<InternalSend> listener;
2661 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2662 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2665 add_processor (listener, before);
2667 } catch (failed_constructor& err) {
2675 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2677 ProcessorStreams err;
2678 ProcessorList::iterator tmp;
2681 Glib::RWLock::ReaderLock rl(_processor_lock);
2683 /* have to do this early because otherwise processor reconfig
2684 * will put _monitor_send back in the list
2687 if (route == _session.monitor_out()) {
2688 _monitor_send.reset ();
2692 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2694 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2696 if (d && d->target_route() == route) {
2698 remove_processor (*x, &err, false);
2701 /* list could have been demolished while we dropped the lock
2712 Route::set_comment (string cmt, void *src)
2715 comment_changed (src);
2716 _session.set_dirty ();
2720 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2722 FeedRecord fr (other, via_sends_only);
2724 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2726 if (!result.second) {
2728 /* already a record for "other" - make sure sends-only information is correct */
2729 if (!via_sends_only && result.first->sends_only) {
2730 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2731 frp->sends_only = false;
2735 return result.second;
2739 Route::clear_fed_by ()
2745 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2747 const FedBy& fed_by (other->fed_by());
2749 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2750 boost::shared_ptr<Route> sr = f->r.lock();
2752 if (sr && (sr.get() == this)) {
2754 if (via_sends_only) {
2755 *via_sends_only = f->sends_only;
2766 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2768 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2770 if (_output->connected_to (other->input())) {
2771 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2772 if (via_send_only) {
2773 *via_send_only = false;
2780 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2782 boost::shared_ptr<IOProcessor> iop;
2784 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2785 if (iop->feeds (other)) {
2786 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2787 if (via_send_only) {
2788 *via_send_only = true;
2792 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2795 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2800 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2805 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2807 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2810 /** Called from the (non-realtime) butler thread when the transport is stopped */
2812 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2814 framepos_t now = _session.transport_frame();
2817 Glib::RWLock::ReaderLock lm (_processor_lock);
2820 automation_snapshot (now, true);
2823 Automatable::transport_stopped (now);
2825 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2827 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2831 (*i)->transport_stopped (now);
2835 _roll_delay = _initial_delay;
2839 Route::input_change_handler (IOChange change, void * /*src*/)
2841 bool need_to_queue_solo_change = true;
2843 if ((change.type & IOChange::ConfigurationChanged)) {
2844 /* This is called with the process lock held if change
2845 contains ConfigurationChanged
2847 need_to_queue_solo_change = false;
2848 configure_processors (0);
2849 _phase_invert.resize (_input->n_ports().n_audio ());
2850 io_changed (); /* EMIT SIGNAL */
2853 if (!_input->connected() && _soloed_by_others_upstream) {
2854 if (need_to_queue_solo_change) {
2855 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2857 cancel_solo_after_disconnect (true);
2863 Route::output_change_handler (IOChange change, void * /*src*/)
2865 bool need_to_queue_solo_change = true;
2867 if ((change.type & IOChange::ConfigurationChanged)) {
2868 /* This is called with the process lock held if change
2869 contains ConfigurationChanged
2871 need_to_queue_solo_change = false;
2874 if (!_output->connected() && _soloed_by_others_downstream) {
2875 if (need_to_queue_solo_change) {
2876 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2878 cancel_solo_after_disconnect (false);
2884 Route::cancel_solo_after_disconnect (bool upstream)
2887 _soloed_by_others_upstream = 0;
2889 _soloed_by_others_downstream = 0;
2891 set_mute_master_solo ();
2892 solo_changed (false, this);
2896 Route::pans_required () const
2898 if (n_outputs().n_audio() < 2) {
2902 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2906 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2908 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2913 if (n_outputs().n_total() == 0) {
2917 if (!_active || n_inputs() == ChanCount::ZERO) {
2918 silence_unlocked (nframes);
2921 if (session_state_changing) {
2922 if (_session.transport_speed() != 0.0f) {
2923 /* we're rolling but some state is changing (e.g. our diskstream contents)
2924 so we cannot use them. Be silent till this is over.
2926 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2928 silence_unlocked (nframes);
2931 /* we're really not rolling, so we're either delivery silence or actually
2932 monitoring, both of which are safe to do while session_state_changing is true.
2936 _amp->apply_gain_automation (false);
2937 passthru (start_frame, end_frame, nframes, 0);
2943 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
2945 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2950 automation_snapshot (_session.transport_frame(), false);
2952 if (n_outputs().n_total() == 0) {
2956 if (!_active || n_inputs().n_total() == 0) {
2957 silence_unlocked (nframes);
2961 framepos_t unused = 0;
2963 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2969 passthru (start_frame, end_frame, nframes, declick);
2975 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
2982 Route::flush_processors ()
2984 /* XXX shouldn't really try to take this lock, since
2985 this is called from the RT audio thread.
2988 Glib::RWLock::ReaderLock lm (_processor_lock);
2990 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2996 Route::set_meter_point (MeterPoint p, bool force)
2998 /* CAN BE CALLED FROM PROCESS CONTEXT */
3000 if (_meter_point == p && !force) {
3004 bool meter_was_visible_to_user = _meter->display_to_user ();
3007 Glib::RWLock::WriterLock lm (_processor_lock);
3009 maybe_note_meter_position ();
3013 if (_meter_point != MeterCustom) {
3015 _meter->set_display_to_user (false);
3017 setup_invisible_processors ();
3021 _meter->set_display_to_user (true);
3023 /* If we have a previous position for the custom meter, try to put it there */
3024 if (_custom_meter_position_noted) {
3025 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3028 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3029 if (i != _processors.end ()) {
3030 _processors.remove (_meter);
3031 _processors.insert (i, _meter);
3033 } else if (_last_custom_meter_was_at_end) {
3034 _processors.remove (_meter);
3035 _processors.push_back (_meter);
3040 /* Set up the meter for its new position */
3042 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3046 if (loc == _processors.begin()) {
3047 m_in = _input->n_ports();
3049 ProcessorList::iterator before = loc;
3051 m_in = (*before)->output_streams ();
3054 _meter->reflect_inputs (m_in);
3056 /* we do not need to reconfigure the processors, because the meter
3057 (a) is always ready to handle processor_max_streams
3058 (b) is always an N-in/N-out processor, and thus moving
3059 it doesn't require any changes to the other processors.
3063 meter_change (); /* EMIT SIGNAL */
3065 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3067 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3071 Route::listen_position_changed ()
3074 Glib::RWLock::WriterLock lm (_processor_lock);
3075 ProcessorState pstate (this);
3078 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3080 if (configure_processors_unlocked (0)) {
3082 configure_processors_unlocked (0); // it worked before we tried to add it ...
3088 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3089 _session.set_dirty ();
3092 boost::shared_ptr<CapturingProcessor>
3093 Route::add_export_point()
3095 if (!_capturing_processor) {
3097 _capturing_processor.reset (new CapturingProcessor (_session));
3098 _capturing_processor->activate ();
3101 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3102 configure_processors (0);
3107 return _capturing_processor;
3111 Route::update_signal_latency ()
3113 framecnt_t l = _output->user_latency();
3115 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3116 if ((*i)->active ()) {
3117 l += (*i)->signal_latency ();
3121 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3123 if (_signal_latency != l) {
3124 _signal_latency = l;
3125 signal_latency_changed (); /* EMIT SIGNAL */
3128 return _signal_latency;
3132 Route::set_user_latency (framecnt_t nframes)
3134 _output->set_user_latency (nframes);
3135 _session.update_latency_compensation ();
3139 Route::set_latency_compensation (framecnt_t longest_session_latency)
3141 framecnt_t old = _initial_delay;
3143 if (_signal_latency < longest_session_latency) {
3144 _initial_delay = longest_session_latency - _signal_latency;
3149 DEBUG_TRACE (DEBUG::Latency, string_compose (
3150 "%1: compensate for maximum latency of %2,"
3151 "given own latency of %3, using initial delay of %4\n",
3152 name(), longest_session_latency, _signal_latency, _initial_delay));
3154 if (_initial_delay != old) {
3155 initial_delay_changed (); /* EMIT SIGNAL */
3158 if (_session.transport_stopped()) {
3159 _roll_delay = _initial_delay;
3164 Route::automation_snapshot (framepos_t now, bool force)
3167 _pannable->automation_snapshot (now, force);
3170 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3171 (*i)->automation_snapshot (now, force);
3175 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3176 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3177 boost::shared_ptr<AutomationList>(), name)
3180 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3185 Route::SoloControllable::set_value (double val)
3187 bool bval = ((val >= 0.5f) ? true: false);
3189 boost::shared_ptr<RouteList> rl (new RouteList);
3191 boost::shared_ptr<Route> r = _route.lock ();
3198 if (Config->get_solo_control_is_listen_control()) {
3199 _session.set_listen (rl, bval);
3201 _session.set_solo (rl, bval);
3206 Route::SoloControllable::get_value () const
3208 boost::shared_ptr<Route> r = _route.lock ();
3213 if (Config->get_solo_control_is_listen_control()) {
3214 return r->listening_via_monitor() ? 1.0f : 0.0f;
3216 return r->self_soloed() ? 1.0f : 0.0f;
3220 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3221 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3222 boost::shared_ptr<AutomationList>(), name)
3225 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3230 Route::MuteControllable::set_value (double val)
3232 bool bval = ((val >= 0.5f) ? true: false);
3234 boost::shared_ptr<RouteList> rl (new RouteList);
3236 boost::shared_ptr<Route> r = _route.lock ();
3242 _session.set_mute (rl, bval);
3246 Route::MuteControllable::get_value () const
3248 boost::shared_ptr<Route> r = _route.lock ();
3253 return r->muted() ? 1.0f : 0.0f;
3257 Route::set_block_size (pframes_t nframes)
3259 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3260 (*i)->set_block_size (nframes);
3263 _session.ensure_buffers (n_process_buffers ());
3267 Route::protect_automation ()
3269 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3270 (*i)->protect_automation();
3274 Route::set_pending_declick (int declick)
3277 /* this call is not allowed to turn off a pending declick unless "force" is true */
3279 _pending_declick = declick;
3281 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3283 _pending_declick = 0;
3288 /** Shift automation forwards from a particular place, thereby inserting time.
3289 * Adds undo commands for any shifts that are performed.
3291 * @param pos Position to start shifting from.
3292 * @param frames Amount to shift forwards by.
3296 Route::shift (framepos_t pos, framecnt_t frames)
3298 /* gain automation */
3300 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3302 XMLNode &before = gc->alist()->get_state ();
3303 gc->alist()->shift (pos, frames);
3304 XMLNode &after = gc->alist()->get_state ();
3305 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3308 /* pan automation */
3310 ControlSet::Controls& c (_pannable->controls());
3312 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3313 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3315 boost::shared_ptr<AutomationList> al = pc->alist();
3316 XMLNode& before = al->get_state ();
3317 al->shift (pos, frames);
3318 XMLNode& after = al->get_state ();
3319 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3324 /* redirect automation */
3326 Glib::RWLock::ReaderLock lm (_processor_lock);
3327 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3329 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3331 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3332 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3334 boost::shared_ptr<AutomationList> al = ac->alist();
3335 XMLNode &before = al->get_state ();
3336 al->shift (pos, frames);
3337 XMLNode &after = al->get_state ();
3338 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3347 Route::save_as_template (const string& path, const string& name)
3349 XMLNode& node (state (false));
3352 IO::set_name_in_state (*node.children().front(), name);
3354 tree.set_root (&node);
3355 return tree.write (path.c_str());
3360 Route::set_name (const string& str)
3366 name = Route::ensure_track_or_route_name (str, _session);
3367 SessionObject::set_name (name);
3369 ret = (_input->set_name(name) && _output->set_name(name));
3372 /* rename the main outs. Leave other IO processors
3373 * with whatever name they already have, because its
3374 * just fine as it is (it will not contain the route
3375 * name if its a port insert, port send or port return).
3379 if (_main_outs->set_name (name)) {
3380 /* XXX returning false here is stupid because
3381 we already changed the route name.
3391 /** Set the name of a route in an XML description.
3392 * @param node XML <Route> node to set the name in.
3393 * @param name New name.
3396 Route::set_name_in_state (XMLNode& node, string const & name)
3398 node.add_property (X_("name"), name);
3400 XMLNodeList children = node.children();
3401 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3403 if ((*i)->name() == X_("IO")) {
3405 IO::set_name_in_state (**i, name);
3407 } else if ((*i)->name() == X_("Processor")) {
3409 XMLProperty* role = (*i)->property (X_("role"));
3410 if (role && role->value() == X_("Main")) {
3411 (*i)->add_property (X_("name"), name);
3414 } else if ((*i)->name() == X_("Diskstream")) {
3416 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3417 (*i)->add_property (X_("name"), name);
3423 boost::shared_ptr<Send>
3424 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3426 Glib::RWLock::ReaderLock lm (_processor_lock);
3428 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3429 boost::shared_ptr<InternalSend> send;
3431 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3432 if (send->target_route() == target) {
3438 return boost::shared_ptr<Send>();
3441 /** @param c Audio channel index.
3442 * @param yn true to invert phase, otherwise false.
3445 Route::set_phase_invert (uint32_t c, bool yn)
3447 if (_phase_invert[c] != yn) {
3448 _phase_invert[c] = yn;
3449 phase_invert_changed (); /* EMIT SIGNAL */
3450 _session.set_dirty ();
3455 Route::set_phase_invert (boost::dynamic_bitset<> p)
3457 if (_phase_invert != p) {
3459 phase_invert_changed (); /* EMIT SIGNAL */
3460 _session.set_dirty ();
3465 Route::phase_invert (uint32_t c) const
3467 return _phase_invert[c];
3470 boost::dynamic_bitset<>
3471 Route::phase_invert () const
3473 return _phase_invert;
3477 Route::set_denormal_protection (bool yn)
3479 if (_denormal_protection != yn) {
3480 _denormal_protection = yn;
3481 denormal_protection_changed (); /* EMIT SIGNAL */
3486 Route::denormal_protection () const
3488 return _denormal_protection;
3492 Route::set_active (bool yn, void* src)
3494 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3495 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3499 if (_active != yn) {
3501 _input->set_active (yn);
3502 _output->set_active (yn);
3503 active_changed (); // EMIT SIGNAL
3510 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3516 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3518 boost::shared_ptr<Send> s;
3519 boost::shared_ptr<Return> r;
3521 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3522 s->meter()->meter();
3523 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3524 r->meter()->meter ();
3529 boost::shared_ptr<Pannable>
3530 Route::pannable() const
3535 boost::shared_ptr<Panner>
3536 Route::panner() const
3539 return _main_outs->panner_shell()->panner();
3542 boost::shared_ptr<PannerShell>
3543 Route::panner_shell() const
3545 return _main_outs->panner_shell();
3548 boost::shared_ptr<AutomationControl>
3549 Route::gain_control() const
3551 return _amp->gain_control();
3554 boost::shared_ptr<AutomationControl>
3555 Route::get_control (const Evoral::Parameter& param)
3557 /* either we own the control or .... */
3559 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3563 /* maybe one of our processors does or ... */
3565 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3566 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3567 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3575 /* nobody does so we'll make a new one */
3577 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3584 boost::shared_ptr<Processor>
3585 Route::nth_plugin (uint32_t n)
3587 Glib::RWLock::ReaderLock lm (_processor_lock);
3588 ProcessorList::iterator i;
3590 for (i = _processors.begin(); i != _processors.end(); ++i) {
3591 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3598 return boost::shared_ptr<Processor> ();
3601 boost::shared_ptr<Processor>
3602 Route::nth_send (uint32_t n)
3604 Glib::RWLock::ReaderLock lm (_processor_lock);
3605 ProcessorList::iterator i;
3607 for (i = _processors.begin(); i != _processors.end(); ++i) {
3608 if (boost::dynamic_pointer_cast<Send> (*i)) {
3615 return boost::shared_ptr<Processor> ();
3619 Route::has_io_processor_named (const string& name)
3621 Glib::RWLock::ReaderLock lm (_processor_lock);
3622 ProcessorList::iterator i;
3624 for (i = _processors.begin(); i != _processors.end(); ++i) {
3625 if (boost::dynamic_pointer_cast<Send> (*i) ||
3626 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3627 if ((*i)->name() == name) {
3636 MuteMaster::MutePoint
3637 Route::mute_points () const
3639 return _mute_master->mute_points ();
3643 Route::set_processor_positions ()
3645 Glib::RWLock::ReaderLock lm (_processor_lock);
3647 bool had_amp = false;
3648 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3649 (*i)->set_pre_fader (!had_amp);
3650 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3656 /** Called when there is a proposed change to the input port count */
3658 Route::input_port_count_changing (ChanCount to)
3660 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3662 /* The processors cannot be configured with the new input arrangement, so
3668 /* The change is ok */
3673 Route::unknown_processors () const
3677 Glib::RWLock::ReaderLock lm (_processor_lock);
3678 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3679 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3680 p.push_back ((*i)->name ());
3689 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3691 /* we assume that all our input ports feed all our output ports. its not
3692 universally true, but the alternative is way too corner-case to worry about.
3695 jack_latency_range_t all_connections;
3698 all_connections.min = 0;
3699 all_connections.max = 0;
3701 all_connections.min = ~((jack_nframes_t) 0);
3702 all_connections.max = 0;
3704 /* iterate over all "from" ports and determine the latency range for all of their
3705 connections to the "outside" (outside of this Route).
3708 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3710 jack_latency_range_t range;
3712 p->get_connected_latency_range (range, playback);
3714 all_connections.min = min (all_connections.min, range.min);
3715 all_connections.max = max (all_connections.max, range.max);
3719 /* set the "from" port latencies to the max/min range of all their connections */
3721 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3722 p->set_private_latency_range (all_connections, playback);
3725 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3727 all_connections.min += our_latency;
3728 all_connections.max += our_latency;
3730 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3731 p->set_private_latency_range (all_connections, playback);
3734 return all_connections.max;
3738 Route::set_private_port_latencies (bool playback) const
3740 framecnt_t own_latency = 0;
3742 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3743 OR LATENCY CALLBACK.
3745 This is called (early) from the latency callback. It computes the REAL
3746 latency associated with each port and stores the result as the "private"
3747 latency of the port. A later call to Route::set_public_port_latencies()
3748 sets all ports to the same value to reflect the fact that we do latency
3749 compensation and so all signals are delayed by the same amount as they
3750 flow through ardour.
3753 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3754 if ((*i)->active ()) {
3755 own_latency += (*i)->signal_latency ();
3760 /* playback: propagate latency from "outside the route" to outputs to inputs */
3761 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3763 /* capture: propagate latency from "outside the route" to inputs to outputs */
3764 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3769 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3771 /* this is called to set the JACK-visible port latencies, which take
3772 latency compensation into account.
3775 jack_latency_range_t range;
3781 const PortSet& ports (_input->ports());
3782 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3783 p->set_public_latency_range (range, playback);
3788 const PortSet& ports (_output->ports());
3789 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3790 p->set_public_latency_range (range, playback);
3795 /** Put the invisible processors in the right place in _processors.
3796 * Must be called with a writer lock on _processor_lock held.
3799 Route::setup_invisible_processors ()
3802 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3803 assert (!lm.locked ());
3807 /* too early to be doing this stuff */
3811 /* we'll build this new list here and then use it */
3813 ProcessorList new_processors;
3815 /* find visible processors */
3817 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3818 if ((*i)->display_to_user ()) {
3819 new_processors.push_back (*i);
3825 ProcessorList::iterator amp = new_processors.begin ();
3826 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3830 assert (amp != _processors.end ());
3832 /* and the processor after the amp */
3834 ProcessorList::iterator after_amp = amp;
3840 switch (_meter_point) {
3842 assert (!_meter->display_to_user ());
3843 new_processors.push_front (_meter);
3846 assert (!_meter->display_to_user ());
3847 new_processors.insert (amp, _meter);
3849 case MeterPostFader:
3850 /* do nothing here */
3853 /* do nothing here */
3856 /* the meter is visible, so we don't touch it here */
3863 assert (_main_outs);
3864 assert (!_main_outs->display_to_user ());
3865 new_processors.push_back (_main_outs);
3867 /* iterator for the main outs */
3869 ProcessorList::iterator main = new_processors.end();
3872 /* OUTPUT METERING */
3874 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3875 assert (!_meter->display_to_user ());
3877 /* add the processor just before or just after the main outs */
3879 ProcessorList::iterator meter_point = main;
3881 if (_meter_point == MeterOutput) {
3884 new_processors.insert (meter_point, _meter);
3889 if (_monitor_send && !is_monitor ()) {
3890 assert (!_monitor_send->display_to_user ());
3891 if (Config->get_solo_control_is_listen_control()) {
3892 switch (Config->get_listen_position ()) {
3893 case PreFaderListen:
3894 switch (Config->get_pfl_position ()) {
3895 case PFLFromBeforeProcessors:
3896 new_processors.push_front (_monitor_send);
3898 case PFLFromAfterProcessors:
3899 new_processors.insert (amp, _monitor_send);
3902 _monitor_send->set_can_pan (false);
3904 case AfterFaderListen:
3905 switch (Config->get_afl_position ()) {
3906 case AFLFromBeforeProcessors:
3907 new_processors.insert (after_amp, _monitor_send);
3909 case AFLFromAfterProcessors:
3910 new_processors.insert (new_processors.end(), _monitor_send);
3913 _monitor_send->set_can_pan (true);
3917 new_processors.insert (new_processors.end(), _monitor_send);
3918 _monitor_send->set_can_pan (false);
3922 /* MONITOR CONTROL */
3924 if (_monitor_control && is_monitor ()) {
3925 assert (!_monitor_control->display_to_user ());
3926 new_processors.push_front (_monitor_control);
3929 /* INTERNAL RETURN */
3931 /* doing this here means that any monitor control will come just after
3936 assert (!_intreturn->display_to_user ());
3937 new_processors.push_front (_intreturn);
3940 /* EXPORT PROCESSOR */
3942 if (_capturing_processor) {
3943 assert (!_capturing_processor->display_to_user ());
3944 new_processors.push_front (_capturing_processor);
3947 _processors = new_processors;
3949 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3950 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3951 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3958 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3959 Glib::RWLock::ReaderLock lp (_processor_lock);
3963 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3964 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
3971 /** If the meter point is `Custom', make a note of where the meter is.
3972 * This is so that if the meter point is subsequently set to something else,
3973 * and then back to custom, we can put the meter back where it was last time
3974 * custom was enabled.
3976 * Must be called with the _processor_lock held.
3979 Route::maybe_note_meter_position ()
3981 if (_meter_point != MeterCustom) {
3985 _custom_meter_position_noted = true;
3986 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3987 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
3988 ProcessorList::iterator j = i;
3990 if (j != _processors.end ()) {
3991 _processor_after_last_custom_meter = *j;
3992 _last_custom_meter_was_at_end = false;
3994 _last_custom_meter_was_at_end = true;
4000 boost::shared_ptr<Processor>
4001 Route::processor_by_id (PBD::ID id) const
4003 Glib::RWLock::ReaderLock lm (_processor_lock);
4004 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4005 if ((*i)->id() == id) {
4010 return boost::shared_ptr<Processor> ();
4013 /** @return the monitoring state, or in other words what data we are pushing
4014 * into the route (data from the inputs, data from disk or silence)
4017 Route::monitoring_state () const
4019 return MonitoringInput;
4022 /** @return what we should be metering; either the data coming from the input
4023 * IO or the data that is flowing through the route.
4026 Route::metering_state () const
4028 return MeteringRoute;
4032 Route::has_external_redirects () const
4034 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4036 /* ignore inactive processors and obviously ignore the main
4037 * outs since everything has them and we don't care.
4040 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4048 boost::shared_ptr<Processor>
4049 Route::the_instrument () const
4051 Glib::RWLock::WriterLock lm (_processor_lock);
4052 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4053 if ((*i)->input_streams().n_midi() > 0 &&
4054 (*i)->output_streams().n_audio() > 0) {
4058 return boost::shared_ptr<Processor>();