2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include "pbd/xml++.h"
30 #include "pbd/enumwriter.h"
31 #include "pbd/memento_command.h"
32 #include "pbd/stacktrace.h"
33 #include "pbd/convert.h"
34 #include "pbd/boost_debug.h"
36 #include "evoral/Curve.hpp"
38 #include "ardour/amp.h"
39 #include "ardour/audio_port.h"
40 #include "ardour/audioengine.h"
41 #include "ardour/buffer.h"
42 #include "ardour/buffer_set.h"
43 #include "ardour/configuration.h"
44 #include "ardour/cycle_timer.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/dB.h"
48 #include "ardour/internal_send.h"
49 #include "ardour/internal_return.h"
50 #include "ardour/ladspa_plugin.h"
51 #include "ardour/meter.h"
52 #include "ardour/mix.h"
53 #include "ardour/monitor_processor.h"
54 #include "ardour/pannable.h"
55 #include "ardour/panner.h"
56 #include "ardour/panner_shell.h"
57 #include "ardour/plugin_insert.h"
58 #include "ardour/port.h"
59 #include "ardour/port_insert.h"
60 #include "ardour/processor.h"
61 #include "ardour/profile.h"
62 #include "ardour/route.h"
63 #include "ardour/route_group.h"
64 #include "ardour/send.h"
65 #include "ardour/session.h"
66 #include "ardour/timestamps.h"
67 #include "ardour/utils.h"
68 #include "ardour/unknown_processor.h"
69 #include "ardour/capturing_processor.h"
74 using namespace ARDOUR;
77 uint32_t Route::order_key_cnt = 0;
78 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
79 PBD::Signal0<void> Route::RemoteControlIDChange;
81 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
82 : SessionObject (sess, name)
84 , GraphNode (sess._process_graph)
90 , _pending_declick (true)
91 , _meter_point (MeterPostFader)
93 , _soloed_by_others_upstream (0)
94 , _soloed_by_others_downstream (0)
96 , _denormal_protection (false)
99 , _declickable (false)
100 , _mute_master (new MuteMaster (sess, name))
101 , _have_internal_generator (false)
103 , _default_type (default_type)
104 , _remote_control_id (0)
105 , _in_configure_processors (false)
106 , _custom_meter_position_noted (false)
107 , _last_custom_meter_was_at_end (false)
109 processor_max_streams.reset();
110 order_keys[N_("signal")] = order_key_cnt++;
113 set_remote_control_id (MasterBusRemoteControlID);
114 } else if (is_monitor()) {
115 set_remote_control_id (MonitorBusRemoteControlID);
123 /* add standard controls */
125 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
126 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
128 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
129 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
131 add_control (_solo_control);
132 add_control (_mute_control);
136 if (!(_flags & Route::MonitorOut)) {
137 _pannable.reset (new Pannable (_session));
140 /* input and output objects */
142 _input.reset (new IO (_session, _name, IO::Input, _default_type));
143 _output.reset (new IO (_session, _name, IO::Output, _default_type));
145 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
146 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
148 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
150 /* add amp processor */
152 _amp.reset (new Amp (_session));
153 add_processor (_amp, PostFader);
155 /* create standard processors: meter, main outs, monitor out;
156 they will be added to _processors by setup_invisible_processors ()
159 _meter.reset (new PeakMeter (_session));
160 _meter->set_display_to_user (false);
163 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
164 _main_outs->activate ();
167 /* where we listen to tracks */
168 _intreturn.reset (new InternalReturn (_session));
169 _intreturn->activate ();
171 /* the thing that provides proper control over a control/monitor/listen bus
172 (such as per-channel cut, dim, solo, invert, etc).
174 _monitor_control.reset (new MonitorProcessor (_session));
175 _monitor_control->activate ();
178 if (is_master() || is_monitor() || is_hidden()) {
179 _mute_master->set_solo_ignore (true);
182 /* now that we have _meter, its safe to connect to this */
184 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
187 /* run a configure so that the invisible processors get set up */
188 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
189 configure_processors (0);
197 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
199 /* do this early so that we don't get incoming signals as we are going through destruction
204 /* don't use clear_processors here, as it depends on the session which may
205 be half-destroyed by now
208 Glib::RWLock::WriterLock lm (_processor_lock);
209 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
210 (*i)->drop_references ();
213 _processors.clear ();
217 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
219 /* force IDs for master/monitor busses and prevent
220 any other route from accidentally getting these IDs
221 (i.e. legacy sessions)
224 if (is_master() && id != MasterBusRemoteControlID) {
225 id = MasterBusRemoteControlID;
228 if (is_monitor() && id != MonitorBusRemoteControlID) {
229 id = MonitorBusRemoteControlID;
232 /* don't allow it to collide */
234 if (!is_master () && !is_monitor() &&
235 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
236 id += MonitorBusRemoteControlID;
239 if (id != _remote_control_id) {
240 _remote_control_id = id;
241 RemoteControlIDChanged ();
242 if (notify_class_listeners) {
243 RemoteControlIDChange ();
249 Route::remote_control_id() const
251 return _remote_control_id;
255 Route::order_key (std::string const & name) const
257 OrderKeys::const_iterator i = order_keys.find (name);
258 if (i == order_keys.end()) {
266 Route::set_order_key (std::string const & name, int32_t n)
268 bool changed = false;
270 /* This method looks more complicated than it should, but
271 it's important that we don't emit order_key_changed unless
272 it actually has, as expensive things happen on receipt of that
276 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
277 order_keys[name] = n;
281 if (Config->get_sync_all_route_ordering()) {
282 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
283 if (x->second != n) {
291 order_key_changed (); /* EMIT SIGNAL */
292 _session.set_dirty ();
296 /** Set all order keys to be the same as that for `base', if such a key
297 * exists in this route.
298 * @param base Base key.
301 Route::sync_order_keys (std::string const & base)
303 if (order_keys.empty()) {
307 OrderKeys::iterator i;
310 if ((i = order_keys.find (base)) == order_keys.end()) {
311 /* key doesn't exist, use the first existing key (during session initialization) */
312 i = order_keys.begin();
316 /* key exists - use it and reset all others (actually, itself included) */
318 i = order_keys.begin();
321 bool changed = false;
323 for (; i != order_keys.end(); ++i) {
324 if (i->second != key) {
331 order_key_changed (); /* EMIT SIGNAL */
336 Route::ensure_track_or_route_name(string name, Session &session)
338 string newname = name;
340 while (!session.io_name_is_legal (newname)) {
341 newname = bump_name_once (newname, '.');
349 Route::inc_gain (gain_t fraction, void *src)
351 _amp->inc_gain (fraction, src);
355 Route::set_gain (gain_t val, void *src)
357 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
359 if (_route_group->is_relative()) {
361 gain_t usable_gain = _amp->gain();
362 if (usable_gain < 0.000001f) {
363 usable_gain = 0.000001f;
367 if (delta < 0.000001f) {
371 delta -= usable_gain;
376 gain_t factor = delta / usable_gain;
379 factor = _route_group->get_max_factor(factor);
380 if (factor == 0.0f) {
381 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
385 factor = _route_group->get_min_factor(factor);
386 if (factor == 0.0f) {
387 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
392 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
396 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
402 if (val == _amp->gain()) {
406 _amp->set_gain (val, src);
410 Route::maybe_declick (BufferSet&, framecnt_t, int)
412 /* this is the "bus" implementation and they never declick.
417 /** Process this route for one (sub) cycle (process thread)
419 * @param bufs Scratch buffers to use for the signal path
420 * @param start_frame Initial transport frame
421 * @param end_frame Final transport frame
422 * @param nframes Number of frames to output (to ports)
424 * Note that (end_frame - start_frame) may not be equal to nframes when the
425 * transport speed isn't 1.0 (eg varispeed).
428 Route::process_output_buffers (BufferSet& bufs,
429 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
430 int declick, bool gain_automation_ok)
432 bufs.set_is_silent (false);
434 /* figure out if we're going to use gain automation */
435 if (gain_automation_ok) {
436 _amp->setup_gain_automation (start_frame, end_frame, nframes);
438 _amp->apply_gain_automation (false);
441 /* Tell main outs what to do about monitoring. We do this so that
442 on a transition between monitoring states we get a de-clicking gain
443 change in the _main_outs delivery.
445 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
448 /* -------------------------------------------------------------------------------------------
449 GLOBAL DECLICK (for transport changes etc.)
450 ----------------------------------------------------------------------------------------- */
452 maybe_declick (bufs, nframes, declick);
453 _pending_declick = 0;
455 /* -------------------------------------------------------------------------------------------
456 DENORMAL CONTROL/PHASE INVERT
457 ----------------------------------------------------------------------------------------- */
459 if (_phase_invert.any ()) {
463 if (_denormal_protection || Config->get_denormal_protection()) {
465 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
466 Sample* const sp = i->data();
468 if (_phase_invert[chn]) {
469 for (pframes_t nx = 0; nx < nframes; ++nx) {
474 for (pframes_t nx = 0; nx < nframes; ++nx) {
482 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
483 Sample* const sp = i->data();
485 if (_phase_invert[chn]) {
486 for (pframes_t nx = 0; nx < nframes; ++nx) {
495 if (_denormal_protection || Config->get_denormal_protection()) {
497 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
498 Sample* const sp = i->data();
499 for (pframes_t nx = 0; nx < nframes; ++nx) {
507 /* -------------------------------------------------------------------------------------------
509 ----------------------------------------------------------------------------------------- */
511 /* set this to be true if the meter will already have been ::run() earlier */
512 bool const meter_already_run = metering_state() == MeteringInput;
514 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
516 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
517 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
521 if (Config->get_plugins_stop_with_transport() && _session.transport_speed() == 0 && boost::dynamic_pointer_cast<PluginInsert> (*i)) {
522 /* don't run plugins with the transport stopped, if configured this way */
527 /* if it has any inputs, make sure they match */
528 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
529 if (bufs.count() != (*i)->input_streams()) {
530 cerr << _name << " bufs = " << bufs.count()
531 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
538 /* should we NOT run plugins here if the route is inactive?
539 do we catch route != active somewhere higher?
542 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
543 bufs.set_count ((*i)->output_streams());
548 Route::n_process_buffers ()
550 return max (_input->n_ports(), processor_max_streams);
554 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
556 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
560 assert (bufs.available() >= input_streams());
562 if (_input->n_ports() == ChanCount::ZERO) {
563 silence_unlocked (nframes);
566 bufs.set_count (input_streams());
568 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
570 /* control/monitor bus ignores input ports when something is
571 feeding the listen "stream". data will "arrive" into the
572 route from the intreturn processor element.
574 bufs.silence (nframes, 0);
578 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
580 BufferSet::iterator o = bufs.begin(*t);
581 PortSet& ports (_input->ports());
583 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
584 o->read_from (i->get_buffer(nframes), nframes);
589 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
590 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
594 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
596 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
598 bufs.set_count (_input->n_ports());
599 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
600 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
604 Route::set_listen (bool yn, void* src)
610 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
611 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
616 if (yn != _monitor_send->active()) {
618 _monitor_send->activate ();
619 _mute_master->set_soloed (true);
621 _monitor_send->deactivate ();
622 _mute_master->set_soloed (false);
625 listen_changed (src); /* EMIT SIGNAL */
631 Route::listening_via_monitor () const
634 return _monitor_send->active ();
641 Route::set_solo_safe (bool yn, void *src)
643 if (_solo_safe != yn) {
645 solo_safe_changed (src);
650 Route::solo_safe() const
656 Route::set_solo (bool yn, void *src)
662 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
663 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
667 if (self_soloed() != yn) {
669 set_mute_master_solo ();
670 solo_changed (true, src); /* EMIT SIGNAL */
671 _solo_control->Changed (); /* EMIT SIGNAL */
676 Route::set_self_solo (bool yn)
682 Route::mod_solo_by_others_upstream (int32_t delta)
688 uint32_t old_sbu = _soloed_by_others_upstream;
691 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
692 _soloed_by_others_upstream += delta;
694 _soloed_by_others_upstream = 0;
697 _soloed_by_others_upstream += delta;
700 DEBUG_TRACE (DEBUG::Solo, string_compose (
701 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
702 name(), delta, _soloed_by_others_upstream, old_sbu,
703 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
705 /* push the inverse solo change to everything that feeds us.
707 This is important for solo-within-group. When we solo 1 track out of N that
708 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
709 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
710 tracks that feed it. This will silence them if they were audible because
711 of a bus solo, but the newly soloed track will still be audible (because
714 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
718 if ((_self_solo || _soloed_by_others_downstream) &&
719 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
720 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
722 if (delta > 0 || !Config->get_exclusive_solo()) {
723 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
724 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
725 boost::shared_ptr<Route> sr = i->r.lock();
727 sr->mod_solo_by_others_downstream (-delta);
733 set_mute_master_solo ();
734 solo_changed (false, this);
738 Route::mod_solo_by_others_downstream (int32_t delta)
745 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
746 _soloed_by_others_downstream += delta;
748 _soloed_by_others_downstream = 0;
751 _soloed_by_others_downstream += delta;
754 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
756 set_mute_master_solo ();
757 solo_changed (false, this);
761 Route::set_mute_master_solo ()
763 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
767 Route::set_solo_isolated (bool yn, void *src)
769 if (is_master() || is_monitor() || is_hidden()) {
773 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
774 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
778 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
780 boost::shared_ptr<RouteList> routes = _session.get_routes ();
781 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
783 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
788 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
790 if (does_feed && !sends_only) {
791 (*i)->set_solo_isolated (yn, (*i)->route_group());
795 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
797 bool changed = false;
800 if (_solo_isolated == 0) {
801 _mute_master->set_solo_ignore (true);
806 if (_solo_isolated > 0) {
808 if (_solo_isolated == 0) {
809 _mute_master->set_solo_ignore (false);
816 solo_isolated_changed (src);
821 Route::solo_isolated () const
823 return _solo_isolated > 0;
827 Route::set_mute_points (MuteMaster::MutePoint mp)
829 _mute_master->set_mute_points (mp);
830 mute_points_changed (); /* EMIT SIGNAL */
832 if (_mute_master->muted_by_self()) {
833 mute_changed (this); /* EMIT SIGNAL */
834 _mute_control->Changed (); /* EMIT SIGNAL */
839 Route::set_mute (bool yn, void *src)
841 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
842 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
847 _mute_master->set_muted_by_self (yn);
848 /* allow any derived classes to respond to the mute change
849 before anybody else knows about it.
852 /* tell everyone else */
853 mute_changed (src); /* EMIT SIGNAL */
854 _mute_control->Changed (); /* EMIT SIGNAL */
859 Route::muted () const
861 return _mute_master->muted_by_self();
866 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
868 cerr << name << " {" << endl;
869 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
870 p != procs.end(); ++p) {
871 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
877 /** Supposing that we want to insert a Processor at a given Placement, return
878 * the processor to add the new one before (or 0 to add at the end).
880 boost::shared_ptr<Processor>
881 Route::before_processor_for_placement (Placement p)
883 Glib::RWLock::ReaderLock lm (_processor_lock);
885 ProcessorList::iterator loc;
888 /* generic pre-fader: insert immediately before the amp */
889 loc = find (_processors.begin(), _processors.end(), _amp);
891 /* generic post-fader: insert right before the main outs */
892 loc = find (_processors.begin(), _processors.end(), _main_outs);
895 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
898 /** Supposing that we want to insert a Processor at a given index, return
899 * the processor to add the new one before (or 0 to add at the end).
901 boost::shared_ptr<Processor>
902 Route::before_processor_for_index (int index)
905 return boost::shared_ptr<Processor> ();
908 Glib::RWLock::ReaderLock lm (_processor_lock);
910 ProcessorList::iterator i = _processors.begin ();
912 while (i != _processors.end() && j < index) {
913 if ((*i)->display_to_user()) {
920 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
923 /** Add a processor either pre- or post-fader
924 * @return 0 on success, non-0 on failure.
927 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
929 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
933 /** Add a processor to a route such that it ends up with a given index into the visible processors.
934 * @param index Index to add the processor at, or -1 to add at the end of the list.
935 * @return 0 on success, non-0 on failure.
938 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
940 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
943 /** Add a processor to the route.
944 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
945 * @return 0 on success, non-0 on failure.
948 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
950 assert (processor != _meter);
951 assert (processor != _main_outs);
953 DEBUG_TRACE (DEBUG::Processors, string_compose (
954 "%1 adding processor %2\n", name(), processor->name()));
956 if (!_session.engine().connected() || !processor) {
961 Glib::RWLock::WriterLock lm (_processor_lock);
962 ProcessorState pstate (this);
964 boost::shared_ptr<PluginInsert> pi;
965 boost::shared_ptr<PortInsert> porti;
967 if (processor == _amp) {
968 /* Ensure that only one amp is in the list at any time */
969 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
970 if (check != _processors.end()) {
971 if (before == _amp) {
972 /* Already in position; all is well */
975 _processors.erase (check);
980 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
982 ProcessorList::iterator loc;
984 /* inserting before a processor; find it */
985 loc = find (_processors.begin(), _processors.end(), before);
986 if (loc == _processors.end ()) {
991 /* inserting at end */
992 loc = _processors.end ();
995 _processors.insert (loc, processor);
997 // Set up processor list channels. This will set processor->[input|output]_streams(),
998 // configure redirect ports properly, etc.
1001 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1003 if (configure_processors_unlocked (err)) {
1005 configure_processors_unlocked (0); // it worked before we tried to add it ...
1010 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1012 if (pi->has_no_inputs ()) {
1013 /* generator plugin */
1014 _have_internal_generator = true;
1019 if (activation_allowed) {
1020 processor->activate ();
1023 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1025 _output->set_user_latency (0);
1028 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1029 set_processor_positions ();
1035 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1037 const XMLProperty *prop;
1040 boost::shared_ptr<Processor> processor;
1042 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1043 so that we can add the processor in the right place (pre/post-fader)
1046 XMLNodeList const & children = node.children ();
1047 XMLNodeList::const_iterator i = children.begin ();
1049 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1053 Placement placement = PreFader;
1055 if (i != children.end()) {
1056 if ((prop = (*i)->property (X_("placement"))) != 0) {
1057 placement = Placement (string_2_enum (prop->value(), placement));
1061 if (node.name() == "Insert") {
1063 if ((prop = node.property ("type")) != 0) {
1065 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1066 prop->value() == "lv2" ||
1067 prop->value() == "vst" ||
1068 prop->value() == "lxvst" ||
1069 prop->value() == "audiounit") {
1071 processor.reset (new PluginInsert (_session));
1075 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1080 } else if (node.name() == "Send") {
1082 processor.reset (new Send (_session, _pannable, _mute_master));
1086 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1090 if (processor->set_state (node, version)) {
1094 return (add_processor (processor, placement) == 0);
1097 catch (failed_constructor &err) {
1098 warning << _("processor could not be created. Ignored.") << endmsg;
1104 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1106 /* NOTE: this is intended to be used ONLY when copying
1107 processors from another Route. Hence the subtle
1108 differences between this and ::add_processor()
1111 ProcessorList::iterator loc;
1114 loc = find(_processors.begin(), _processors.end(), before);
1116 /* nothing specified - at end */
1117 loc = _processors.end ();
1120 if (!_session.engine().connected()) {
1124 if (others.empty()) {
1129 Glib::RWLock::WriterLock lm (_processor_lock);
1130 ProcessorState pstate (this);
1132 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1138 boost::shared_ptr<PluginInsert> pi;
1140 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1144 _processors.insert (loc, *i);
1146 if ((*i)->active()) {
1151 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1152 if (configure_processors_unlocked (err)) {
1154 configure_processors_unlocked (0); // it worked before we tried to add it ...
1159 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1162 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1163 boost::shared_ptr<PluginInsert> pi;
1165 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1166 if (pi->has_no_inputs ()) {
1167 _have_internal_generator = true;
1173 _output->set_user_latency (0);
1176 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1177 set_processor_positions ();
1183 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1185 if (p == PreFader) {
1186 start = _processors.begin();
1187 end = find(_processors.begin(), _processors.end(), _amp);
1189 start = find(_processors.begin(), _processors.end(), _amp);
1191 end = _processors.end();
1195 /** Turn off all processors with a given placement
1196 * @param p Placement of processors to disable
1199 Route::disable_processors (Placement p)
1201 Glib::RWLock::ReaderLock lm (_processor_lock);
1203 ProcessorList::iterator start, end;
1204 placement_range(p, start, end);
1206 for (ProcessorList::iterator i = start; i != end; ++i) {
1207 (*i)->deactivate ();
1210 _session.set_dirty ();
1213 /** Turn off all redirects
1216 Route::disable_processors ()
1218 Glib::RWLock::ReaderLock lm (_processor_lock);
1220 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1221 (*i)->deactivate ();
1224 _session.set_dirty ();
1227 /** Turn off all redirects with a given placement
1228 * @param p Placement of redirects to disable
1231 Route::disable_plugins (Placement p)
1233 Glib::RWLock::ReaderLock lm (_processor_lock);
1235 ProcessorList::iterator start, end;
1236 placement_range(p, start, end);
1238 for (ProcessorList::iterator i = start; i != end; ++i) {
1239 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1240 (*i)->deactivate ();
1244 _session.set_dirty ();
1247 /** Turn off all plugins
1250 Route::disable_plugins ()
1252 Glib::RWLock::ReaderLock lm (_processor_lock);
1254 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1255 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1256 (*i)->deactivate ();
1260 _session.set_dirty ();
1265 Route::ab_plugins (bool forward)
1267 Glib::RWLock::ReaderLock lm (_processor_lock);
1271 /* forward = turn off all active redirects, and mark them so that the next time
1272 we go the other way, we will revert them
1275 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1276 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1280 if ((*i)->active()) {
1281 (*i)->deactivate ();
1282 (*i)->set_next_ab_is_active (true);
1284 (*i)->set_next_ab_is_active (false);
1290 /* backward = if the redirect was marked to go active on the next ab, do so */
1292 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1294 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1298 if ((*i)->get_next_ab_is_active()) {
1301 (*i)->deactivate ();
1306 _session.set_dirty ();
1310 /** Remove processors with a given placement.
1311 * @param p Placement of processors to remove.
1314 Route::clear_processors (Placement p)
1316 if (!_session.engine().connected()) {
1320 bool already_deleting = _session.deletion_in_progress();
1321 if (!already_deleting) {
1322 _session.set_deletion_in_progress();
1326 Glib::RWLock::WriterLock lm (_processor_lock);
1327 ProcessorList new_list;
1328 ProcessorStreams err;
1329 bool seen_amp = false;
1331 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1337 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1339 /* you can't remove these */
1341 new_list.push_back (*i);
1348 new_list.push_back (*i);
1351 (*i)->drop_references ();
1359 (*i)->drop_references ();
1362 new_list.push_back (*i);
1369 _processors = new_list;
1372 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1373 configure_processors_unlocked (&err); // this can't fail
1377 processor_max_streams.reset();
1378 _have_internal_generator = false;
1379 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1380 set_processor_positions ();
1382 if (!already_deleting) {
1383 _session.clear_deletion_in_progress();
1388 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
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 processor->drop_references ();
1481 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1482 set_processor_positions ();
1488 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1490 ProcessorList deleted;
1492 if (!_session.engine().connected()) {
1496 processor_max_streams.reset();
1499 Glib::RWLock::WriterLock lm (_processor_lock);
1500 ProcessorState pstate (this);
1502 ProcessorList::iterator i;
1503 boost::shared_ptr<Processor> processor;
1505 for (i = _processors.begin(); i != _processors.end(); ) {
1509 /* these can never be removed */
1511 if (processor == _amp || processor == _meter || processor == _main_outs) {
1516 /* see if its in the list of processors to delete */
1518 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1523 /* stop IOProcessors that send to JACK ports
1524 from causing noise as a result of no longer being
1528 boost::shared_ptr<IOProcessor> iop;
1530 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1534 deleted.push_back (processor);
1535 i = _processors.erase (i);
1538 if (deleted.empty()) {
1539 /* none of those in the requested list were found */
1543 _output->set_user_latency (0);
1546 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1548 if (configure_processors_unlocked (err)) {
1550 /* we know this will work, because it worked before :) */
1551 configure_processors_unlocked (0);
1556 _have_internal_generator = false;
1558 for (i = _processors.begin(); i != _processors.end(); ++i) {
1559 boost::shared_ptr<PluginInsert> pi;
1561 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1562 if (pi->has_no_inputs ()) {
1563 _have_internal_generator = true;
1570 /* now try to do what we need to so that those that were removed will be deleted */
1572 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1573 (*i)->drop_references ();
1576 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1577 set_processor_positions ();
1582 /** Caller must hold process lock */
1584 Route::configure_processors (ProcessorStreams* err)
1586 assert (!AudioEngine::instance()->process_lock().trylock());
1588 if (!_in_configure_processors) {
1589 Glib::RWLock::WriterLock lm (_processor_lock);
1590 return configure_processors_unlocked (err);
1597 Route::input_streams () const
1599 return _input->n_ports ();
1602 list<pair<ChanCount, ChanCount> >
1603 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1605 Glib::RWLock::ReaderLock lm (_processor_lock);
1607 return try_configure_processors_unlocked (in, err);
1610 list<pair<ChanCount, ChanCount> >
1611 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1613 // Check each processor in order to see if we can configure as requested
1615 list<pair<ChanCount, ChanCount> > configuration;
1618 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1619 DEBUG_TRACE (DEBUG::Processors, "{\n");
1621 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1623 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1624 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1628 if ((*p)->can_support_io_configuration(in, out)) {
1629 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1630 configuration.push_back(make_pair(in, out));
1637 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1638 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1639 DEBUG_TRACE (DEBUG::Processors, "}\n");
1640 return list<pair<ChanCount, ChanCount> > ();
1644 DEBUG_TRACE (DEBUG::Processors, "}\n");
1646 return configuration;
1649 /** Set the input/output configuration of each processor in the processors list.
1650 * Caller must hold process lock.
1651 * Return 0 on success, otherwise configuration is impossible.
1654 Route::configure_processors_unlocked (ProcessorStreams* err)
1656 assert (!AudioEngine::instance()->process_lock().trylock());
1658 if (_in_configure_processors) {
1662 /* put invisible processors where they should be */
1663 setup_invisible_processors ();
1665 _in_configure_processors = true;
1667 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1669 if (configuration.empty ()) {
1670 _in_configure_processors = false;
1676 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1677 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1679 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1683 (*p)->configure_io(c->first, c->second);
1684 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1685 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1690 _meter->reset_max_channels (processor_max_streams);
1693 /* make sure we have sufficient scratch buffers to cope with the new processor
1696 _session.ensure_buffers (n_process_buffers ());
1698 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1700 _in_configure_processors = false;
1704 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1705 * @param state New active state for those processors.
1708 Route::all_visible_processors_active (bool state)
1710 Glib::RWLock::ReaderLock lm (_processor_lock);
1712 if (_processors.empty()) {
1716 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1717 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1724 (*i)->deactivate ();
1728 _session.set_dirty ();
1732 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1734 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1735 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1736 processors in the current actual processor list that are hidden. Any visible processors
1737 in the current list but not in "new_order" will be assumed to be deleted.
1741 Glib::RWLock::WriterLock lm (_processor_lock);
1742 ProcessorState pstate (this);
1744 ProcessorList::iterator oiter;
1745 ProcessorList::const_iterator niter;
1746 ProcessorList as_it_will_be;
1748 oiter = _processors.begin();
1749 niter = new_order.begin();
1751 while (niter != new_order.end()) {
1753 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1754 then append it to the temp list.
1756 Otherwise, see if the next processor in the old list is in the new list. if not,
1757 its been deleted. If its there, append it to the temp list.
1760 if (oiter == _processors.end()) {
1762 /* no more elements in the old list, so just stick the rest of
1763 the new order onto the temp list.
1766 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1767 while (niter != new_order.end()) {
1774 if (!(*oiter)->display_to_user()) {
1776 as_it_will_be.push_back (*oiter);
1780 /* visible processor: check that its in the new order */
1782 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1783 /* deleted: do nothing, shared_ptr<> will clean up */
1785 /* ignore this one, and add the next item from the new order instead */
1786 as_it_will_be.push_back (*niter);
1791 /* now remove from old order - its taken care of no matter what */
1792 oiter = _processors.erase (oiter);
1797 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1799 /* If the meter is in a custom position, find it and make a rough note of its position */
1800 maybe_note_meter_position ();
1803 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1805 if (configure_processors_unlocked (err)) {
1812 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1813 set_processor_positions ();
1825 Route::get_template()
1827 return state(false);
1831 Route::state(bool full_state)
1833 XMLNode *node = new XMLNode("Route");
1834 ProcessorList::iterator i;
1837 id().print (buf, sizeof (buf));
1838 node->add_property("id", buf);
1839 node->add_property ("name", _name);
1840 node->add_property("default-type", _default_type.to_string());
1843 node->add_property("flags", enum_2_string (_flags));
1846 node->add_property("active", _active?"yes":"no");
1848 boost::to_string (_phase_invert, p);
1849 node->add_property("phase-invert", p);
1850 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1851 node->add_property("meter-point", enum_2_string (_meter_point));
1854 node->add_property("route-group", _route_group->name());
1857 string order_string;
1858 OrderKeys::iterator x = order_keys.begin();
1860 while (x != order_keys.end()) {
1861 order_string += string ((*x).first);
1862 order_string += '=';
1863 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1864 order_string += buf;
1868 if (x == order_keys.end()) {
1872 order_string += ':';
1874 node->add_property ("order-keys", order_string);
1875 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1876 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1877 node->add_property ("soloed-by-upstream", buf);
1878 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1879 node->add_property ("soloed-by-downstream", buf);
1880 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1881 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1883 node->add_child_nocopy (_input->state (full_state));
1884 node->add_child_nocopy (_output->state (full_state));
1885 node->add_child_nocopy (_solo_control->get_state ());
1886 node->add_child_nocopy (_mute_control->get_state ());
1887 node->add_child_nocopy (_mute_master->get_state ());
1889 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1890 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1891 remote_control_node->add_property (X_("id"), buf);
1892 node->add_child_nocopy (*remote_control_node);
1894 if (_comment.length()) {
1895 XMLNode *cmt = node->add_child ("Comment");
1896 cmt->add_content (_comment);
1900 node->add_child_nocopy (_pannable->state (full_state));
1903 for (i = _processors.begin(); i != _processors.end(); ++i) {
1905 /* template save: do not include internal sends functioning as
1906 aux sends because the chance of the target ID
1907 in the session where this template is used
1910 similarly, do not save listen sends which connect to
1911 the monitor section, because these will always be
1914 boost::shared_ptr<InternalSend> is;
1916 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1917 if (is->role() == Delivery::Aux || is->role() == Delivery::Listen) {
1922 node->add_child_nocopy((*i)->state (full_state));
1926 node->add_child_copy (*_extra_xml);
1929 if (_custom_meter_position_noted) {
1930 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1932 after->id().print (buf, sizeof (buf));
1933 node->add_property (X_("processor-after-last-custom-meter"), buf);
1936 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1943 Route::set_state (const XMLNode& node, int version)
1945 if (version < 3000) {
1946 return set_state_2X (node, version);
1950 XMLNodeConstIterator niter;
1952 const XMLProperty *prop;
1954 if (node.name() != "Route"){
1955 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1959 if ((prop = node.property (X_("name"))) != 0) {
1960 Route::set_name (prop->value());
1965 if ((prop = node.property (X_("flags"))) != 0) {
1966 _flags = Flag (string_2_enum (prop->value(), _flags));
1971 if (is_master() || is_monitor() || is_hidden()) {
1972 _mute_master->set_solo_ignore (true);
1976 /* monitor bus does not get a panner, but if (re)created
1977 via XML, it will already have one by the time we
1978 call ::set_state(). so ... remove it.
1983 /* add all processors (except amp, which is always present) */
1985 nlist = node.children();
1986 XMLNode processor_state (X_("processor_state"));
1988 Stateful::save_extra_xml (node);
1990 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1994 if (child->name() == IO::state_node_name) {
1995 if ((prop = child->property (X_("direction"))) == 0) {
1999 if (prop->value() == "Input") {
2000 _input->set_state (*child, version);
2001 } else if (prop->value() == "Output") {
2002 _output->set_state (*child, version);
2006 if (child->name() == X_("Processor")) {
2007 processor_state.add_child_copy (*child);
2011 if (child->name() == X_("Pannable")) {
2013 _pannable->set_state (*child, version);
2015 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2020 if ((prop = node.property (X_("meter-point"))) != 0) {
2021 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2022 set_meter_point (mp, true);
2024 _meter->set_display_to_user (_meter_point == MeterCustom);
2028 set_processor_state (processor_state);
2030 if ((prop = node.property ("self-solo")) != 0) {
2031 set_self_solo (string_is_affirmative (prop->value()));
2034 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2035 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2036 mod_solo_by_others_upstream (atoi (prop->value()));
2039 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2040 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2041 mod_solo_by_others_downstream (atoi (prop->value()));
2044 if ((prop = node.property ("solo-isolated")) != 0) {
2045 set_solo_isolated (string_is_affirmative (prop->value()), this);
2048 if ((prop = node.property ("solo-safe")) != 0) {
2049 set_solo_safe (string_is_affirmative (prop->value()), this);
2052 if ((prop = node.property (X_("phase-invert"))) != 0) {
2053 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2056 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2057 set_denormal_protection (string_is_affirmative (prop->value()));
2060 if ((prop = node.property (X_("active"))) != 0) {
2061 bool yn = string_is_affirmative (prop->value());
2062 _active = !yn; // force switch
2063 set_active (yn, this);
2066 if ((prop = node.property (X_("order-keys"))) != 0) {
2070 string::size_type colon, equal;
2071 string remaining = prop->value();
2073 while (remaining.length()) {
2075 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2076 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2079 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2080 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2083 set_order_key (remaining.substr (0, equal), n);
2087 colon = remaining.find_first_of (':');
2089 if (colon != string::npos) {
2090 remaining = remaining.substr (colon+1);
2097 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2098 PBD::ID id (prop->value ());
2099 Glib::RWLock::ReaderLock lm (_processor_lock);
2100 ProcessorList::const_iterator i = _processors.begin ();
2101 while (i != _processors.end() && (*i)->id() != id) {
2105 if (i != _processors.end ()) {
2106 _processor_after_last_custom_meter = *i;
2107 _custom_meter_position_noted = true;
2111 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2112 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2115 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2118 if (child->name() == X_("Comment")) {
2120 /* XXX this is a terrible API design in libxml++ */
2122 XMLNode *cmt = *(child->children().begin());
2123 _comment = cmt->content();
2125 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2126 if (prop->value() == "solo") {
2127 _solo_control->set_state (*child, version);
2130 } else if (child->name() == X_("RemoteControl")) {
2131 if ((prop = child->property (X_("id"))) != 0) {
2133 sscanf (prop->value().c_str(), "%d", &x);
2134 set_remote_control_id (x);
2137 } else if (child->name() == X_("MuteMaster")) {
2138 _mute_master->set_state (*child, version);
2146 Route::set_state_2X (const XMLNode& node, int version)
2149 XMLNodeConstIterator niter;
2151 const XMLProperty *prop;
2153 /* 2X things which still remain to be handled:
2159 if (node.name() != "Route") {
2160 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2164 if ((prop = node.property (X_("flags"))) != 0) {
2165 _flags = Flag (string_2_enum (prop->value(), _flags));
2170 if ((prop = node.property (X_("phase-invert"))) != 0) {
2171 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2172 if (string_is_affirmative (prop->value ())) {
2175 set_phase_invert (p);
2178 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2179 set_denormal_protection (string_is_affirmative (prop->value()));
2182 if ((prop = node.property (X_("soloed"))) != 0) {
2183 bool yn = string_is_affirmative (prop->value());
2185 /* XXX force reset of solo status */
2187 set_solo (yn, this);
2190 if ((prop = node.property (X_("muted"))) != 0) {
2193 bool muted = string_is_affirmative (prop->value());
2199 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2201 if (string_is_affirmative (prop->value())){
2202 mute_point = mute_point + "PreFader";
2207 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2209 if (string_is_affirmative (prop->value())){
2212 mute_point = mute_point + ",";
2215 mute_point = mute_point + "PostFader";
2220 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2222 if (string_is_affirmative (prop->value())){
2225 mute_point = mute_point + ",";
2228 mute_point = mute_point + "Listen";
2233 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2235 if (string_is_affirmative (prop->value())){
2238 mute_point = mute_point + ",";
2241 mute_point = mute_point + "Main";
2245 _mute_master->set_mute_points (mute_point);
2246 _mute_master->set_muted_by_self (true);
2250 if ((prop = node.property (X_("meter-point"))) != 0) {
2251 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2254 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2255 don't mean the same thing.
2258 if ((prop = node.property (X_("order-keys"))) != 0) {
2262 string::size_type colon, equal;
2263 string remaining = prop->value();
2265 while (remaining.length()) {
2267 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2268 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2271 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2272 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2275 set_order_key (remaining.substr (0, equal), n);
2279 colon = remaining.find_first_of (':');
2281 if (colon != string::npos) {
2282 remaining = remaining.substr (colon+1);
2291 nlist = node.children ();
2292 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2296 if (child->name() == IO::state_node_name) {
2298 /* there is a note in IO::set_state_2X() about why we have to call
2302 _input->set_state_2X (*child, version, true);
2303 _output->set_state_2X (*child, version, false);
2305 if ((prop = child->property (X_("name"))) != 0) {
2306 Route::set_name (prop->value ());
2311 if ((prop = child->property (X_("active"))) != 0) {
2312 bool yn = string_is_affirmative (prop->value());
2313 _active = !yn; // force switch
2314 set_active (yn, this);
2317 if ((prop = child->property (X_("gain"))) != 0) {
2320 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2321 _amp->gain_control()->set_value (val);
2325 /* Set up Panners in the IO */
2326 XMLNodeList io_nlist = child->children ();
2328 XMLNodeConstIterator io_niter;
2331 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2333 io_child = *io_niter;
2335 if (io_child->name() == X_("Panner")) {
2336 _main_outs->panner_shell()->set_state(*io_child, version);
2337 } else if (io_child->name() == X_("Automation")) {
2338 /* IO's automation is for the fader */
2339 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2345 XMLNodeList redirect_nodes;
2347 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2351 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2352 redirect_nodes.push_back(child);
2357 set_processor_state_2X (redirect_nodes, version);
2359 Stateful::save_extra_xml (node);
2361 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2364 if (child->name() == X_("Comment")) {
2366 /* XXX this is a terrible API design in libxml++ */
2368 XMLNode *cmt = *(child->children().begin());
2369 _comment = cmt->content();
2371 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2372 if (prop->value() == X_("solo")) {
2373 _solo_control->set_state (*child, version);
2374 } else if (prop->value() == X_("mute")) {
2375 _mute_control->set_state (*child, version);
2378 } else if (child->name() == X_("RemoteControl")) {
2379 if ((prop = child->property (X_("id"))) != 0) {
2381 sscanf (prop->value().c_str(), "%d", &x);
2382 set_remote_control_id (x);
2392 Route::get_processor_state ()
2394 XMLNode* root = new XMLNode (X_("redirects"));
2395 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2396 root->add_child_nocopy ((*i)->state (true));
2403 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2405 /* We don't bother removing existing processors not in nList, as this
2406 method will only be called when creating a Route from scratch, not
2407 for undo purposes. Just put processors in at the appropriate place
2411 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2412 add_processor_from_xml_2X (**i, version);
2417 Route::set_processor_state (const XMLNode& node)
2419 const XMLNodeList &nlist = node.children();
2420 XMLNodeConstIterator niter;
2421 ProcessorList new_order;
2422 bool must_configure = false;
2424 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2426 XMLProperty* prop = (*niter)->property ("type");
2428 if (prop->value() == "amp") {
2429 _amp->set_state (**niter, Stateful::current_state_version);
2430 new_order.push_back (_amp);
2431 } else if (prop->value() == "meter") {
2432 _meter->set_state (**niter, Stateful::current_state_version);
2433 new_order.push_back (_meter);
2434 } else if (prop->value() == "main-outs") {
2435 _main_outs->set_state (**niter, Stateful::current_state_version);
2436 } else if (prop->value() == "intreturn") {
2438 _intreturn.reset (new InternalReturn (_session));
2439 must_configure = true;
2441 _intreturn->set_state (**niter, Stateful::current_state_version);
2442 } else if (is_monitor() && prop->value() == "monitor") {
2443 if (!_monitor_control) {
2444 _monitor_control.reset (new MonitorProcessor (_session));
2445 must_configure = true;
2447 _monitor_control->set_state (**niter, Stateful::current_state_version);
2448 } else if (prop->value() == "capture") {
2449 _capturing_processor.reset (new CapturingProcessor (_session));
2451 ProcessorList::iterator o;
2453 for (o = _processors.begin(); o != _processors.end(); ++o) {
2454 XMLProperty* id_prop = (*niter)->property(X_("id"));
2455 if (id_prop && (*o)->id() == id_prop->value()) {
2456 (*o)->set_state (**niter, Stateful::current_state_version);
2457 new_order.push_back (*o);
2462 // If the processor (*niter) is not on the route then create it
2464 if (o == _processors.end()) {
2466 boost::shared_ptr<Processor> processor;
2468 if (prop->value() == "intsend") {
2470 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2472 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2473 prop->value() == "lv2" ||
2474 prop->value() == "vst" ||
2475 prop->value() == "lxvst" ||
2476 prop->value() == "audiounit") {
2478 processor.reset (new PluginInsert(_session));
2480 } else if (prop->value() == "port") {
2482 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2484 } else if (prop->value() == "send") {
2486 processor.reset (new Send (_session, _pannable, _mute_master));
2489 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2493 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2494 /* This processor could not be configured. Turn it into a UnknownProcessor */
2495 processor.reset (new UnknownProcessor (_session, **niter));
2498 /* we have to note the monitor send here, otherwise a new one will be created
2499 and the state of this one will be lost.
2501 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2502 if (isend && isend->role() == Delivery::Listen) {
2503 _monitor_send = isend;
2506 /* it doesn't matter if invisible processors are added here, as they
2507 will be sorted out by setup_invisible_processors () shortly.
2510 new_order.push_back (processor);
2511 must_configure = true;
2517 Glib::RWLock::WriterLock lm (_processor_lock);
2518 _processors = new_order;
2520 if (must_configure) {
2521 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2522 configure_processors_unlocked (0);
2525 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2527 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2529 boost::shared_ptr<PluginInsert> pi;
2531 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2532 if (pi->has_no_inputs ()) {
2533 _have_internal_generator = true;
2540 processors_changed (RouteProcessorChange ());
2541 set_processor_positions ();
2545 Route::curve_reallocate ()
2547 // _gain_automation_curve.finish_resize ();
2548 // _pan_automation_curve.finish_resize ();
2552 Route::silence (framecnt_t nframes)
2554 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2559 silence_unlocked (nframes);
2563 Route::silence_unlocked (framecnt_t nframes)
2565 /* Must be called with the processor lock held */
2569 _output->silence (nframes);
2571 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2572 boost::shared_ptr<PluginInsert> pi;
2574 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2575 // skip plugins, they don't need anything when we're not active
2579 (*i)->silence (nframes);
2582 if (nframes == _session.get_block_size()) {
2589 Route::add_internal_return ()
2592 _intreturn.reset (new InternalReturn (_session));
2593 add_processor (_intreturn, PreFader);
2598 Route::add_send_to_internal_return (InternalSend* send)
2600 Glib::RWLock::ReaderLock rm (_processor_lock);
2602 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2603 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2606 return d->add_send (send);
2612 Route::remove_send_from_internal_return (InternalSend* send)
2614 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
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->remove_send (send);
2627 Route::enable_monitor_send ()
2629 /* Caller must hold process lock */
2630 assert (!AudioEngine::instance()->process_lock().trylock());
2632 /* master never sends to monitor section via the normal mechanism */
2633 assert (!is_master ());
2635 /* make sure we have one */
2636 if (!_monitor_send) {
2637 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2638 _monitor_send->set_display_to_user (false);
2642 configure_processors (0);
2645 /** Add an aux send to a route.
2646 * @param route route to send to.
2647 * @param before Processor to insert before, or 0 to insert at the end.
2650 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2652 assert (route != _session.monitor_out ());
2655 Glib::RWLock::ReaderLock rm (_processor_lock);
2657 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2659 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2661 if (d && d->target_route() == route) {
2662 /* already listening via the specified IO: do nothing */
2670 boost::shared_ptr<InternalSend> listener;
2673 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2674 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2677 add_processor (listener, before);
2679 } catch (failed_constructor& err) {
2687 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2689 ProcessorStreams err;
2690 ProcessorList::iterator tmp;
2693 Glib::RWLock::ReaderLock rl(_processor_lock);
2695 /* have to do this early because otherwise processor reconfig
2696 * will put _monitor_send back in the list
2699 if (route == _session.monitor_out()) {
2700 _monitor_send.reset ();
2704 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2706 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2708 if (d && d->target_route() == route) {
2710 remove_processor (*x, &err, false);
2713 /* list could have been demolished while we dropped the lock
2724 Route::set_comment (string cmt, void *src)
2727 comment_changed (src);
2728 _session.set_dirty ();
2732 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2734 FeedRecord fr (other, via_sends_only);
2736 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2738 if (!result.second) {
2740 /* already a record for "other" - make sure sends-only information is correct */
2741 if (!via_sends_only && result.first->sends_only) {
2742 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2743 frp->sends_only = false;
2747 return result.second;
2751 Route::clear_fed_by ()
2757 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2759 const FedBy& fed_by (other->fed_by());
2761 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2762 boost::shared_ptr<Route> sr = f->r.lock();
2764 if (sr && (sr.get() == this)) {
2766 if (via_sends_only) {
2767 *via_sends_only = f->sends_only;
2778 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2780 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2782 if (_output->connected_to (other->input())) {
2783 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2784 if (via_send_only) {
2785 *via_send_only = false;
2792 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2794 boost::shared_ptr<IOProcessor> iop;
2796 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2797 if (iop->feeds (other)) {
2798 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2799 if (via_send_only) {
2800 *via_send_only = true;
2804 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2807 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2812 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2817 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2819 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2822 /** Called from the (non-realtime) butler thread when the transport is stopped */
2824 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2826 framepos_t now = _session.transport_frame();
2829 Glib::RWLock::ReaderLock lm (_processor_lock);
2832 automation_snapshot (now, true);
2835 Automatable::transport_stopped (now);
2837 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2839 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2843 (*i)->transport_stopped (now);
2847 _roll_delay = _initial_delay;
2851 Route::input_change_handler (IOChange change, void * /*src*/)
2853 bool need_to_queue_solo_change = true;
2855 if ((change.type & IOChange::ConfigurationChanged)) {
2856 /* This is called with the process lock held if change
2857 contains ConfigurationChanged
2859 need_to_queue_solo_change = false;
2860 configure_processors (0);
2861 _phase_invert.resize (_input->n_ports().n_audio ());
2862 io_changed (); /* EMIT SIGNAL */
2865 if (!_input->connected() && _soloed_by_others_upstream) {
2866 if (need_to_queue_solo_change) {
2867 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2869 cancel_solo_after_disconnect (true);
2875 Route::output_change_handler (IOChange change, void * /*src*/)
2877 bool need_to_queue_solo_change = true;
2879 if ((change.type & IOChange::ConfigurationChanged)) {
2880 /* This is called with the process lock held if change
2881 contains ConfigurationChanged
2883 need_to_queue_solo_change = false;
2886 if (!_output->connected() && _soloed_by_others_downstream) {
2887 if (need_to_queue_solo_change) {
2888 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2890 cancel_solo_after_disconnect (false);
2896 Route::cancel_solo_after_disconnect (bool upstream)
2899 _soloed_by_others_upstream = 0;
2901 _soloed_by_others_downstream = 0;
2903 set_mute_master_solo ();
2904 solo_changed (false, this);
2908 Route::pans_required () const
2910 if (n_outputs().n_audio() < 2) {
2914 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2918 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2920 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2925 if (n_outputs().n_total() == 0) {
2929 if (!_active || n_inputs() == ChanCount::ZERO) {
2930 silence_unlocked (nframes);
2933 if (session_state_changing) {
2934 if (_session.transport_speed() != 0.0f) {
2935 /* we're rolling but some state is changing (e.g. our diskstream contents)
2936 so we cannot use them. Be silent till this is over.
2938 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2940 silence_unlocked (nframes);
2943 /* we're really not rolling, so we're either delivery silence or actually
2944 monitoring, both of which are safe to do while session_state_changing is true.
2948 _amp->apply_gain_automation (false);
2949 passthru (start_frame, end_frame, nframes, 0);
2955 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
2957 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2962 automation_snapshot (_session.transport_frame(), false);
2964 if (n_outputs().n_total() == 0) {
2968 if (!_active || n_inputs().n_total() == 0) {
2969 silence_unlocked (nframes);
2973 framecnt_t unused = 0;
2975 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2981 passthru (start_frame, end_frame, nframes, declick);
2987 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
2994 Route::has_external_redirects () const
2996 // FIXME: what about sends? - they don't return a signal back to ardour?
2998 boost::shared_ptr<const PortInsert> pi;
3000 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3002 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
3004 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
3006 string port_name = port->name();
3007 string client_name = port_name.substr (0, port_name.find(':'));
3009 /* only say "yes" if the redirect is actually in use */
3011 if (client_name != "ardour" && pi->active()) {
3022 Route::flush_processors ()
3024 /* XXX shouldn't really try to take this lock, since
3025 this is called from the RT audio thread.
3028 Glib::RWLock::ReaderLock lm (_processor_lock);
3030 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3036 Route::set_meter_point (MeterPoint p, bool force)
3038 /* CAN BE CALLED FROM PROCESS CONTEXT */
3040 if (_meter_point == p && !force) {
3044 bool meter_was_visible_to_user = _meter->display_to_user ();
3047 Glib::RWLock::WriterLock lm (_processor_lock);
3049 maybe_note_meter_position ();
3053 if (_meter_point != MeterCustom) {
3055 _meter->set_display_to_user (false);
3057 setup_invisible_processors ();
3061 _meter->set_display_to_user (true);
3063 /* If we have a previous position for the custom meter, try to put it there */
3064 if (_custom_meter_position_noted) {
3065 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3068 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3069 if (i != _processors.end ()) {
3070 _processors.remove (_meter);
3071 _processors.insert (i, _meter);
3073 } else if (_last_custom_meter_was_at_end) {
3074 _processors.remove (_meter);
3075 _processors.push_back (_meter);
3080 /* Set up the meter for its new position */
3082 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3086 if (loc == _processors.begin()) {
3087 m_in = _input->n_ports();
3089 ProcessorList::iterator before = loc;
3091 m_in = (*before)->output_streams ();
3094 _meter->reflect_inputs (m_in);
3096 /* we do not need to reconfigure the processors, because the meter
3097 (a) is always ready to handle processor_max_streams
3098 (b) is always an N-in/N-out processor, and thus moving
3099 it doesn't require any changes to the other processors.
3103 meter_change (); /* EMIT SIGNAL */
3105 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3107 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3111 Route::listen_position_changed ()
3114 Glib::RWLock::WriterLock lm (_processor_lock);
3115 ProcessorState pstate (this);
3118 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3120 if (configure_processors_unlocked (0)) {
3122 configure_processors_unlocked (0); // it worked before we tried to add it ...
3128 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3129 _session.set_dirty ();
3132 boost::shared_ptr<CapturingProcessor>
3133 Route::add_export_point()
3135 if (!_capturing_processor) {
3137 _capturing_processor.reset (new CapturingProcessor (_session));
3138 _capturing_processor->activate ();
3141 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3142 configure_processors (0);
3147 return _capturing_processor;
3151 Route::update_signal_latency ()
3153 framecnt_t l = _output->user_latency();
3155 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3156 if ((*i)->active ()) {
3157 l += (*i)->signal_latency ();
3161 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3163 if (_signal_latency != l) {
3164 _signal_latency = l;
3165 signal_latency_changed (); /* EMIT SIGNAL */
3168 return _signal_latency;
3172 Route::set_user_latency (framecnt_t nframes)
3174 _output->set_user_latency (nframes);
3175 _session.update_latency_compensation ();
3179 Route::set_latency_compensation (framecnt_t longest_session_latency)
3181 framecnt_t old = _initial_delay;
3183 if (_signal_latency < longest_session_latency) {
3184 _initial_delay = longest_session_latency - _signal_latency;
3189 DEBUG_TRACE (DEBUG::Latency, string_compose (
3190 "%1: compensate for maximum latency of %2,"
3191 "given own latency of %3, using initial delay of %4\n",
3192 name(), longest_session_latency, _signal_latency, _initial_delay));
3194 if (_initial_delay != old) {
3195 initial_delay_changed (); /* EMIT SIGNAL */
3198 if (_session.transport_stopped()) {
3199 _roll_delay = _initial_delay;
3204 Route::automation_snapshot (framepos_t now, bool force)
3207 _pannable->automation_snapshot (now, force);
3210 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3211 (*i)->automation_snapshot (now, force);
3215 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3216 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3217 boost::shared_ptr<AutomationList>(), name)
3220 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3225 Route::SoloControllable::set_value (double val)
3227 bool bval = ((val >= 0.5f) ? true: false);
3229 boost::shared_ptr<RouteList> rl (new RouteList);
3231 boost::shared_ptr<Route> r = _route.lock ();
3238 if (Config->get_solo_control_is_listen_control()) {
3239 _session.set_listen (rl, bval);
3241 _session.set_solo (rl, bval);
3246 Route::SoloControllable::get_value () const
3248 boost::shared_ptr<Route> r = _route.lock ();
3253 if (Config->get_solo_control_is_listen_control()) {
3254 return r->listening_via_monitor() ? 1.0f : 0.0f;
3256 return r->self_soloed() ? 1.0f : 0.0f;
3260 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3261 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3262 boost::shared_ptr<AutomationList>(), name)
3265 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3270 Route::MuteControllable::set_value (double val)
3272 bool bval = ((val >= 0.5f) ? true: false);
3274 boost::shared_ptr<RouteList> rl (new RouteList);
3276 boost::shared_ptr<Route> r = _route.lock ();
3282 _session.set_mute (rl, bval);
3286 Route::MuteControllable::get_value () const
3288 boost::shared_ptr<Route> r = _route.lock ();
3293 return r->muted() ? 1.0f : 0.0f;
3297 Route::set_block_size (pframes_t nframes)
3299 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3300 (*i)->set_block_size (nframes);
3303 _session.ensure_buffers (n_process_buffers ());
3307 Route::protect_automation ()
3309 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3310 (*i)->protect_automation();
3314 Route::set_pending_declick (int declick)
3317 /* this call is not allowed to turn off a pending declick unless "force" is true */
3319 _pending_declick = declick;
3321 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3323 _pending_declick = 0;
3328 /** Shift automation forwards from a particular place, thereby inserting time.
3329 * Adds undo commands for any shifts that are performed.
3331 * @param pos Position to start shifting from.
3332 * @param frames Amount to shift forwards by.
3336 Route::shift (framepos_t pos, framecnt_t frames)
3338 /* gain automation */
3340 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3342 XMLNode &before = gc->alist()->get_state ();
3343 gc->alist()->shift (pos, frames);
3344 XMLNode &after = gc->alist()->get_state ();
3345 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3348 /* pan automation */
3350 ControlSet::Controls& c (_pannable->controls());
3352 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3353 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3355 boost::shared_ptr<AutomationList> al = pc->alist();
3356 XMLNode& before = al->get_state ();
3357 al->shift (pos, frames);
3358 XMLNode& after = al->get_state ();
3359 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3364 /* redirect automation */
3366 Glib::RWLock::ReaderLock lm (_processor_lock);
3367 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3369 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3371 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3372 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3374 boost::shared_ptr<AutomationList> al = ac->alist();
3375 XMLNode &before = al->get_state ();
3376 al->shift (pos, frames);
3377 XMLNode &after = al->get_state ();
3378 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3387 Route::save_as_template (const string& path, const string& name)
3389 XMLNode& node (state (false));
3392 IO::set_name_in_state (*node.children().front(), name);
3394 tree.set_root (&node);
3395 return tree.write (path.c_str());
3400 Route::set_name (const string& str)
3406 name = Route::ensure_track_or_route_name (str, _session);
3407 SessionObject::set_name (name);
3409 ret = (_input->set_name(name) && _output->set_name(name));
3412 /* rename the main outs. Leave other IO processors
3413 * with whatever name they already have, because its
3414 * just fine as it is (it will not contain the route
3415 * name if its a port insert, port send or port return).
3419 if (_main_outs->set_name (name)) {
3420 /* XXX returning false here is stupid because
3421 we already changed the route name.
3431 /** Set the name of a route in an XML description.
3432 * @param node XML <Route> node to set the name in.
3433 * @param name New name.
3436 Route::set_name_in_state (XMLNode& node, string const & name)
3438 node.add_property (X_("name"), name);
3440 XMLNodeList children = node.children();
3441 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3443 if ((*i)->name() == X_("IO")) {
3445 IO::set_name_in_state (**i, name);
3447 } else if ((*i)->name() == X_("Processor")) {
3449 XMLProperty* role = (*i)->property (X_("role"));
3450 if (role && role->value() == X_("Main")) {
3451 (*i)->add_property (X_("name"), name);
3454 } else if ((*i)->name() == X_("Diskstream")) {
3456 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3457 (*i)->add_property (X_("name"), name);
3463 boost::shared_ptr<Send>
3464 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3466 Glib::RWLock::ReaderLock lm (_processor_lock);
3468 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3469 boost::shared_ptr<InternalSend> send;
3471 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3472 if (send->target_route() == target) {
3478 return boost::shared_ptr<Send>();
3481 /** @param c Audio channel index.
3482 * @param yn true to invert phase, otherwise false.
3485 Route::set_phase_invert (uint32_t c, bool yn)
3487 if (_phase_invert[c] != yn) {
3488 _phase_invert[c] = yn;
3489 phase_invert_changed (); /* EMIT SIGNAL */
3490 _session.set_dirty ();
3495 Route::set_phase_invert (boost::dynamic_bitset<> p)
3497 if (_phase_invert != p) {
3499 phase_invert_changed (); /* EMIT SIGNAL */
3500 _session.set_dirty ();
3505 Route::phase_invert (uint32_t c) const
3507 return _phase_invert[c];
3510 boost::dynamic_bitset<>
3511 Route::phase_invert () const
3513 return _phase_invert;
3517 Route::set_denormal_protection (bool yn)
3519 if (_denormal_protection != yn) {
3520 _denormal_protection = yn;
3521 denormal_protection_changed (); /* EMIT SIGNAL */
3526 Route::denormal_protection () const
3528 return _denormal_protection;
3532 Route::set_active (bool yn, void* src)
3534 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3535 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3539 if (_active != yn) {
3541 _input->set_active (yn);
3542 _output->set_active (yn);
3543 active_changed (); // EMIT SIGNAL
3550 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3556 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3558 boost::shared_ptr<Send> s;
3559 boost::shared_ptr<Return> r;
3561 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3562 s->meter()->meter();
3563 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3564 r->meter()->meter ();
3569 boost::shared_ptr<Pannable>
3570 Route::pannable() const
3575 boost::shared_ptr<Panner>
3576 Route::panner() const
3579 return _main_outs->panner_shell()->panner();
3582 boost::shared_ptr<PannerShell>
3583 Route::panner_shell() const
3585 return _main_outs->panner_shell();
3588 boost::shared_ptr<AutomationControl>
3589 Route::gain_control() const
3591 return _amp->gain_control();
3594 boost::shared_ptr<AutomationControl>
3595 Route::get_control (const Evoral::Parameter& param)
3597 /* either we own the control or .... */
3599 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3603 /* maybe one of our processors does or ... */
3605 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3606 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3607 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3615 /* nobody does so we'll make a new one */
3617 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3624 boost::shared_ptr<Processor>
3625 Route::nth_plugin (uint32_t n)
3627 Glib::RWLock::ReaderLock lm (_processor_lock);
3628 ProcessorList::iterator i;
3630 for (i = _processors.begin(); i != _processors.end(); ++i) {
3631 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3638 return boost::shared_ptr<Processor> ();
3641 boost::shared_ptr<Processor>
3642 Route::nth_send (uint32_t n)
3644 Glib::RWLock::ReaderLock lm (_processor_lock);
3645 ProcessorList::iterator i;
3647 for (i = _processors.begin(); i != _processors.end(); ++i) {
3648 if (boost::dynamic_pointer_cast<Send> (*i)) {
3655 return boost::shared_ptr<Processor> ();
3659 Route::has_io_processor_named (const string& name)
3661 Glib::RWLock::ReaderLock lm (_processor_lock);
3662 ProcessorList::iterator i;
3664 for (i = _processors.begin(); i != _processors.end(); ++i) {
3665 if (boost::dynamic_pointer_cast<Send> (*i) ||
3666 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3667 if ((*i)->name() == name) {
3676 MuteMaster::MutePoint
3677 Route::mute_points () const
3679 return _mute_master->mute_points ();
3683 Route::set_processor_positions ()
3685 Glib::RWLock::ReaderLock lm (_processor_lock);
3687 bool had_amp = false;
3688 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3689 (*i)->set_pre_fader (!had_amp);
3690 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3696 /** Called when there is a proposed change to the input port count */
3698 Route::input_port_count_changing (ChanCount to)
3700 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3702 /* The processors cannot be configured with the new input arrangement, so
3708 /* The change is ok */
3713 Route::unknown_processors () const
3717 Glib::RWLock::ReaderLock lm (_processor_lock);
3718 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3719 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3720 p.push_back ((*i)->name ());
3729 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3731 /* we assume that all our input ports feed all our output ports. its not
3732 universally true, but the alternative is way too corner-case to worry about.
3735 jack_latency_range_t all_connections;
3738 all_connections.min = 0;
3739 all_connections.max = 0;
3741 all_connections.min = ~((jack_nframes_t) 0);
3742 all_connections.max = 0;
3744 /* iterate over all "from" ports and determine the latency range for all of their
3745 connections to the "outside" (outside of this Route).
3748 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3750 jack_latency_range_t range;
3752 p->get_connected_latency_range (range, playback);
3754 all_connections.min = min (all_connections.min, range.min);
3755 all_connections.max = max (all_connections.max, range.max);
3759 /* set the "from" port latencies to the max/min range of all their connections */
3761 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3762 p->set_private_latency_range (all_connections, playback);
3765 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3767 all_connections.min += our_latency;
3768 all_connections.max += our_latency;
3770 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3771 p->set_private_latency_range (all_connections, playback);
3774 return all_connections.max;
3778 Route::set_private_port_latencies (bool playback) const
3780 framecnt_t own_latency = 0;
3782 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3783 OR LATENCY CALLBACK.
3785 This is called (early) from the latency callback. It computes the REAL
3786 latency associated with each port and stores the result as the "private"
3787 latency of the port. A later call to Route::set_public_port_latencies()
3788 sets all ports to the same value to reflect the fact that we do latency
3789 compensation and so all signals are delayed by the same amount as they
3790 flow through ardour.
3793 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3794 if ((*i)->active ()) {
3795 own_latency += (*i)->signal_latency ();
3800 /* playback: propagate latency from "outside the route" to outputs to inputs */
3801 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3803 /* capture: propagate latency from "outside the route" to inputs to outputs */
3804 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3809 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3811 /* this is called to set the JACK-visible port latencies, which take
3812 latency compensation into account.
3815 jack_latency_range_t range;
3821 const PortSet& ports (_input->ports());
3822 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3823 p->set_public_latency_range (range, playback);
3828 const PortSet& ports (_output->ports());
3829 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3830 p->set_public_latency_range (range, playback);
3835 /** Put the invisible processors in the right place in _processors.
3836 * Must be called with a writer lock on _processor_lock held.
3839 Route::setup_invisible_processors ()
3842 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3843 assert (!lm.locked ());
3847 /* too early to be doing this stuff */
3851 /* we'll build this new list here and then use it */
3853 ProcessorList new_processors;
3855 /* find visible processors */
3857 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3858 if ((*i)->display_to_user ()) {
3859 new_processors.push_back (*i);
3865 ProcessorList::iterator amp = new_processors.begin ();
3866 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3870 assert (amp != _processors.end ());
3872 /* and the processor after the amp */
3874 ProcessorList::iterator after_amp = amp;
3880 switch (_meter_point) {
3882 assert (!_meter->display_to_user ());
3883 new_processors.push_front (_meter);
3886 assert (!_meter->display_to_user ());
3887 new_processors.insert (amp, _meter);
3889 case MeterPostFader:
3890 /* do nothing here */
3893 /* do nothing here */
3896 /* the meter is visible, so we don't touch it here */
3903 assert (_main_outs);
3904 assert (!_main_outs->display_to_user ());
3905 new_processors.push_back (_main_outs);
3907 /* iterator for the main outs */
3909 ProcessorList::iterator main = new_processors.end();
3912 /* OUTPUT METERING */
3914 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3915 assert (!_meter->display_to_user ());
3917 /* add the processor just before or just after the main outs */
3919 ProcessorList::iterator meter_point = main;
3921 if (_meter_point == MeterOutput) {
3924 new_processors.insert (meter_point, _meter);
3929 if (_monitor_send && !is_monitor ()) {
3930 assert (!_monitor_send->display_to_user ());
3931 if (Config->get_solo_control_is_listen_control()) {
3932 switch (Config->get_listen_position ()) {
3933 case PreFaderListen:
3934 switch (Config->get_pfl_position ()) {
3935 case PFLFromBeforeProcessors:
3936 new_processors.push_front (_monitor_send);
3938 case PFLFromAfterProcessors:
3939 new_processors.insert (amp, _monitor_send);
3942 _monitor_send->set_can_pan (false);
3944 case AfterFaderListen:
3945 switch (Config->get_afl_position ()) {
3946 case AFLFromBeforeProcessors:
3947 new_processors.insert (after_amp, _monitor_send);
3949 case AFLFromAfterProcessors:
3950 new_processors.insert (new_processors.end(), _monitor_send);
3953 _monitor_send->set_can_pan (true);
3957 new_processors.insert (new_processors.end(), _monitor_send);
3958 _monitor_send->set_can_pan (false);
3962 /* MONITOR CONTROL */
3964 if (_monitor_control && is_monitor ()) {
3965 assert (!_monitor_control->display_to_user ());
3966 new_processors.push_front (_monitor_control);
3969 /* INTERNAL RETURN */
3971 /* doing this here means that any monitor control will come just after
3976 assert (!_intreturn->display_to_user ());
3977 new_processors.push_front (_intreturn);
3980 /* EXPORT PROCESSOR */
3982 if (_capturing_processor) {
3983 assert (!_capturing_processor->display_to_user ());
3984 new_processors.push_front (_capturing_processor);
3987 _processors = new_processors;
3989 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3990 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3991 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3998 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3999 Glib::RWLock::ReaderLock lp (_processor_lock);
4003 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4004 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4011 /** If the meter point is `Custom', make a note of where the meter is.
4012 * This is so that if the meter point is subsequently set to something else,
4013 * and then back to custom, we can put the meter back where it was last time
4014 * custom was enabled.
4016 * Must be called with the _processor_lock held.
4019 Route::maybe_note_meter_position ()
4021 if (_meter_point != MeterCustom) {
4025 _custom_meter_position_noted = true;
4026 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4027 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4028 ProcessorList::iterator j = i;
4030 if (j != _processors.end ()) {
4031 _processor_after_last_custom_meter = *j;
4032 _last_custom_meter_was_at_end = false;
4034 _last_custom_meter_was_at_end = true;
4040 boost::shared_ptr<Processor>
4041 Route::processor_by_id (PBD::ID id) const
4043 Glib::RWLock::ReaderLock lm (_processor_lock);
4044 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4045 if ((*i)->id() == id) {
4050 return boost::shared_ptr<Processor> ();
4053 /** @return the monitoring state, or in other words what data we are pushing
4054 * into the route (data from the inputs, data from disk or silence)
4057 Route::monitoring_state () const
4059 return MonitoringInput;
4062 /** @return what we should be metering; either the data coming from the input
4063 * IO or the data that is flowing through the route.
4066 Route::metering_state () const
4068 return MeteringRoute;