2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/boost_debug.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audioengine.h"
41 #include "ardour/buffer.h"
42 #include "ardour/buffer_set.h"
43 #include "ardour/capturing_processor.h"
44 #include "ardour/debug.h"
45 #include "ardour/delivery.h"
46 #include "ardour/internal_return.h"
47 #include "ardour/internal_send.h"
48 #include "ardour/meter.h"
49 #include "ardour/monitor_processor.h"
50 #include "ardour/pannable.h"
51 #include "ardour/panner_shell.h"
52 #include "ardour/plugin_insert.h"
53 #include "ardour/port.h"
54 #include "ardour/port_insert.h"
55 #include "ardour/processor.h"
56 #include "ardour/route.h"
57 #include "ardour/route_group.h"
58 #include "ardour/send.h"
59 #include "ardour/session.h"
60 #include "ardour/unknown_processor.h"
61 #include "ardour/utils.h"
66 using namespace ARDOUR;
69 uint32_t Route::order_key_cnt = 0;
70 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
71 PBD::Signal0<void> Route::RemoteControlIDChange;
73 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
74 : SessionObject (sess, name)
76 , GraphNode (sess._process_graph)
82 , _pending_declick (true)
83 , _meter_point (MeterPostFader)
85 , _soloed_by_others_upstream (0)
86 , _soloed_by_others_downstream (0)
88 , _denormal_protection (false)
91 , _declickable (false)
92 , _mute_master (new MuteMaster (sess, name))
93 , _have_internal_generator (false)
95 , _default_type (default_type)
96 , _remote_control_id (0)
97 , _in_configure_processors (false)
98 , _custom_meter_position_noted (false)
99 , _last_custom_meter_was_at_end (false)
101 processor_max_streams.reset();
102 order_keys[N_("signal")] = order_key_cnt++;
105 set_remote_control_id (MasterBusRemoteControlID);
106 } else if (is_monitor()) {
107 set_remote_control_id (MonitorBusRemoteControlID);
115 /* add standard controls */
117 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
118 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
120 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
121 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
123 add_control (_solo_control);
124 add_control (_mute_control);
128 if (!(_flags & Route::MonitorOut)) {
129 _pannable.reset (new Pannable (_session));
132 /* input and output objects */
134 _input.reset (new IO (_session, _name, IO::Input, _default_type));
135 _output.reset (new IO (_session, _name, IO::Output, _default_type));
137 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
138 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
140 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
142 /* add amp processor */
144 _amp.reset (new Amp (_session));
145 add_processor (_amp, PostFader);
147 /* create standard processors: meter, main outs, monitor out;
148 they will be added to _processors by setup_invisible_processors ()
151 _meter.reset (new PeakMeter (_session));
152 _meter->set_display_to_user (false);
155 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
156 _main_outs->activate ();
159 /* where we listen to tracks */
160 _intreturn.reset (new InternalReturn (_session));
161 _intreturn->activate ();
163 /* the thing that provides proper control over a control/monitor/listen bus
164 (such as per-channel cut, dim, solo, invert, etc).
166 _monitor_control.reset (new MonitorProcessor (_session));
167 _monitor_control->activate ();
170 if (is_master() || is_monitor() || is_hidden()) {
171 _mute_master->set_solo_ignore (true);
174 /* now that we have _meter, its safe to connect to this */
176 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
179 /* run a configure so that the invisible processors get set up */
180 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
181 configure_processors (0);
189 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
191 /* do this early so that we don't get incoming signals as we are going through destruction
196 /* don't use clear_processors here, as it depends on the session which may
197 be half-destroyed by now
200 Glib::RWLock::WriterLock lm (_processor_lock);
201 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
202 (*i)->drop_references ();
205 _processors.clear ();
209 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
211 /* force IDs for master/monitor busses and prevent
212 any other route from accidentally getting these IDs
213 (i.e. legacy sessions)
216 if (is_master() && id != MasterBusRemoteControlID) {
217 id = MasterBusRemoteControlID;
220 if (is_monitor() && id != MonitorBusRemoteControlID) {
221 id = MonitorBusRemoteControlID;
224 /* don't allow it to collide */
226 if (!is_master () && !is_monitor() &&
227 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
228 id += MonitorBusRemoteControlID;
231 if (id != _remote_control_id) {
232 _remote_control_id = id;
233 RemoteControlIDChanged ();
234 if (notify_class_listeners) {
235 RemoteControlIDChange ();
241 Route::remote_control_id() const
243 return _remote_control_id;
247 Route::order_key (std::string const & name) const
249 OrderKeys::const_iterator i = order_keys.find (name);
250 if (i == order_keys.end()) {
258 Route::set_order_key (std::string const & name, int32_t n)
260 bool changed = false;
262 /* This method looks more complicated than it should, but
263 it's important that we don't emit order_key_changed unless
264 it actually has, as expensive things happen on receipt of that
268 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
269 order_keys[name] = n;
273 if (Config->get_sync_all_route_ordering()) {
274 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
275 if (x->second != n) {
283 order_key_changed (); /* EMIT SIGNAL */
284 _session.set_dirty ();
288 /** Set all order keys to be the same as that for `base', if such a key
289 * exists in this route.
290 * @param base Base key.
293 Route::sync_order_keys (std::string const & base)
295 if (order_keys.empty()) {
299 OrderKeys::iterator i;
302 if ((i = order_keys.find (base)) == order_keys.end()) {
303 /* key doesn't exist, use the first existing key (during session initialization) */
304 i = order_keys.begin();
308 /* key exists - use it and reset all others (actually, itself included) */
310 i = order_keys.begin();
313 bool changed = false;
315 for (; i != order_keys.end(); ++i) {
316 if (i->second != key) {
323 order_key_changed (); /* EMIT SIGNAL */
328 Route::ensure_track_or_route_name(string name, Session &session)
330 string newname = name;
332 while (!session.io_name_is_legal (newname)) {
333 newname = bump_name_once (newname, '.');
341 Route::inc_gain (gain_t fraction, void *src)
343 _amp->inc_gain (fraction, src);
347 Route::set_gain (gain_t val, void *src)
349 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
351 if (_route_group->is_relative()) {
353 gain_t usable_gain = _amp->gain();
354 if (usable_gain < 0.000001f) {
355 usable_gain = 0.000001f;
359 if (delta < 0.000001f) {
363 delta -= usable_gain;
368 gain_t factor = delta / usable_gain;
371 factor = _route_group->get_max_factor(factor);
372 if (factor == 0.0f) {
373 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
377 factor = _route_group->get_min_factor(factor);
378 if (factor == 0.0f) {
379 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
384 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
388 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
394 if (val == _amp->gain()) {
398 _amp->set_gain (val, src);
402 Route::maybe_declick (BufferSet&, framecnt_t, int)
404 /* this is the "bus" implementation and they never declick.
409 /** Process this route for one (sub) cycle (process thread)
411 * @param bufs Scratch buffers to use for the signal path
412 * @param start_frame Initial transport frame
413 * @param end_frame Final transport frame
414 * @param nframes Number of frames to output (to ports)
416 * Note that (end_frame - start_frame) may not be equal to nframes when the
417 * transport speed isn't 1.0 (eg varispeed).
420 Route::process_output_buffers (BufferSet& bufs,
421 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
422 int declick, bool gain_automation_ok)
424 bufs.set_is_silent (false);
426 /* figure out if we're going to use gain automation */
427 if (gain_automation_ok) {
428 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
429 _amp->setup_gain_automation (start_frame, end_frame, nframes);
431 _amp->apply_gain_automation (false);
434 /* Tell main outs what to do about monitoring. We do this so that
435 on a transition between monitoring states we get a de-clicking gain
436 change in the _main_outs delivery.
438 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
441 /* -------------------------------------------------------------------------------------------
442 GLOBAL DECLICK (for transport changes etc.)
443 ----------------------------------------------------------------------------------------- */
445 maybe_declick (bufs, nframes, declick);
446 _pending_declick = 0;
448 /* -------------------------------------------------------------------------------------------
449 DENORMAL CONTROL/PHASE INVERT
450 ----------------------------------------------------------------------------------------- */
452 if (_phase_invert.any ()) {
456 if (_denormal_protection || Config->get_denormal_protection()) {
458 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
459 Sample* const sp = i->data();
461 if (_phase_invert[chn]) {
462 for (pframes_t nx = 0; nx < nframes; ++nx) {
467 for (pframes_t nx = 0; nx < nframes; ++nx) {
475 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
476 Sample* const sp = i->data();
478 if (_phase_invert[chn]) {
479 for (pframes_t nx = 0; nx < nframes; ++nx) {
488 if (_denormal_protection || Config->get_denormal_protection()) {
490 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
491 Sample* const sp = i->data();
492 for (pframes_t nx = 0; nx < nframes; ++nx) {
500 /* -------------------------------------------------------------------------------------------
502 ----------------------------------------------------------------------------------------- */
504 /* set this to be true if the meter will already have been ::run() earlier */
505 bool const meter_already_run = metering_state() == MeteringInput;
507 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
509 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
510 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
515 /* if it has any inputs, make sure they match */
516 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
517 if (bufs.count() != (*i)->input_streams()) {
519 DEBUG::Processors, string_compose (
520 "%1 bufs = %2 input for %3 = %4\n",
521 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
529 /* should we NOT run plugins here if the route is inactive?
530 do we catch route != active somewhere higher?
533 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
534 bufs.set_count ((*i)->output_streams());
539 Route::n_process_buffers ()
541 return max (_input->n_ports(), processor_max_streams);
545 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
547 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
551 assert (bufs.available() >= input_streams());
553 if (_input->n_ports() == ChanCount::ZERO) {
554 silence_unlocked (nframes);
557 bufs.set_count (input_streams());
559 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
561 /* control/monitor bus ignores input ports when something is
562 feeding the listen "stream". data will "arrive" into the
563 route from the intreturn processor element.
565 bufs.silence (nframes, 0);
569 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
571 BufferSet::iterator o = bufs.begin(*t);
572 PortSet& ports (_input->ports());
574 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
575 o->read_from (i->get_buffer(nframes), nframes);
580 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
581 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
585 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
587 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
589 bufs.set_count (_input->n_ports());
590 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
591 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
595 Route::set_listen (bool yn, void* src)
601 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
602 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
607 if (yn != _monitor_send->active()) {
609 _monitor_send->activate ();
610 _mute_master->set_soloed (true);
612 _monitor_send->deactivate ();
613 _mute_master->set_soloed (false);
616 listen_changed (src); /* EMIT SIGNAL */
622 Route::listening_via_monitor () const
625 return _monitor_send->active ();
632 Route::set_solo_safe (bool yn, void *src)
634 if (_solo_safe != yn) {
636 solo_safe_changed (src);
641 Route::solo_safe() const
647 Route::set_solo (bool yn, void *src)
653 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
654 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
658 if (self_soloed() != yn) {
660 set_mute_master_solo ();
661 solo_changed (true, src); /* EMIT SIGNAL */
662 _solo_control->Changed (); /* EMIT SIGNAL */
667 Route::set_self_solo (bool yn)
673 Route::mod_solo_by_others_upstream (int32_t delta)
679 uint32_t old_sbu = _soloed_by_others_upstream;
682 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
683 _soloed_by_others_upstream += delta;
685 _soloed_by_others_upstream = 0;
688 _soloed_by_others_upstream += delta;
691 DEBUG_TRACE (DEBUG::Solo, string_compose (
692 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
693 name(), delta, _soloed_by_others_upstream, old_sbu,
694 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
696 /* push the inverse solo change to everything that feeds us.
698 This is important for solo-within-group. When we solo 1 track out of N that
699 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
700 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
701 tracks that feed it. This will silence them if they were audible because
702 of a bus solo, but the newly soloed track will still be audible (because
705 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
709 if ((_self_solo || _soloed_by_others_downstream) &&
710 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
711 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
713 if (delta > 0 || !Config->get_exclusive_solo()) {
714 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
715 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
716 boost::shared_ptr<Route> sr = i->r.lock();
718 sr->mod_solo_by_others_downstream (-delta);
724 set_mute_master_solo ();
725 solo_changed (false, this);
729 Route::mod_solo_by_others_downstream (int32_t delta)
736 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
737 _soloed_by_others_downstream += delta;
739 _soloed_by_others_downstream = 0;
742 _soloed_by_others_downstream += delta;
745 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
747 set_mute_master_solo ();
748 solo_changed (false, this);
752 Route::set_mute_master_solo ()
754 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
758 Route::set_solo_isolated (bool yn, void *src)
760 if (is_master() || is_monitor() || is_hidden()) {
764 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
765 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
769 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
771 boost::shared_ptr<RouteList> routes = _session.get_routes ();
772 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
774 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
779 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
781 if (does_feed && !sends_only) {
782 (*i)->set_solo_isolated (yn, (*i)->route_group());
786 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
788 bool changed = false;
791 if (_solo_isolated == 0) {
792 _mute_master->set_solo_ignore (true);
797 if (_solo_isolated > 0) {
799 if (_solo_isolated == 0) {
800 _mute_master->set_solo_ignore (false);
807 solo_isolated_changed (src);
812 Route::solo_isolated () const
814 return _solo_isolated > 0;
818 Route::set_mute_points (MuteMaster::MutePoint mp)
820 _mute_master->set_mute_points (mp);
821 mute_points_changed (); /* EMIT SIGNAL */
823 if (_mute_master->muted_by_self()) {
824 mute_changed (this); /* EMIT SIGNAL */
825 _mute_control->Changed (); /* EMIT SIGNAL */
830 Route::set_mute (bool yn, void *src)
832 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
833 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
838 _mute_master->set_muted_by_self (yn);
839 /* allow any derived classes to respond to the mute change
840 before anybody else knows about it.
843 /* tell everyone else */
844 mute_changed (src); /* EMIT SIGNAL */
845 _mute_control->Changed (); /* EMIT SIGNAL */
850 Route::muted () const
852 return _mute_master->muted_by_self();
857 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
859 cerr << name << " {" << endl;
860 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
861 p != procs.end(); ++p) {
862 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
868 /** Supposing that we want to insert a Processor at a given Placement, return
869 * the processor to add the new one before (or 0 to add at the end).
871 boost::shared_ptr<Processor>
872 Route::before_processor_for_placement (Placement p)
874 Glib::RWLock::ReaderLock lm (_processor_lock);
876 ProcessorList::iterator loc;
879 /* generic pre-fader: insert immediately before the amp */
880 loc = find (_processors.begin(), _processors.end(), _amp);
882 /* generic post-fader: insert right before the main outs */
883 loc = find (_processors.begin(), _processors.end(), _main_outs);
886 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
889 /** Supposing that we want to insert a Processor at a given index, return
890 * the processor to add the new one before (or 0 to add at the end).
892 boost::shared_ptr<Processor>
893 Route::before_processor_for_index (int index)
896 return boost::shared_ptr<Processor> ();
899 Glib::RWLock::ReaderLock lm (_processor_lock);
901 ProcessorList::iterator i = _processors.begin ();
903 while (i != _processors.end() && j < index) {
904 if ((*i)->display_to_user()) {
911 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
914 /** Add a processor either pre- or post-fader
915 * @return 0 on success, non-0 on failure.
918 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
920 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
924 /** Add a processor to a route such that it ends up with a given index into the visible processors.
925 * @param index Index to add the processor at, or -1 to add at the end of the list.
926 * @return 0 on success, non-0 on failure.
929 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
931 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
934 /** Add a processor to the route.
935 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
936 * @return 0 on success, non-0 on failure.
939 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
941 assert (processor != _meter);
942 assert (processor != _main_outs);
944 DEBUG_TRACE (DEBUG::Processors, string_compose (
945 "%1 adding processor %2\n", name(), processor->name()));
947 if (!_session.engine().connected() || !processor) {
952 Glib::RWLock::WriterLock lm (_processor_lock);
953 ProcessorState pstate (this);
955 boost::shared_ptr<PluginInsert> pi;
956 boost::shared_ptr<PortInsert> porti;
958 if (processor == _amp) {
959 /* Ensure that only one amp is in the list at any time */
960 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
961 if (check != _processors.end()) {
962 if (before == _amp) {
963 /* Already in position; all is well */
966 _processors.erase (check);
971 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
973 ProcessorList::iterator loc;
975 /* inserting before a processor; find it */
976 loc = find (_processors.begin(), _processors.end(), before);
977 if (loc == _processors.end ()) {
982 /* inserting at end */
983 loc = _processors.end ();
986 _processors.insert (loc, processor);
988 // Set up processor list channels. This will set processor->[input|output]_streams(),
989 // configure redirect ports properly, etc.
992 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
994 if (configure_processors_unlocked (err)) {
996 configure_processors_unlocked (0); // it worked before we tried to add it ...
1001 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1003 if (pi->has_no_inputs ()) {
1004 /* generator plugin */
1005 _have_internal_generator = true;
1010 if (activation_allowed) {
1011 processor->activate ();
1014 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1016 _output->set_user_latency (0);
1019 reset_instrument_info ();
1020 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1021 set_processor_positions ();
1027 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1029 const XMLProperty *prop;
1032 boost::shared_ptr<Processor> processor;
1034 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1035 so that we can add the processor in the right place (pre/post-fader)
1038 XMLNodeList const & children = node.children ();
1039 XMLNodeList::const_iterator i = children.begin ();
1041 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1045 Placement placement = PreFader;
1047 if (i != children.end()) {
1048 if ((prop = (*i)->property (X_("placement"))) != 0) {
1049 placement = Placement (string_2_enum (prop->value(), placement));
1053 if (node.name() == "Insert") {
1055 if ((prop = node.property ("type")) != 0) {
1057 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1058 prop->value() == "lv2" ||
1059 prop->value() == "vst" ||
1060 prop->value() == "lxvst" ||
1061 prop->value() == "audiounit") {
1063 processor.reset (new PluginInsert (_session));
1067 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1072 } else if (node.name() == "Send") {
1074 processor.reset (new Send (_session, _pannable, _mute_master));
1078 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1082 if (processor->set_state (node, version)) {
1086 return (add_processor (processor, placement) == 0);
1089 catch (failed_constructor &err) {
1090 warning << _("processor could not be created. Ignored.") << endmsg;
1096 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1098 /* NOTE: this is intended to be used ONLY when copying
1099 processors from another Route. Hence the subtle
1100 differences between this and ::add_processor()
1103 ProcessorList::iterator loc;
1106 loc = find(_processors.begin(), _processors.end(), before);
1108 /* nothing specified - at end */
1109 loc = _processors.end ();
1112 if (!_session.engine().connected()) {
1116 if (others.empty()) {
1121 Glib::RWLock::WriterLock lm (_processor_lock);
1122 ProcessorState pstate (this);
1124 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1130 boost::shared_ptr<PluginInsert> pi;
1132 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1136 _processors.insert (loc, *i);
1138 if ((*i)->active()) {
1143 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1144 if (configure_processors_unlocked (err)) {
1146 configure_processors_unlocked (0); // it worked before we tried to add it ...
1151 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1154 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1155 boost::shared_ptr<PluginInsert> pi;
1157 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1158 if (pi->has_no_inputs ()) {
1159 _have_internal_generator = true;
1165 _output->set_user_latency (0);
1168 reset_instrument_info ();
1169 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1170 set_processor_positions ();
1176 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1178 if (p == PreFader) {
1179 start = _processors.begin();
1180 end = find(_processors.begin(), _processors.end(), _amp);
1182 start = find(_processors.begin(), _processors.end(), _amp);
1184 end = _processors.end();
1188 /** Turn off all processors with a given placement
1189 * @param p Placement of processors to disable
1192 Route::disable_processors (Placement p)
1194 Glib::RWLock::ReaderLock lm (_processor_lock);
1196 ProcessorList::iterator start, end;
1197 placement_range(p, start, end);
1199 for (ProcessorList::iterator i = start; i != end; ++i) {
1200 (*i)->deactivate ();
1203 _session.set_dirty ();
1206 /** Turn off all redirects
1209 Route::disable_processors ()
1211 Glib::RWLock::ReaderLock lm (_processor_lock);
1213 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1214 (*i)->deactivate ();
1217 _session.set_dirty ();
1220 /** Turn off all redirects with a given placement
1221 * @param p Placement of redirects to disable
1224 Route::disable_plugins (Placement p)
1226 Glib::RWLock::ReaderLock lm (_processor_lock);
1228 ProcessorList::iterator start, end;
1229 placement_range(p, start, end);
1231 for (ProcessorList::iterator i = start; i != end; ++i) {
1232 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1233 (*i)->deactivate ();
1237 _session.set_dirty ();
1240 /** Turn off all plugins
1243 Route::disable_plugins ()
1245 Glib::RWLock::ReaderLock lm (_processor_lock);
1247 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1248 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1249 (*i)->deactivate ();
1253 _session.set_dirty ();
1258 Route::ab_plugins (bool forward)
1260 Glib::RWLock::ReaderLock lm (_processor_lock);
1264 /* forward = turn off all active redirects, and mark them so that the next time
1265 we go the other way, we will revert them
1268 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1269 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1273 if ((*i)->active()) {
1274 (*i)->deactivate ();
1275 (*i)->set_next_ab_is_active (true);
1277 (*i)->set_next_ab_is_active (false);
1283 /* backward = if the redirect was marked to go active on the next ab, do so */
1285 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1287 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1291 if ((*i)->get_next_ab_is_active()) {
1294 (*i)->deactivate ();
1299 _session.set_dirty ();
1303 /** Remove processors with a given placement.
1304 * @param p Placement of processors to remove.
1307 Route::clear_processors (Placement p)
1309 if (!_session.engine().connected()) {
1313 bool already_deleting = _session.deletion_in_progress();
1314 if (!already_deleting) {
1315 _session.set_deletion_in_progress();
1319 Glib::RWLock::WriterLock lm (_processor_lock);
1320 ProcessorList new_list;
1321 ProcessorStreams err;
1322 bool seen_amp = false;
1324 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1330 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1332 /* you can't remove these */
1334 new_list.push_back (*i);
1341 new_list.push_back (*i);
1344 (*i)->drop_references ();
1352 (*i)->drop_references ();
1355 new_list.push_back (*i);
1362 _processors = new_list;
1365 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1366 configure_processors_unlocked (&err); // this can't fail
1370 processor_max_streams.reset();
1371 _have_internal_generator = false;
1372 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1373 set_processor_positions ();
1375 reset_instrument_info ();
1377 if (!already_deleting) {
1378 _session.clear_deletion_in_progress();
1383 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1385 // TODO once the export point can be configured properly, do something smarter here
1386 if (processor == _capturing_processor) {
1387 _capturing_processor.reset();
1390 /* these can never be removed */
1392 if (processor == _amp || processor == _meter || processor == _main_outs) {
1396 if (!_session.engine().connected()) {
1400 processor_max_streams.reset();
1403 Glib::RWLock::WriterLock lm (_processor_lock);
1404 ProcessorState pstate (this);
1406 ProcessorList::iterator i;
1407 bool removed = false;
1409 for (i = _processors.begin(); i != _processors.end(); ) {
1410 if (*i == processor) {
1412 /* move along, see failure case for configure_processors()
1413 where we may need to reconfigure the processor.
1416 /* stop redirects that send signals to JACK ports
1417 from causing noise as a result of no longer being
1421 boost::shared_ptr<IOProcessor> iop;
1423 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1425 iop->input()->disconnect (this);
1427 if (iop->output()) {
1428 iop->output()->disconnect (this);
1432 i = _processors.erase (i);
1440 _output->set_user_latency (0);
1448 if (need_process_lock) {
1449 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1451 if (configure_processors_unlocked (err)) {
1453 /* we know this will work, because it worked before :) */
1454 configure_processors_unlocked (0);
1458 if (configure_processors_unlocked (err)) {
1460 /* we know this will work, because it worked before :) */
1461 configure_processors_unlocked (0);
1466 _have_internal_generator = false;
1468 for (i = _processors.begin(); i != _processors.end(); ++i) {
1469 boost::shared_ptr<PluginInsert> pi;
1471 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1472 if (pi->has_no_inputs ()) {
1473 _have_internal_generator = true;
1480 reset_instrument_info ();
1481 processor->drop_references ();
1482 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1483 set_processor_positions ();
1489 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1491 ProcessorList deleted;
1493 if (!_session.engine().connected()) {
1497 processor_max_streams.reset();
1500 Glib::RWLock::WriterLock lm (_processor_lock);
1501 ProcessorState pstate (this);
1503 ProcessorList::iterator i;
1504 boost::shared_ptr<Processor> processor;
1506 for (i = _processors.begin(); i != _processors.end(); ) {
1510 /* these can never be removed */
1512 if (processor == _amp || processor == _meter || processor == _main_outs) {
1517 /* see if its in the list of processors to delete */
1519 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1524 /* stop IOProcessors that send to JACK ports
1525 from causing noise as a result of no longer being
1529 boost::shared_ptr<IOProcessor> iop;
1531 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1535 deleted.push_back (processor);
1536 i = _processors.erase (i);
1539 if (deleted.empty()) {
1540 /* none of those in the requested list were found */
1544 _output->set_user_latency (0);
1547 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1549 if (configure_processors_unlocked (err)) {
1551 /* we know this will work, because it worked before :) */
1552 configure_processors_unlocked (0);
1557 _have_internal_generator = false;
1559 for (i = _processors.begin(); i != _processors.end(); ++i) {
1560 boost::shared_ptr<PluginInsert> pi;
1562 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1563 if (pi->has_no_inputs ()) {
1564 _have_internal_generator = true;
1571 /* now try to do what we need to so that those that were removed will be deleted */
1573 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1574 (*i)->drop_references ();
1577 reset_instrument_info ();
1578 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1579 set_processor_positions ();
1585 Route::reset_instrument_info ()
1587 boost::shared_ptr<Processor> instr = the_instrument();
1588 _instrument_info.set_internal_instrument (instr);
1591 /** Caller must hold process lock */
1593 Route::configure_processors (ProcessorStreams* err)
1595 assert (!AudioEngine::instance()->process_lock().trylock());
1597 if (!_in_configure_processors) {
1598 Glib::RWLock::WriterLock lm (_processor_lock);
1599 return configure_processors_unlocked (err);
1606 Route::input_streams () const
1608 return _input->n_ports ();
1611 list<pair<ChanCount, ChanCount> >
1612 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1614 Glib::RWLock::ReaderLock lm (_processor_lock);
1616 return try_configure_processors_unlocked (in, err);
1619 list<pair<ChanCount, ChanCount> >
1620 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1622 // Check each processor in order to see if we can configure as requested
1624 list<pair<ChanCount, ChanCount> > configuration;
1627 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1628 DEBUG_TRACE (DEBUG::Processors, "{\n");
1630 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1632 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1633 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1637 if ((*p)->can_support_io_configuration(in, out)) {
1638 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1639 configuration.push_back(make_pair(in, out));
1646 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1647 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1648 DEBUG_TRACE (DEBUG::Processors, "}\n");
1649 return list<pair<ChanCount, ChanCount> > ();
1653 DEBUG_TRACE (DEBUG::Processors, "}\n");
1655 return configuration;
1658 /** Set the input/output configuration of each processor in the processors list.
1659 * Caller must hold process lock.
1660 * Return 0 on success, otherwise configuration is impossible.
1663 Route::configure_processors_unlocked (ProcessorStreams* err)
1665 assert (!AudioEngine::instance()->process_lock().trylock());
1667 if (_in_configure_processors) {
1671 /* put invisible processors where they should be */
1672 setup_invisible_processors ();
1674 _in_configure_processors = true;
1676 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1678 if (configuration.empty ()) {
1679 _in_configure_processors = false;
1685 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1686 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1688 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1692 (*p)->configure_io(c->first, c->second);
1693 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1694 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1699 _meter->reset_max_channels (processor_max_streams);
1702 /* make sure we have sufficient scratch buffers to cope with the new processor
1705 _session.ensure_buffers (n_process_buffers ());
1707 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1709 _in_configure_processors = false;
1713 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1714 * @param state New active state for those processors.
1717 Route::all_visible_processors_active (bool state)
1719 Glib::RWLock::ReaderLock lm (_processor_lock);
1721 if (_processors.empty()) {
1725 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1726 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1733 (*i)->deactivate ();
1737 _session.set_dirty ();
1741 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1743 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1744 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1745 processors in the current actual processor list that are hidden. Any visible processors
1746 in the current list but not in "new_order" will be assumed to be deleted.
1750 Glib::RWLock::WriterLock lm (_processor_lock);
1751 ProcessorState pstate (this);
1753 ProcessorList::iterator oiter;
1754 ProcessorList::const_iterator niter;
1755 ProcessorList as_it_will_be;
1757 oiter = _processors.begin();
1758 niter = new_order.begin();
1760 while (niter != new_order.end()) {
1762 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1763 then append it to the temp list.
1765 Otherwise, see if the next processor in the old list is in the new list. if not,
1766 its been deleted. If its there, append it to the temp list.
1769 if (oiter == _processors.end()) {
1771 /* no more elements in the old list, so just stick the rest of
1772 the new order onto the temp list.
1775 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1776 while (niter != new_order.end()) {
1783 if (!(*oiter)->display_to_user()) {
1785 as_it_will_be.push_back (*oiter);
1789 /* visible processor: check that its in the new order */
1791 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1792 /* deleted: do nothing, shared_ptr<> will clean up */
1794 /* ignore this one, and add the next item from the new order instead */
1795 as_it_will_be.push_back (*niter);
1800 /* now remove from old order - its taken care of no matter what */
1801 oiter = _processors.erase (oiter);
1806 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1808 /* If the meter is in a custom position, find it and make a rough note of its position */
1809 maybe_note_meter_position ();
1812 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1814 if (configure_processors_unlocked (err)) {
1821 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1822 set_processor_positions ();
1834 Route::get_template()
1836 return state(false);
1840 Route::state(bool full_state)
1842 XMLNode *node = new XMLNode("Route");
1843 ProcessorList::iterator i;
1846 id().print (buf, sizeof (buf));
1847 node->add_property("id", buf);
1848 node->add_property ("name", _name);
1849 node->add_property("default-type", _default_type.to_string());
1852 node->add_property("flags", enum_2_string (_flags));
1855 node->add_property("active", _active?"yes":"no");
1857 boost::to_string (_phase_invert, p);
1858 node->add_property("phase-invert", p);
1859 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1860 node->add_property("meter-point", enum_2_string (_meter_point));
1863 node->add_property("route-group", _route_group->name());
1866 string order_string;
1867 OrderKeys::iterator x = order_keys.begin();
1869 while (x != order_keys.end()) {
1870 order_string += string ((*x).first);
1871 order_string += '=';
1872 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1873 order_string += buf;
1877 if (x == order_keys.end()) {
1881 order_string += ':';
1883 node->add_property ("order-keys", order_string);
1884 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1885 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1886 node->add_property ("soloed-by-upstream", buf);
1887 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1888 node->add_property ("soloed-by-downstream", buf);
1889 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1890 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1892 node->add_child_nocopy (_input->state (full_state));
1893 node->add_child_nocopy (_output->state (full_state));
1894 node->add_child_nocopy (_solo_control->get_state ());
1895 node->add_child_nocopy (_mute_control->get_state ());
1896 node->add_child_nocopy (_mute_master->get_state ());
1898 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1899 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1900 remote_control_node->add_property (X_("id"), buf);
1901 node->add_child_nocopy (*remote_control_node);
1903 if (_comment.length()) {
1904 XMLNode *cmt = node->add_child ("Comment");
1905 cmt->add_content (_comment);
1909 node->add_child_nocopy (_pannable->state (full_state));
1912 for (i = _processors.begin(); i != _processors.end(); ++i) {
1914 /* template save: do not include internal sends functioning as
1915 aux sends because the chance of the target ID
1916 in the session where this template is used
1919 similarly, do not save listen sends which connect to
1920 the monitor section, because these will always be
1923 boost::shared_ptr<InternalSend> is;
1925 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1926 if (is->role() == Delivery::Aux || is->role() == Delivery::Listen) {
1931 node->add_child_nocopy((*i)->state (full_state));
1935 node->add_child_copy (*_extra_xml);
1938 if (_custom_meter_position_noted) {
1939 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1941 after->id().print (buf, sizeof (buf));
1942 node->add_property (X_("processor-after-last-custom-meter"), buf);
1945 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1952 Route::set_state (const XMLNode& node, int version)
1954 if (version < 3000) {
1955 return set_state_2X (node, version);
1959 XMLNodeConstIterator niter;
1961 const XMLProperty *prop;
1963 if (node.name() != "Route"){
1964 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1968 if ((prop = node.property (X_("name"))) != 0) {
1969 Route::set_name (prop->value());
1974 if ((prop = node.property (X_("flags"))) != 0) {
1975 _flags = Flag (string_2_enum (prop->value(), _flags));
1980 if (is_master() || is_monitor() || is_hidden()) {
1981 _mute_master->set_solo_ignore (true);
1985 /* monitor bus does not get a panner, but if (re)created
1986 via XML, it will already have one by the time we
1987 call ::set_state(). so ... remove it.
1992 /* add all processors (except amp, which is always present) */
1994 nlist = node.children();
1995 XMLNode processor_state (X_("processor_state"));
1997 Stateful::save_extra_xml (node);
1999 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2003 if (child->name() == IO::state_node_name) {
2004 if ((prop = child->property (X_("direction"))) == 0) {
2008 if (prop->value() == "Input") {
2009 _input->set_state (*child, version);
2010 } else if (prop->value() == "Output") {
2011 _output->set_state (*child, version);
2015 if (child->name() == X_("Processor")) {
2016 processor_state.add_child_copy (*child);
2020 if (child->name() == X_("Pannable")) {
2022 _pannable->set_state (*child, version);
2024 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2029 if ((prop = node.property (X_("meter-point"))) != 0) {
2030 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2031 set_meter_point (mp, true);
2033 _meter->set_display_to_user (_meter_point == MeterCustom);
2037 set_processor_state (processor_state);
2039 if ((prop = node.property ("self-solo")) != 0) {
2040 set_self_solo (string_is_affirmative (prop->value()));
2043 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2044 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2045 mod_solo_by_others_upstream (atoi (prop->value()));
2048 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2049 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2050 mod_solo_by_others_downstream (atoi (prop->value()));
2053 if ((prop = node.property ("solo-isolated")) != 0) {
2054 set_solo_isolated (string_is_affirmative (prop->value()), this);
2057 if ((prop = node.property ("solo-safe")) != 0) {
2058 set_solo_safe (string_is_affirmative (prop->value()), this);
2061 if ((prop = node.property (X_("phase-invert"))) != 0) {
2062 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2065 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2066 set_denormal_protection (string_is_affirmative (prop->value()));
2069 if ((prop = node.property (X_("active"))) != 0) {
2070 bool yn = string_is_affirmative (prop->value());
2071 _active = !yn; // force switch
2072 set_active (yn, this);
2075 if ((prop = node.property (X_("order-keys"))) != 0) {
2079 string::size_type colon, equal;
2080 string remaining = prop->value();
2082 while (remaining.length()) {
2084 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2085 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2088 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2089 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2092 set_order_key (remaining.substr (0, equal), n);
2096 colon = remaining.find_first_of (':');
2098 if (colon != string::npos) {
2099 remaining = remaining.substr (colon+1);
2106 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2107 PBD::ID id (prop->value ());
2108 Glib::RWLock::ReaderLock lm (_processor_lock);
2109 ProcessorList::const_iterator i = _processors.begin ();
2110 while (i != _processors.end() && (*i)->id() != id) {
2114 if (i != _processors.end ()) {
2115 _processor_after_last_custom_meter = *i;
2116 _custom_meter_position_noted = true;
2120 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2121 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2124 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2127 if (child->name() == X_("Comment")) {
2129 /* XXX this is a terrible API design in libxml++ */
2131 XMLNode *cmt = *(child->children().begin());
2132 _comment = cmt->content();
2134 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2135 if (prop->value() == "solo") {
2136 _solo_control->set_state (*child, version);
2137 } else if (prop->value() == "mute") {
2138 _mute_control->set_state (*child, version);
2141 } else if (child->name() == X_("RemoteControl")) {
2142 if ((prop = child->property (X_("id"))) != 0) {
2144 sscanf (prop->value().c_str(), "%d", &x);
2145 set_remote_control_id (x);
2148 } else if (child->name() == X_("MuteMaster")) {
2149 _mute_master->set_state (*child, version);
2157 Route::set_state_2X (const XMLNode& node, int version)
2160 XMLNodeConstIterator niter;
2162 const XMLProperty *prop;
2164 /* 2X things which still remain to be handled:
2170 if (node.name() != "Route") {
2171 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2175 if ((prop = node.property (X_("flags"))) != 0) {
2176 string f = prop->value ();
2177 boost::replace_all (f, "ControlOut", "MonitorOut");
2178 _flags = Flag (string_2_enum (f, _flags));
2183 if ((prop = node.property (X_("phase-invert"))) != 0) {
2184 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2185 if (string_is_affirmative (prop->value ())) {
2188 set_phase_invert (p);
2191 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2192 set_denormal_protection (string_is_affirmative (prop->value()));
2195 if ((prop = node.property (X_("soloed"))) != 0) {
2196 bool yn = string_is_affirmative (prop->value());
2198 /* XXX force reset of solo status */
2200 set_solo (yn, this);
2203 if ((prop = node.property (X_("muted"))) != 0) {
2206 bool muted = string_is_affirmative (prop->value());
2212 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2214 if (string_is_affirmative (prop->value())){
2215 mute_point = mute_point + "PreFader";
2220 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2222 if (string_is_affirmative (prop->value())){
2225 mute_point = mute_point + ",";
2228 mute_point = mute_point + "PostFader";
2233 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2235 if (string_is_affirmative (prop->value())){
2238 mute_point = mute_point + ",";
2241 mute_point = mute_point + "Listen";
2246 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2248 if (string_is_affirmative (prop->value())){
2251 mute_point = mute_point + ",";
2254 mute_point = mute_point + "Main";
2258 _mute_master->set_mute_points (mute_point);
2259 _mute_master->set_muted_by_self (true);
2263 if ((prop = node.property (X_("meter-point"))) != 0) {
2264 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2267 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2268 don't mean the same thing.
2271 if ((prop = node.property (X_("order-keys"))) != 0) {
2275 string::size_type colon, equal;
2276 string remaining = prop->value();
2278 while (remaining.length()) {
2280 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2281 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2284 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2285 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2288 set_order_key (remaining.substr (0, equal), n);
2292 colon = remaining.find_first_of (':');
2294 if (colon != string::npos) {
2295 remaining = remaining.substr (colon+1);
2304 nlist = node.children ();
2305 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2309 if (child->name() == IO::state_node_name) {
2311 /* there is a note in IO::set_state_2X() about why we have to call
2315 _input->set_state_2X (*child, version, true);
2316 _output->set_state_2X (*child, version, false);
2318 if ((prop = child->property (X_("name"))) != 0) {
2319 Route::set_name (prop->value ());
2324 if ((prop = child->property (X_("active"))) != 0) {
2325 bool yn = string_is_affirmative (prop->value());
2326 _active = !yn; // force switch
2327 set_active (yn, this);
2330 if ((prop = child->property (X_("gain"))) != 0) {
2333 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2334 _amp->gain_control()->set_value (val);
2338 /* Set up Panners in the IO */
2339 XMLNodeList io_nlist = child->children ();
2341 XMLNodeConstIterator io_niter;
2344 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2346 io_child = *io_niter;
2348 if (io_child->name() == X_("Panner")) {
2349 _main_outs->panner_shell()->set_state(*io_child, version);
2350 } else if (io_child->name() == X_("Automation")) {
2351 /* IO's automation is for the fader */
2352 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2358 XMLNodeList redirect_nodes;
2360 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2364 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2365 redirect_nodes.push_back(child);
2370 set_processor_state_2X (redirect_nodes, version);
2372 Stateful::save_extra_xml (node);
2374 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2377 if (child->name() == X_("Comment")) {
2379 /* XXX this is a terrible API design in libxml++ */
2381 XMLNode *cmt = *(child->children().begin());
2382 _comment = cmt->content();
2384 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2385 if (prop->value() == X_("solo")) {
2386 _solo_control->set_state (*child, version);
2387 } else if (prop->value() == X_("mute")) {
2388 _mute_control->set_state (*child, version);
2391 } else if (child->name() == X_("RemoteControl")) {
2392 if ((prop = child->property (X_("id"))) != 0) {
2394 sscanf (prop->value().c_str(), "%d", &x);
2395 set_remote_control_id (x);
2405 Route::get_processor_state ()
2407 XMLNode* root = new XMLNode (X_("redirects"));
2408 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2409 root->add_child_nocopy ((*i)->state (true));
2416 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2418 /* We don't bother removing existing processors not in nList, as this
2419 method will only be called when creating a Route from scratch, not
2420 for undo purposes. Just put processors in at the appropriate place
2424 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2425 add_processor_from_xml_2X (**i, version);
2430 Route::set_processor_state (const XMLNode& node)
2432 const XMLNodeList &nlist = node.children();
2433 XMLNodeConstIterator niter;
2434 ProcessorList new_order;
2435 bool must_configure = false;
2437 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2439 XMLProperty* prop = (*niter)->property ("type");
2441 if (prop->value() == "amp") {
2442 _amp->set_state (**niter, Stateful::current_state_version);
2443 new_order.push_back (_amp);
2444 } else if (prop->value() == "meter") {
2445 _meter->set_state (**niter, Stateful::current_state_version);
2446 new_order.push_back (_meter);
2447 } else if (prop->value() == "main-outs") {
2448 _main_outs->set_state (**niter, Stateful::current_state_version);
2449 } else if (prop->value() == "intreturn") {
2451 _intreturn.reset (new InternalReturn (_session));
2452 must_configure = true;
2454 _intreturn->set_state (**niter, Stateful::current_state_version);
2455 } else if (is_monitor() && prop->value() == "monitor") {
2456 if (!_monitor_control) {
2457 _monitor_control.reset (new MonitorProcessor (_session));
2458 must_configure = true;
2460 _monitor_control->set_state (**niter, Stateful::current_state_version);
2461 } else if (prop->value() == "capture") {
2462 /* CapturingProcessor should never be restored, it's always
2463 added explicitly when needed */
2465 ProcessorList::iterator o;
2467 for (o = _processors.begin(); o != _processors.end(); ++o) {
2468 XMLProperty* id_prop = (*niter)->property(X_("id"));
2469 if (id_prop && (*o)->id() == id_prop->value()) {
2470 (*o)->set_state (**niter, Stateful::current_state_version);
2471 new_order.push_back (*o);
2476 // If the processor (*niter) is not on the route then create it
2478 if (o == _processors.end()) {
2480 boost::shared_ptr<Processor> processor;
2482 if (prop->value() == "intsend") {
2484 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2486 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2487 prop->value() == "lv2" ||
2488 prop->value() == "vst" ||
2489 prop->value() == "lxvst" ||
2490 prop->value() == "audiounit") {
2492 processor.reset (new PluginInsert(_session));
2494 } else if (prop->value() == "port") {
2496 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2498 } else if (prop->value() == "send") {
2500 processor.reset (new Send (_session, _pannable, _mute_master));
2503 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2507 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2508 /* This processor could not be configured. Turn it into a UnknownProcessor */
2509 processor.reset (new UnknownProcessor (_session, **niter));
2512 /* we have to note the monitor send here, otherwise a new one will be created
2513 and the state of this one will be lost.
2515 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2516 if (isend && isend->role() == Delivery::Listen) {
2517 _monitor_send = isend;
2520 /* it doesn't matter if invisible processors are added here, as they
2521 will be sorted out by setup_invisible_processors () shortly.
2524 new_order.push_back (processor);
2525 must_configure = true;
2531 Glib::RWLock::WriterLock lm (_processor_lock);
2532 _processors = new_order;
2534 if (must_configure) {
2535 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2536 configure_processors_unlocked (0);
2539 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2541 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2543 boost::shared_ptr<PluginInsert> pi;
2545 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2546 if (pi->has_no_inputs ()) {
2547 _have_internal_generator = true;
2554 reset_instrument_info ();
2555 processors_changed (RouteProcessorChange ());
2556 set_processor_positions ();
2560 Route::curve_reallocate ()
2562 // _gain_automation_curve.finish_resize ();
2563 // _pan_automation_curve.finish_resize ();
2567 Route::silence (framecnt_t nframes)
2569 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2574 silence_unlocked (nframes);
2578 Route::silence_unlocked (framecnt_t nframes)
2580 /* Must be called with the processor lock held */
2584 _output->silence (nframes);
2586 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2587 boost::shared_ptr<PluginInsert> pi;
2589 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2590 // skip plugins, they don't need anything when we're not active
2594 (*i)->silence (nframes);
2597 if (nframes == _session.get_block_size()) {
2604 Route::add_internal_return ()
2607 _intreturn.reset (new InternalReturn (_session));
2608 add_processor (_intreturn, PreFader);
2613 Route::add_send_to_internal_return (InternalSend* send)
2615 Glib::RWLock::ReaderLock rm (_processor_lock);
2617 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2618 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2621 return d->add_send (send);
2627 Route::remove_send_from_internal_return (InternalSend* send)
2629 Glib::RWLock::ReaderLock rm (_processor_lock);
2631 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2632 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2635 return d->remove_send (send);
2641 Route::enable_monitor_send ()
2643 /* Caller must hold process lock */
2644 assert (!AudioEngine::instance()->process_lock().trylock());
2646 /* master never sends to monitor section via the normal mechanism */
2647 assert (!is_master ());
2649 /* make sure we have one */
2650 if (!_monitor_send) {
2651 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2652 _monitor_send->set_display_to_user (false);
2656 configure_processors (0);
2659 /** Add an aux send to a route.
2660 * @param route route to send to.
2661 * @param before Processor to insert before, or 0 to insert at the end.
2664 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2666 assert (route != _session.monitor_out ());
2669 Glib::RWLock::ReaderLock rm (_processor_lock);
2671 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2673 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2675 if (d && d->target_route() == route) {
2676 /* already listening via the specified IO: do nothing */
2684 boost::shared_ptr<InternalSend> listener;
2687 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2688 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2691 add_processor (listener, before);
2693 } catch (failed_constructor& err) {
2701 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2703 ProcessorStreams err;
2704 ProcessorList::iterator tmp;
2707 Glib::RWLock::ReaderLock rl(_processor_lock);
2709 /* have to do this early because otherwise processor reconfig
2710 * will put _monitor_send back in the list
2713 if (route == _session.monitor_out()) {
2714 _monitor_send.reset ();
2718 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2720 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2722 if (d && d->target_route() == route) {
2724 remove_processor (*x, &err, false);
2727 /* list could have been demolished while we dropped the lock
2738 Route::set_comment (string cmt, void *src)
2741 comment_changed (src);
2742 _session.set_dirty ();
2746 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2748 FeedRecord fr (other, via_sends_only);
2750 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2752 if (!result.second) {
2754 /* already a record for "other" - make sure sends-only information is correct */
2755 if (!via_sends_only && result.first->sends_only) {
2756 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2757 frp->sends_only = false;
2761 return result.second;
2765 Route::clear_fed_by ()
2771 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2773 const FedBy& fed_by (other->fed_by());
2775 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2776 boost::shared_ptr<Route> sr = f->r.lock();
2778 if (sr && (sr.get() == this)) {
2780 if (via_sends_only) {
2781 *via_sends_only = f->sends_only;
2792 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2794 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2796 if (_output->connected_to (other->input())) {
2797 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2798 if (via_send_only) {
2799 *via_send_only = false;
2806 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2808 boost::shared_ptr<IOProcessor> iop;
2810 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2811 if (iop->feeds (other)) {
2812 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2813 if (via_send_only) {
2814 *via_send_only = true;
2818 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2821 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2826 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2831 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2833 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2836 /** Called from the (non-realtime) butler thread when the transport is stopped */
2838 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2840 framepos_t now = _session.transport_frame();
2843 Glib::RWLock::ReaderLock lm (_processor_lock);
2846 automation_snapshot (now, true);
2849 Automatable::transport_stopped (now);
2851 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2853 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2857 (*i)->transport_stopped (now);
2861 _roll_delay = _initial_delay;
2865 Route::input_change_handler (IOChange change, void * /*src*/)
2867 bool need_to_queue_solo_change = true;
2869 if ((change.type & IOChange::ConfigurationChanged)) {
2870 /* This is called with the process lock held if change
2871 contains ConfigurationChanged
2873 need_to_queue_solo_change = false;
2874 configure_processors (0);
2875 _phase_invert.resize (_input->n_ports().n_audio ());
2876 io_changed (); /* EMIT SIGNAL */
2879 if (!_input->connected() && _soloed_by_others_upstream) {
2880 if (need_to_queue_solo_change) {
2881 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2883 cancel_solo_after_disconnect (true);
2889 Route::output_change_handler (IOChange change, void * /*src*/)
2891 bool need_to_queue_solo_change = true;
2893 if ((change.type & IOChange::ConfigurationChanged)) {
2894 /* This is called with the process lock held if change
2895 contains ConfigurationChanged
2897 need_to_queue_solo_change = false;
2900 if (!_output->connected() && _soloed_by_others_downstream) {
2901 if (need_to_queue_solo_change) {
2902 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2904 cancel_solo_after_disconnect (false);
2910 Route::cancel_solo_after_disconnect (bool upstream)
2913 _soloed_by_others_upstream = 0;
2915 _soloed_by_others_downstream = 0;
2917 set_mute_master_solo ();
2918 solo_changed (false, this);
2922 Route::pans_required () const
2924 if (n_outputs().n_audio() < 2) {
2928 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2932 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2934 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2939 if (n_outputs().n_total() == 0) {
2943 if (!_active || n_inputs() == ChanCount::ZERO) {
2944 silence_unlocked (nframes);
2947 if (session_state_changing) {
2948 if (_session.transport_speed() != 0.0f) {
2949 /* we're rolling but some state is changing (e.g. our diskstream contents)
2950 so we cannot use them. Be silent till this is over.
2952 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2954 silence_unlocked (nframes);
2957 /* we're really not rolling, so we're either delivery silence or actually
2958 monitoring, both of which are safe to do while session_state_changing is true.
2962 _amp->apply_gain_automation (false);
2963 passthru (start_frame, end_frame, nframes, 0);
2969 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
2971 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2976 automation_snapshot (_session.transport_frame(), false);
2978 if (n_outputs().n_total() == 0) {
2982 if (!_active || n_inputs().n_total() == 0) {
2983 silence_unlocked (nframes);
2987 framepos_t unused = 0;
2989 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2995 passthru (start_frame, end_frame, nframes, declick);
3001 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3008 Route::flush_processors ()
3010 /* XXX shouldn't really try to take this lock, since
3011 this is called from the RT audio thread.
3014 Glib::RWLock::ReaderLock lm (_processor_lock);
3016 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3022 Route::set_meter_point (MeterPoint p, bool force)
3024 /* CAN BE CALLED FROM PROCESS CONTEXT */
3026 if (_meter_point == p && !force) {
3030 bool meter_was_visible_to_user = _meter->display_to_user ();
3033 Glib::RWLock::WriterLock lm (_processor_lock);
3035 maybe_note_meter_position ();
3039 if (_meter_point != MeterCustom) {
3041 _meter->set_display_to_user (false);
3043 setup_invisible_processors ();
3047 _meter->set_display_to_user (true);
3049 /* If we have a previous position for the custom meter, try to put it there */
3050 if (_custom_meter_position_noted) {
3051 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3054 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3055 if (i != _processors.end ()) {
3056 _processors.remove (_meter);
3057 _processors.insert (i, _meter);
3059 } else if (_last_custom_meter_was_at_end) {
3060 _processors.remove (_meter);
3061 _processors.push_back (_meter);
3066 /* Set up the meter for its new position */
3068 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3072 if (loc == _processors.begin()) {
3073 m_in = _input->n_ports();
3075 ProcessorList::iterator before = loc;
3077 m_in = (*before)->output_streams ();
3080 _meter->reflect_inputs (m_in);
3082 /* we do not need to reconfigure the processors, because the meter
3083 (a) is always ready to handle processor_max_streams
3084 (b) is always an N-in/N-out processor, and thus moving
3085 it doesn't require any changes to the other processors.
3089 meter_change (); /* EMIT SIGNAL */
3091 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3093 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3097 Route::listen_position_changed ()
3100 Glib::RWLock::WriterLock lm (_processor_lock);
3101 ProcessorState pstate (this);
3104 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3106 if (configure_processors_unlocked (0)) {
3108 configure_processors_unlocked (0); // it worked before we tried to add it ...
3114 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3115 _session.set_dirty ();
3118 boost::shared_ptr<CapturingProcessor>
3119 Route::add_export_point()
3121 if (!_capturing_processor) {
3123 _capturing_processor.reset (new CapturingProcessor (_session));
3124 _capturing_processor->activate ();
3127 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3128 configure_processors (0);
3133 return _capturing_processor;
3137 Route::update_signal_latency ()
3139 framecnt_t l = _output->user_latency();
3141 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3142 if ((*i)->active ()) {
3143 l += (*i)->signal_latency ();
3147 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3149 if (_signal_latency != l) {
3150 _signal_latency = l;
3151 signal_latency_changed (); /* EMIT SIGNAL */
3154 return _signal_latency;
3158 Route::set_user_latency (framecnt_t nframes)
3160 _output->set_user_latency (nframes);
3161 _session.update_latency_compensation ();
3165 Route::set_latency_compensation (framecnt_t longest_session_latency)
3167 framecnt_t old = _initial_delay;
3169 if (_signal_latency < longest_session_latency) {
3170 _initial_delay = longest_session_latency - _signal_latency;
3175 DEBUG_TRACE (DEBUG::Latency, string_compose (
3176 "%1: compensate for maximum latency of %2,"
3177 "given own latency of %3, using initial delay of %4\n",
3178 name(), longest_session_latency, _signal_latency, _initial_delay));
3180 if (_initial_delay != old) {
3181 initial_delay_changed (); /* EMIT SIGNAL */
3184 if (_session.transport_stopped()) {
3185 _roll_delay = _initial_delay;
3190 Route::automation_snapshot (framepos_t now, bool force)
3193 _pannable->automation_snapshot (now, force);
3196 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3197 (*i)->automation_snapshot (now, force);
3201 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3202 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3203 boost::shared_ptr<AutomationList>(), name)
3206 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3211 Route::SoloControllable::set_value (double val)
3213 bool bval = ((val >= 0.5f) ? true: false);
3215 boost::shared_ptr<RouteList> rl (new RouteList);
3217 boost::shared_ptr<Route> r = _route.lock ();
3224 if (Config->get_solo_control_is_listen_control()) {
3225 _session.set_listen (rl, bval);
3227 _session.set_solo (rl, bval);
3232 Route::SoloControllable::get_value () const
3234 boost::shared_ptr<Route> r = _route.lock ();
3239 if (Config->get_solo_control_is_listen_control()) {
3240 return r->listening_via_monitor() ? 1.0f : 0.0f;
3242 return r->self_soloed() ? 1.0f : 0.0f;
3246 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3247 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3248 boost::shared_ptr<AutomationList>(), name)
3251 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3256 Route::MuteControllable::set_value (double val)
3258 bool bval = ((val >= 0.5f) ? true: false);
3260 boost::shared_ptr<RouteList> rl (new RouteList);
3262 boost::shared_ptr<Route> r = _route.lock ();
3268 _session.set_mute (rl, bval);
3272 Route::MuteControllable::get_value () const
3274 boost::shared_ptr<Route> r = _route.lock ();
3279 return r->muted() ? 1.0f : 0.0f;
3283 Route::set_block_size (pframes_t nframes)
3285 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3286 (*i)->set_block_size (nframes);
3289 _session.ensure_buffers (n_process_buffers ());
3293 Route::protect_automation ()
3295 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3296 (*i)->protect_automation();
3299 /** @param declick 1 to set a pending declick fade-in,
3300 * -1 to set a pending declick fade-out
3303 Route::set_pending_declick (int declick)
3306 /* this call is not allowed to turn off a pending declick */
3308 _pending_declick = declick;
3311 _pending_declick = 0;
3315 /** Shift automation forwards from a particular place, thereby inserting time.
3316 * Adds undo commands for any shifts that are performed.
3318 * @param pos Position to start shifting from.
3319 * @param frames Amount to shift forwards by.
3323 Route::shift (framepos_t pos, framecnt_t frames)
3325 /* gain automation */
3327 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3329 XMLNode &before = gc->alist()->get_state ();
3330 gc->alist()->shift (pos, frames);
3331 XMLNode &after = gc->alist()->get_state ();
3332 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3335 /* pan automation */
3337 ControlSet::Controls& c (_pannable->controls());
3339 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3340 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3342 boost::shared_ptr<AutomationList> al = pc->alist();
3343 XMLNode& before = al->get_state ();
3344 al->shift (pos, frames);
3345 XMLNode& after = al->get_state ();
3346 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3351 /* redirect automation */
3353 Glib::RWLock::ReaderLock lm (_processor_lock);
3354 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3356 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3358 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3359 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3361 boost::shared_ptr<AutomationList> al = ac->alist();
3362 XMLNode &before = al->get_state ();
3363 al->shift (pos, frames);
3364 XMLNode &after = al->get_state ();
3365 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3374 Route::save_as_template (const string& path, const string& name)
3376 XMLNode& node (state (false));
3379 IO::set_name_in_state (*node.children().front(), name);
3381 tree.set_root (&node);
3382 return tree.write (path.c_str());
3387 Route::set_name (const string& str)
3393 name = Route::ensure_track_or_route_name (str, _session);
3394 SessionObject::set_name (name);
3396 ret = (_input->set_name(name) && _output->set_name(name));
3399 /* rename the main outs. Leave other IO processors
3400 * with whatever name they already have, because its
3401 * just fine as it is (it will not contain the route
3402 * name if its a port insert, port send or port return).
3406 if (_main_outs->set_name (name)) {
3407 /* XXX returning false here is stupid because
3408 we already changed the route name.
3418 /** Set the name of a route in an XML description.
3419 * @param node XML <Route> node to set the name in.
3420 * @param name New name.
3423 Route::set_name_in_state (XMLNode& node, string const & name)
3425 node.add_property (X_("name"), name);
3427 XMLNodeList children = node.children();
3428 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3430 if ((*i)->name() == X_("IO")) {
3432 IO::set_name_in_state (**i, name);
3434 } else if ((*i)->name() == X_("Processor")) {
3436 XMLProperty* role = (*i)->property (X_("role"));
3437 if (role && role->value() == X_("Main")) {
3438 (*i)->add_property (X_("name"), name);
3441 } else if ((*i)->name() == X_("Diskstream")) {
3443 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3444 (*i)->add_property (X_("name"), name);
3450 boost::shared_ptr<Send>
3451 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3453 Glib::RWLock::ReaderLock lm (_processor_lock);
3455 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3456 boost::shared_ptr<InternalSend> send;
3458 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3459 if (send->target_route() == target) {
3465 return boost::shared_ptr<Send>();
3468 /** @param c Audio channel index.
3469 * @param yn true to invert phase, otherwise false.
3472 Route::set_phase_invert (uint32_t c, bool yn)
3474 if (_phase_invert[c] != yn) {
3475 _phase_invert[c] = yn;
3476 phase_invert_changed (); /* EMIT SIGNAL */
3477 _session.set_dirty ();
3482 Route::set_phase_invert (boost::dynamic_bitset<> p)
3484 if (_phase_invert != p) {
3486 phase_invert_changed (); /* EMIT SIGNAL */
3487 _session.set_dirty ();
3492 Route::phase_invert (uint32_t c) const
3494 return _phase_invert[c];
3497 boost::dynamic_bitset<>
3498 Route::phase_invert () const
3500 return _phase_invert;
3504 Route::set_denormal_protection (bool yn)
3506 if (_denormal_protection != yn) {
3507 _denormal_protection = yn;
3508 denormal_protection_changed (); /* EMIT SIGNAL */
3513 Route::denormal_protection () const
3515 return _denormal_protection;
3519 Route::set_active (bool yn, void* src)
3521 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3522 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3526 if (_active != yn) {
3528 _input->set_active (yn);
3529 _output->set_active (yn);
3530 active_changed (); // EMIT SIGNAL
3537 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3543 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3545 boost::shared_ptr<Send> s;
3546 boost::shared_ptr<Return> r;
3548 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3549 s->meter()->meter();
3550 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3551 r->meter()->meter ();
3556 boost::shared_ptr<Pannable>
3557 Route::pannable() const
3562 boost::shared_ptr<Panner>
3563 Route::panner() const
3566 return _main_outs->panner_shell()->panner();
3569 boost::shared_ptr<PannerShell>
3570 Route::panner_shell() const
3572 return _main_outs->panner_shell();
3575 boost::shared_ptr<AutomationControl>
3576 Route::gain_control() const
3578 return _amp->gain_control();
3581 boost::shared_ptr<AutomationControl>
3582 Route::get_control (const Evoral::Parameter& param)
3584 /* either we own the control or .... */
3586 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3590 /* maybe one of our processors does or ... */
3592 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3593 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3594 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3602 /* nobody does so we'll make a new one */
3604 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3611 boost::shared_ptr<Processor>
3612 Route::nth_plugin (uint32_t n)
3614 Glib::RWLock::ReaderLock lm (_processor_lock);
3615 ProcessorList::iterator i;
3617 for (i = _processors.begin(); i != _processors.end(); ++i) {
3618 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3625 return boost::shared_ptr<Processor> ();
3628 boost::shared_ptr<Processor>
3629 Route::nth_send (uint32_t n)
3631 Glib::RWLock::ReaderLock lm (_processor_lock);
3632 ProcessorList::iterator i;
3634 for (i = _processors.begin(); i != _processors.end(); ++i) {
3635 if (boost::dynamic_pointer_cast<Send> (*i)) {
3642 return boost::shared_ptr<Processor> ();
3646 Route::has_io_processor_named (const string& name)
3648 Glib::RWLock::ReaderLock lm (_processor_lock);
3649 ProcessorList::iterator i;
3651 for (i = _processors.begin(); i != _processors.end(); ++i) {
3652 if (boost::dynamic_pointer_cast<Send> (*i) ||
3653 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3654 if ((*i)->name() == name) {
3663 MuteMaster::MutePoint
3664 Route::mute_points () const
3666 return _mute_master->mute_points ();
3670 Route::set_processor_positions ()
3672 Glib::RWLock::ReaderLock lm (_processor_lock);
3674 bool had_amp = false;
3675 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3676 (*i)->set_pre_fader (!had_amp);
3677 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3683 /** Called when there is a proposed change to the input port count */
3685 Route::input_port_count_changing (ChanCount to)
3687 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3689 /* The processors cannot be configured with the new input arrangement, so
3695 /* The change is ok */
3700 Route::unknown_processors () const
3704 Glib::RWLock::ReaderLock lm (_processor_lock);
3705 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3706 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3707 p.push_back ((*i)->name ());
3716 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3718 /* we assume that all our input ports feed all our output ports. its not
3719 universally true, but the alternative is way too corner-case to worry about.
3722 jack_latency_range_t all_connections;
3725 all_connections.min = 0;
3726 all_connections.max = 0;
3728 all_connections.min = ~((jack_nframes_t) 0);
3729 all_connections.max = 0;
3731 /* iterate over all "from" ports and determine the latency range for all of their
3732 connections to the "outside" (outside of this Route).
3735 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3737 jack_latency_range_t range;
3739 p->get_connected_latency_range (range, playback);
3741 all_connections.min = min (all_connections.min, range.min);
3742 all_connections.max = max (all_connections.max, range.max);
3746 /* set the "from" port latencies to the max/min range of all their connections */
3748 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3749 p->set_private_latency_range (all_connections, playback);
3752 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3754 all_connections.min += our_latency;
3755 all_connections.max += our_latency;
3757 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3758 p->set_private_latency_range (all_connections, playback);
3761 return all_connections.max;
3765 Route::set_private_port_latencies (bool playback) const
3767 framecnt_t own_latency = 0;
3769 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3770 OR LATENCY CALLBACK.
3772 This is called (early) from the latency callback. It computes the REAL
3773 latency associated with each port and stores the result as the "private"
3774 latency of the port. A later call to Route::set_public_port_latencies()
3775 sets all ports to the same value to reflect the fact that we do latency
3776 compensation and so all signals are delayed by the same amount as they
3777 flow through ardour.
3780 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3781 if ((*i)->active ()) {
3782 own_latency += (*i)->signal_latency ();
3787 /* playback: propagate latency from "outside the route" to outputs to inputs */
3788 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3790 /* capture: propagate latency from "outside the route" to inputs to outputs */
3791 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3796 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3798 /* this is called to set the JACK-visible port latencies, which take
3799 latency compensation into account.
3802 jack_latency_range_t range;
3808 const PortSet& ports (_input->ports());
3809 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3810 p->set_public_latency_range (range, playback);
3815 const PortSet& ports (_output->ports());
3816 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3817 p->set_public_latency_range (range, playback);
3822 /** Put the invisible processors in the right place in _processors.
3823 * Must be called with a writer lock on _processor_lock held.
3826 Route::setup_invisible_processors ()
3829 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3830 assert (!lm.locked ());
3834 /* too early to be doing this stuff */
3838 /* we'll build this new list here and then use it */
3840 ProcessorList new_processors;
3842 /* find visible processors */
3844 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3845 if ((*i)->display_to_user ()) {
3846 new_processors.push_back (*i);
3852 ProcessorList::iterator amp = new_processors.begin ();
3853 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3857 assert (amp != _processors.end ());
3859 /* and the processor after the amp */
3861 ProcessorList::iterator after_amp = amp;
3867 switch (_meter_point) {
3869 assert (!_meter->display_to_user ());
3870 new_processors.push_front (_meter);
3873 assert (!_meter->display_to_user ());
3874 new_processors.insert (amp, _meter);
3876 case MeterPostFader:
3877 /* do nothing here */
3880 /* do nothing here */
3883 /* the meter is visible, so we don't touch it here */
3890 assert (_main_outs);
3891 assert (!_main_outs->display_to_user ());
3892 new_processors.push_back (_main_outs);
3894 /* iterator for the main outs */
3896 ProcessorList::iterator main = new_processors.end();
3899 /* OUTPUT METERING */
3901 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3902 assert (!_meter->display_to_user ());
3904 /* add the processor just before or just after the main outs */
3906 ProcessorList::iterator meter_point = main;
3908 if (_meter_point == MeterOutput) {
3911 new_processors.insert (meter_point, _meter);
3916 if (_monitor_send && !is_monitor ()) {
3917 assert (!_monitor_send->display_to_user ());
3918 if (Config->get_solo_control_is_listen_control()) {
3919 switch (Config->get_listen_position ()) {
3920 case PreFaderListen:
3921 switch (Config->get_pfl_position ()) {
3922 case PFLFromBeforeProcessors:
3923 new_processors.push_front (_monitor_send);
3925 case PFLFromAfterProcessors:
3926 new_processors.insert (amp, _monitor_send);
3929 _monitor_send->set_can_pan (false);
3931 case AfterFaderListen:
3932 switch (Config->get_afl_position ()) {
3933 case AFLFromBeforeProcessors:
3934 new_processors.insert (after_amp, _monitor_send);
3936 case AFLFromAfterProcessors:
3937 new_processors.insert (new_processors.end(), _monitor_send);
3940 _monitor_send->set_can_pan (true);
3944 new_processors.insert (new_processors.end(), _monitor_send);
3945 _monitor_send->set_can_pan (false);
3949 /* MONITOR CONTROL */
3951 if (_monitor_control && is_monitor ()) {
3952 assert (!_monitor_control->display_to_user ());
3953 new_processors.push_front (_monitor_control);
3956 /* INTERNAL RETURN */
3958 /* doing this here means that any monitor control will come just after
3963 assert (!_intreturn->display_to_user ());
3964 new_processors.push_front (_intreturn);
3967 /* EXPORT PROCESSOR */
3969 if (_capturing_processor) {
3970 assert (!_capturing_processor->display_to_user ());
3971 new_processors.push_front (_capturing_processor);
3974 _processors = new_processors;
3976 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3977 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3978 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3985 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3986 Glib::RWLock::ReaderLock lp (_processor_lock);
3990 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3991 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
3998 /** If the meter point is `Custom', make a note of where the meter is.
3999 * This is so that if the meter point is subsequently set to something else,
4000 * and then back to custom, we can put the meter back where it was last time
4001 * custom was enabled.
4003 * Must be called with the _processor_lock held.
4006 Route::maybe_note_meter_position ()
4008 if (_meter_point != MeterCustom) {
4012 _custom_meter_position_noted = true;
4013 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4014 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4015 ProcessorList::iterator j = i;
4017 if (j != _processors.end ()) {
4018 _processor_after_last_custom_meter = *j;
4019 _last_custom_meter_was_at_end = false;
4021 _last_custom_meter_was_at_end = true;
4027 boost::shared_ptr<Processor>
4028 Route::processor_by_id (PBD::ID id) const
4030 Glib::RWLock::ReaderLock lm (_processor_lock);
4031 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4032 if ((*i)->id() == id) {
4037 return boost::shared_ptr<Processor> ();
4040 /** @return the monitoring state, or in other words what data we are pushing
4041 * into the route (data from the inputs, data from disk or silence)
4044 Route::monitoring_state () const
4046 return MonitoringInput;
4049 /** @return what we should be metering; either the data coming from the input
4050 * IO or the data that is flowing through the route.
4053 Route::metering_state () const
4055 return MeteringRoute;
4059 Route::has_external_redirects () const
4061 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4063 /* ignore inactive processors and obviously ignore the main
4064 * outs since everything has them and we don't care.
4067 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4075 boost::shared_ptr<Processor>
4076 Route::the_instrument () const
4078 Glib::RWLock::WriterLock lm (_processor_lock);
4079 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4080 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4081 if ((*i)->input_streams().n_midi() > 0 &&
4082 (*i)->output_streams().n_audio() > 0) {
4087 return boost::shared_ptr<Processor>();