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 reset_instrument_info ();
1018 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1019 set_processor_positions ();
1025 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1027 const XMLProperty *prop;
1030 boost::shared_ptr<Processor> processor;
1032 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1033 so that we can add the processor in the right place (pre/post-fader)
1036 XMLNodeList const & children = node.children ();
1037 XMLNodeList::const_iterator i = children.begin ();
1039 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1043 Placement placement = PreFader;
1045 if (i != children.end()) {
1046 if ((prop = (*i)->property (X_("placement"))) != 0) {
1047 placement = Placement (string_2_enum (prop->value(), placement));
1051 if (node.name() == "Insert") {
1053 if ((prop = node.property ("type")) != 0) {
1055 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1056 prop->value() == "lv2" ||
1057 prop->value() == "vst" ||
1058 prop->value() == "lxvst" ||
1059 prop->value() == "audiounit") {
1061 processor.reset (new PluginInsert (_session));
1065 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1070 } else if (node.name() == "Send") {
1072 processor.reset (new Send (_session, _pannable, _mute_master));
1076 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1080 if (processor->set_state (node, version)) {
1084 return (add_processor (processor, placement) == 0);
1087 catch (failed_constructor &err) {
1088 warning << _("processor could not be created. Ignored.") << endmsg;
1094 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1096 /* NOTE: this is intended to be used ONLY when copying
1097 processors from another Route. Hence the subtle
1098 differences between this and ::add_processor()
1101 ProcessorList::iterator loc;
1104 loc = find(_processors.begin(), _processors.end(), before);
1106 /* nothing specified - at end */
1107 loc = _processors.end ();
1110 if (!_session.engine().connected()) {
1114 if (others.empty()) {
1119 Glib::RWLock::WriterLock lm (_processor_lock);
1120 ProcessorState pstate (this);
1122 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1128 boost::shared_ptr<PluginInsert> pi;
1130 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1134 _processors.insert (loc, *i);
1136 if ((*i)->active()) {
1141 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1142 if (configure_processors_unlocked (err)) {
1144 configure_processors_unlocked (0); // it worked before we tried to add it ...
1149 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1152 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1153 boost::shared_ptr<PluginInsert> pi;
1155 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1156 if (pi->has_no_inputs ()) {
1157 _have_internal_generator = true;
1163 _output->set_user_latency (0);
1166 reset_instrument_info ();
1167 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1168 set_processor_positions ();
1174 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1176 if (p == PreFader) {
1177 start = _processors.begin();
1178 end = find(_processors.begin(), _processors.end(), _amp);
1180 start = find(_processors.begin(), _processors.end(), _amp);
1182 end = _processors.end();
1186 /** Turn off all processors with a given placement
1187 * @param p Placement of processors to disable
1190 Route::disable_processors (Placement p)
1192 Glib::RWLock::ReaderLock lm (_processor_lock);
1194 ProcessorList::iterator start, end;
1195 placement_range(p, start, end);
1197 for (ProcessorList::iterator i = start; i != end; ++i) {
1198 (*i)->deactivate ();
1201 _session.set_dirty ();
1204 /** Turn off all redirects
1207 Route::disable_processors ()
1209 Glib::RWLock::ReaderLock lm (_processor_lock);
1211 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1212 (*i)->deactivate ();
1215 _session.set_dirty ();
1218 /** Turn off all redirects with a given placement
1219 * @param p Placement of redirects to disable
1222 Route::disable_plugins (Placement p)
1224 Glib::RWLock::ReaderLock lm (_processor_lock);
1226 ProcessorList::iterator start, end;
1227 placement_range(p, start, end);
1229 for (ProcessorList::iterator i = start; i != end; ++i) {
1230 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1231 (*i)->deactivate ();
1235 _session.set_dirty ();
1238 /** Turn off all plugins
1241 Route::disable_plugins ()
1243 Glib::RWLock::ReaderLock lm (_processor_lock);
1245 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1246 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1247 (*i)->deactivate ();
1251 _session.set_dirty ();
1256 Route::ab_plugins (bool forward)
1258 Glib::RWLock::ReaderLock lm (_processor_lock);
1262 /* forward = turn off all active redirects, and mark them so that the next time
1263 we go the other way, we will revert them
1266 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1267 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1271 if ((*i)->active()) {
1272 (*i)->deactivate ();
1273 (*i)->set_next_ab_is_active (true);
1275 (*i)->set_next_ab_is_active (false);
1281 /* backward = if the redirect was marked to go active on the next ab, do so */
1283 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1285 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1289 if ((*i)->get_next_ab_is_active()) {
1292 (*i)->deactivate ();
1297 _session.set_dirty ();
1301 /** Remove processors with a given placement.
1302 * @param p Placement of processors to remove.
1305 Route::clear_processors (Placement p)
1307 if (!_session.engine().connected()) {
1311 bool already_deleting = _session.deletion_in_progress();
1312 if (!already_deleting) {
1313 _session.set_deletion_in_progress();
1317 Glib::RWLock::WriterLock lm (_processor_lock);
1318 ProcessorList new_list;
1319 ProcessorStreams err;
1320 bool seen_amp = false;
1322 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1328 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1330 /* you can't remove these */
1332 new_list.push_back (*i);
1339 new_list.push_back (*i);
1342 (*i)->drop_references ();
1350 (*i)->drop_references ();
1353 new_list.push_back (*i);
1360 _processors = new_list;
1363 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1364 configure_processors_unlocked (&err); // this can't fail
1368 processor_max_streams.reset();
1369 _have_internal_generator = false;
1370 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1371 set_processor_positions ();
1373 reset_instrument_info ();
1375 if (!already_deleting) {
1376 _session.clear_deletion_in_progress();
1381 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1383 /* these can never be removed */
1385 if (processor == _amp || processor == _meter || processor == _main_outs) {
1389 if (!_session.engine().connected()) {
1393 processor_max_streams.reset();
1396 Glib::RWLock::WriterLock lm (_processor_lock);
1397 ProcessorState pstate (this);
1399 ProcessorList::iterator i;
1400 bool removed = false;
1402 for (i = _processors.begin(); i != _processors.end(); ) {
1403 if (*i == processor) {
1405 /* move along, see failure case for configure_processors()
1406 where we may need to reconfigure the processor.
1409 /* stop redirects that send signals to JACK ports
1410 from causing noise as a result of no longer being
1414 boost::shared_ptr<IOProcessor> iop;
1416 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1418 iop->input()->disconnect (this);
1420 if (iop->output()) {
1421 iop->output()->disconnect (this);
1425 i = _processors.erase (i);
1433 _output->set_user_latency (0);
1441 if (need_process_lock) {
1442 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1444 if (configure_processors_unlocked (err)) {
1446 /* we know this will work, because it worked before :) */
1447 configure_processors_unlocked (0);
1451 if (configure_processors_unlocked (err)) {
1453 /* we know this will work, because it worked before :) */
1454 configure_processors_unlocked (0);
1459 _have_internal_generator = false;
1461 for (i = _processors.begin(); i != _processors.end(); ++i) {
1462 boost::shared_ptr<PluginInsert> pi;
1464 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1465 if (pi->has_no_inputs ()) {
1466 _have_internal_generator = true;
1473 reset_instrument_info ();
1474 processor->drop_references ();
1475 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1476 set_processor_positions ();
1482 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1484 ProcessorList deleted;
1486 if (!_session.engine().connected()) {
1490 processor_max_streams.reset();
1493 Glib::RWLock::WriterLock lm (_processor_lock);
1494 ProcessorState pstate (this);
1496 ProcessorList::iterator i;
1497 boost::shared_ptr<Processor> processor;
1499 for (i = _processors.begin(); i != _processors.end(); ) {
1503 /* these can never be removed */
1505 if (processor == _amp || processor == _meter || processor == _main_outs) {
1510 /* see if its in the list of processors to delete */
1512 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1517 /* stop IOProcessors that send to JACK ports
1518 from causing noise as a result of no longer being
1522 boost::shared_ptr<IOProcessor> iop;
1524 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1528 deleted.push_back (processor);
1529 i = _processors.erase (i);
1532 if (deleted.empty()) {
1533 /* none of those in the requested list were found */
1537 _output->set_user_latency (0);
1540 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1542 if (configure_processors_unlocked (err)) {
1544 /* we know this will work, because it worked before :) */
1545 configure_processors_unlocked (0);
1550 _have_internal_generator = false;
1552 for (i = _processors.begin(); i != _processors.end(); ++i) {
1553 boost::shared_ptr<PluginInsert> pi;
1555 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1556 if (pi->has_no_inputs ()) {
1557 _have_internal_generator = true;
1564 /* now try to do what we need to so that those that were removed will be deleted */
1566 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1567 (*i)->drop_references ();
1570 reset_instrument_info ();
1571 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1572 set_processor_positions ();
1578 Route::reset_instrument_info ()
1580 boost::shared_ptr<Processor> instr = the_instrument();
1581 _instrument_info.set_internal_instrument (instr);
1584 /** Caller must hold process lock */
1586 Route::configure_processors (ProcessorStreams* err)
1588 assert (!AudioEngine::instance()->process_lock().trylock());
1590 if (!_in_configure_processors) {
1591 Glib::RWLock::WriterLock lm (_processor_lock);
1592 return configure_processors_unlocked (err);
1599 Route::input_streams () const
1601 return _input->n_ports ();
1604 list<pair<ChanCount, ChanCount> >
1605 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1607 Glib::RWLock::ReaderLock lm (_processor_lock);
1609 return try_configure_processors_unlocked (in, err);
1612 list<pair<ChanCount, ChanCount> >
1613 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1615 // Check each processor in order to see if we can configure as requested
1617 list<pair<ChanCount, ChanCount> > configuration;
1620 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1621 DEBUG_TRACE (DEBUG::Processors, "{\n");
1623 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1625 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1626 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1630 if ((*p)->can_support_io_configuration(in, out)) {
1631 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1632 configuration.push_back(make_pair(in, out));
1639 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1640 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1641 DEBUG_TRACE (DEBUG::Processors, "}\n");
1642 return list<pair<ChanCount, ChanCount> > ();
1646 DEBUG_TRACE (DEBUG::Processors, "}\n");
1648 return configuration;
1651 /** Set the input/output configuration of each processor in the processors list.
1652 * Caller must hold process lock.
1653 * Return 0 on success, otherwise configuration is impossible.
1656 Route::configure_processors_unlocked (ProcessorStreams* err)
1658 assert (!AudioEngine::instance()->process_lock().trylock());
1660 if (_in_configure_processors) {
1664 /* put invisible processors where they should be */
1665 setup_invisible_processors ();
1667 _in_configure_processors = true;
1669 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1671 if (configuration.empty ()) {
1672 _in_configure_processors = false;
1678 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1679 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1681 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1685 (*p)->configure_io(c->first, c->second);
1686 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1687 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1692 _meter->reset_max_channels (processor_max_streams);
1695 /* make sure we have sufficient scratch buffers to cope with the new processor
1698 _session.ensure_buffers (n_process_buffers ());
1700 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1702 _in_configure_processors = false;
1706 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1707 * @param state New active state for those processors.
1710 Route::all_visible_processors_active (bool state)
1712 Glib::RWLock::ReaderLock lm (_processor_lock);
1714 if (_processors.empty()) {
1718 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1719 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1726 (*i)->deactivate ();
1730 _session.set_dirty ();
1734 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1736 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1737 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1738 processors in the current actual processor list that are hidden. Any visible processors
1739 in the current list but not in "new_order" will be assumed to be deleted.
1743 Glib::RWLock::WriterLock lm (_processor_lock);
1744 ProcessorState pstate (this);
1746 ProcessorList::iterator oiter;
1747 ProcessorList::const_iterator niter;
1748 ProcessorList as_it_will_be;
1750 oiter = _processors.begin();
1751 niter = new_order.begin();
1753 while (niter != new_order.end()) {
1755 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1756 then append it to the temp list.
1758 Otherwise, see if the next processor in the old list is in the new list. if not,
1759 its been deleted. If its there, append it to the temp list.
1762 if (oiter == _processors.end()) {
1764 /* no more elements in the old list, so just stick the rest of
1765 the new order onto the temp list.
1768 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1769 while (niter != new_order.end()) {
1776 if (!(*oiter)->display_to_user()) {
1778 as_it_will_be.push_back (*oiter);
1782 /* visible processor: check that its in the new order */
1784 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1785 /* deleted: do nothing, shared_ptr<> will clean up */
1787 /* ignore this one, and add the next item from the new order instead */
1788 as_it_will_be.push_back (*niter);
1793 /* now remove from old order - its taken care of no matter what */
1794 oiter = _processors.erase (oiter);
1799 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1801 /* If the meter is in a custom position, find it and make a rough note of its position */
1802 maybe_note_meter_position ();
1805 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1807 if (configure_processors_unlocked (err)) {
1814 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1815 set_processor_positions ();
1827 Route::get_template()
1829 return state(false);
1833 Route::state(bool full_state)
1835 XMLNode *node = new XMLNode("Route");
1836 ProcessorList::iterator i;
1839 id().print (buf, sizeof (buf));
1840 node->add_property("id", buf);
1841 node->add_property ("name", _name);
1842 node->add_property("default-type", _default_type.to_string());
1845 node->add_property("flags", enum_2_string (_flags));
1848 node->add_property("active", _active?"yes":"no");
1850 boost::to_string (_phase_invert, p);
1851 node->add_property("phase-invert", p);
1852 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1853 node->add_property("meter-point", enum_2_string (_meter_point));
1856 node->add_property("route-group", _route_group->name());
1859 string order_string;
1860 OrderKeys::iterator x = order_keys.begin();
1862 while (x != order_keys.end()) {
1863 order_string += string ((*x).first);
1864 order_string += '=';
1865 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1866 order_string += buf;
1870 if (x == order_keys.end()) {
1874 order_string += ':';
1876 node->add_property ("order-keys", order_string);
1877 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1878 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1879 node->add_property ("soloed-by-upstream", buf);
1880 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1881 node->add_property ("soloed-by-downstream", buf);
1882 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1883 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1885 node->add_child_nocopy (_input->state (full_state));
1886 node->add_child_nocopy (_output->state (full_state));
1887 node->add_child_nocopy (_solo_control->get_state ());
1888 node->add_child_nocopy (_mute_control->get_state ());
1889 node->add_child_nocopy (_mute_master->get_state ());
1891 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1892 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1893 remote_control_node->add_property (X_("id"), buf);
1894 node->add_child_nocopy (*remote_control_node);
1896 if (_comment.length()) {
1897 XMLNode *cmt = node->add_child ("Comment");
1898 cmt->add_content (_comment);
1902 node->add_child_nocopy (_pannable->state (full_state));
1905 for (i = _processors.begin(); i != _processors.end(); ++i) {
1907 /* template save: do not include internal sends functioning as
1908 aux sends because the chance of the target ID
1909 in the session where this template is used
1912 similarly, do not save listen sends which connect to
1913 the monitor section, because these will always be
1916 boost::shared_ptr<InternalSend> is;
1918 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1919 if (is->role() == Delivery::Aux || is->role() == Delivery::Listen) {
1924 node->add_child_nocopy((*i)->state (full_state));
1928 node->add_child_copy (*_extra_xml);
1931 if (_custom_meter_position_noted) {
1932 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1934 after->id().print (buf, sizeof (buf));
1935 node->add_property (X_("processor-after-last-custom-meter"), buf);
1938 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1945 Route::set_state (const XMLNode& node, int version)
1947 if (version < 3000) {
1948 return set_state_2X (node, version);
1952 XMLNodeConstIterator niter;
1954 const XMLProperty *prop;
1956 if (node.name() != "Route"){
1957 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1961 if ((prop = node.property (X_("name"))) != 0) {
1962 Route::set_name (prop->value());
1967 if ((prop = node.property (X_("flags"))) != 0) {
1968 _flags = Flag (string_2_enum (prop->value(), _flags));
1973 if (is_master() || is_monitor() || is_hidden()) {
1974 _mute_master->set_solo_ignore (true);
1978 /* monitor bus does not get a panner, but if (re)created
1979 via XML, it will already have one by the time we
1980 call ::set_state(). so ... remove it.
1985 /* add all processors (except amp, which is always present) */
1987 nlist = node.children();
1988 XMLNode processor_state (X_("processor_state"));
1990 Stateful::save_extra_xml (node);
1992 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1996 if (child->name() == IO::state_node_name) {
1997 if ((prop = child->property (X_("direction"))) == 0) {
2001 if (prop->value() == "Input") {
2002 _input->set_state (*child, version);
2003 } else if (prop->value() == "Output") {
2004 _output->set_state (*child, version);
2008 if (child->name() == X_("Processor")) {
2009 processor_state.add_child_copy (*child);
2013 if (child->name() == X_("Pannable")) {
2015 _pannable->set_state (*child, version);
2017 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2022 if ((prop = node.property (X_("meter-point"))) != 0) {
2023 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2024 set_meter_point (mp, true);
2026 _meter->set_display_to_user (_meter_point == MeterCustom);
2030 set_processor_state (processor_state);
2032 if ((prop = node.property ("self-solo")) != 0) {
2033 set_self_solo (string_is_affirmative (prop->value()));
2036 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2037 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2038 mod_solo_by_others_upstream (atoi (prop->value()));
2041 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2042 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2043 mod_solo_by_others_downstream (atoi (prop->value()));
2046 if ((prop = node.property ("solo-isolated")) != 0) {
2047 set_solo_isolated (string_is_affirmative (prop->value()), this);
2050 if ((prop = node.property ("solo-safe")) != 0) {
2051 set_solo_safe (string_is_affirmative (prop->value()), this);
2054 if ((prop = node.property (X_("phase-invert"))) != 0) {
2055 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2058 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2059 set_denormal_protection (string_is_affirmative (prop->value()));
2062 if ((prop = node.property (X_("active"))) != 0) {
2063 bool yn = string_is_affirmative (prop->value());
2064 _active = !yn; // force switch
2065 set_active (yn, this);
2068 if ((prop = node.property (X_("order-keys"))) != 0) {
2072 string::size_type colon, equal;
2073 string remaining = prop->value();
2075 while (remaining.length()) {
2077 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2078 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2081 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2082 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2085 set_order_key (remaining.substr (0, equal), n);
2089 colon = remaining.find_first_of (':');
2091 if (colon != string::npos) {
2092 remaining = remaining.substr (colon+1);
2099 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2100 PBD::ID id (prop->value ());
2101 Glib::RWLock::ReaderLock lm (_processor_lock);
2102 ProcessorList::const_iterator i = _processors.begin ();
2103 while (i != _processors.end() && (*i)->id() != id) {
2107 if (i != _processors.end ()) {
2108 _processor_after_last_custom_meter = *i;
2109 _custom_meter_position_noted = true;
2113 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2114 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2117 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2120 if (child->name() == X_("Comment")) {
2122 /* XXX this is a terrible API design in libxml++ */
2124 XMLNode *cmt = *(child->children().begin());
2125 _comment = cmt->content();
2127 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2128 if (prop->value() == "solo") {
2129 _solo_control->set_state (*child, version);
2132 } else if (child->name() == X_("RemoteControl")) {
2133 if ((prop = child->property (X_("id"))) != 0) {
2135 sscanf (prop->value().c_str(), "%d", &x);
2136 set_remote_control_id (x);
2139 } else if (child->name() == X_("MuteMaster")) {
2140 _mute_master->set_state (*child, version);
2148 Route::set_state_2X (const XMLNode& node, int version)
2151 XMLNodeConstIterator niter;
2153 const XMLProperty *prop;
2155 /* 2X things which still remain to be handled:
2161 if (node.name() != "Route") {
2162 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2166 if ((prop = node.property (X_("flags"))) != 0) {
2167 _flags = Flag (string_2_enum (prop->value(), _flags));
2172 if ((prop = node.property (X_("phase-invert"))) != 0) {
2173 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2174 if (string_is_affirmative (prop->value ())) {
2177 set_phase_invert (p);
2180 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2181 set_denormal_protection (string_is_affirmative (prop->value()));
2184 if ((prop = node.property (X_("soloed"))) != 0) {
2185 bool yn = string_is_affirmative (prop->value());
2187 /* XXX force reset of solo status */
2189 set_solo (yn, this);
2192 if ((prop = node.property (X_("muted"))) != 0) {
2195 bool muted = string_is_affirmative (prop->value());
2201 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2203 if (string_is_affirmative (prop->value())){
2204 mute_point = mute_point + "PreFader";
2209 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2211 if (string_is_affirmative (prop->value())){
2214 mute_point = mute_point + ",";
2217 mute_point = mute_point + "PostFader";
2222 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2224 if (string_is_affirmative (prop->value())){
2227 mute_point = mute_point + ",";
2230 mute_point = mute_point + "Listen";
2235 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2237 if (string_is_affirmative (prop->value())){
2240 mute_point = mute_point + ",";
2243 mute_point = mute_point + "Main";
2247 _mute_master->set_mute_points (mute_point);
2248 _mute_master->set_muted_by_self (true);
2252 if ((prop = node.property (X_("meter-point"))) != 0) {
2253 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2256 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2257 don't mean the same thing.
2260 if ((prop = node.property (X_("order-keys"))) != 0) {
2264 string::size_type colon, equal;
2265 string remaining = prop->value();
2267 while (remaining.length()) {
2269 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2270 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2273 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2274 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2277 set_order_key (remaining.substr (0, equal), n);
2281 colon = remaining.find_first_of (':');
2283 if (colon != string::npos) {
2284 remaining = remaining.substr (colon+1);
2293 nlist = node.children ();
2294 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2298 if (child->name() == IO::state_node_name) {
2300 /* there is a note in IO::set_state_2X() about why we have to call
2304 _input->set_state_2X (*child, version, true);
2305 _output->set_state_2X (*child, version, false);
2307 if ((prop = child->property (X_("name"))) != 0) {
2308 Route::set_name (prop->value ());
2313 if ((prop = child->property (X_("active"))) != 0) {
2314 bool yn = string_is_affirmative (prop->value());
2315 _active = !yn; // force switch
2316 set_active (yn, this);
2319 if ((prop = child->property (X_("gain"))) != 0) {
2322 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2323 _amp->gain_control()->set_value (val);
2327 /* Set up Panners in the IO */
2328 XMLNodeList io_nlist = child->children ();
2330 XMLNodeConstIterator io_niter;
2333 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2335 io_child = *io_niter;
2337 if (io_child->name() == X_("Panner")) {
2338 _main_outs->panner_shell()->set_state(*io_child, version);
2339 } else if (io_child->name() == X_("Automation")) {
2340 /* IO's automation is for the fader */
2341 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2347 XMLNodeList redirect_nodes;
2349 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2353 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2354 redirect_nodes.push_back(child);
2359 set_processor_state_2X (redirect_nodes, version);
2361 Stateful::save_extra_xml (node);
2363 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2366 if (child->name() == X_("Comment")) {
2368 /* XXX this is a terrible API design in libxml++ */
2370 XMLNode *cmt = *(child->children().begin());
2371 _comment = cmt->content();
2373 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2374 if (prop->value() == X_("solo")) {
2375 _solo_control->set_state (*child, version);
2376 } else if (prop->value() == X_("mute")) {
2377 _mute_control->set_state (*child, version);
2380 } else if (child->name() == X_("RemoteControl")) {
2381 if ((prop = child->property (X_("id"))) != 0) {
2383 sscanf (prop->value().c_str(), "%d", &x);
2384 set_remote_control_id (x);
2394 Route::get_processor_state ()
2396 XMLNode* root = new XMLNode (X_("redirects"));
2397 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2398 root->add_child_nocopy ((*i)->state (true));
2405 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2407 /* We don't bother removing existing processors not in nList, as this
2408 method will only be called when creating a Route from scratch, not
2409 for undo purposes. Just put processors in at the appropriate place
2413 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2414 add_processor_from_xml_2X (**i, version);
2419 Route::set_processor_state (const XMLNode& node)
2421 const XMLNodeList &nlist = node.children();
2422 XMLNodeConstIterator niter;
2423 ProcessorList new_order;
2424 bool must_configure = false;
2426 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2428 XMLProperty* prop = (*niter)->property ("type");
2430 if (prop->value() == "amp") {
2431 _amp->set_state (**niter, Stateful::current_state_version);
2432 new_order.push_back (_amp);
2433 } else if (prop->value() == "meter") {
2434 _meter->set_state (**niter, Stateful::current_state_version);
2435 new_order.push_back (_meter);
2436 } else if (prop->value() == "main-outs") {
2437 _main_outs->set_state (**niter, Stateful::current_state_version);
2438 } else if (prop->value() == "intreturn") {
2440 _intreturn.reset (new InternalReturn (_session));
2441 must_configure = true;
2443 _intreturn->set_state (**niter, Stateful::current_state_version);
2444 } else if (is_monitor() && prop->value() == "monitor") {
2445 if (!_monitor_control) {
2446 _monitor_control.reset (new MonitorProcessor (_session));
2447 must_configure = true;
2449 _monitor_control->set_state (**niter, Stateful::current_state_version);
2450 } else if (prop->value() == "capture") {
2451 _capturing_processor.reset (new CapturingProcessor (_session));
2453 ProcessorList::iterator o;
2455 for (o = _processors.begin(); o != _processors.end(); ++o) {
2456 XMLProperty* id_prop = (*niter)->property(X_("id"));
2457 if (id_prop && (*o)->id() == id_prop->value()) {
2458 (*o)->set_state (**niter, Stateful::current_state_version);
2459 new_order.push_back (*o);
2464 // If the processor (*niter) is not on the route then create it
2466 if (o == _processors.end()) {
2468 boost::shared_ptr<Processor> processor;
2470 if (prop->value() == "intsend") {
2472 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2474 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2475 prop->value() == "lv2" ||
2476 prop->value() == "vst" ||
2477 prop->value() == "lxvst" ||
2478 prop->value() == "audiounit") {
2480 processor.reset (new PluginInsert(_session));
2482 } else if (prop->value() == "port") {
2484 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2486 } else if (prop->value() == "send") {
2488 processor.reset (new Send (_session, _pannable, _mute_master));
2491 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2495 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2496 /* This processor could not be configured. Turn it into a UnknownProcessor */
2497 processor.reset (new UnknownProcessor (_session, **niter));
2500 /* we have to note the monitor send here, otherwise a new one will be created
2501 and the state of this one will be lost.
2503 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2504 if (isend && isend->role() == Delivery::Listen) {
2505 _monitor_send = isend;
2508 /* it doesn't matter if invisible processors are added here, as they
2509 will be sorted out by setup_invisible_processors () shortly.
2512 new_order.push_back (processor);
2513 must_configure = true;
2519 Glib::RWLock::WriterLock lm (_processor_lock);
2520 _processors = new_order;
2522 if (must_configure) {
2523 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2524 configure_processors_unlocked (0);
2527 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2529 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2531 boost::shared_ptr<PluginInsert> pi;
2533 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2534 if (pi->has_no_inputs ()) {
2535 _have_internal_generator = true;
2542 reset_instrument_info ();
2543 processors_changed (RouteProcessorChange ());
2544 set_processor_positions ();
2548 Route::curve_reallocate ()
2550 // _gain_automation_curve.finish_resize ();
2551 // _pan_automation_curve.finish_resize ();
2555 Route::silence (framecnt_t nframes)
2557 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2562 silence_unlocked (nframes);
2566 Route::silence_unlocked (framecnt_t nframes)
2568 /* Must be called with the processor lock held */
2572 _output->silence (nframes);
2574 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2575 boost::shared_ptr<PluginInsert> pi;
2577 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2578 // skip plugins, they don't need anything when we're not active
2582 (*i)->silence (nframes);
2585 if (nframes == _session.get_block_size()) {
2592 Route::add_internal_return ()
2595 _intreturn.reset (new InternalReturn (_session));
2596 add_processor (_intreturn, PreFader);
2601 Route::add_send_to_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->add_send (send);
2615 Route::remove_send_from_internal_return (InternalSend* send)
2617 Glib::RWLock::ReaderLock rm (_processor_lock);
2619 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2620 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2623 return d->remove_send (send);
2629 Route::enable_monitor_send ()
2631 /* Caller must hold process lock */
2632 assert (!AudioEngine::instance()->process_lock().trylock());
2634 /* master never sends to monitor section via the normal mechanism */
2635 assert (!is_master ());
2637 /* make sure we have one */
2638 if (!_monitor_send) {
2639 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2640 _monitor_send->set_display_to_user (false);
2644 configure_processors (0);
2647 /** Add an aux send to a route.
2648 * @param route route to send to.
2649 * @param before Processor to insert before, or 0 to insert at the end.
2652 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2654 assert (route != _session.monitor_out ());
2657 Glib::RWLock::ReaderLock rm (_processor_lock);
2659 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2661 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2663 if (d && d->target_route() == route) {
2664 /* already listening via the specified IO: do nothing */
2672 boost::shared_ptr<InternalSend> listener;
2675 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2676 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2679 add_processor (listener, before);
2681 } catch (failed_constructor& err) {
2689 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2691 ProcessorStreams err;
2692 ProcessorList::iterator tmp;
2695 Glib::RWLock::ReaderLock rl(_processor_lock);
2697 /* have to do this early because otherwise processor reconfig
2698 * will put _monitor_send back in the list
2701 if (route == _session.monitor_out()) {
2702 _monitor_send.reset ();
2706 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2708 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2710 if (d && d->target_route() == route) {
2712 remove_processor (*x, &err, false);
2715 /* list could have been demolished while we dropped the lock
2726 Route::set_comment (string cmt, void *src)
2729 comment_changed (src);
2730 _session.set_dirty ();
2734 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2736 FeedRecord fr (other, via_sends_only);
2738 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2740 if (!result.second) {
2742 /* already a record for "other" - make sure sends-only information is correct */
2743 if (!via_sends_only && result.first->sends_only) {
2744 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2745 frp->sends_only = false;
2749 return result.second;
2753 Route::clear_fed_by ()
2759 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2761 const FedBy& fed_by (other->fed_by());
2763 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2764 boost::shared_ptr<Route> sr = f->r.lock();
2766 if (sr && (sr.get() == this)) {
2768 if (via_sends_only) {
2769 *via_sends_only = f->sends_only;
2780 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2782 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2784 if (_output->connected_to (other->input())) {
2785 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2786 if (via_send_only) {
2787 *via_send_only = false;
2794 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2796 boost::shared_ptr<IOProcessor> iop;
2798 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2799 if (iop->feeds (other)) {
2800 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2801 if (via_send_only) {
2802 *via_send_only = true;
2806 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2809 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2814 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2819 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2821 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2824 /** Called from the (non-realtime) butler thread when the transport is stopped */
2826 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2828 framepos_t now = _session.transport_frame();
2831 Glib::RWLock::ReaderLock lm (_processor_lock);
2834 automation_snapshot (now, true);
2837 Automatable::transport_stopped (now);
2839 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2841 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2845 (*i)->transport_stopped (now);
2849 _roll_delay = _initial_delay;
2853 Route::input_change_handler (IOChange change, void * /*src*/)
2855 bool need_to_queue_solo_change = true;
2857 if ((change.type & IOChange::ConfigurationChanged)) {
2858 /* This is called with the process lock held if change
2859 contains ConfigurationChanged
2861 need_to_queue_solo_change = false;
2862 configure_processors (0);
2863 _phase_invert.resize (_input->n_ports().n_audio ());
2864 io_changed (); /* EMIT SIGNAL */
2867 if (!_input->connected() && _soloed_by_others_upstream) {
2868 if (need_to_queue_solo_change) {
2869 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2871 cancel_solo_after_disconnect (true);
2877 Route::output_change_handler (IOChange change, void * /*src*/)
2879 bool need_to_queue_solo_change = true;
2881 if ((change.type & IOChange::ConfigurationChanged)) {
2882 /* This is called with the process lock held if change
2883 contains ConfigurationChanged
2885 need_to_queue_solo_change = false;
2888 if (!_output->connected() && _soloed_by_others_downstream) {
2889 if (need_to_queue_solo_change) {
2890 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2892 cancel_solo_after_disconnect (false);
2898 Route::cancel_solo_after_disconnect (bool upstream)
2901 _soloed_by_others_upstream = 0;
2903 _soloed_by_others_downstream = 0;
2905 set_mute_master_solo ();
2906 solo_changed (false, this);
2910 Route::pans_required () const
2912 if (n_outputs().n_audio() < 2) {
2916 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2920 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2922 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2927 if (n_outputs().n_total() == 0) {
2931 if (!_active || n_inputs() == ChanCount::ZERO) {
2932 silence_unlocked (nframes);
2935 if (session_state_changing) {
2936 if (_session.transport_speed() != 0.0f) {
2937 /* we're rolling but some state is changing (e.g. our diskstream contents)
2938 so we cannot use them. Be silent till this is over.
2940 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2942 silence_unlocked (nframes);
2945 /* we're really not rolling, so we're either delivery silence or actually
2946 monitoring, both of which are safe to do while session_state_changing is true.
2950 _amp->apply_gain_automation (false);
2951 passthru (start_frame, end_frame, nframes, 0);
2957 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
2959 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2964 automation_snapshot (_session.transport_frame(), false);
2966 if (n_outputs().n_total() == 0) {
2970 if (!_active || n_inputs().n_total() == 0) {
2971 silence_unlocked (nframes);
2975 framepos_t unused = 0;
2977 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2983 passthru (start_frame, end_frame, nframes, declick);
2989 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
2996 Route::flush_processors ()
2998 /* XXX shouldn't really try to take this lock, since
2999 this is called from the RT audio thread.
3002 Glib::RWLock::ReaderLock lm (_processor_lock);
3004 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3010 Route::set_meter_point (MeterPoint p, bool force)
3012 /* CAN BE CALLED FROM PROCESS CONTEXT */
3014 if (_meter_point == p && !force) {
3018 bool meter_was_visible_to_user = _meter->display_to_user ();
3021 Glib::RWLock::WriterLock lm (_processor_lock);
3023 maybe_note_meter_position ();
3027 if (_meter_point != MeterCustom) {
3029 _meter->set_display_to_user (false);
3031 setup_invisible_processors ();
3035 _meter->set_display_to_user (true);
3037 /* If we have a previous position for the custom meter, try to put it there */
3038 if (_custom_meter_position_noted) {
3039 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3042 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3043 if (i != _processors.end ()) {
3044 _processors.remove (_meter);
3045 _processors.insert (i, _meter);
3047 } else if (_last_custom_meter_was_at_end) {
3048 _processors.remove (_meter);
3049 _processors.push_back (_meter);
3054 /* Set up the meter for its new position */
3056 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3060 if (loc == _processors.begin()) {
3061 m_in = _input->n_ports();
3063 ProcessorList::iterator before = loc;
3065 m_in = (*before)->output_streams ();
3068 _meter->reflect_inputs (m_in);
3070 /* we do not need to reconfigure the processors, because the meter
3071 (a) is always ready to handle processor_max_streams
3072 (b) is always an N-in/N-out processor, and thus moving
3073 it doesn't require any changes to the other processors.
3077 meter_change (); /* EMIT SIGNAL */
3079 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3081 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3085 Route::listen_position_changed ()
3088 Glib::RWLock::WriterLock lm (_processor_lock);
3089 ProcessorState pstate (this);
3092 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3094 if (configure_processors_unlocked (0)) {
3096 configure_processors_unlocked (0); // it worked before we tried to add it ...
3102 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3103 _session.set_dirty ();
3106 boost::shared_ptr<CapturingProcessor>
3107 Route::add_export_point()
3109 if (!_capturing_processor) {
3111 _capturing_processor.reset (new CapturingProcessor (_session));
3112 _capturing_processor->activate ();
3115 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3116 configure_processors (0);
3121 return _capturing_processor;
3125 Route::update_signal_latency ()
3127 framecnt_t l = _output->user_latency();
3129 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3130 if ((*i)->active ()) {
3131 l += (*i)->signal_latency ();
3135 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3137 if (_signal_latency != l) {
3138 _signal_latency = l;
3139 signal_latency_changed (); /* EMIT SIGNAL */
3142 return _signal_latency;
3146 Route::set_user_latency (framecnt_t nframes)
3148 _output->set_user_latency (nframes);
3149 _session.update_latency_compensation ();
3153 Route::set_latency_compensation (framecnt_t longest_session_latency)
3155 framecnt_t old = _initial_delay;
3157 if (_signal_latency < longest_session_latency) {
3158 _initial_delay = longest_session_latency - _signal_latency;
3163 DEBUG_TRACE (DEBUG::Latency, string_compose (
3164 "%1: compensate for maximum latency of %2,"
3165 "given own latency of %3, using initial delay of %4\n",
3166 name(), longest_session_latency, _signal_latency, _initial_delay));
3168 if (_initial_delay != old) {
3169 initial_delay_changed (); /* EMIT SIGNAL */
3172 if (_session.transport_stopped()) {
3173 _roll_delay = _initial_delay;
3178 Route::automation_snapshot (framepos_t now, bool force)
3181 _pannable->automation_snapshot (now, force);
3184 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3185 (*i)->automation_snapshot (now, force);
3189 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3190 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3191 boost::shared_ptr<AutomationList>(), name)
3194 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3199 Route::SoloControllable::set_value (double val)
3201 bool bval = ((val >= 0.5f) ? true: false);
3203 boost::shared_ptr<RouteList> rl (new RouteList);
3205 boost::shared_ptr<Route> r = _route.lock ();
3212 if (Config->get_solo_control_is_listen_control()) {
3213 _session.set_listen (rl, bval);
3215 _session.set_solo (rl, bval);
3220 Route::SoloControllable::get_value () const
3222 boost::shared_ptr<Route> r = _route.lock ();
3227 if (Config->get_solo_control_is_listen_control()) {
3228 return r->listening_via_monitor() ? 1.0f : 0.0f;
3230 return r->self_soloed() ? 1.0f : 0.0f;
3234 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3235 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3236 boost::shared_ptr<AutomationList>(), name)
3239 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3244 Route::MuteControllable::set_value (double val)
3246 bool bval = ((val >= 0.5f) ? true: false);
3248 boost::shared_ptr<RouteList> rl (new RouteList);
3250 boost::shared_ptr<Route> r = _route.lock ();
3256 _session.set_mute (rl, bval);
3260 Route::MuteControllable::get_value () const
3262 boost::shared_ptr<Route> r = _route.lock ();
3267 return r->muted() ? 1.0f : 0.0f;
3271 Route::set_block_size (pframes_t nframes)
3273 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3274 (*i)->set_block_size (nframes);
3277 _session.ensure_buffers (n_process_buffers ());
3281 Route::protect_automation ()
3283 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3284 (*i)->protect_automation();
3288 Route::set_pending_declick (int declick)
3291 /* this call is not allowed to turn off a pending declick unless "force" is true */
3293 _pending_declick = declick;
3295 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3297 _pending_declick = 0;
3302 /** Shift automation forwards from a particular place, thereby inserting time.
3303 * Adds undo commands for any shifts that are performed.
3305 * @param pos Position to start shifting from.
3306 * @param frames Amount to shift forwards by.
3310 Route::shift (framepos_t pos, framecnt_t frames)
3312 /* gain automation */
3314 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3316 XMLNode &before = gc->alist()->get_state ();
3317 gc->alist()->shift (pos, frames);
3318 XMLNode &after = gc->alist()->get_state ();
3319 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3322 /* pan automation */
3324 ControlSet::Controls& c (_pannable->controls());
3326 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3327 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3329 boost::shared_ptr<AutomationList> al = pc->alist();
3330 XMLNode& before = al->get_state ();
3331 al->shift (pos, frames);
3332 XMLNode& after = al->get_state ();
3333 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3338 /* redirect automation */
3340 Glib::RWLock::ReaderLock lm (_processor_lock);
3341 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3343 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3345 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3346 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3348 boost::shared_ptr<AutomationList> al = ac->alist();
3349 XMLNode &before = al->get_state ();
3350 al->shift (pos, frames);
3351 XMLNode &after = al->get_state ();
3352 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3361 Route::save_as_template (const string& path, const string& name)
3363 XMLNode& node (state (false));
3366 IO::set_name_in_state (*node.children().front(), name);
3368 tree.set_root (&node);
3369 return tree.write (path.c_str());
3374 Route::set_name (const string& str)
3380 name = Route::ensure_track_or_route_name (str, _session);
3381 SessionObject::set_name (name);
3383 ret = (_input->set_name(name) && _output->set_name(name));
3386 /* rename the main outs. Leave other IO processors
3387 * with whatever name they already have, because its
3388 * just fine as it is (it will not contain the route
3389 * name if its a port insert, port send or port return).
3393 if (_main_outs->set_name (name)) {
3394 /* XXX returning false here is stupid because
3395 we already changed the route name.
3405 /** Set the name of a route in an XML description.
3406 * @param node XML <Route> node to set the name in.
3407 * @param name New name.
3410 Route::set_name_in_state (XMLNode& node, string const & name)
3412 node.add_property (X_("name"), name);
3414 XMLNodeList children = node.children();
3415 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3417 if ((*i)->name() == X_("IO")) {
3419 IO::set_name_in_state (**i, name);
3421 } else if ((*i)->name() == X_("Processor")) {
3423 XMLProperty* role = (*i)->property (X_("role"));
3424 if (role && role->value() == X_("Main")) {
3425 (*i)->add_property (X_("name"), name);
3428 } else if ((*i)->name() == X_("Diskstream")) {
3430 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3431 (*i)->add_property (X_("name"), name);
3437 boost::shared_ptr<Send>
3438 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3440 Glib::RWLock::ReaderLock lm (_processor_lock);
3442 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3443 boost::shared_ptr<InternalSend> send;
3445 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3446 if (send->target_route() == target) {
3452 return boost::shared_ptr<Send>();
3455 /** @param c Audio channel index.
3456 * @param yn true to invert phase, otherwise false.
3459 Route::set_phase_invert (uint32_t c, bool yn)
3461 if (_phase_invert[c] != yn) {
3462 _phase_invert[c] = yn;
3463 phase_invert_changed (); /* EMIT SIGNAL */
3464 _session.set_dirty ();
3469 Route::set_phase_invert (boost::dynamic_bitset<> p)
3471 if (_phase_invert != p) {
3473 phase_invert_changed (); /* EMIT SIGNAL */
3474 _session.set_dirty ();
3479 Route::phase_invert (uint32_t c) const
3481 return _phase_invert[c];
3484 boost::dynamic_bitset<>
3485 Route::phase_invert () const
3487 return _phase_invert;
3491 Route::set_denormal_protection (bool yn)
3493 if (_denormal_protection != yn) {
3494 _denormal_protection = yn;
3495 denormal_protection_changed (); /* EMIT SIGNAL */
3500 Route::denormal_protection () const
3502 return _denormal_protection;
3506 Route::set_active (bool yn, void* src)
3508 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3509 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3513 if (_active != yn) {
3515 _input->set_active (yn);
3516 _output->set_active (yn);
3517 active_changed (); // EMIT SIGNAL
3524 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3530 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3532 boost::shared_ptr<Send> s;
3533 boost::shared_ptr<Return> r;
3535 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3536 s->meter()->meter();
3537 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3538 r->meter()->meter ();
3543 boost::shared_ptr<Pannable>
3544 Route::pannable() const
3549 boost::shared_ptr<Panner>
3550 Route::panner() const
3553 return _main_outs->panner_shell()->panner();
3556 boost::shared_ptr<PannerShell>
3557 Route::panner_shell() const
3559 return _main_outs->panner_shell();
3562 boost::shared_ptr<AutomationControl>
3563 Route::gain_control() const
3565 return _amp->gain_control();
3568 boost::shared_ptr<AutomationControl>
3569 Route::get_control (const Evoral::Parameter& param)
3571 /* either we own the control or .... */
3573 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3577 /* maybe one of our processors does or ... */
3579 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3580 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3581 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3589 /* nobody does so we'll make a new one */
3591 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3598 boost::shared_ptr<Processor>
3599 Route::nth_plugin (uint32_t n)
3601 Glib::RWLock::ReaderLock lm (_processor_lock);
3602 ProcessorList::iterator i;
3604 for (i = _processors.begin(); i != _processors.end(); ++i) {
3605 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3612 return boost::shared_ptr<Processor> ();
3615 boost::shared_ptr<Processor>
3616 Route::nth_send (uint32_t n)
3618 Glib::RWLock::ReaderLock lm (_processor_lock);
3619 ProcessorList::iterator i;
3621 for (i = _processors.begin(); i != _processors.end(); ++i) {
3622 if (boost::dynamic_pointer_cast<Send> (*i)) {
3629 return boost::shared_ptr<Processor> ();
3633 Route::has_io_processor_named (const string& name)
3635 Glib::RWLock::ReaderLock lm (_processor_lock);
3636 ProcessorList::iterator i;
3638 for (i = _processors.begin(); i != _processors.end(); ++i) {
3639 if (boost::dynamic_pointer_cast<Send> (*i) ||
3640 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3641 if ((*i)->name() == name) {
3650 MuteMaster::MutePoint
3651 Route::mute_points () const
3653 return _mute_master->mute_points ();
3657 Route::set_processor_positions ()
3659 Glib::RWLock::ReaderLock lm (_processor_lock);
3661 bool had_amp = false;
3662 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3663 (*i)->set_pre_fader (!had_amp);
3664 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3670 /** Called when there is a proposed change to the input port count */
3672 Route::input_port_count_changing (ChanCount to)
3674 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3676 /* The processors cannot be configured with the new input arrangement, so
3682 /* The change is ok */
3687 Route::unknown_processors () const
3691 Glib::RWLock::ReaderLock lm (_processor_lock);
3692 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3693 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3694 p.push_back ((*i)->name ());
3703 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3705 /* we assume that all our input ports feed all our output ports. its not
3706 universally true, but the alternative is way too corner-case to worry about.
3709 jack_latency_range_t all_connections;
3712 all_connections.min = 0;
3713 all_connections.max = 0;
3715 all_connections.min = ~((jack_nframes_t) 0);
3716 all_connections.max = 0;
3718 /* iterate over all "from" ports and determine the latency range for all of their
3719 connections to the "outside" (outside of this Route).
3722 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3724 jack_latency_range_t range;
3726 p->get_connected_latency_range (range, playback);
3728 all_connections.min = min (all_connections.min, range.min);
3729 all_connections.max = max (all_connections.max, range.max);
3733 /* set the "from" port latencies to the max/min range of all their connections */
3735 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3736 p->set_private_latency_range (all_connections, playback);
3739 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3741 all_connections.min += our_latency;
3742 all_connections.max += our_latency;
3744 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3745 p->set_private_latency_range (all_connections, playback);
3748 return all_connections.max;
3752 Route::set_private_port_latencies (bool playback) const
3754 framecnt_t own_latency = 0;
3756 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3757 OR LATENCY CALLBACK.
3759 This is called (early) from the latency callback. It computes the REAL
3760 latency associated with each port and stores the result as the "private"
3761 latency of the port. A later call to Route::set_public_port_latencies()
3762 sets all ports to the same value to reflect the fact that we do latency
3763 compensation and so all signals are delayed by the same amount as they
3764 flow through ardour.
3767 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3768 if ((*i)->active ()) {
3769 own_latency += (*i)->signal_latency ();
3774 /* playback: propagate latency from "outside the route" to outputs to inputs */
3775 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3777 /* capture: propagate latency from "outside the route" to inputs to outputs */
3778 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3783 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3785 /* this is called to set the JACK-visible port latencies, which take
3786 latency compensation into account.
3789 jack_latency_range_t range;
3795 const PortSet& ports (_input->ports());
3796 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3797 p->set_public_latency_range (range, playback);
3802 const PortSet& ports (_output->ports());
3803 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3804 p->set_public_latency_range (range, playback);
3809 /** Put the invisible processors in the right place in _processors.
3810 * Must be called with a writer lock on _processor_lock held.
3813 Route::setup_invisible_processors ()
3816 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3817 assert (!lm.locked ());
3821 /* too early to be doing this stuff */
3825 /* we'll build this new list here and then use it */
3827 ProcessorList new_processors;
3829 /* find visible processors */
3831 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3832 if ((*i)->display_to_user ()) {
3833 new_processors.push_back (*i);
3839 ProcessorList::iterator amp = new_processors.begin ();
3840 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3844 assert (amp != _processors.end ());
3846 /* and the processor after the amp */
3848 ProcessorList::iterator after_amp = amp;
3854 switch (_meter_point) {
3856 assert (!_meter->display_to_user ());
3857 new_processors.push_front (_meter);
3860 assert (!_meter->display_to_user ());
3861 new_processors.insert (amp, _meter);
3863 case MeterPostFader:
3864 /* do nothing here */
3867 /* do nothing here */
3870 /* the meter is visible, so we don't touch it here */
3877 assert (_main_outs);
3878 assert (!_main_outs->display_to_user ());
3879 new_processors.push_back (_main_outs);
3881 /* iterator for the main outs */
3883 ProcessorList::iterator main = new_processors.end();
3886 /* OUTPUT METERING */
3888 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3889 assert (!_meter->display_to_user ());
3891 /* add the processor just before or just after the main outs */
3893 ProcessorList::iterator meter_point = main;
3895 if (_meter_point == MeterOutput) {
3898 new_processors.insert (meter_point, _meter);
3903 if (_monitor_send && !is_monitor ()) {
3904 assert (!_monitor_send->display_to_user ());
3905 if (Config->get_solo_control_is_listen_control()) {
3906 switch (Config->get_listen_position ()) {
3907 case PreFaderListen:
3908 switch (Config->get_pfl_position ()) {
3909 case PFLFromBeforeProcessors:
3910 new_processors.push_front (_monitor_send);
3912 case PFLFromAfterProcessors:
3913 new_processors.insert (amp, _monitor_send);
3916 _monitor_send->set_can_pan (false);
3918 case AfterFaderListen:
3919 switch (Config->get_afl_position ()) {
3920 case AFLFromBeforeProcessors:
3921 new_processors.insert (after_amp, _monitor_send);
3923 case AFLFromAfterProcessors:
3924 new_processors.insert (new_processors.end(), _monitor_send);
3927 _monitor_send->set_can_pan (true);
3931 new_processors.insert (new_processors.end(), _monitor_send);
3932 _monitor_send->set_can_pan (false);
3936 /* MONITOR CONTROL */
3938 if (_monitor_control && is_monitor ()) {
3939 assert (!_monitor_control->display_to_user ());
3940 new_processors.push_front (_monitor_control);
3943 /* INTERNAL RETURN */
3945 /* doing this here means that any monitor control will come just after
3950 assert (!_intreturn->display_to_user ());
3951 new_processors.push_front (_intreturn);
3954 /* EXPORT PROCESSOR */
3956 if (_capturing_processor) {
3957 assert (!_capturing_processor->display_to_user ());
3958 new_processors.push_front (_capturing_processor);
3961 _processors = new_processors;
3963 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3964 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3965 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3972 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3973 Glib::RWLock::ReaderLock lp (_processor_lock);
3977 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3978 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
3985 /** If the meter point is `Custom', make a note of where the meter is.
3986 * This is so that if the meter point is subsequently set to something else,
3987 * and then back to custom, we can put the meter back where it was last time
3988 * custom was enabled.
3990 * Must be called with the _processor_lock held.
3993 Route::maybe_note_meter_position ()
3995 if (_meter_point != MeterCustom) {
3999 _custom_meter_position_noted = true;
4000 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4001 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4002 ProcessorList::iterator j = i;
4004 if (j != _processors.end ()) {
4005 _processor_after_last_custom_meter = *j;
4006 _last_custom_meter_was_at_end = false;
4008 _last_custom_meter_was_at_end = true;
4014 boost::shared_ptr<Processor>
4015 Route::processor_by_id (PBD::ID id) const
4017 Glib::RWLock::ReaderLock lm (_processor_lock);
4018 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4019 if ((*i)->id() == id) {
4024 return boost::shared_ptr<Processor> ();
4027 /** @return the monitoring state, or in other words what data we are pushing
4028 * into the route (data from the inputs, data from disk or silence)
4031 Route::monitoring_state () const
4033 return MonitoringInput;
4036 /** @return what we should be metering; either the data coming from the input
4037 * IO or the data that is flowing through the route.
4040 Route::metering_state () const
4042 return MeteringRoute;
4046 Route::has_external_redirects () const
4048 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4050 /* ignore inactive processors and obviously ignore the main
4051 * outs since everything has them and we don't care.
4054 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4062 boost::shared_ptr<Processor>
4063 Route::the_instrument () const
4065 Glib::RWLock::WriterLock lm (_processor_lock);
4066 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4067 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4068 if ((*i)->input_streams().n_midi() > 0 &&
4069 (*i)->output_streams().n_audio() > 0) {
4074 return boost::shared_ptr<Processor>();