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.
25 #include "pbd/xml++.h"
26 #include "pbd/enumwriter.h"
27 #include "pbd/memento_command.h"
28 #include "pbd/stacktrace.h"
29 #include "pbd/convert.h"
31 #include "evoral/Curve.hpp"
33 #include "ardour/amp.h"
34 #include "ardour/audio_port.h"
35 #include "ardour/audioengine.h"
36 #include "ardour/buffer.h"
37 #include "ardour/buffer_set.h"
38 #include "ardour/configuration.h"
39 #include "ardour/cycle_timer.h"
40 #include "ardour/debug.h"
41 #include "ardour/delivery.h"
42 #include "ardour/dB.h"
43 #include "ardour/internal_send.h"
44 #include "ardour/internal_return.h"
45 #include "ardour/ladspa_plugin.h"
46 #include "ardour/meter.h"
47 #include "ardour/mix.h"
48 #include "ardour/monitor_processor.h"
49 #include "ardour/panner.h"
50 #include "ardour/plugin_insert.h"
51 #include "ardour/port.h"
52 #include "ardour/port_insert.h"
53 #include "ardour/processor.h"
54 #include "ardour/profile.h"
55 #include "ardour/route.h"
56 #include "ardour/route_group.h"
57 #include "ardour/send.h"
58 #include "ardour/session.h"
59 #include "ardour/timestamps.h"
60 #include "ardour/utils.h"
65 using namespace ARDOUR;
68 uint32_t Route::order_key_cnt = 0;
69 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
70 PBD::Signal0<void> Route::RemoteControlIDChange;
72 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
73 : SessionObject (sess, name)
74 , AutomatableControls (sess)
79 , _pending_declick (true)
80 , _meter_point (MeterPostFader)
83 , _soloed_by_others_upstream (0)
84 , _soloed_by_others_downstream (0)
86 , _denormal_protection (false)
89 , _declickable (false)
90 , _solo_control (new SoloControllable (X_("solo"), *this))
91 , _mute_control (new MuteControllable (X_("mute"), *this))
92 , _mute_master (new MuteMaster (sess, name))
93 , _have_internal_generator (false)
95 , _default_type (default_type)
96 , _remote_control_id (0)
97 , _in_configure_processors (false)
99 processor_max_streams.reset();
100 order_keys[N_("signal")] = order_key_cnt++;
106 /* add standard controls */
108 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
109 _mute_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
111 add_control (_solo_control);
112 add_control (_mute_control);
114 /* input and output objects */
116 _input.reset (new IO (_session, _name, IO::Input, _default_type));
117 _output.reset (new IO (_session, _name, IO::Output, _default_type));
119 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
120 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
122 /* add amp processor */
124 _amp.reset (new Amp (_session));
125 add_processor (_amp, PostFader);
127 /* add standard processors: meter, main outs, monitor out */
129 _meter.reset (new PeakMeter (_session));
130 _meter->set_display_to_user (false);
132 add_processor (_meter, PostFader);
134 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
136 add_processor (_main_outs, PostFader);
139 /* where we listen to tracks */
140 _intreturn.reset (new InternalReturn (_session));
141 add_processor (_intreturn, PreFader);
143 ProcessorList::iterator i;
145 for (i = _processors.begin(); i != _processors.end(); ++i) {
146 if (*i == _intreturn) {
152 /* the thing that provides proper control over a control/monitor/listen bus
153 (such as per-channel cut, dim, solo, invert, etc).
154 It always goes right after the internal return;
156 _monitor_control.reset (new MonitorProcessor (_session));
157 add_processor (_monitor_control, i);
159 /* no panning on the monitor main outs */
161 _main_outs->panner()->set_bypassed (true);
164 if (is_master() || is_monitor() || is_hidden()) {
165 _mute_master->set_solo_ignore (true);
168 /* now that we have _meter, its safe to connect to this */
170 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
177 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
179 /* do this early so that we don't get incoming signals as we are going through destruction
184 /* don't use clear_processors here, as it depends on the session which may
185 be half-destroyed by now
188 Glib::RWLock::WriterLock lm (_processor_lock);
189 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
190 (*i)->drop_references ();
193 _processors.clear ();
197 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
199 if (id != _remote_control_id) {
200 _remote_control_id = id;
201 RemoteControlIDChanged ();
202 if (notify_class_listeners) {
203 RemoteControlIDChange ();
209 Route::remote_control_id() const
211 return _remote_control_id;
215 Route::order_key (std::string const & name) const
217 OrderKeys::const_iterator i = order_keys.find (name);
218 if (i == order_keys.end()) {
226 Route::set_order_key (std::string const & name, long n)
228 order_keys[name] = n;
230 if (Config->get_sync_all_route_ordering()) {
231 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
236 _session.set_dirty ();
239 /** Set all order keys to be the same as that for `base', if such a key
240 * exists in this route.
241 * @param base Base key.
244 Route::sync_order_keys (std::string const & base)
246 if (order_keys.empty()) {
250 OrderKeys::iterator i;
253 if ((i = order_keys.find (base)) == order_keys.end()) {
254 /* key doesn't exist, use the first existing key (during session initialization) */
255 i = order_keys.begin();
259 /* key exists - use it and reset all others (actually, itself included) */
261 i = order_keys.begin();
264 for (; i != order_keys.end(); ++i) {
270 Route::ensure_track_or_route_name(string name, Session &session)
272 string newname = name;
274 while (!session.io_name_is_legal (newname)) {
275 newname = bump_name_once (newname, '.');
283 Route::inc_gain (gain_t fraction, void *src)
285 _amp->inc_gain (fraction, src);
289 Route::set_gain (gain_t val, void *src)
291 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
293 if (_route_group->is_relative()) {
295 gain_t usable_gain = _amp->gain();
296 if (usable_gain < 0.000001f) {
297 usable_gain = 0.000001f;
301 if (delta < 0.000001f) {
305 delta -= usable_gain;
310 gain_t factor = delta / usable_gain;
313 factor = _route_group->get_max_factor(factor);
314 if (factor == 0.0f) {
315 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
319 factor = _route_group->get_min_factor(factor);
320 if (factor == 0.0f) {
321 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
326 _route_group->apply (&Route::inc_gain, factor, _route_group);
330 _route_group->apply (&Route::set_gain, val, _route_group);
336 if (val == _amp->gain()) {
340 _amp->set_gain (val, src);
343 /** Process this route for one (sub) cycle (process thread)
345 * @param bufs Scratch buffers to use for the signal path
346 * @param start_frame Initial transport frame
347 * @param end_frame Final transport frame
348 * @param nframes Number of frames to output (to ports)
350 * Note that (end_frame - start_frame) may not be equal to nframes when the
351 * transport speed isn't 1.0 (eg varispeed).
354 Route::process_output_buffers (BufferSet& bufs,
355 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
356 bool /*with_processors*/, int declick)
360 bufs.is_silent (false);
362 switch (Config->get_monitoring_model()) {
363 case HardwareMonitoring:
364 case ExternalMonitoring:
365 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
372 declick = _pending_declick;
375 /* figure out if we're going to use gain automation */
376 _amp->setup_gain_automation (start_frame, end_frame, nframes);
379 /* tell main outs what to do about monitoring */
380 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
383 /* -------------------------------------------------------------------------------------------
384 GLOBAL DECLICK (for transport changes etc.)
385 ----------------------------------------------------------------------------------------- */
388 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
389 } else if (declick < 0) {
390 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
393 _pending_declick = 0;
395 /* -------------------------------------------------------------------------------------------
396 DENORMAL CONTROL/PHASE INVERT
397 ----------------------------------------------------------------------------------------- */
403 if (_denormal_protection || Config->get_denormal_protection()) {
405 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
406 Sample* const sp = i->data();
408 if (_phase_invert & chn) {
409 for (nframes_t nx = 0; nx < nframes; ++nx) {
414 for (nframes_t nx = 0; nx < nframes; ++nx) {
422 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
423 Sample* const sp = i->data();
425 if (_phase_invert & (1<<chn)) {
426 for (nframes_t nx = 0; nx < nframes; ++nx) {
435 if (_denormal_protection || Config->get_denormal_protection()) {
437 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
438 Sample* const sp = i->data();
439 for (nframes_t nx = 0; nx < nframes; ++nx) {
447 /* -------------------------------------------------------------------------------------------
449 ----------------------------------------------------------------------------------------- */
451 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
455 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
457 if (bufs.count() != (*i)->input_streams()) {
458 cerr << _name << " bufs = " << bufs.count()
459 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
462 assert (bufs.count() == (*i)->input_streams());
464 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
465 bufs.set_count ((*i)->output_streams());
471 Route::n_process_buffers ()
473 return max (_input->n_ports(), processor_max_streams);
477 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
479 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
483 assert (bufs.available() >= input_streams());
485 if (_input->n_ports() == ChanCount::ZERO) {
489 bufs.set_count (input_streams());
491 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
493 /* control/monitor bus ignores input ports when something is
494 feeding the listen "stream". data will "arrive" into the
495 route from the intreturn processor element.
497 bufs.silence (nframes, 0);
501 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
503 BufferSet::iterator o = bufs.begin(*t);
504 PortSet& ports (_input->ports());
506 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
507 o->read_from (i->get_buffer(nframes), nframes);
512 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
513 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
517 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
519 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
520 bufs.set_count (_input->n_ports());
521 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
522 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
526 Route::set_listen (bool yn, void* src)
533 if (yn != _monitor_send->active()) {
535 _monitor_send->activate ();
536 _mute_master->set_soloed (true);
538 _monitor_send->deactivate ();
539 _mute_master->set_soloed (false);
542 listen_changed (src); /* EMIT SIGNAL */
548 Route::listening () const
551 return _monitor_send->active ();
558 Route::set_solo_safe (bool yn, void *src)
560 if (_solo_safe != yn) {
562 solo_safe_changed (src);
567 Route::solo_safe() const
573 Route::set_solo (bool yn, void *src)
579 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
580 _route_group->apply (&Route::set_solo, yn, _route_group);
584 if (self_soloed() != yn) {
586 set_mute_master_solo ();
587 solo_changed (true, src); /* EMIT SIGNAL */
588 _solo_control->Changed (); /* EMIT SIGNAL */
593 Route::set_self_solo (bool yn)
599 Route::mod_solo_by_others_upstream (int32_t delta)
605 uint32_t old_sbu = _soloed_by_others_upstream;
608 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
609 _soloed_by_others_upstream += delta;
611 _soloed_by_others_upstream = 0;
614 _soloed_by_others_upstream += delta;
617 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
618 name(), delta, _soloed_by_others_upstream, old_sbu,
619 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
621 /* push the inverse solo change to everything that feeds us.
623 This is important for solo-within-group. When we solo 1 track out of N that
624 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
625 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
626 tracks that feed it. This will silence them if they were audible because
627 of a bus solo, but the newly soloed track will still be audible (because
630 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
634 if ((_self_solo || _soloed_by_others_downstream) &&
635 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
636 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
638 if (delta > 0 || !Config->get_exclusive_solo()) {
639 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
640 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
641 boost::shared_ptr<Route> sr = i->r.lock();
643 sr->mod_solo_by_others_downstream (-delta);
649 set_mute_master_solo ();
650 solo_changed (false, this);
654 Route::mod_solo_by_others_downstream (int32_t delta)
661 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
662 _soloed_by_others_downstream += delta;
664 _soloed_by_others_downstream = 0;
667 _soloed_by_others_downstream += delta;
670 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
672 set_mute_master_solo ();
673 solo_changed (false, this);
677 Route::set_mute_master_solo ()
679 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
683 Route::set_solo_isolated (bool yn, void *src)
685 if (is_master() || is_monitor() || is_hidden()) {
689 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
690 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
694 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
696 boost::shared_ptr<RouteList> routes = _session.get_routes ();
697 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
699 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
704 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
706 if (does_feed && !sends_only) {
707 (*i)->set_solo_isolated (yn, (*i)->route_group());
711 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
713 bool changed = false;
716 if (_solo_isolated == 0) {
717 _mute_master->set_solo_ignore (true);
722 if (_solo_isolated > 0) {
724 if (_solo_isolated == 0) {
725 _mute_master->set_solo_ignore (false);
732 solo_isolated_changed (src);
737 Route::solo_isolated () const
739 return _solo_isolated > 0;
743 Route::set_mute_points (MuteMaster::MutePoint mp)
745 _mute_master->set_mute_points (mp);
746 mute_points_changed (); /* EMIT SIGNAL */
748 if (_mute_master->muted_by_self()) {
749 mute_changed (this); /* EMIT SIGNAL */
754 Route::set_mute (bool yn, void *src)
756 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
757 _route_group->apply (&Route::set_mute, yn, _route_group);
762 _mute_master->set_muted_by_self (yn);
763 mute_changed (src); /* EMIT SIGNAL */
768 Route::muted () const
770 return _mute_master->muted_by_self();
775 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
777 cerr << name << " {" << endl;
778 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
779 p != procs.end(); ++p) {
780 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
787 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
789 ProcessorList::iterator loc;
791 /* XXX this is not thread safe - we don't hold the lock across determining the iter
792 to add before and actually doing the insertion. dammit.
795 if (placement == PreFader) {
796 /* generic pre-fader: insert immediately before the amp */
797 loc = find (_processors.begin(), _processors.end(), _amp);
799 /* generic post-fader: insert right before the main outs */
800 loc = find (_processors.begin(), _processors.end(), _main_outs);
803 return add_processor (processor, loc, err);
807 /** Add a processor to the route.
808 * @a iter must point to an iterator in _processors and the new
809 * processor will be inserted immediately before this location. Otherwise,
810 * @a position is used.
813 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
815 ChanCount old_pms = processor_max_streams;
817 if (!_session.engine().connected() || !processor) {
822 Glib::RWLock::WriterLock lm (_processor_lock);
824 boost::shared_ptr<PluginInsert> pi;
825 boost::shared_ptr<PortInsert> porti;
827 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
829 if (processor == _amp || processor == _meter || processor == _main_outs) {
830 // Ensure only one of these are in the list at any time
831 if (loc != _processors.end()) {
832 if (iter == loc) { // Already in place, do nothing
834 } else { // New position given, relocate
835 _processors.erase (loc);
840 if (loc != _processors.end()) {
841 cerr << "ERROR: Processor added to route twice!" << endl;
848 _processors.insert (loc, processor);
850 // Set up processor list channels. This will set processor->[input|output]_streams(),
851 // configure redirect ports properly, etc.
853 if (configure_processors_unlocked (err)) {
854 ProcessorList::iterator ploc = loc;
856 _processors.erase(ploc);
857 configure_processors_unlocked (0); // it worked before we tried to add it ...
858 cerr << "configure failed\n";
862 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
864 if (pi->natural_input_streams() == ChanCount::ZERO) {
865 /* generator plugin */
866 _have_internal_generator = true;
871 /* is this the monitor send ? if so, make sure we keep track of it */
873 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
875 if (isend && _session.monitor_out() && (isend->target_id() == _session.monitor_out()->id())) {
876 _monitor_send = isend;
879 if (activation_allowed && (processor != _monitor_send)) {
880 processor->activate ();
883 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
885 _output->set_user_latency (0);
888 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
889 set_processor_positions ();
895 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
897 const XMLProperty *prop;
900 boost::shared_ptr<Processor> processor;
902 if (node.name() == "Insert") {
904 if ((prop = node.property ("type")) != 0) {
906 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
907 prop->value() == "lv2" ||
908 prop->value() == "vst" ||
909 prop->value() == "audiounit") {
911 processor.reset (new PluginInsert (_session));
915 processor.reset (new PortInsert (_session, _mute_master));
920 } else if (node.name() == "Send") {
922 processor.reset (new Send (_session, _mute_master));
926 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
930 if (processor->set_state (node, version)) {
934 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
935 /* check for invisible processors stacked at the end and leave them there */
936 ProcessorList::iterator p;
937 p = _processors.end();
939 while (!(*p)->display_to_user() && p != _processors.begin()) {
946 return (add_processor (processor, iter) == 0);
949 catch (failed_constructor &err) {
950 warning << _("processor could not be created. Ignored.") << endmsg;
956 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
958 ProcessorList::iterator loc;
961 loc = find(_processors.begin(), _processors.end(), before);
963 /* nothing specified - at end but before main outs */
964 loc = find (_processors.begin(), _processors.end(), _main_outs);
967 return add_processors (others, loc, err);
971 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
973 /* NOTE: this is intended to be used ONLY when copying
974 processors from another Route. Hence the subtle
975 differences between this and ::add_processor()
978 ChanCount old_pms = processor_max_streams;
980 if (!_session.engine().connected()) {
984 if (others.empty()) {
989 Glib::RWLock::WriterLock lm (_processor_lock);
991 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
993 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
995 // Ensure meter only appears in the list once
997 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
998 if (m != _processors.end()) {
999 _processors.erase(m);
1003 boost::shared_ptr<PluginInsert> pi;
1005 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1008 ChanCount m = max (pi->input_streams(), pi->output_streams());
1010 if (m > potential_max_streams) {
1011 potential_max_streams = m;
1015 ProcessorList::iterator inserted = _processors.insert (iter, *i);
1017 if ((*i)->active()) {
1021 if (configure_processors_unlocked (err)) {
1022 _processors.erase (inserted);
1023 configure_processors_unlocked (0); // it worked before we tried to add it ...
1027 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1030 _output->set_user_latency (0);
1033 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1034 set_processor_positions ();
1040 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1042 if (p == PreFader) {
1043 start = _processors.begin();
1044 end = find(_processors.begin(), _processors.end(), _amp);
1046 start = find(_processors.begin(), _processors.end(), _amp);
1048 end = _processors.end();
1052 /** Turn off all processors with a given placement
1053 * @param p Placement of processors to disable
1056 Route::disable_processors (Placement p)
1058 Glib::RWLock::ReaderLock lm (_processor_lock);
1060 ProcessorList::iterator start, end;
1061 placement_range(p, start, end);
1063 for (ProcessorList::iterator i = start; i != end; ++i) {
1064 (*i)->deactivate ();
1067 _session.set_dirty ();
1070 /** Turn off all redirects
1073 Route::disable_processors ()
1075 Glib::RWLock::ReaderLock lm (_processor_lock);
1077 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1078 (*i)->deactivate ();
1081 _session.set_dirty ();
1084 /** Turn off all redirects with a given placement
1085 * @param p Placement of redirects to disable
1088 Route::disable_plugins (Placement p)
1090 Glib::RWLock::ReaderLock lm (_processor_lock);
1092 ProcessorList::iterator start, end;
1093 placement_range(p, start, end);
1095 for (ProcessorList::iterator i = start; i != end; ++i) {
1096 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1097 (*i)->deactivate ();
1101 _session.set_dirty ();
1104 /** Turn off all plugins
1107 Route::disable_plugins ()
1109 Glib::RWLock::ReaderLock lm (_processor_lock);
1111 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1112 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1113 (*i)->deactivate ();
1117 _session.set_dirty ();
1122 Route::ab_plugins (bool forward)
1124 Glib::RWLock::ReaderLock lm (_processor_lock);
1128 /* forward = turn off all active redirects, and mark them so that the next time
1129 we go the other way, we will revert them
1132 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1133 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1137 if ((*i)->active()) {
1138 (*i)->deactivate ();
1139 (*i)->set_next_ab_is_active (true);
1141 (*i)->set_next_ab_is_active (false);
1147 /* backward = if the redirect was marked to go active on the next ab, do so */
1149 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1151 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1155 if ((*i)->get_next_ab_is_active()) {
1158 (*i)->deactivate ();
1163 _session.set_dirty ();
1167 /** Remove processors with a given placement.
1168 * @param p Placement of processors to remove.
1171 Route::clear_processors (Placement p)
1173 const ChanCount old_pms = processor_max_streams;
1175 if (!_session.engine().connected()) {
1179 bool already_deleting = _session.deletion_in_progress();
1180 if (!already_deleting) {
1181 _session.set_deletion_in_progress();
1185 Glib::RWLock::WriterLock lm (_processor_lock);
1186 ProcessorList new_list;
1187 ProcessorStreams err;
1188 bool seen_amp = false;
1190 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1196 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1198 /* you can't remove these */
1200 new_list.push_back (*i);
1207 new_list.push_back (*i);
1210 (*i)->drop_references ();
1218 (*i)->drop_references ();
1221 new_list.push_back (*i);
1228 _processors = new_list;
1229 configure_processors_unlocked (&err); // this can't fail
1232 processor_max_streams.reset();
1233 _have_internal_generator = false;
1234 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1235 set_processor_positions ();
1237 if (!already_deleting) {
1238 _session.clear_deletion_in_progress();
1243 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1245 /* these can never be removed */
1247 if (processor == _amp || processor == _meter || processor == _main_outs) {
1251 ChanCount old_pms = processor_max_streams;
1253 if (!_session.engine().connected()) {
1257 processor_max_streams.reset();
1260 Glib::RWLock::WriterLock lm (_processor_lock);
1261 ProcessorList::iterator i;
1262 bool removed = false;
1264 for (i = _processors.begin(); i != _processors.end(); ) {
1265 if (*i == processor) {
1267 /* move along, see failure case for configure_processors()
1268 where we may need to reconfigure the processor.
1271 /* stop redirects that send signals to JACK ports
1272 from causing noise as a result of no longer being
1276 boost::shared_ptr<IOProcessor> iop;
1278 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1280 iop->input()->disconnect (this);
1282 if (iop->output()) {
1283 iop->output()->disconnect (this);
1287 i = _processors.erase (i);
1295 _output->set_user_latency (0);
1303 if (configure_processors_unlocked (err)) {
1304 /* get back to where we where */
1305 _processors.insert (i, processor);
1306 /* we know this will work, because it worked before :) */
1307 configure_processors_unlocked (0);
1311 _have_internal_generator = false;
1313 for (i = _processors.begin(); i != _processors.end(); ++i) {
1314 boost::shared_ptr<PluginInsert> pi;
1316 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1317 if (pi->is_generator()) {
1318 _have_internal_generator = true;
1325 processor->drop_references ();
1326 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1327 set_processor_positions ();
1333 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1335 ProcessorList deleted;
1337 if (!_session.engine().connected()) {
1341 processor_max_streams.reset();
1344 Glib::RWLock::WriterLock lm (_processor_lock);
1345 ProcessorList::iterator i;
1346 boost::shared_ptr<Processor> processor;
1348 ProcessorList as_we_were = _processors;
1350 for (i = _processors.begin(); i != _processors.end(); ) {
1354 /* these can never be removed */
1356 if (processor == _amp || processor == _meter || processor == _main_outs) {
1361 /* see if its in the list of processors to delete */
1363 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1368 /* stop IOProcessors that send to JACK ports
1369 from causing noise as a result of no longer being
1373 boost::shared_ptr<IOProcessor> iop;
1375 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1379 deleted.push_back (processor);
1380 i = _processors.erase (i);
1383 if (deleted.empty()) {
1384 /* none of those in the requested list were found */
1388 _output->set_user_latency (0);
1390 if (configure_processors_unlocked (err)) {
1391 /* get back to where we where */
1392 _processors = as_we_were;
1393 /* we know this will work, because it worked before :) */
1394 configure_processors_unlocked (0);
1398 _have_internal_generator = false;
1400 for (i = _processors.begin(); i != _processors.end(); ++i) {
1401 boost::shared_ptr<PluginInsert> pi;
1403 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1404 if (pi->is_generator()) {
1405 _have_internal_generator = true;
1412 /* now try to do what we need to so that those that were removed will be deleted */
1414 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1415 (*i)->drop_references ();
1418 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1419 set_processor_positions ();
1426 Route::configure_processors (ProcessorStreams* err)
1428 if (!_in_configure_processors) {
1429 Glib::RWLock::WriterLock lm (_processor_lock);
1430 return configure_processors_unlocked (err);
1436 Route::input_streams () const
1438 return _input->n_ports ();
1441 /** Configure the input/output configuration of each processor in the processors list.
1442 * Return 0 on success, otherwise configuration is impossible.
1445 Route::configure_processors_unlocked (ProcessorStreams* err)
1447 if (_in_configure_processors) {
1451 _in_configure_processors = true;
1453 // Check each processor in order to see if we can configure as requested
1454 ChanCount in = input_streams ();
1456 list< pair<ChanCount,ChanCount> > configuration;
1459 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1461 DEBUG_TRACE (DEBUG::Processors, "{\n");
1462 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1463 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1465 DEBUG_TRACE (DEBUG::Processors, "}\n");
1468 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1470 if ((*p)->can_support_io_configuration(in, out)) {
1471 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
1472 configuration.push_back(make_pair(in, out));
1479 _in_configure_processors = false;
1484 // We can, so configure everything
1485 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1486 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1487 (*p)->configure_io(c->first, c->second);
1488 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1489 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1494 _meter->reset_max_channels (processor_max_streams);
1497 /* make sure we have sufficient scratch buffers to cope with the new processor
1500 Glib::Mutex::Lock em (_session.engine().process_lock ());
1501 _session.ensure_buffers (n_process_buffers ());
1504 _in_configure_processors = false;
1509 Route::all_processors_flip ()
1511 Glib::RWLock::ReaderLock lm (_processor_lock);
1513 if (_processors.empty()) {
1517 bool first_is_on = _processors.front()->active();
1519 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1521 (*i)->deactivate ();
1527 _session.set_dirty ();
1530 /** Set all processors with a given placement to a given active state.
1531 * @param p Placement of processors to change.
1532 * @param state New active state for those processors.
1535 Route::all_processors_active (Placement p, bool state)
1537 Glib::RWLock::ReaderLock lm (_processor_lock);
1539 if (_processors.empty()) {
1542 ProcessorList::iterator start, end;
1543 placement_range(p, start, end);
1545 bool before_amp = true;
1546 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1551 if (p == PreFader && before_amp) {
1555 (*i)->deactivate ();
1560 _session.set_dirty ();
1564 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1566 bool pre_fader = true;
1567 Glib::RWLock::ReaderLock lm (_processor_lock);
1569 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1571 /* semantic note: if p == amp, we want to return true, so test
1572 for equality before checking if this is the amp
1589 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1591 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1592 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1593 processors in the current actual processor list that are hidden. Any visible processors
1594 in the current list but not in "new_order" will be assumed to be deleted.
1598 Glib::RWLock::WriterLock lm (_processor_lock);
1599 ChanCount old_pms = processor_max_streams;
1600 ProcessorList::iterator oiter;
1601 ProcessorList::const_iterator niter;
1602 ProcessorList as_it_was_before = _processors;
1603 ProcessorList as_it_will_be;
1605 oiter = _processors.begin();
1606 niter = new_order.begin();
1608 while (niter != new_order.end()) {
1610 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1611 then append it to the temp list.
1613 Otherwise, see if the next processor in the old list is in the new list. if not,
1614 its been deleted. If its there, append it to the temp list.
1617 if (oiter == _processors.end()) {
1619 /* no more elements in the old list, so just stick the rest of
1620 the new order onto the temp list.
1623 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1624 while (niter != new_order.end()) {
1631 if (!(*oiter)->display_to_user()) {
1633 as_it_will_be.push_back (*oiter);
1637 /* visible processor: check that its in the new order */
1639 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1640 /* deleted: do nothing, shared_ptr<> will clean up */
1642 /* ignore this one, and add the next item from the new order instead */
1643 as_it_will_be.push_back (*niter);
1648 /* now remove from old order - its taken care of no matter what */
1649 oiter = _processors.erase (oiter);
1654 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1656 if (configure_processors_unlocked (err)) {
1657 _processors = as_it_was_before;
1658 processor_max_streams = old_pms;
1664 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1665 set_processor_positions ();
1678 Route::get_template()
1680 return state(false);
1684 Route::state(bool full_state)
1686 XMLNode *node = new XMLNode("Route");
1687 ProcessorList::iterator i;
1690 id().print (buf, sizeof (buf));
1691 node->add_property("id", buf);
1692 node->add_property ("name", _name);
1693 node->add_property("default-type", _default_type.to_string());
1696 node->add_property("flags", enum_2_string (_flags));
1699 node->add_property("active", _active?"yes":"no");
1700 node->add_property("phase-invert", _phase_invert?"yes":"no");
1701 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1702 node->add_property("meter-point", enum_2_string (_meter_point));
1705 node->add_property("route-group", _route_group->name());
1708 string order_string;
1709 OrderKeys::iterator x = order_keys.begin();
1711 while (x != order_keys.end()) {
1712 order_string += string ((*x).first);
1713 order_string += '=';
1714 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1715 order_string += buf;
1719 if (x == order_keys.end()) {
1723 order_string += ':';
1725 node->add_property ("order-keys", order_string);
1726 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1727 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1728 node->add_property ("soloed-by-upstream", buf);
1729 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1730 node->add_property ("soloed-by-downstream", buf);
1732 node->add_child_nocopy (_input->state (full_state));
1733 node->add_child_nocopy (_output->state (full_state));
1734 node->add_child_nocopy (_solo_control->get_state ());
1735 node->add_child_nocopy (_mute_master->get_state ());
1737 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1738 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1739 remote_control_node->add_property (X_("id"), buf);
1740 node->add_child_nocopy (*remote_control_node);
1742 if (_comment.length()) {
1743 XMLNode *cmt = node->add_child ("Comment");
1744 cmt->add_content (_comment);
1747 for (i = _processors.begin(); i != _processors.end(); ++i) {
1748 node->add_child_nocopy((*i)->state (full_state));
1752 node->add_child_copy (*_extra_xml);
1759 Route::set_state (const XMLNode& node, int version)
1761 return _set_state (node, version, true);
1765 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1767 if (version < 3000) {
1768 return _set_state_2X (node, version);
1772 XMLNodeConstIterator niter;
1774 XMLPropertyList plist;
1775 const XMLProperty *prop;
1777 if (node.name() != "Route"){
1778 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1782 if ((prop = node.property (X_("name"))) != 0) {
1783 Route::set_name (prop->value());
1786 if ((prop = node.property ("id")) != 0) {
1787 _id = prop->value ();
1790 if ((prop = node.property (X_("flags"))) != 0) {
1791 _flags = Flag (string_2_enum (prop->value(), _flags));
1796 if (is_master() || is_monitor() || is_hidden()) {
1797 _mute_master->set_solo_ignore (true);
1800 /* add all processors (except amp, which is always present) */
1802 nlist = node.children();
1803 XMLNode processor_state (X_("processor_state"));
1805 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1809 if (child->name() == IO::state_node_name) {
1810 if ((prop = child->property (X_("direction"))) == 0) {
1814 if (prop->value() == "Input") {
1815 _input->set_state (*child, version);
1816 } else if (prop->value() == "Output") {
1817 _output->set_state (*child, version);
1821 if (child->name() == X_("Processor")) {
1822 processor_state.add_child_copy (*child);
1826 set_processor_state (processor_state);
1828 if ((prop = node.property ("self-solo")) != 0) {
1829 set_self_solo (string_is_affirmative (prop->value()));
1832 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1833 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1834 mod_solo_by_others_upstream (atoi (prop->value()));
1837 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1838 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1839 mod_solo_by_others_downstream (atoi (prop->value()));
1842 if ((prop = node.property ("solo-isolated")) != 0) {
1843 set_solo_isolated (string_is_affirmative (prop->value()), this);
1846 if ((prop = node.property (X_("phase-invert"))) != 0) {
1847 set_phase_invert (string_is_affirmative (prop->value()));
1850 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1851 set_denormal_protection (string_is_affirmative (prop->value()));
1854 if ((prop = node.property (X_("active"))) != 0) {
1855 bool yn = string_is_affirmative (prop->value());
1856 _active = !yn; // force switch
1860 if ((prop = node.property (X_("meter-point"))) != 0) {
1861 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1862 set_meter_point (mp);
1864 _meter->set_display_to_user (_meter_point == MeterCustom);
1868 if ((prop = node.property (X_("order-keys"))) != 0) {
1872 string::size_type colon, equal;
1873 string remaining = prop->value();
1875 while (remaining.length()) {
1877 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1878 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1881 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1882 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1885 set_order_key (remaining.substr (0, equal), n);
1889 colon = remaining.find_first_of (':');
1891 if (colon != string::npos) {
1892 remaining = remaining.substr (colon+1);
1899 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1902 if (child->name() == X_("Comment")) {
1904 /* XXX this is a terrible API design in libxml++ */
1906 XMLNode *cmt = *(child->children().begin());
1907 _comment = cmt->content();
1909 } else if (child->name() == X_("Extra")) {
1911 _extra_xml = new XMLNode (*child);
1913 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1915 if (prop->value() == "solo") {
1916 _solo_control->set_state (*child, version);
1917 _session.add_controllable (_solo_control);
1920 } else if (child->name() == X_("RemoteControl")) {
1921 if ((prop = child->property (X_("id"))) != 0) {
1923 sscanf (prop->value().c_str(), "%d", &x);
1924 set_remote_control_id (x);
1927 } else if (child->name() == X_("MuteMaster")) {
1928 _mute_master->set_state (*child, version);
1936 Route::_set_state_2X (const XMLNode& node, int version)
1939 XMLNodeConstIterator niter;
1941 XMLPropertyList plist;
1942 const XMLProperty *prop;
1944 /* 2X things which still remain to be handled:
1950 if (node.name() != "Route") {
1951 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1955 if ((prop = node.property (X_("flags"))) != 0) {
1956 _flags = Flag (string_2_enum (prop->value(), _flags));
1961 if ((prop = node.property (X_("phase-invert"))) != 0) {
1962 set_phase_invert (string_is_affirmative (prop->value()));
1965 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1966 set_denormal_protection (string_is_affirmative (prop->value()));
1969 if ((prop = node.property (X_("soloed"))) != 0) {
1970 bool yn = string_is_affirmative (prop->value());
1972 /* XXX force reset of solo status */
1974 set_solo (yn, this);
1977 if ((prop = node.property (X_("muted"))) != 0) {
1980 bool muted = string_is_affirmative (prop->value());
1986 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1988 if (string_is_affirmative (prop->value())){
1989 mute_point = mute_point + "PreFader";
1994 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1996 if (string_is_affirmative (prop->value())){
1999 mute_point = mute_point + ",";
2002 mute_point = mute_point + "PostFader";
2007 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2009 if (string_is_affirmative (prop->value())){
2012 mute_point = mute_point + ",";
2015 mute_point = mute_point + "Listen";
2020 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2022 if (string_is_affirmative (prop->value())){
2025 mute_point = mute_point + ",";
2028 mute_point = mute_point + "Main";
2032 _mute_master->set_mute_points (mute_point);
2036 if ((prop = node.property (X_("meter-point"))) != 0) {
2037 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2040 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2041 don't mean the same thing.
2044 if ((prop = node.property (X_("order-keys"))) != 0) {
2048 string::size_type colon, equal;
2049 string remaining = prop->value();
2051 while (remaining.length()) {
2053 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2054 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2057 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2058 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2061 set_order_key (remaining.substr (0, equal), n);
2065 colon = remaining.find_first_of (':');
2067 if (colon != string::npos) {
2068 remaining = remaining.substr (colon+1);
2075 /* add standard processors */
2077 //_meter.reset (new PeakMeter (_session));
2078 //add_processor (_meter, PreFader);
2081 /* where we listen to tracks */
2082 _intreturn.reset (new InternalReturn (_session));
2083 add_processor (_intreturn, PreFader);
2085 _monitor_control.reset (new MonitorProcessor (_session));
2086 add_processor (_monitor_control, PostFader);
2089 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
2090 add_processor (_main_outs, PostFader);
2094 nlist = node.children ();
2095 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2099 if (child->name() == IO::state_node_name) {
2101 /* there is a note in IO::set_state_2X() about why we have to call
2105 _input->set_state_2X (*child, version, true);
2106 _output->set_state_2X (*child, version, false);
2108 if ((prop = child->property (X_("name"))) != 0) {
2109 Route::set_name (prop->value ());
2112 if ((prop = child->property (X_("id"))) != 0) {
2113 _id = prop->value ();
2116 if ((prop = child->property (X_("active"))) != 0) {
2117 bool yn = string_is_affirmative (prop->value());
2118 _active = !yn; // force switch
2122 if ((prop = child->property (X_("gain"))) != 0) {
2125 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2126 _amp->gain_control()->set_value (val);
2130 /* Set up Panners in the IO */
2131 XMLNodeList io_nlist = child->children ();
2133 XMLNodeConstIterator io_niter;
2136 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2138 io_child = *io_niter;
2140 if (io_child->name() == X_("Panner")) {
2141 _main_outs->panner()->set_state(*io_child, version);
2147 XMLNodeList redirect_nodes;
2149 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2153 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2154 redirect_nodes.push_back(child);
2159 set_processor_state_2X (redirect_nodes, version);
2161 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2164 if (child->name() == X_("Comment")) {
2166 /* XXX this is a terrible API design in libxml++ */
2168 XMLNode *cmt = *(child->children().begin());
2169 _comment = cmt->content();
2171 } else if (child->name() == X_("Extra")) {
2173 _extra_xml = new XMLNode (*child);
2175 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2177 if (prop->value() == "solo") {
2178 _solo_control->set_state (*child, version);
2179 _session.add_controllable (_solo_control);
2182 } else if (child->name() == X_("RemoteControl")) {
2183 if ((prop = child->property (X_("id"))) != 0) {
2185 sscanf (prop->value().c_str(), "%d", &x);
2186 set_remote_control_id (x);
2196 Route::get_processor_state ()
2198 XMLNode* root = new XMLNode (X_("redirects"));
2199 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2200 root->add_child_nocopy ((*i)->state (true));
2207 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2209 /* We don't bother removing existing processors not in nList, as this
2210 method will only be called when creating a Route from scratch, not
2211 for undo purposes. Just put processors in at the appropriate place
2215 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2216 add_processor_from_xml_2X (**i, version, _processors.begin ());
2221 Route::set_processor_state (const XMLNode& node)
2223 const XMLNodeList &nlist = node.children();
2224 XMLNodeConstIterator niter;
2225 ProcessorList new_order;
2226 bool must_configure = false;
2228 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2230 XMLProperty* prop = (*niter)->property ("type");
2232 if (prop->value() == "amp") {
2233 _amp->set_state (**niter, Stateful::current_state_version);
2234 new_order.push_back (_amp);
2235 } else if (prop->value() == "meter") {
2236 _meter->set_state (**niter, Stateful::current_state_version);
2237 new_order.push_back (_meter);
2238 } else if (prop->value() == "main-outs") {
2239 _main_outs->set_state (**niter, Stateful::current_state_version);
2240 new_order.push_back (_main_outs);
2241 } else if (prop->value() == "intreturn") {
2243 _intreturn.reset (new InternalReturn (_session));
2244 must_configure = true;
2246 _intreturn->set_state (**niter, Stateful::current_state_version);
2247 new_order.push_back (_intreturn);
2248 } else if (is_monitor() && prop->value() == "monitor") {
2249 if (!_monitor_control) {
2250 _monitor_control.reset (new MonitorProcessor (_session));
2251 must_configure = true;
2253 _monitor_control->set_state (**niter, Stateful::current_state_version);
2254 new_order.push_back (_monitor_control);
2256 ProcessorList::iterator o;
2258 for (o = _processors.begin(); o != _processors.end(); ++o) {
2259 XMLProperty* id_prop = (*niter)->property(X_("id"));
2260 if (id_prop && (*o)->id() == id_prop->value()) {
2261 (*o)->set_state (**niter, Stateful::current_state_version);
2262 new_order.push_back (*o);
2267 // If the processor (*niter) is not on the route then create it
2269 if (o == _processors.end()) {
2271 boost::shared_ptr<Processor> processor;
2273 if (prop->value() == "intsend") {
2275 processor.reset (new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2277 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2278 prop->value() == "lv2" ||
2279 prop->value() == "vst" ||
2280 prop->value() == "audiounit") {
2282 processor.reset (new PluginInsert(_session));
2284 } else if (prop->value() == "port") {
2286 processor.reset (new PortInsert (_session, _mute_master));
2288 } else if (prop->value() == "send") {
2290 processor.reset (new Send (_session, _mute_master));
2293 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2297 processor->set_state (**niter, Stateful::current_state_version);
2298 new_order.push_back (processor);
2299 must_configure = true;
2305 Glib::RWLock::WriterLock lm (_processor_lock);
2306 _processors = new_order;
2307 if (must_configure) {
2308 configure_processors_unlocked (0);
2312 processors_changed (RouteProcessorChange ());
2313 set_processor_positions ();
2317 Route::curve_reallocate ()
2319 // _gain_automation_curve.finish_resize ();
2320 // _pan_automation_curve.finish_resize ();
2324 Route::silence (nframes_t nframes)
2328 _output->silence (nframes);
2331 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2334 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2335 boost::shared_ptr<PluginInsert> pi;
2337 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2338 // skip plugins, they don't need anything when we're not active
2342 (*i)->silence (nframes);
2345 if (nframes == _session.get_block_size()) {
2355 Route::add_internal_return ()
2358 _intreturn.reset (new InternalReturn (_session));
2359 add_processor (_intreturn, PreFader);
2364 Route::get_return_buffer () const
2366 Glib::RWLock::ReaderLock rm (_processor_lock);
2368 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2369 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2372 BufferSet* bs = d->get_buffers ();
2381 Route::release_return_buffer () const
2383 Glib::RWLock::ReaderLock rm (_processor_lock);
2385 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2386 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2389 return d->release_buffers ();
2395 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2397 vector<string> ports;
2398 vector<string>::const_iterator i;
2401 Glib::RWLock::ReaderLock rm (_processor_lock);
2403 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2405 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2407 if (d && d->target_route() == route) {
2409 /* if the target is the control outs, then make sure
2410 we take note of which i-send is doing that.
2413 if (route == _session.monitor_out()) {
2414 _monitor_send = boost::dynamic_pointer_cast<Delivery>(d);
2417 /* already listening via the specified IO: do nothing */
2424 boost::shared_ptr<InternalSend> listener;
2430 if (route == _session.monitor_out()) {
2431 /* master never sends to control outs */
2434 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2438 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2441 } catch (failed_constructor& err) {
2445 if (route == _session.monitor_out()) {
2446 _monitor_send = listener;
2449 if (placement == PostFader) {
2450 /* put it *really* at the end, not just after the panner (main outs)
2452 add_processor (listener, _processors.end());
2454 add_processor (listener, PreFader);
2461 Route::drop_listen (boost::shared_ptr<Route> route)
2463 ProcessorStreams err;
2464 ProcessorList::iterator tmp;
2466 Glib::RWLock::ReaderLock rl(_processor_lock);
2470 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2472 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2474 if (d && d->target_route() == route) {
2476 remove_processor (*x, &err);
2479 /* list could have been demolished while we dropped the lock
2489 if (route == _session.monitor_out()) {
2490 _monitor_send.reset ();
2495 Route::set_comment (string cmt, void *src)
2498 comment_changed (src);
2499 _session.set_dirty ();
2503 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2505 FeedRecord fr (other, via_sends_only);
2507 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2509 if (!result.second) {
2511 /* already a record for "other" - make sure sends-only information is correct */
2512 if (!via_sends_only && result.first->sends_only) {
2513 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2514 frp->sends_only = false;
2518 return result.second;
2522 Route::clear_fed_by ()
2528 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2530 const FedBy& fed_by (other->fed_by());
2532 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2533 boost::shared_ptr<Route> sr = f->r.lock();
2535 if (sr && (sr.get() == this)) {
2537 if (via_sends_only) {
2538 *via_sends_only = f->sends_only;
2549 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2551 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2553 if (_output->connected_to (other->input())) {
2554 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2563 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2565 boost::shared_ptr<IOProcessor> iop;
2567 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2568 if (iop->feeds (other)) {
2569 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2575 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2578 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2583 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2588 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2590 nframes_t now = _session.transport_frame();
2593 Glib::RWLock::ReaderLock lm (_processor_lock);
2596 automation_snapshot (now, true);
2599 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2601 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2602 (*i)->deactivate ();
2606 (*i)->transport_stopped (now);
2610 _roll_delay = _initial_delay;
2614 Route::input_change_handler (IOChange change, void * /*src*/)
2616 if ((change & ConfigurationChanged)) {
2617 configure_processors (0);
2622 Route::output_change_handler (IOChange change, void * /*src*/)
2624 if ((change & ConfigurationChanged)) {
2626 /* XXX resize all listeners to match _main_outs? */
2628 // configure_processors (0);
2633 Route::pans_required () const
2635 if (n_outputs().n_audio() < 2) {
2639 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2643 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2644 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2646 if (n_outputs().n_total() == 0) {
2650 if (!_active || n_inputs() == ChanCount::ZERO) {
2654 if (session_state_changing) {
2655 if (_session.transport_speed() != 0.0f) {
2656 /* we're rolling but some state is changing (e.g. our diskstream contents)
2657 so we cannot use them. Be silent till this is over.
2659 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2664 /* we're really not rolling, so we're either delivery silence or actually
2665 monitoring, both of which are safe to do while session_state_changing is true.
2669 _amp->apply_gain_automation (false);
2670 passthru (start_frame, end_frame, nframes, 0);
2676 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2678 if (_roll_delay > nframes) {
2680 _roll_delay -= nframes;
2682 /* transport frame is not legal for caller to use */
2685 } else if (_roll_delay > 0) {
2687 nframes -= _roll_delay;
2688 silence (_roll_delay);
2689 /* we've written _roll_delay of samples into the
2690 output ports, so make a note of that for
2693 _main_outs->increment_output_offset (_roll_delay);
2694 transport_frame += _roll_delay;
2703 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2704 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2707 // automation snapshot can also be called from the non-rt context
2708 // and it uses the processor list, so we try to acquire the lock here
2709 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2712 automation_snapshot (_session.transport_frame(), false);
2716 if (n_outputs().n_total() == 0) {
2720 if (!_active || n_inputs().n_total() == 0) {
2725 nframes_t unused = 0;
2727 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2733 passthru (start_frame, end_frame, nframes, declick);
2739 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2740 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2747 Route::toggle_monitor_input ()
2749 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2750 i->ensure_monitor_input( ! i->monitoring_input());
2755 Route::has_external_redirects () const
2757 // FIXME: what about sends? - they don't return a signal back to ardour?
2759 boost::shared_ptr<const PortInsert> pi;
2761 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2763 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2765 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2767 string port_name = port->name();
2768 string client_name = port_name.substr (0, port_name.find(':'));
2770 /* only say "yes" if the redirect is actually in use */
2772 if (client_name != "ardour" && pi->active()) {
2783 Route::flush_processors ()
2785 /* XXX shouldn't really try to take this lock, since
2786 this is called from the RT audio thread.
2789 Glib::RWLock::ReaderLock lm (_processor_lock);
2791 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2792 (*i)->deactivate ();
2798 Route::set_meter_point (MeterPoint p)
2800 /* CAN BE CALLED FROM PROCESS CONTEXT */
2802 if (_meter_point == p) {
2806 bool meter_was_visible_to_user = _meter->display_to_user ();
2809 Glib::RWLock::WriterLock lm (_processor_lock);
2811 if (p != MeterCustom) {
2812 // Move meter in the processors list to reflect the new position
2813 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2814 _processors.erase(loc);
2817 loc = _processors.begin();
2820 loc = find (_processors.begin(), _processors.end(), _amp);
2822 case MeterPostFader:
2823 loc = _processors.end();
2831 if (loc == _processors.begin()) {
2832 m_in = _input->n_ports();
2834 ProcessorList::iterator before = loc;
2836 m_in = (*before)->output_streams ();
2839 _meter->reflect_inputs (m_in);
2841 _processors.insert (loc, _meter);
2843 /* we do not need to reconfigure the processors, because the meter
2844 (a) is always ready to handle processor_max_streams
2845 (b) is always an N-in/N-out processor, and thus moving
2846 it doesn't require any changes to the other processors.
2849 _meter->set_display_to_user (false);
2853 // just make it visible and let the user move it
2855 _meter->set_display_to_user (true);
2860 meter_change (); /* EMIT SIGNAL */
2862 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2864 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2868 Route::put_monitor_send_at (Placement p)
2870 if (!_monitor_send) {
2875 Glib::RWLock::WriterLock lm (_processor_lock);
2876 ProcessorList as_it_was (_processors);
2877 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _monitor_send);
2878 _processors.erase(loc);
2882 loc = find(_processors.begin(), _processors.end(), _amp);
2883 if (loc != _processors.begin()) {
2888 loc = _processors.end();
2892 _processors.insert (loc, _monitor_send);
2894 if (configure_processors_unlocked (0)) {
2895 _processors = as_it_was;
2896 configure_processors_unlocked (0); // it worked before we tried to add it ...
2901 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2902 _session.set_dirty ();
2906 Route::update_total_latency ()
2908 nframes_t old = _output->effective_latency();
2909 nframes_t own_latency = _output->user_latency();
2911 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2912 if ((*i)->active ()) {
2913 own_latency += (*i)->signal_latency ();
2917 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2919 _output->set_port_latency (own_latency);
2921 if (_output->user_latency() == 0) {
2923 /* this (virtual) function is used for pure Routes,
2924 not derived classes like AudioTrack. this means
2925 that the data processed here comes from an input
2926 port, not prerecorded material, and therefore we
2927 have to take into account any input latency.
2930 own_latency += _input->signal_latency ();
2933 if (old != own_latency) {
2934 _output->set_latency_delay (own_latency);
2935 signal_latency_changed (); /* EMIT SIGNAL */
2938 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2940 return _output->effective_latency ();
2944 Route::set_user_latency (nframes_t nframes)
2946 _output->set_user_latency (nframes);
2947 _session.update_latency_compensation (false, false);
2951 Route::set_latency_delay (nframes_t longest_session_latency)
2953 nframes_t old = _initial_delay;
2955 if (_output->effective_latency() < longest_session_latency) {
2956 _initial_delay = longest_session_latency - _output->effective_latency();
2961 if (_initial_delay != old) {
2962 initial_delay_changed (); /* EMIT SIGNAL */
2965 if (_session.transport_stopped()) {
2966 _roll_delay = _initial_delay;
2971 Route::automation_snapshot (nframes_t now, bool force)
2973 panner()->automation_snapshot (now, force);
2975 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2976 (*i)->automation_snapshot (now, force);
2980 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2981 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2982 boost::shared_ptr<AutomationList>(), name)
2985 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2990 Route::SoloControllable::set_value (float val)
2992 bool bval = ((val >= 0.5f) ? true: false);
2994 this is how it should be done
2996 boost::shared_ptr<RouteList> rl (new RouteList);
2997 rl->push_back (route);
2999 if (Config->get_solo_control_is_listen_control()) {
3000 _session.set_listen (rl, bval);
3002 _session.set_solo (rl, bval);
3005 route.set_solo (bval, this);
3010 Route::SoloControllable::get_value (void) const
3012 if (Config->get_solo_control_is_listen_control()) {
3013 return route.listening() ? 1.0f : 0.0f;
3015 return route.self_soloed() ? 1.0f : 0.0f;
3019 Route::MuteControllable::MuteControllable (std::string name, Route& r)
3020 : AutomationControl (r.session(), Evoral::Parameter (MuteAutomation),
3021 boost::shared_ptr<AutomationList>(), name)
3024 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3029 Route::MuteControllable::set_value (float val)
3031 bool bval = ((val >= 0.5f) ? true: false);
3033 this is how it should be done
3035 boost::shared_ptr<RouteList> rl (new RouteList);
3036 rl->push_back (route);
3037 _session.set_mute (rl, bval);
3039 route.set_mute (bval, this);
3044 Route::MuteControllable::get_value (void) const
3046 return route.muted() ? 1.0f : 0.0f;
3050 Route::set_block_size (nframes_t nframes)
3052 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3053 (*i)->set_block_size (nframes);
3056 _session.ensure_buffers (n_process_buffers ());
3060 Route::protect_automation ()
3062 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3063 (*i)->protect_automation();
3067 Route::set_pending_declick (int declick)
3070 /* this call is not allowed to turn off a pending declick unless "force" is true */
3072 _pending_declick = declick;
3074 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3076 _pending_declick = 0;
3081 /** Shift automation forwards from a particular place, thereby inserting time.
3082 * Adds undo commands for any shifts that are performed.
3084 * @param pos Position to start shifting from.
3085 * @param frames Amount to shift forwards by.
3089 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
3091 #ifdef THIS_NEEDS_FIXING_FOR_V3
3093 /* gain automation */
3094 XMLNode &before = _gain_control->get_state ();
3095 _gain_control->shift (pos, frames);
3096 XMLNode &after = _gain_control->get_state ();
3097 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
3099 /* pan automation */
3100 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
3101 Curve & c = (*i)->automation ();
3102 XMLNode &before = c.get_state ();
3103 c.shift (pos, frames);
3104 XMLNode &after = c.get_state ();
3105 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
3108 /* redirect automation */
3110 Glib::RWLock::ReaderLock lm (redirect_lock);
3111 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
3114 (*i)->what_has_automation (a);
3116 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
3117 AutomationList & al = (*i)->automation_list (*j);
3118 XMLNode &before = al.get_state ();
3119 al.shift (pos, frames);
3120 XMLNode &after = al.get_state ();
3121 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
3131 Route::save_as_template (const string& path, const string& name)
3133 XMLNode& node (state (false));
3136 IO::set_name_in_state (*node.children().front(), name);
3138 tree.set_root (&node);
3139 return tree.write (path.c_str());
3144 Route::set_name (const string& str)
3150 name = Route::ensure_track_or_route_name (str, _session);
3151 SessionObject::set_name (name);
3153 ret = (_input->set_name(name) && _output->set_name(name));
3157 Glib::RWLock::ReaderLock lm (_processor_lock);
3159 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3161 /* rename all I/O processors that have inputs or outputs */
3163 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3165 if (iop && (iop->output() || iop->input())) {
3166 if (!iop->set_name (name)) {
3177 boost::shared_ptr<Send>
3178 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3180 Glib::RWLock::ReaderLock lm (_processor_lock);
3182 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3183 boost::shared_ptr<InternalSend> send;
3185 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3186 if (send->target_route() == target) {
3192 return boost::shared_ptr<Send>();
3196 Route::set_phase_invert (bool yn)
3198 if (_phase_invert != yn) {
3200 _phase_invert = 0xffff; // XXX all channels
3202 _phase_invert = 0; // XXX no channels
3205 phase_invert_changed (); /* EMIT SIGNAL */
3206 _session.set_dirty ();
3211 Route::phase_invert () const
3213 return _phase_invert != 0;
3217 Route::set_denormal_protection (bool yn)
3219 if (_denormal_protection != yn) {
3220 _denormal_protection = yn;
3221 denormal_protection_changed (); /* EMIT SIGNAL */
3226 Route::denormal_protection () const
3228 return _denormal_protection;
3232 Route::set_active (bool yn)
3234 if (_active != yn) {
3236 _input->set_active (yn);
3237 _output->set_active (yn);
3238 active_changed (); // EMIT SIGNAL
3245 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3251 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3253 boost::shared_ptr<Send> s;
3254 boost::shared_ptr<Return> r;
3256 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3257 s->meter()->meter();
3258 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3259 r->meter()->meter ();
3264 boost::shared_ptr<Panner>
3265 Route::panner() const
3267 return _main_outs->panner();
3270 boost::shared_ptr<AutomationControl>
3271 Route::gain_control() const
3273 return _amp->gain_control();
3276 boost::shared_ptr<AutomationControl>
3277 Route::get_control (const Evoral::Parameter& param)
3279 /* either we own the control or .... */
3281 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3285 /* maybe one of our processors does or ... */
3287 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3288 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3289 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3297 /* nobody does so we'll make a new one */
3299 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3306 boost::shared_ptr<Processor>
3307 Route::nth_plugin (uint32_t n)
3309 Glib::RWLock::ReaderLock lm (_processor_lock);
3310 ProcessorList::iterator i;
3312 for (i = _processors.begin(); i != _processors.end(); ++i) {
3313 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3320 return boost::shared_ptr<Processor> ();
3323 boost::shared_ptr<Processor>
3324 Route::nth_send (uint32_t n)
3326 Glib::RWLock::ReaderLock lm (_processor_lock);
3327 ProcessorList::iterator i;
3329 for (i = _processors.begin(); i != _processors.end(); ++i) {
3330 if (boost::dynamic_pointer_cast<Send> (*i)) {
3337 return boost::shared_ptr<Processor> ();
3341 Route::has_io_processor_named (const string& name)
3343 Glib::RWLock::ReaderLock lm (_processor_lock);
3344 ProcessorList::iterator i;
3346 for (i = _processors.begin(); i != _processors.end(); ++i) {
3347 if (boost::dynamic_pointer_cast<Send> (*i) ||
3348 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3349 if ((*i)->name() == name) {
3358 MuteMaster::MutePoint
3359 Route::mute_points () const
3361 return _mute_master->mute_points ();
3365 Route::set_processor_positions ()
3367 Glib::RWLock::ReaderLock lm (_processor_lock);
3369 bool had_amp = false;
3370 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3371 (*i)->set_pre_fader (!had_amp);
3372 if (boost::dynamic_pointer_cast<Amp> (*i)) {