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 , _mute_points (MuteMaster::AllPoints)
94 , _have_internal_generator (false)
95 , _physically_connected (false)
98 , _default_type (default_type)
99 , _remote_control_id (0)
100 , _in_configure_processors (false)
102 processor_max_streams.reset();
103 order_keys[N_("signal")] = order_key_cnt++;
109 /* add standard controls */
111 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
112 _mute_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
114 add_control (_solo_control);
115 add_control (_mute_control);
117 /* input and output objects */
119 _input.reset (new IO (_session, _name, IO::Input, _default_type));
120 _output.reset (new IO (_session, _name, IO::Output, _default_type));
122 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
123 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
125 /* add amp processor */
127 _amp.reset (new Amp (_session, _mute_master));
128 add_processor (_amp, PostFader);
130 /* add standard processors: meter, main outs, monitor out */
132 _meter.reset (new PeakMeter (_session));
133 _meter->set_display_to_user (false);
135 add_processor (_meter, PostFader);
137 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
139 add_processor (_main_outs, PostFader);
142 /* where we listen to tracks */
143 _intreturn.reset (new InternalReturn (_session));
144 add_processor (_intreturn, PreFader);
146 ProcessorList::iterator i;
148 for (i = _processors.begin(); i != _processors.end(); ++i) {
149 if (*i == _intreturn) {
155 /* the thing that provides proper control over a control/monitor/listen bus
156 (such as per-channel cut, dim, solo, invert, etc).
157 It always goes right after the internal return;
159 _monitor_control.reset (new MonitorProcessor (_session));
160 add_processor (_monitor_control, i);
162 /* no panning on the monitor main outs */
164 _main_outs->panner()->set_bypassed (true);
167 if (is_master() || is_monitor() || is_hidden()) {
168 _mute_master->set_solo_ignore (true);
171 /* now that we have _meter, its safe to connect to this */
173 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
180 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
182 /* do this early so that we don't get incoming signals as we are going through destruction
187 /* don't use clear_processors here, as it depends on the session which may
188 be half-destroyed by now
191 Glib::RWLock::WriterLock lm (_processor_lock);
192 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
193 (*i)->drop_references ();
196 _processors.clear ();
200 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
202 if (id != _remote_control_id) {
203 _remote_control_id = id;
204 RemoteControlIDChanged ();
205 if (notify_class_listeners) {
206 RemoteControlIDChange ();
212 Route::remote_control_id() const
214 return _remote_control_id;
218 Route::order_key (std::string const & name) const
220 OrderKeys::const_iterator i = order_keys.find (name);
221 if (i == order_keys.end()) {
229 Route::set_order_key (std::string const & name, long n)
231 order_keys[name] = n;
233 if (Config->get_sync_all_route_ordering()) {
234 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
239 _session.set_dirty ();
242 /** Set all order keys to be the same as that for `base', if such a key
243 * exists in this route.
244 * @param base Base key.
247 Route::sync_order_keys (std::string const & base)
249 if (order_keys.empty()) {
253 OrderKeys::iterator i;
256 if ((i = order_keys.find (base)) == order_keys.end()) {
257 /* key doesn't exist, use the first existing key (during session initialization) */
258 i = order_keys.begin();
262 /* key exists - use it and reset all others (actually, itself included) */
264 i = order_keys.begin();
267 for (; i != order_keys.end(); ++i) {
273 Route::ensure_track_or_route_name(string name, Session &session)
275 string newname = name;
277 while (!session.io_name_is_legal (newname)) {
278 newname = bump_name_once (newname);
286 Route::inc_gain (gain_t fraction, void *src)
288 _amp->inc_gain (fraction, src);
292 Route::set_gain (gain_t val, void *src)
294 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
296 if (_route_group->is_relative()) {
298 gain_t usable_gain = _amp->gain();
299 if (usable_gain < 0.000001f) {
300 usable_gain = 0.000001f;
304 if (delta < 0.000001f) {
308 delta -= usable_gain;
313 gain_t factor = delta / usable_gain;
316 factor = _route_group->get_max_factor(factor);
317 if (factor == 0.0f) {
318 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
322 factor = _route_group->get_min_factor(factor);
323 if (factor == 0.0f) {
324 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
329 _route_group->apply (&Route::inc_gain, factor, _route_group);
333 _route_group->apply (&Route::set_gain, val, _route_group);
339 if (val == _amp->gain()) {
343 _amp->set_gain (val, src);
346 /** Process this route for one (sub) cycle (process thread)
348 * @param bufs Scratch buffers to use for the signal path
349 * @param start_frame Initial transport frame
350 * @param end_frame Final transport frame
351 * @param nframes Number of frames to output (to ports)
353 * Note that (end_frame - start_frame) may not be equal to nframes when the
354 * transport speed isn't 1.0 (eg varispeed).
357 Route::process_output_buffers (BufferSet& bufs,
358 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
359 bool /*with_processors*/, int declick)
363 bufs.is_silent (false);
365 switch (Config->get_monitoring_model()) {
366 case HardwareMonitoring:
367 case ExternalMonitoring:
368 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
375 declick = _pending_declick;
378 /* figure out if we're going to use gain automation */
379 _amp->setup_gain_automation (start_frame, end_frame, nframes);
382 /* tell main outs what to do about monitoring */
383 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
386 /* -------------------------------------------------------------------------------------------
387 GLOBAL DECLICK (for transport changes etc.)
388 ----------------------------------------------------------------------------------------- */
391 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
392 } else if (declick < 0) {
393 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
396 _pending_declick = 0;
398 /* -------------------------------------------------------------------------------------------
399 DENORMAL CONTROL/PHASE INVERT
400 ----------------------------------------------------------------------------------------- */
406 if (_denormal_protection || Config->get_denormal_protection()) {
408 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
409 Sample* const sp = i->data();
411 if (_phase_invert & chn) {
412 for (nframes_t nx = 0; nx < nframes; ++nx) {
417 for (nframes_t nx = 0; nx < nframes; ++nx) {
425 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
426 Sample* const sp = i->data();
428 if (_phase_invert & (1<<chn)) {
429 for (nframes_t nx = 0; nx < nframes; ++nx) {
438 if (_denormal_protection || Config->get_denormal_protection()) {
440 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
441 Sample* const sp = i->data();
442 for (nframes_t nx = 0; nx < nframes; ++nx) {
450 /* -------------------------------------------------------------------------------------------
452 ----------------------------------------------------------------------------------------- */
454 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
457 //cerr << name() << " upstream solo " << _soloed_by_others_upstream
458 // << " downstream solo " << _soloed_by_others_downstream
459 // << " self " << _self_solo
461 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
463 if (bufs.count() != (*i)->input_streams()) {
464 cerr << _name << " bufs = " << bufs.count()
465 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
468 assert (bufs.count() == (*i)->input_streams());
470 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
471 bufs.set_count ((*i)->output_streams());
477 Route::n_process_buffers ()
479 return max (_input->n_ports(), processor_max_streams);
483 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
485 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
489 assert (bufs.available() >= input_streams());
491 if (_input->n_ports() == ChanCount::ZERO) {
495 bufs.set_count (input_streams());
497 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
499 /* control/monitor bus ignores input ports when something is
500 feeding the listen "stream". data will "arrive" into the
501 route from the intreturn processor element.
503 bufs.silence (nframes, 0);
507 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
509 BufferSet::iterator o = bufs.begin(*t);
510 PortSet& ports (_input->ports());
512 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
513 o->read_from (i->get_buffer(nframes), nframes);
518 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
519 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
523 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
525 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
526 bufs.set_count (_input->n_ports());
527 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
528 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
532 Route::set_listen (bool yn, void* src)
539 if (yn != _monitor_send->active()) {
541 _monitor_send->activate ();
543 _monitor_send->deactivate ();
546 listen_changed (src); /* EMIT SIGNAL */
552 Route::listening () const
555 return _monitor_send->active ();
562 Route::set_solo_safe (bool yn, void *src)
564 if (_solo_safe != yn) {
566 solo_safe_changed (src);
571 Route::solo_safe() const
577 Route::set_solo (bool yn, void *src)
583 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
584 _route_group->apply (&Route::set_solo, yn, _route_group);
588 if (self_soloed() != yn) {
590 set_mute_master_solo ();
591 solo_changed (true, src); /* EMIT SIGNAL */
592 _solo_control->Changed (); /* EMIT SIGNAL */
597 Route::set_self_solo (bool yn)
603 Route::mod_solo_by_others_upstream (int32_t delta)
609 uint32_t old_sbu = _soloed_by_others_upstream;
611 cerr << name() << " SbU was " << old_sbu << " delta " << delta << " = ";
614 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
615 _soloed_by_others_upstream += delta;
617 _soloed_by_others_upstream = 0;
620 _soloed_by_others_upstream += delta;
623 cerr << _soloed_by_others_upstream << endl;
625 /* push the inverse solo change to everything that feeds us.
627 This is important for solo-within-group. When we solo 1 track out of N that
628 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
629 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
630 tracks that feed it. This will silence them if they were audible because
631 of a bus solo, but the newly soloed track will still be audible (because
634 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
638 cerr << name() << " SbU ... latched solo? " << Config->get_solo_latched() << " delta = " << delta << endl;
640 bool push_inverse = false;
642 if (old_sbu > 0 && _soloed_by_others_upstream == 0 && _self_solo) {
643 /* we went back to non-soloed-by-others-upstream but we're still soloed push */
647 if (old_sbu == 0 && _soloed_by_others_upstream > 0) {
648 /* upstream made us solo when we weren't before */
653 cerr << "\t ... INVERT push\n";
654 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
655 boost::shared_ptr<Route> sr = i->r.lock();
657 sr->mod_solo_by_others_downstream (-delta);
662 set_mute_master_solo ();
663 solo_changed (false, this);
667 Route::mod_solo_by_others_downstream (int32_t delta)
673 cerr << name() << " SbD delta " << delta << " = ";
676 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
677 _soloed_by_others_downstream += delta;
679 _soloed_by_others_downstream = 0;
682 _soloed_by_others_downstream += delta;
685 cerr << _soloed_by_others_downstream << endl;
687 set_mute_master_solo ();
688 solo_changed (false, this);
692 Route::set_mute_master_solo ()
694 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
698 Route::set_solo_isolated (bool yn, void *src)
700 if (is_master() || is_monitor() || is_hidden()) {
704 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
705 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
709 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
711 boost::shared_ptr<RouteList> routes = _session.get_routes ();
712 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
714 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
719 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
721 if (does_feed && !sends_only) {
722 (*i)->set_solo_isolated (yn, (*i)->route_group());
726 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
729 if (_solo_isolated == 0) {
730 _mute_master->set_solo_ignore (true);
733 solo_isolated_changed (src);
735 if (_solo_isolated > 0) {
737 if (_solo_isolated == 0) {
738 _mute_master->set_solo_ignore (false);
740 solo_isolated_changed (src);
747 Route::solo_isolated () const
749 return _solo_isolated > 0;
753 Route::set_mute_points (MuteMaster::MutePoint mp)
756 _mute_master->set_mute_points (MuteMaster::AllPoints);
757 mute_points_changed (); /* EMIT SIGNAL */
759 if (_mute_master->muted()) {
760 mute_changed (this); /* EMIT SIGNAL */
765 Route::set_mute (bool yn, void *src)
767 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
768 _route_group->apply (&Route::set_mute, yn, _route_group);
773 _mute_master->set_muted (yn);
774 mute_changed (src); /* EMIT SIGNAL */
779 Route::muted () const
781 return _mute_master->muted();
786 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
788 cerr << name << " {" << endl;
789 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
790 p != procs.end(); ++p) {
791 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
798 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
800 ProcessorList::iterator loc;
802 /* XXX this is not thread safe - we don't hold the lock across determining the iter
803 to add before and actually doing the insertion. dammit.
806 if (placement == PreFader) {
807 /* generic pre-fader: insert immediately before the amp */
808 loc = find (_processors.begin(), _processors.end(), _amp);
810 /* generic post-fader: insert right before the main outs */
811 loc = find (_processors.begin(), _processors.end(), _main_outs);
814 return add_processor (processor, loc, err);
818 /** Add a processor to the route.
819 * @a iter must point to an iterator in _processors and the new
820 * processor will be inserted immediately before this location. Otherwise,
821 * @a position is used.
824 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
826 ChanCount old_pms = processor_max_streams;
828 if (!_session.engine().connected() || !processor) {
833 Glib::RWLock::WriterLock lm (_processor_lock);
835 boost::shared_ptr<PluginInsert> pi;
836 boost::shared_ptr<PortInsert> porti;
838 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
840 if (processor == _amp || processor == _meter || processor == _main_outs) {
841 // Ensure only one of these are in the list at any time
842 if (loc != _processors.end()) {
843 if (iter == loc) { // Already in place, do nothing
845 } else { // New position given, relocate
846 _processors.erase (loc);
851 if (loc != _processors.end()) {
852 cerr << "ERROR: Processor added to route twice!" << endl;
859 _processors.insert (loc, processor);
861 // Set up processor list channels. This will set processor->[input|output]_streams(),
862 // configure redirect ports properly, etc.
864 if (configure_processors_unlocked (err)) {
865 ProcessorList::iterator ploc = loc;
867 _processors.erase(ploc);
868 configure_processors_unlocked (0); // it worked before we tried to add it ...
869 cerr << "configure failed\n";
873 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
875 if (pi->natural_input_streams() == ChanCount::ZERO) {
876 /* generator plugin */
877 _have_internal_generator = true;
882 /* is this the monitor send ? if so, make sure we keep track of it */
884 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
886 if (isend && _session.monitor_out() && (isend->target_id() == _session.monitor_out()->id())) {
887 _monitor_send = isend;
890 if (activation_allowed && (processor != _monitor_send)) {
891 processor->activate ();
894 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
896 _output->set_user_latency (0);
899 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
905 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
907 const XMLProperty *prop;
910 boost::shared_ptr<Processor> processor;
912 if (node.name() == "Insert") {
914 if ((prop = node.property ("type")) != 0) {
916 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
917 prop->value() == "lv2" ||
918 prop->value() == "vst" ||
919 prop->value() == "audiounit") {
921 processor.reset (new PluginInsert (_session));
925 processor.reset (new PortInsert (_session, _mute_master));
930 } else if (node.name() == "Send") {
932 processor.reset (new Send (_session, _mute_master));
936 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
940 if (processor->set_state (node, version)) {
944 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
945 /* check for invisible processors stacked at the end and leave them there */
946 ProcessorList::iterator p;
947 p = _processors.end();
949 while (!(*p)->display_to_user() && p != _processors.begin()) {
956 return (add_processor (processor, iter) == 0);
959 catch (failed_constructor &err) {
960 warning << _("processor could not be created. Ignored.") << endmsg;
966 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
968 ProcessorList::iterator loc;
971 loc = find(_processors.begin(), _processors.end(), before);
973 /* nothing specified - at end but before main outs */
974 loc = find (_processors.begin(), _processors.end(), _main_outs);
977 return add_processors (others, loc, err);
981 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
983 /* NOTE: this is intended to be used ONLY when copying
984 processors from another Route. Hence the subtle
985 differences between this and ::add_processor()
988 ChanCount old_pms = processor_max_streams;
990 if (!_session.engine().connected()) {
994 if (others.empty()) {
999 Glib::RWLock::WriterLock lm (_processor_lock);
1001 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
1003 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1005 // Ensure meter only appears in the list once
1007 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
1008 if (m != _processors.end()) {
1009 _processors.erase(m);
1013 boost::shared_ptr<PluginInsert> pi;
1015 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1018 ChanCount m = max (pi->input_streams(), pi->output_streams());
1020 if (m > potential_max_streams) {
1021 potential_max_streams = m;
1025 ProcessorList::iterator inserted = _processors.insert (iter, *i);
1027 if ((*i)->active()) {
1031 if (configure_processors_unlocked (err)) {
1032 _processors.erase (inserted);
1033 configure_processors_unlocked (0); // it worked before we tried to add it ...
1037 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1040 _output->set_user_latency (0);
1043 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1049 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1051 if (p == PreFader) {
1052 start = _processors.begin();
1053 end = find(_processors.begin(), _processors.end(), _amp);
1055 start = find(_processors.begin(), _processors.end(), _amp);
1057 end = _processors.end();
1061 /** Turn off all processors with a given placement
1062 * @param p Placement of processors to disable
1065 Route::disable_processors (Placement p)
1067 Glib::RWLock::ReaderLock lm (_processor_lock);
1069 ProcessorList::iterator start, end;
1070 placement_range(p, start, end);
1072 for (ProcessorList::iterator i = start; i != end; ++i) {
1073 (*i)->deactivate ();
1076 _session.set_dirty ();
1079 /** Turn off all redirects
1082 Route::disable_processors ()
1084 Glib::RWLock::ReaderLock lm (_processor_lock);
1086 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1087 (*i)->deactivate ();
1090 _session.set_dirty ();
1093 /** Turn off all redirects with a given placement
1094 * @param p Placement of redirects to disable
1097 Route::disable_plugins (Placement p)
1099 Glib::RWLock::ReaderLock lm (_processor_lock);
1101 ProcessorList::iterator start, end;
1102 placement_range(p, start, end);
1104 for (ProcessorList::iterator i = start; i != end; ++i) {
1105 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1106 (*i)->deactivate ();
1110 _session.set_dirty ();
1113 /** Turn off all plugins
1116 Route::disable_plugins ()
1118 Glib::RWLock::ReaderLock lm (_processor_lock);
1120 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1121 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1122 (*i)->deactivate ();
1126 _session.set_dirty ();
1131 Route::ab_plugins (bool forward)
1133 Glib::RWLock::ReaderLock lm (_processor_lock);
1137 /* forward = turn off all active redirects, and mark them so that the next time
1138 we go the other way, we will revert them
1141 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1142 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1146 if ((*i)->active()) {
1147 (*i)->deactivate ();
1148 (*i)->set_next_ab_is_active (true);
1150 (*i)->set_next_ab_is_active (false);
1156 /* backward = if the redirect was marked to go active on the next ab, do so */
1158 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1160 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1164 if ((*i)->get_next_ab_is_active()) {
1167 (*i)->deactivate ();
1172 _session.set_dirty ();
1176 /** Remove processors with a given placement.
1177 * @param p Placement of processors to remove.
1180 Route::clear_processors (Placement p)
1182 const ChanCount old_pms = processor_max_streams;
1184 if (!_session.engine().connected()) {
1188 bool already_deleting = _session.deletion_in_progress();
1189 if (!already_deleting) {
1190 _session.set_deletion_in_progress();
1194 Glib::RWLock::WriterLock lm (_processor_lock);
1195 ProcessorList new_list;
1196 ProcessorStreams err;
1197 bool seen_amp = false;
1199 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1205 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1207 /* you can't remove these */
1209 new_list.push_back (*i);
1216 new_list.push_back (*i);
1219 (*i)->drop_references ();
1227 (*i)->drop_references ();
1230 new_list.push_back (*i);
1237 _processors = new_list;
1238 configure_processors_unlocked (&err); // this can't fail
1241 processor_max_streams.reset();
1242 _have_internal_generator = false;
1243 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1245 if (!already_deleting) {
1246 _session.clear_deletion_in_progress();
1251 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1253 /* these can never be removed */
1255 if (processor == _amp || processor == _meter || processor == _main_outs) {
1259 ChanCount old_pms = processor_max_streams;
1261 if (!_session.engine().connected()) {
1265 processor_max_streams.reset();
1268 Glib::RWLock::WriterLock lm (_processor_lock);
1269 ProcessorList::iterator i;
1270 bool removed = false;
1272 for (i = _processors.begin(); i != _processors.end(); ) {
1273 if (*i == processor) {
1275 /* move along, see failure case for configure_processors()
1276 where we may need to reconfigure the processor.
1279 /* stop redirects that send signals to JACK ports
1280 from causing noise as a result of no longer being
1284 boost::shared_ptr<IOProcessor> iop;
1286 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1288 iop->input()->disconnect (this);
1290 if (iop->output()) {
1291 iop->output()->disconnect (this);
1295 i = _processors.erase (i);
1303 _output->set_user_latency (0);
1311 if (configure_processors_unlocked (err)) {
1312 /* get back to where we where */
1313 _processors.insert (i, processor);
1314 /* we know this will work, because it worked before :) */
1315 configure_processors_unlocked (0);
1319 _have_internal_generator = false;
1321 for (i = _processors.begin(); i != _processors.end(); ++i) {
1322 boost::shared_ptr<PluginInsert> pi;
1324 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1325 if (pi->is_generator()) {
1326 _have_internal_generator = true;
1333 processor->drop_references ();
1334 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1340 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1342 ProcessorList deleted;
1344 if (!_session.engine().connected()) {
1348 processor_max_streams.reset();
1351 Glib::RWLock::WriterLock lm (_processor_lock);
1352 ProcessorList::iterator i;
1353 boost::shared_ptr<Processor> processor;
1355 ProcessorList as_we_were = _processors;
1357 for (i = _processors.begin(); i != _processors.end(); ) {
1361 /* these can never be removed */
1363 if (processor == _amp || processor == _meter || processor == _main_outs) {
1368 /* see if its in the list of processors to delete */
1370 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1375 /* stop IOProcessors that send to JACK ports
1376 from causing noise as a result of no longer being
1380 boost::shared_ptr<IOProcessor> iop;
1382 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1386 deleted.push_back (processor);
1387 i = _processors.erase (i);
1390 if (deleted.empty()) {
1391 /* none of those in the requested list were found */
1395 _output->set_user_latency (0);
1397 if (configure_processors_unlocked (err)) {
1398 /* get back to where we where */
1399 _processors = as_we_were;
1400 /* we know this will work, because it worked before :) */
1401 configure_processors_unlocked (0);
1405 _have_internal_generator = false;
1407 for (i = _processors.begin(); i != _processors.end(); ++i) {
1408 boost::shared_ptr<PluginInsert> pi;
1410 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1411 if (pi->is_generator()) {
1412 _have_internal_generator = true;
1419 /* now try to do what we need to so that those that were removed will be deleted */
1421 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1422 (*i)->drop_references ();
1425 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1432 Route::configure_processors (ProcessorStreams* err)
1434 if (!_in_configure_processors) {
1435 Glib::RWLock::WriterLock lm (_processor_lock);
1436 return configure_processors_unlocked (err);
1442 Route::input_streams () const
1444 return _input->n_ports ();
1447 /** Configure the input/output configuration of each processor in the processors list.
1448 * Return 0 on success, otherwise configuration is impossible.
1451 Route::configure_processors_unlocked (ProcessorStreams* err)
1453 if (_in_configure_processors) {
1457 _in_configure_processors = true;
1459 // Check each processor in order to see if we can configure as requested
1460 ChanCount in = input_streams ();
1462 list< pair<ChanCount,ChanCount> > configuration;
1465 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1467 DEBUG_TRACE (DEBUG::Processors, "{\n");
1468 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1469 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1471 DEBUG_TRACE (DEBUG::Processors, "}\n");
1474 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1476 if ((*p)->can_support_io_configuration(in, out)) {
1477 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
1478 configuration.push_back(make_pair(in, out));
1485 _in_configure_processors = false;
1490 // We can, so configure everything
1491 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1492 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1493 (*p)->configure_io(c->first, c->second);
1494 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1495 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1500 _meter->reset_max_channels (processor_max_streams);
1503 /* make sure we have sufficient scratch buffers to cope with the new processor
1506 Glib::Mutex::Lock em (_session.engine().process_lock ());
1507 _session.ensure_buffers (n_process_buffers ());
1510 _in_configure_processors = false;
1515 Route::all_processors_flip ()
1517 Glib::RWLock::ReaderLock lm (_processor_lock);
1519 if (_processors.empty()) {
1523 bool first_is_on = _processors.front()->active();
1525 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1527 (*i)->deactivate ();
1533 _session.set_dirty ();
1536 /** Set all processors with a given placement to a given active state.
1537 * @param p Placement of processors to change.
1538 * @param state New active state for those processors.
1541 Route::all_processors_active (Placement p, bool state)
1543 Glib::RWLock::ReaderLock lm (_processor_lock);
1545 if (_processors.empty()) {
1548 ProcessorList::iterator start, end;
1549 placement_range(p, start, end);
1551 bool before_amp = true;
1552 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1557 if (p == PreFader && before_amp) {
1561 (*i)->deactivate ();
1566 _session.set_dirty ();
1570 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1572 bool pre_fader = true;
1573 Glib::RWLock::ReaderLock lm (_processor_lock);
1575 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1577 /* semantic note: if p == amp, we want to return true, so test
1578 for equality before checking if this is the amp
1595 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1597 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1598 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1599 processors in the current actual processor list that are hidden. Any visible processors
1600 in the current list but not in "new_order" will be assumed to be deleted.
1604 Glib::RWLock::WriterLock lm (_processor_lock);
1605 ChanCount old_pms = processor_max_streams;
1606 ProcessorList::iterator oiter;
1607 ProcessorList::const_iterator niter;
1608 ProcessorList as_it_was_before = _processors;
1609 ProcessorList as_it_will_be;
1611 oiter = _processors.begin();
1612 niter = new_order.begin();
1614 while (niter != new_order.end()) {
1616 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1617 then append it to the temp list.
1619 Otherwise, see if the next processor in the old list is in the new list. if not,
1620 its been deleted. If its there, append it to the temp list.
1623 if (oiter == _processors.end()) {
1625 /* no more elements in the old list, so just stick the rest of
1626 the new order onto the temp list.
1629 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1630 while (niter != new_order.end()) {
1637 if (!(*oiter)->display_to_user()) {
1639 as_it_will_be.push_back (*oiter);
1643 /* visible processor: check that its in the new order */
1645 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1646 /* deleted: do nothing, shared_ptr<> will clean up */
1648 /* ignore this one, and add the next item from the new order instead */
1649 as_it_will_be.push_back (*niter);
1654 /* now remove from old order - its taken care of no matter what */
1655 oiter = _processors.erase (oiter);
1660 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1662 if (configure_processors_unlocked (err)) {
1663 _processors = as_it_was_before;
1664 processor_max_streams = old_pms;
1670 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1683 Route::get_template()
1685 return state(false);
1689 Route::state(bool full_state)
1691 XMLNode *node = new XMLNode("Route");
1692 ProcessorList::iterator i;
1695 id().print (buf, sizeof (buf));
1696 node->add_property("id", buf);
1697 node->add_property ("name", _name);
1698 node->add_property("default-type", _default_type.to_string());
1701 node->add_property("flags", enum_2_string (_flags));
1704 node->add_property("active", _active?"yes":"no");
1705 node->add_property("phase-invert", _phase_invert?"yes":"no");
1706 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1707 node->add_property("meter-point", enum_2_string (_meter_point));
1710 node->add_property("route-group", _route_group->name());
1713 string order_string;
1714 OrderKeys::iterator x = order_keys.begin();
1716 while (x != order_keys.end()) {
1717 order_string += string ((*x).first);
1718 order_string += '=';
1719 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1720 order_string += buf;
1724 if (x == order_keys.end()) {
1728 order_string += ':';
1730 node->add_property ("order-keys", order_string);
1731 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1732 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1733 node->add_property ("soloed-by-upstream", buf);
1734 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1735 node->add_property ("soloed-by-downstream", buf);
1737 node->add_child_nocopy (_input->state (full_state));
1738 node->add_child_nocopy (_output->state (full_state));
1739 node->add_child_nocopy (_solo_control->get_state ());
1740 node->add_child_nocopy (_mute_master->get_state ());
1742 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1743 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1744 remote_control_node->add_property (X_("id"), buf);
1745 node->add_child_nocopy (*remote_control_node);
1747 if (_comment.length()) {
1748 XMLNode *cmt = node->add_child ("Comment");
1749 cmt->add_content (_comment);
1752 for (i = _processors.begin(); i != _processors.end(); ++i) {
1753 node->add_child_nocopy((*i)->state (full_state));
1757 node->add_child_copy (*_extra_xml);
1764 Route::set_state (const XMLNode& node, int version)
1766 return _set_state (node, version, true);
1770 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1772 if (version < 3000) {
1773 return _set_state_2X (node, version);
1777 XMLNodeConstIterator niter;
1779 XMLPropertyList plist;
1780 const XMLProperty *prop;
1782 if (node.name() != "Route"){
1783 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1787 if ((prop = node.property (X_("name"))) != 0) {
1788 Route::set_name (prop->value());
1791 if ((prop = node.property ("id")) != 0) {
1792 _id = prop->value ();
1795 if ((prop = node.property (X_("flags"))) != 0) {
1796 _flags = Flag (string_2_enum (prop->value(), _flags));
1801 if (is_master() || is_monitor() || is_hidden()) {
1802 _mute_master->set_solo_ignore (true);
1805 /* add all processors (except amp, which is always present) */
1807 nlist = node.children();
1808 XMLNode processor_state (X_("processor_state"));
1810 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1814 if (child->name() == IO::state_node_name) {
1815 if ((prop = child->property (X_("direction"))) == 0) {
1819 if (prop->value() == "Input") {
1820 _input->set_state (*child, version);
1821 } else if (prop->value() == "Output") {
1822 _output->set_state (*child, version);
1826 if (child->name() == X_("Processor")) {
1827 processor_state.add_child_copy (*child);
1831 set_processor_state (processor_state);
1833 if ((prop = node.property ("self-solo")) != 0) {
1834 set_self_solo (string_is_affirmative (prop->value()));
1837 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1838 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1839 mod_solo_by_others_upstream (atoi (prop->value()));
1842 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1843 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1844 mod_solo_by_others_downstream (atoi (prop->value()));
1847 if ((prop = node.property ("solo-isolated")) != 0) {
1848 set_solo_isolated (string_is_affirmative (prop->value()), this);
1851 if ((prop = node.property (X_("phase-invert"))) != 0) {
1852 set_phase_invert (string_is_affirmative (prop->value()));
1855 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1856 set_denormal_protection (string_is_affirmative (prop->value()));
1859 if ((prop = node.property (X_("active"))) != 0) {
1860 bool yn = string_is_affirmative (prop->value());
1861 _active = !yn; // force switch
1865 if ((prop = node.property (X_("meter-point"))) != 0) {
1866 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1867 set_meter_point (mp);
1869 _meter->set_display_to_user (_meter_point == MeterCustom);
1873 if ((prop = node.property (X_("order-keys"))) != 0) {
1877 string::size_type colon, equal;
1878 string remaining = prop->value();
1880 while (remaining.length()) {
1882 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1883 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1886 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1887 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1890 set_order_key (remaining.substr (0, equal), n);
1894 colon = remaining.find_first_of (':');
1896 if (colon != string::npos) {
1897 remaining = remaining.substr (colon+1);
1904 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1907 if (child->name() == X_("Comment")) {
1909 /* XXX this is a terrible API design in libxml++ */
1911 XMLNode *cmt = *(child->children().begin());
1912 _comment = cmt->content();
1914 } else if (child->name() == X_("Extra")) {
1916 _extra_xml = new XMLNode (*child);
1918 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1920 if (prop->value() == "solo") {
1921 _solo_control->set_state (*child, version);
1922 _session.add_controllable (_solo_control);
1925 } else if (child->name() == X_("RemoteControl")) {
1926 if ((prop = child->property (X_("id"))) != 0) {
1928 sscanf (prop->value().c_str(), "%d", &x);
1929 set_remote_control_id (x);
1932 } else if (child->name() == X_("MuteMaster")) {
1933 _mute_master->set_state (*child, version);
1941 Route::_set_state_2X (const XMLNode& node, int version)
1944 XMLNodeConstIterator niter;
1946 XMLPropertyList plist;
1947 const XMLProperty *prop;
1949 /* 2X things which still remain to be handled:
1955 if (node.name() != "Route") {
1956 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1960 if ((prop = node.property (X_("flags"))) != 0) {
1961 _flags = Flag (string_2_enum (prop->value(), _flags));
1966 if ((prop = node.property (X_("phase-invert"))) != 0) {
1967 set_phase_invert (string_is_affirmative (prop->value()));
1970 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1971 set_denormal_protection (string_is_affirmative (prop->value()));
1974 if ((prop = node.property (X_("soloed"))) != 0) {
1975 bool yn = string_is_affirmative (prop->value());
1977 /* XXX force reset of solo status */
1979 set_solo (yn, this);
1982 if ((prop = node.property (X_("muted"))) != 0) {
1985 bool muted = string_is_affirmative (prop->value());
1991 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1993 if (string_is_affirmative (prop->value())){
1994 mute_point = mute_point + "PreFader";
1999 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2001 if (string_is_affirmative (prop->value())){
2004 mute_point = mute_point + ",";
2007 mute_point = mute_point + "PostFader";
2012 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2014 if (string_is_affirmative (prop->value())){
2017 mute_point = mute_point + ",";
2020 mute_point = mute_point + "Listen";
2025 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2027 if (string_is_affirmative (prop->value())){
2030 mute_point = mute_point + ",";
2033 mute_point = mute_point + "Main";
2037 _mute_master->set_mute_points (mute_point);
2041 if ((prop = node.property (X_("meter-point"))) != 0) {
2042 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2045 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2046 don't mean the same thing.
2049 if ((prop = node.property (X_("order-keys"))) != 0) {
2053 string::size_type colon, equal;
2054 string remaining = prop->value();
2056 while (remaining.length()) {
2058 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2059 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2062 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2063 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2066 set_order_key (remaining.substr (0, equal), n);
2070 colon = remaining.find_first_of (':');
2072 if (colon != string::npos) {
2073 remaining = remaining.substr (colon+1);
2080 /* add standard processors */
2082 //_meter.reset (new PeakMeter (_session));
2083 //add_processor (_meter, PreFader);
2086 /* where we listen to tracks */
2087 _intreturn.reset (new InternalReturn (_session));
2088 add_processor (_intreturn, PreFader);
2090 _monitor_control.reset (new MonitorProcessor (_session));
2091 add_processor (_monitor_control, PostFader);
2094 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
2095 add_processor (_main_outs, PostFader);
2099 nlist = node.children ();
2100 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2104 if (child->name() == IO::state_node_name) {
2106 /* there is a note in IO::set_state_2X() about why we have to call
2110 _input->set_state_2X (*child, version, true);
2111 _output->set_state_2X (*child, version, false);
2113 if ((prop = child->property (X_("name"))) != 0) {
2114 Route::set_name (prop->value ());
2117 if ((prop = child->property (X_("id"))) != 0) {
2118 _id = prop->value ();
2121 if ((prop = child->property (X_("active"))) != 0) {
2122 bool yn = string_is_affirmative (prop->value());
2123 _active = !yn; // force switch
2127 if ((prop = child->property (X_("gain"))) != 0) {
2130 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2131 _amp->gain_control()->set_value (val);
2135 /* Set up Panners in the IO */
2136 XMLNodeList io_nlist = child->children ();
2138 XMLNodeConstIterator io_niter;
2141 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2143 io_child = *io_niter;
2145 if (io_child->name() == X_("Panner")) {
2146 _main_outs->panner()->set_state(*io_child, version);
2152 XMLNodeList redirect_nodes;
2154 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2158 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2159 redirect_nodes.push_back(child);
2164 set_processor_state_2X (redirect_nodes, version);
2166 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2169 if (child->name() == X_("Comment")) {
2171 /* XXX this is a terrible API design in libxml++ */
2173 XMLNode *cmt = *(child->children().begin());
2174 _comment = cmt->content();
2176 } else if (child->name() == X_("Extra")) {
2178 _extra_xml = new XMLNode (*child);
2180 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2182 if (prop->value() == "solo") {
2183 _solo_control->set_state (*child, version);
2184 _session.add_controllable (_solo_control);
2187 } else if (child->name() == X_("RemoteControl")) {
2188 if ((prop = child->property (X_("id"))) != 0) {
2190 sscanf (prop->value().c_str(), "%d", &x);
2191 set_remote_control_id (x);
2201 Route::get_processor_state ()
2203 XMLNode* root = new XMLNode (X_("redirects"));
2204 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2205 root->add_child_nocopy ((*i)->state (true));
2212 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2214 /* We don't bother removing existing processors not in nList, as this
2215 method will only be called when creating a Route from scratch, not
2216 for undo purposes. Just put processors in at the appropriate place
2220 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2221 add_processor_from_xml_2X (**i, version, _processors.begin ());
2226 Route::set_processor_state (const XMLNode& node)
2228 const XMLNodeList &nlist = node.children();
2229 XMLNodeConstIterator niter;
2230 ProcessorList new_order;
2231 bool must_configure = false;
2233 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2235 XMLProperty* prop = (*niter)->property ("type");
2237 if (prop->value() == "amp") {
2238 _amp->set_state (**niter, Stateful::current_state_version);
2239 new_order.push_back (_amp);
2240 } else if (prop->value() == "meter") {
2241 _meter->set_state (**niter, Stateful::current_state_version);
2242 new_order.push_back (_meter);
2243 } else if (prop->value() == "main-outs") {
2244 _main_outs->set_state (**niter, Stateful::current_state_version);
2245 new_order.push_back (_main_outs);
2246 } else if (prop->value() == "intreturn") {
2248 _intreturn.reset (new InternalReturn (_session));
2249 must_configure = true;
2251 _intreturn->set_state (**niter, Stateful::current_state_version);
2252 new_order.push_back (_intreturn);
2253 } else if (is_monitor() && prop->value() == "monitor") {
2254 if (!_monitor_control) {
2255 _monitor_control.reset (new MonitorProcessor (_session));
2256 must_configure = true;
2258 _monitor_control->set_state (**niter, Stateful::current_state_version);
2259 new_order.push_back (_monitor_control);
2261 ProcessorList::iterator o;
2263 for (o = _processors.begin(); o != _processors.end(); ++o) {
2264 XMLProperty* id_prop = (*niter)->property(X_("id"));
2265 if (id_prop && (*o)->id() == id_prop->value()) {
2266 (*o)->set_state (**niter, Stateful::current_state_version);
2267 new_order.push_back (*o);
2272 // If the processor (*niter) is not on the route then create it
2274 if (o == _processors.end()) {
2276 boost::shared_ptr<Processor> processor;
2278 if (prop->value() == "intsend") {
2280 processor.reset (new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2282 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2283 prop->value() == "lv2" ||
2284 prop->value() == "vst" ||
2285 prop->value() == "audiounit") {
2287 processor.reset (new PluginInsert(_session));
2289 } else if (prop->value() == "port") {
2291 processor.reset (new PortInsert (_session, _mute_master));
2293 } else if (prop->value() == "send") {
2295 processor.reset (new Send (_session, _mute_master));
2298 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2302 processor->set_state (**niter, Stateful::current_state_version);
2303 new_order.push_back (processor);
2304 must_configure = true;
2310 Glib::RWLock::WriterLock lm (_processor_lock);
2311 _processors = new_order;
2312 if (must_configure) {
2313 configure_processors_unlocked (0);
2317 processors_changed (RouteProcessorChange ());
2321 Route::curve_reallocate ()
2323 // _gain_automation_curve.finish_resize ();
2324 // _pan_automation_curve.finish_resize ();
2328 Route::silence (nframes_t nframes)
2332 _output->silence (nframes);
2335 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2338 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2339 boost::shared_ptr<PluginInsert> pi;
2341 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2342 // skip plugins, they don't need anything when we're not active
2346 (*i)->silence (nframes);
2349 if (nframes == _session.get_block_size()) {
2359 Route::add_internal_return ()
2362 _intreturn.reset (new InternalReturn (_session));
2363 add_processor (_intreturn, PreFader);
2368 Route::get_return_buffer () const
2370 Glib::RWLock::ReaderLock rm (_processor_lock);
2372 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2373 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2376 BufferSet* bs = d->get_buffers ();
2385 Route::release_return_buffer () const
2387 Glib::RWLock::ReaderLock rm (_processor_lock);
2389 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2390 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2393 return d->release_buffers ();
2399 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2401 vector<string> ports;
2402 vector<string>::const_iterator i;
2405 Glib::RWLock::ReaderLock rm (_processor_lock);
2407 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2409 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2411 if (d && d->target_route() == route) {
2413 /* if the target is the control outs, then make sure
2414 we take note of which i-send is doing that.
2417 if (route == _session.monitor_out()) {
2418 _monitor_send = boost::dynamic_pointer_cast<Delivery>(d);
2421 /* already listening via the specified IO: do nothing */
2428 boost::shared_ptr<InternalSend> listener;
2434 if (route == _session.monitor_out()) {
2435 /* master never sends to control outs */
2438 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2442 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2445 } catch (failed_constructor& err) {
2449 if (route == _session.monitor_out()) {
2450 _monitor_send = listener;
2453 if (placement == PostFader) {
2454 /* put it *really* at the end, not just after the panner (main outs)
2456 add_processor (listener, _processors.end());
2458 add_processor (listener, PreFader);
2465 Route::drop_listen (boost::shared_ptr<Route> route)
2467 ProcessorStreams err;
2468 ProcessorList::iterator tmp;
2470 Glib::RWLock::ReaderLock rl(_processor_lock);
2474 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2476 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2478 if (d && d->target_route() == route) {
2480 remove_processor (*x, &err);
2483 /* list could have been demolished while we dropped the lock
2493 if (route == _session.monitor_out()) {
2494 _monitor_send.reset ();
2499 Route::set_comment (string cmt, void *src)
2502 comment_changed (src);
2503 _session.set_dirty ();
2507 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2509 FeedRecord fr (other, via_sends_only);
2511 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2513 if (!result.second) {
2515 /* already a record for "other" - make sure sends-only information is correct */
2516 if (!via_sends_only && result.first->sends_only) {
2517 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2518 frp->sends_only = false;
2522 return result.second;
2526 Route::clear_fed_by ()
2532 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2534 const FedBy& fed_by (other->fed_by());
2536 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2537 boost::shared_ptr<Route> sr = f->r.lock();
2539 if (sr && (sr.get() == this)) {
2541 if (via_sends_only) {
2542 *via_sends_only = f->sends_only;
2553 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2555 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2557 if (_output->connected_to (other->input())) {
2558 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2567 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2569 boost::shared_ptr<IOProcessor> iop;
2571 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2572 if (iop->feeds (other)) {
2573 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2579 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2582 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2587 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2592 Route::check_physical_connections ()
2594 _physically_connected = _output->physically_connected ();
2598 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2600 nframes_t now = _session.transport_frame();
2603 Glib::RWLock::ReaderLock lm (_processor_lock);
2606 automation_snapshot (now, true);
2609 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2611 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2612 (*i)->deactivate ();
2616 (*i)->transport_stopped (now);
2620 _roll_delay = _initial_delay;
2624 Route::input_change_handler (IOChange change, void * /*src*/)
2626 if ((change & ConfigurationChanged)) {
2627 configure_processors (0);
2632 Route::output_change_handler (IOChange change, void * /*src*/)
2634 if ((change & ConfigurationChanged)) {
2636 /* XXX resize all listeners to match _main_outs? */
2638 // configure_processors (0);
2643 Route::pans_required () const
2645 if (n_outputs().n_audio() < 2) {
2649 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2653 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2654 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2656 if (n_outputs().n_total() == 0) {
2660 if (!_active || n_inputs() == ChanCount::ZERO) {
2664 if (session_state_changing) {
2665 if (_session.transport_speed() != 0.0f) {
2666 /* we're rolling but some state is changing (e.g. our diskstream contents)
2667 so we cannot use them. Be silent till this is over.
2669 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2674 /* we're really not rolling, so we're either delivery silence or actually
2675 monitoring, both of which are safe to do while session_state_changing is true.
2679 _amp->apply_gain_automation (false);
2680 passthru (start_frame, end_frame, nframes, 0);
2686 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2688 if (_roll_delay > nframes) {
2690 _roll_delay -= nframes;
2692 /* transport frame is not legal for caller to use */
2695 } else if (_roll_delay > 0) {
2697 nframes -= _roll_delay;
2698 silence (_roll_delay);
2699 /* we've written _roll_delay of samples into the
2700 output ports, so make a note of that for
2703 _main_outs->increment_output_offset (_roll_delay);
2704 transport_frame += _roll_delay;
2713 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2714 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2717 // automation snapshot can also be called from the non-rt context
2718 // and it uses the processor list, so we try to acquire the lock here
2719 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2722 automation_snapshot (_session.transport_frame(), false);
2726 if (n_outputs().n_total() == 0) {
2730 if (!_active || n_inputs().n_total() == 0) {
2735 nframes_t unused = 0;
2737 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2743 passthru (start_frame, end_frame, nframes, declick);
2749 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2750 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2757 Route::toggle_monitor_input ()
2759 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2760 i->ensure_monitor_input( ! i->monitoring_input());
2765 Route::has_external_redirects () const
2767 // FIXME: what about sends? - they don't return a signal back to ardour?
2769 boost::shared_ptr<const PortInsert> pi;
2771 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2773 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2775 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2777 string port_name = port->name();
2778 string client_name = port_name.substr (0, port_name.find(':'));
2780 /* only say "yes" if the redirect is actually in use */
2782 if (client_name != "ardour" && pi->active()) {
2793 Route::flush_processors ()
2795 /* XXX shouldn't really try to take this lock, since
2796 this is called from the RT audio thread.
2799 Glib::RWLock::ReaderLock lm (_processor_lock);
2801 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2802 (*i)->deactivate ();
2808 Route::set_meter_point (MeterPoint p)
2810 /* CAN BE CALLED FROM PROCESS CONTEXT */
2812 if (_meter_point == p) {
2816 bool meter_was_visible_to_user = _meter->display_to_user ();
2819 Glib::RWLock::WriterLock lm (_processor_lock);
2821 if (p != MeterCustom) {
2822 // Move meter in the processors list to reflect the new position
2823 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2824 _processors.erase(loc);
2827 loc = _processors.begin();
2830 loc = find (_processors.begin(), _processors.end(), _amp);
2832 case MeterPostFader:
2833 loc = _processors.end();
2841 if (loc == _processors.begin()) {
2842 m_in = _input->n_ports();
2844 ProcessorList::iterator before = loc;
2846 m_in = (*before)->output_streams ();
2849 _meter->reflect_inputs (m_in);
2851 _processors.insert (loc, _meter);
2853 /* we do not need to reconfigure the processors, because the meter
2854 (a) is always ready to handle processor_max_streams
2855 (b) is always an N-in/N-out processor, and thus moving
2856 it doesn't require any changes to the other processors.
2859 _meter->set_display_to_user (false);
2863 // just make it visible and let the user move it
2865 _meter->set_display_to_user (true);
2870 meter_change (); /* EMIT SIGNAL */
2872 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2874 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2878 Route::put_monitor_send_at (Placement p)
2880 if (!_monitor_send) {
2885 Glib::RWLock::WriterLock lm (_processor_lock);
2886 ProcessorList as_it_was (_processors);
2887 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _monitor_send);
2888 _processors.erase(loc);
2892 loc = find(_processors.begin(), _processors.end(), _amp);
2893 if (loc != _processors.begin()) {
2898 loc = _processors.end();
2902 _processors.insert (loc, _monitor_send);
2904 if (configure_processors_unlocked (0)) {
2905 _processors = as_it_was;
2906 configure_processors_unlocked (0); // it worked before we tried to add it ...
2911 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2912 _session.set_dirty ();
2916 Route::update_total_latency ()
2918 nframes_t old = _output->effective_latency();
2919 nframes_t own_latency = _output->user_latency();
2921 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2922 if ((*i)->active ()) {
2923 own_latency += (*i)->signal_latency ();
2927 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2929 _output->set_port_latency (own_latency);
2931 if (_output->user_latency() == 0) {
2933 /* this (virtual) function is used for pure Routes,
2934 not derived classes like AudioTrack. this means
2935 that the data processed here comes from an input
2936 port, not prerecorded material, and therefore we
2937 have to take into account any input latency.
2940 own_latency += _input->signal_latency ();
2943 if (old != own_latency) {
2944 _output->set_latency_delay (own_latency);
2945 signal_latency_changed (); /* EMIT SIGNAL */
2948 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2950 return _output->effective_latency ();
2954 Route::set_user_latency (nframes_t nframes)
2956 _output->set_user_latency (nframes);
2957 _session.update_latency_compensation (false, false);
2961 Route::set_latency_delay (nframes_t longest_session_latency)
2963 nframes_t old = _initial_delay;
2965 if (_output->effective_latency() < longest_session_latency) {
2966 _initial_delay = longest_session_latency - _output->effective_latency();
2971 if (_initial_delay != old) {
2972 initial_delay_changed (); /* EMIT SIGNAL */
2975 if (_session.transport_stopped()) {
2976 _roll_delay = _initial_delay;
2981 Route::automation_snapshot (nframes_t now, bool force)
2983 panner()->automation_snapshot (now, force);
2985 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2986 (*i)->automation_snapshot (now, force);
2990 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2991 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2992 boost::shared_ptr<AutomationList>(), name)
2995 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3000 Route::SoloControllable::set_value (float val)
3002 bool bval = ((val >= 0.5f) ? true: false);
3004 this is how it should be done
3006 boost::shared_ptr<RouteList> rl (new RouteList);
3007 rl->push_back (route);
3009 if (Config->get_solo_control_is_listen_control()) {
3010 _session.set_listen (rl, bval);
3012 _session.set_solo (rl, bval);
3015 route.set_solo (bval, this);
3020 Route::SoloControllable::get_value (void) const
3022 if (Config->get_solo_control_is_listen_control()) {
3023 return route.listening() ? 1.0f : 0.0f;
3025 return route.self_soloed() ? 1.0f : 0.0f;
3029 Route::MuteControllable::MuteControllable (std::string name, Route& r)
3030 : AutomationControl (r.session(), Evoral::Parameter (MuteAutomation),
3031 boost::shared_ptr<AutomationList>(), name)
3034 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3039 Route::MuteControllable::set_value (float val)
3041 bool bval = ((val >= 0.5f) ? true: false);
3043 this is how it should be done
3045 boost::shared_ptr<RouteList> rl (new RouteList);
3046 rl->push_back (route);
3047 _session.set_mute (rl, bval);
3049 route.set_mute (bval, this);
3054 Route::MuteControllable::get_value (void) const
3056 return route.muted() ? 1.0f : 0.0f;
3060 Route::set_block_size (nframes_t nframes)
3062 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3063 (*i)->set_block_size (nframes);
3066 _session.ensure_buffers (n_process_buffers ());
3070 Route::protect_automation ()
3072 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3073 (*i)->protect_automation();
3077 Route::set_pending_declick (int declick)
3080 /* this call is not allowed to turn off a pending declick unless "force" is true */
3082 _pending_declick = declick;
3084 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3086 _pending_declick = 0;
3091 /** Shift automation forwards from a particular place, thereby inserting time.
3092 * Adds undo commands for any shifts that are performed.
3094 * @param pos Position to start shifting from.
3095 * @param frames Amount to shift forwards by.
3099 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
3101 #ifdef THIS_NEEDS_FIXING_FOR_V3
3103 /* gain automation */
3104 XMLNode &before = _gain_control->get_state ();
3105 _gain_control->shift (pos, frames);
3106 XMLNode &after = _gain_control->get_state ();
3107 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
3109 /* pan automation */
3110 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
3111 Curve & c = (*i)->automation ();
3112 XMLNode &before = c.get_state ();
3113 c.shift (pos, frames);
3114 XMLNode &after = c.get_state ();
3115 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
3118 /* redirect automation */
3120 Glib::RWLock::ReaderLock lm (redirect_lock);
3121 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
3124 (*i)->what_has_automation (a);
3126 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
3127 AutomationList & al = (*i)->automation_list (*j);
3128 XMLNode &before = al.get_state ();
3129 al.shift (pos, frames);
3130 XMLNode &after = al.get_state ();
3131 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
3141 Route::save_as_template (const string& path, const string& name)
3143 XMLNode& node (state (false));
3146 IO::set_name_in_state (*node.children().front(), name);
3148 tree.set_root (&node);
3149 return tree.write (path.c_str());
3154 Route::set_name (const string& str)
3160 name = Route::ensure_track_or_route_name (str, _session);
3161 SessionObject::set_name (name);
3163 ret = (_input->set_name(name) && _output->set_name(name));
3167 Glib::RWLock::ReaderLock lm (_processor_lock);
3169 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3171 /* rename all I/O processors that have inputs or outputs */
3173 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3175 if (iop && (iop->output() || iop->input())) {
3176 if (!iop->set_name (name)) {
3187 boost::shared_ptr<Send>
3188 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3190 Glib::RWLock::ReaderLock lm (_processor_lock);
3192 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3193 boost::shared_ptr<InternalSend> send;
3195 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3196 if (send->target_route() == target) {
3202 return boost::shared_ptr<Send>();
3206 Route::set_phase_invert (bool yn)
3208 if (_phase_invert != yn) {
3210 _phase_invert = 0xffff; // XXX all channels
3212 _phase_invert = 0; // XXX no channels
3215 phase_invert_changed (); /* EMIT SIGNAL */
3216 _session.set_dirty ();
3221 Route::phase_invert () const
3223 return _phase_invert != 0;
3227 Route::set_denormal_protection (bool yn)
3229 if (_denormal_protection != yn) {
3230 _denormal_protection = yn;
3231 denormal_protection_changed (); /* EMIT SIGNAL */
3236 Route::denormal_protection () const
3238 return _denormal_protection;
3242 Route::set_active (bool yn)
3244 if (_active != yn) {
3246 _input->set_active (yn);
3247 _output->set_active (yn);
3248 active_changed (); // EMIT SIGNAL
3255 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3261 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3263 boost::shared_ptr<Send> s;
3264 boost::shared_ptr<Return> r;
3266 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3267 s->meter()->meter();
3268 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3269 r->meter()->meter ();
3274 boost::shared_ptr<Panner>
3275 Route::panner() const
3277 return _main_outs->panner();
3280 boost::shared_ptr<AutomationControl>
3281 Route::gain_control() const
3283 return _amp->gain_control();
3286 boost::shared_ptr<AutomationControl>
3287 Route::get_control (const Evoral::Parameter& param)
3289 /* either we own the control or .... */
3291 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3295 /* maybe one of our processors does or ... */
3297 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3298 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3299 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3307 /* nobody does so we'll make a new one */
3309 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3316 boost::shared_ptr<Processor>
3317 Route::nth_plugin (uint32_t n)
3319 Glib::RWLock::ReaderLock lm (_processor_lock);
3320 ProcessorList::iterator i;
3322 for (i = _processors.begin(); i != _processors.end(); ++i) {
3323 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3330 return boost::shared_ptr<Processor> ();
3333 boost::shared_ptr<Processor>
3334 Route::nth_send (uint32_t n)
3336 Glib::RWLock::ReaderLock lm (_processor_lock);
3337 ProcessorList::iterator i;
3339 for (i = _processors.begin(); i != _processors.end(); ++i) {
3340 if (boost::dynamic_pointer_cast<Send> (*i)) {
3347 return boost::shared_ptr<Processor> ();
3351 Route::has_io_processor_named (const string& name)
3353 Glib::RWLock::ReaderLock lm (_processor_lock);
3354 ProcessorList::iterator i;
3356 for (i = _processors.begin(); i != _processors.end(); ++i) {
3357 if (boost::dynamic_pointer_cast<Send> (*i) ||
3358 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3359 if ((*i)->name() == name) {
3369 Route::set_graph_level (int32_t l)