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 ();
542 _mute_master->set_soloed (true);
544 _monitor_send->deactivate ();
545 _mute_master->set_soloed (false);
548 listen_changed (src); /* EMIT SIGNAL */
554 Route::listening () const
557 return _monitor_send->active ();
564 Route::set_solo_safe (bool yn, void *src)
566 if (_solo_safe != yn) {
568 solo_safe_changed (src);
573 Route::solo_safe() const
579 Route::set_solo (bool yn, void *src)
585 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
586 _route_group->apply (&Route::set_solo, yn, _route_group);
590 if (self_soloed() != yn) {
592 set_mute_master_solo ();
593 solo_changed (true, src); /* EMIT SIGNAL */
594 _solo_control->Changed (); /* EMIT SIGNAL */
599 Route::set_self_solo (bool yn)
605 Route::mod_solo_by_others_upstream (int32_t delta)
611 uint32_t old_sbu = _soloed_by_others_upstream;
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 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
624 name(), delta, _soloed_by_others_upstream, old_sbu,
625 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
627 /* push the inverse solo change to everything that feeds us.
629 This is important for solo-within-group. When we solo 1 track out of N that
630 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
631 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
632 tracks that feed it. This will silence them if they were audible because
633 of a bus solo, but the newly soloed track will still be audible (because
636 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
640 if ((_self_solo || _soloed_by_others_downstream) &&
641 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
642 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
644 if (delta > 0 || !Config->get_exclusive_solo()) {
645 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
646 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
647 boost::shared_ptr<Route> sr = i->r.lock();
649 sr->mod_solo_by_others_downstream (-delta);
655 set_mute_master_solo ();
656 solo_changed (false, this);
660 Route::mod_solo_by_others_downstream (int32_t delta)
667 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
668 _soloed_by_others_downstream += delta;
670 _soloed_by_others_downstream = 0;
673 _soloed_by_others_downstream += delta;
676 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
678 set_mute_master_solo ();
679 solo_changed (false, this);
683 Route::set_mute_master_solo ()
685 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
689 Route::set_solo_isolated (bool yn, void *src)
691 if (is_master() || is_monitor() || is_hidden()) {
695 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
696 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
700 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
702 boost::shared_ptr<RouteList> routes = _session.get_routes ();
703 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
705 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
710 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
712 if (does_feed && !sends_only) {
713 (*i)->set_solo_isolated (yn, (*i)->route_group());
717 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
719 bool changed = false;
722 if (_solo_isolated == 0) {
723 _mute_master->set_solo_ignore (true);
728 if (_solo_isolated > 0) {
730 if (_solo_isolated == 0) {
731 _mute_master->set_solo_ignore (false);
738 solo_isolated_changed (src);
743 Route::solo_isolated () const
745 return _solo_isolated > 0;
749 Route::set_mute_points (MuteMaster::MutePoint mp)
752 _mute_master->set_mute_points (MuteMaster::AllPoints);
753 mute_points_changed (); /* EMIT SIGNAL */
755 if (_mute_master->muted()) {
756 mute_changed (this); /* EMIT SIGNAL */
761 Route::set_mute (bool yn, void *src)
763 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
764 _route_group->apply (&Route::set_mute, yn, _route_group);
769 _mute_master->set_muted (yn);
770 mute_changed (src); /* EMIT SIGNAL */
775 Route::muted () const
777 return _mute_master->muted();
782 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
784 cerr << name << " {" << endl;
785 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
786 p != procs.end(); ++p) {
787 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
794 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
796 ProcessorList::iterator loc;
798 /* XXX this is not thread safe - we don't hold the lock across determining the iter
799 to add before and actually doing the insertion. dammit.
802 if (placement == PreFader) {
803 /* generic pre-fader: insert immediately before the amp */
804 loc = find (_processors.begin(), _processors.end(), _amp);
806 /* generic post-fader: insert right before the main outs */
807 loc = find (_processors.begin(), _processors.end(), _main_outs);
810 return add_processor (processor, loc, err);
814 /** Add a processor to the route.
815 * @a iter must point to an iterator in _processors and the new
816 * processor will be inserted immediately before this location. Otherwise,
817 * @a position is used.
820 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
822 ChanCount old_pms = processor_max_streams;
824 if (!_session.engine().connected() || !processor) {
829 Glib::RWLock::WriterLock lm (_processor_lock);
831 boost::shared_ptr<PluginInsert> pi;
832 boost::shared_ptr<PortInsert> porti;
834 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
836 if (processor == _amp || processor == _meter || processor == _main_outs) {
837 // Ensure only one of these are in the list at any time
838 if (loc != _processors.end()) {
839 if (iter == loc) { // Already in place, do nothing
841 } else { // New position given, relocate
842 _processors.erase (loc);
847 if (loc != _processors.end()) {
848 cerr << "ERROR: Processor added to route twice!" << endl;
855 _processors.insert (loc, processor);
857 // Set up processor list channels. This will set processor->[input|output]_streams(),
858 // configure redirect ports properly, etc.
860 if (configure_processors_unlocked (err)) {
861 ProcessorList::iterator ploc = loc;
863 _processors.erase(ploc);
864 configure_processors_unlocked (0); // it worked before we tried to add it ...
865 cerr << "configure failed\n";
869 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
871 if (pi->natural_input_streams() == ChanCount::ZERO) {
872 /* generator plugin */
873 _have_internal_generator = true;
878 /* is this the monitor send ? if so, make sure we keep track of it */
880 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
882 if (isend && _session.monitor_out() && (isend->target_id() == _session.monitor_out()->id())) {
883 _monitor_send = isend;
886 if (activation_allowed && (processor != _monitor_send)) {
887 processor->activate ();
890 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
892 _output->set_user_latency (0);
895 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
901 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
903 const XMLProperty *prop;
906 boost::shared_ptr<Processor> processor;
908 if (node.name() == "Insert") {
910 if ((prop = node.property ("type")) != 0) {
912 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
913 prop->value() == "lv2" ||
914 prop->value() == "vst" ||
915 prop->value() == "audiounit") {
917 processor.reset (new PluginInsert (_session));
921 processor.reset (new PortInsert (_session, _mute_master));
926 } else if (node.name() == "Send") {
928 processor.reset (new Send (_session, _mute_master));
932 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
936 if (processor->set_state (node, version)) {
940 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
941 /* check for invisible processors stacked at the end and leave them there */
942 ProcessorList::iterator p;
943 p = _processors.end();
945 while (!(*p)->display_to_user() && p != _processors.begin()) {
952 return (add_processor (processor, iter) == 0);
955 catch (failed_constructor &err) {
956 warning << _("processor could not be created. Ignored.") << endmsg;
962 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
964 ProcessorList::iterator loc;
967 loc = find(_processors.begin(), _processors.end(), before);
969 /* nothing specified - at end but before main outs */
970 loc = find (_processors.begin(), _processors.end(), _main_outs);
973 return add_processors (others, loc, err);
977 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
979 /* NOTE: this is intended to be used ONLY when copying
980 processors from another Route. Hence the subtle
981 differences between this and ::add_processor()
984 ChanCount old_pms = processor_max_streams;
986 if (!_session.engine().connected()) {
990 if (others.empty()) {
995 Glib::RWLock::WriterLock lm (_processor_lock);
997 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
999 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1001 // Ensure meter only appears in the list once
1003 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
1004 if (m != _processors.end()) {
1005 _processors.erase(m);
1009 boost::shared_ptr<PluginInsert> pi;
1011 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1014 ChanCount m = max (pi->input_streams(), pi->output_streams());
1016 if (m > potential_max_streams) {
1017 potential_max_streams = m;
1021 ProcessorList::iterator inserted = _processors.insert (iter, *i);
1023 if ((*i)->active()) {
1027 if (configure_processors_unlocked (err)) {
1028 _processors.erase (inserted);
1029 configure_processors_unlocked (0); // it worked before we tried to add it ...
1033 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1036 _output->set_user_latency (0);
1039 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1045 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1047 if (p == PreFader) {
1048 start = _processors.begin();
1049 end = find(_processors.begin(), _processors.end(), _amp);
1051 start = find(_processors.begin(), _processors.end(), _amp);
1053 end = _processors.end();
1057 /** Turn off all processors with a given placement
1058 * @param p Placement of processors to disable
1061 Route::disable_processors (Placement p)
1063 Glib::RWLock::ReaderLock lm (_processor_lock);
1065 ProcessorList::iterator start, end;
1066 placement_range(p, start, end);
1068 for (ProcessorList::iterator i = start; i != end; ++i) {
1069 (*i)->deactivate ();
1072 _session.set_dirty ();
1075 /** Turn off all redirects
1078 Route::disable_processors ()
1080 Glib::RWLock::ReaderLock lm (_processor_lock);
1082 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1083 (*i)->deactivate ();
1086 _session.set_dirty ();
1089 /** Turn off all redirects with a given placement
1090 * @param p Placement of redirects to disable
1093 Route::disable_plugins (Placement p)
1095 Glib::RWLock::ReaderLock lm (_processor_lock);
1097 ProcessorList::iterator start, end;
1098 placement_range(p, start, end);
1100 for (ProcessorList::iterator i = start; i != end; ++i) {
1101 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1102 (*i)->deactivate ();
1106 _session.set_dirty ();
1109 /** Turn off all plugins
1112 Route::disable_plugins ()
1114 Glib::RWLock::ReaderLock lm (_processor_lock);
1116 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1117 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1118 (*i)->deactivate ();
1122 _session.set_dirty ();
1127 Route::ab_plugins (bool forward)
1129 Glib::RWLock::ReaderLock lm (_processor_lock);
1133 /* forward = turn off all active redirects, and mark them so that the next time
1134 we go the other way, we will revert them
1137 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1138 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1142 if ((*i)->active()) {
1143 (*i)->deactivate ();
1144 (*i)->set_next_ab_is_active (true);
1146 (*i)->set_next_ab_is_active (false);
1152 /* backward = if the redirect was marked to go active on the next ab, do so */
1154 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1156 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1160 if ((*i)->get_next_ab_is_active()) {
1163 (*i)->deactivate ();
1168 _session.set_dirty ();
1172 /** Remove processors with a given placement.
1173 * @param p Placement of processors to remove.
1176 Route::clear_processors (Placement p)
1178 const ChanCount old_pms = processor_max_streams;
1180 if (!_session.engine().connected()) {
1184 bool already_deleting = _session.deletion_in_progress();
1185 if (!already_deleting) {
1186 _session.set_deletion_in_progress();
1190 Glib::RWLock::WriterLock lm (_processor_lock);
1191 ProcessorList new_list;
1192 ProcessorStreams err;
1193 bool seen_amp = false;
1195 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1201 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1203 /* you can't remove these */
1205 new_list.push_back (*i);
1212 new_list.push_back (*i);
1215 (*i)->drop_references ();
1223 (*i)->drop_references ();
1226 new_list.push_back (*i);
1233 _processors = new_list;
1234 configure_processors_unlocked (&err); // this can't fail
1237 processor_max_streams.reset();
1238 _have_internal_generator = false;
1239 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1241 if (!already_deleting) {
1242 _session.clear_deletion_in_progress();
1247 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1249 /* these can never be removed */
1251 if (processor == _amp || processor == _meter || processor == _main_outs) {
1255 ChanCount old_pms = processor_max_streams;
1257 if (!_session.engine().connected()) {
1261 processor_max_streams.reset();
1264 Glib::RWLock::WriterLock lm (_processor_lock);
1265 ProcessorList::iterator i;
1266 bool removed = false;
1268 for (i = _processors.begin(); i != _processors.end(); ) {
1269 if (*i == processor) {
1271 /* move along, see failure case for configure_processors()
1272 where we may need to reconfigure the processor.
1275 /* stop redirects that send signals to JACK ports
1276 from causing noise as a result of no longer being
1280 boost::shared_ptr<IOProcessor> iop;
1282 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1284 iop->input()->disconnect (this);
1286 if (iop->output()) {
1287 iop->output()->disconnect (this);
1291 i = _processors.erase (i);
1299 _output->set_user_latency (0);
1307 if (configure_processors_unlocked (err)) {
1308 /* get back to where we where */
1309 _processors.insert (i, processor);
1310 /* we know this will work, because it worked before :) */
1311 configure_processors_unlocked (0);
1315 _have_internal_generator = false;
1317 for (i = _processors.begin(); i != _processors.end(); ++i) {
1318 boost::shared_ptr<PluginInsert> pi;
1320 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1321 if (pi->is_generator()) {
1322 _have_internal_generator = true;
1329 processor->drop_references ();
1330 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1336 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1338 ProcessorList deleted;
1340 if (!_session.engine().connected()) {
1344 processor_max_streams.reset();
1347 Glib::RWLock::WriterLock lm (_processor_lock);
1348 ProcessorList::iterator i;
1349 boost::shared_ptr<Processor> processor;
1351 ProcessorList as_we_were = _processors;
1353 for (i = _processors.begin(); i != _processors.end(); ) {
1357 /* these can never be removed */
1359 if (processor == _amp || processor == _meter || processor == _main_outs) {
1364 /* see if its in the list of processors to delete */
1366 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1371 /* stop IOProcessors that send to JACK ports
1372 from causing noise as a result of no longer being
1376 boost::shared_ptr<IOProcessor> iop;
1378 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1382 deleted.push_back (processor);
1383 i = _processors.erase (i);
1386 if (deleted.empty()) {
1387 /* none of those in the requested list were found */
1391 _output->set_user_latency (0);
1393 if (configure_processors_unlocked (err)) {
1394 /* get back to where we where */
1395 _processors = as_we_were;
1396 /* we know this will work, because it worked before :) */
1397 configure_processors_unlocked (0);
1401 _have_internal_generator = false;
1403 for (i = _processors.begin(); i != _processors.end(); ++i) {
1404 boost::shared_ptr<PluginInsert> pi;
1406 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1407 if (pi->is_generator()) {
1408 _have_internal_generator = true;
1415 /* now try to do what we need to so that those that were removed will be deleted */
1417 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1418 (*i)->drop_references ();
1421 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1428 Route::configure_processors (ProcessorStreams* err)
1430 if (!_in_configure_processors) {
1431 Glib::RWLock::WriterLock lm (_processor_lock);
1432 return configure_processors_unlocked (err);
1438 Route::input_streams () const
1440 return _input->n_ports ();
1443 /** Configure the input/output configuration of each processor in the processors list.
1444 * Return 0 on success, otherwise configuration is impossible.
1447 Route::configure_processors_unlocked (ProcessorStreams* err)
1449 if (_in_configure_processors) {
1453 _in_configure_processors = true;
1455 // Check each processor in order to see if we can configure as requested
1456 ChanCount in = input_streams ();
1458 list< pair<ChanCount,ChanCount> > configuration;
1461 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1463 DEBUG_TRACE (DEBUG::Processors, "{\n");
1464 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1465 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1467 DEBUG_TRACE (DEBUG::Processors, "}\n");
1470 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1472 if ((*p)->can_support_io_configuration(in, out)) {
1473 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
1474 configuration.push_back(make_pair(in, out));
1481 _in_configure_processors = false;
1486 // We can, so configure everything
1487 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1488 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1489 (*p)->configure_io(c->first, c->second);
1490 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1491 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1496 _meter->reset_max_channels (processor_max_streams);
1499 /* make sure we have sufficient scratch buffers to cope with the new processor
1502 Glib::Mutex::Lock em (_session.engine().process_lock ());
1503 _session.ensure_buffers (n_process_buffers ());
1506 _in_configure_processors = false;
1511 Route::all_processors_flip ()
1513 Glib::RWLock::ReaderLock lm (_processor_lock);
1515 if (_processors.empty()) {
1519 bool first_is_on = _processors.front()->active();
1521 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1523 (*i)->deactivate ();
1529 _session.set_dirty ();
1532 /** Set all processors with a given placement to a given active state.
1533 * @param p Placement of processors to change.
1534 * @param state New active state for those processors.
1537 Route::all_processors_active (Placement p, bool state)
1539 Glib::RWLock::ReaderLock lm (_processor_lock);
1541 if (_processors.empty()) {
1544 ProcessorList::iterator start, end;
1545 placement_range(p, start, end);
1547 bool before_amp = true;
1548 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1553 if (p == PreFader && before_amp) {
1557 (*i)->deactivate ();
1562 _session.set_dirty ();
1566 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1568 bool pre_fader = true;
1569 Glib::RWLock::ReaderLock lm (_processor_lock);
1571 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1573 /* semantic note: if p == amp, we want to return true, so test
1574 for equality before checking if this is the amp
1591 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1593 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1594 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1595 processors in the current actual processor list that are hidden. Any visible processors
1596 in the current list but not in "new_order" will be assumed to be deleted.
1600 Glib::RWLock::WriterLock lm (_processor_lock);
1601 ChanCount old_pms = processor_max_streams;
1602 ProcessorList::iterator oiter;
1603 ProcessorList::const_iterator niter;
1604 ProcessorList as_it_was_before = _processors;
1605 ProcessorList as_it_will_be;
1607 oiter = _processors.begin();
1608 niter = new_order.begin();
1610 while (niter != new_order.end()) {
1612 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1613 then append it to the temp list.
1615 Otherwise, see if the next processor in the old list is in the new list. if not,
1616 its been deleted. If its there, append it to the temp list.
1619 if (oiter == _processors.end()) {
1621 /* no more elements in the old list, so just stick the rest of
1622 the new order onto the temp list.
1625 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1626 while (niter != new_order.end()) {
1633 if (!(*oiter)->display_to_user()) {
1635 as_it_will_be.push_back (*oiter);
1639 /* visible processor: check that its in the new order */
1641 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1642 /* deleted: do nothing, shared_ptr<> will clean up */
1644 /* ignore this one, and add the next item from the new order instead */
1645 as_it_will_be.push_back (*niter);
1650 /* now remove from old order - its taken care of no matter what */
1651 oiter = _processors.erase (oiter);
1656 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1658 if (configure_processors_unlocked (err)) {
1659 _processors = as_it_was_before;
1660 processor_max_streams = old_pms;
1666 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1679 Route::get_template()
1681 return state(false);
1685 Route::state(bool full_state)
1687 XMLNode *node = new XMLNode("Route");
1688 ProcessorList::iterator i;
1691 id().print (buf, sizeof (buf));
1692 node->add_property("id", buf);
1693 node->add_property ("name", _name);
1694 node->add_property("default-type", _default_type.to_string());
1697 node->add_property("flags", enum_2_string (_flags));
1700 node->add_property("active", _active?"yes":"no");
1701 node->add_property("phase-invert", _phase_invert?"yes":"no");
1702 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1703 node->add_property("meter-point", enum_2_string (_meter_point));
1706 node->add_property("route-group", _route_group->name());
1709 string order_string;
1710 OrderKeys::iterator x = order_keys.begin();
1712 while (x != order_keys.end()) {
1713 order_string += string ((*x).first);
1714 order_string += '=';
1715 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1716 order_string += buf;
1720 if (x == order_keys.end()) {
1724 order_string += ':';
1726 node->add_property ("order-keys", order_string);
1727 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1728 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1729 node->add_property ("soloed-by-upstream", buf);
1730 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1731 node->add_property ("soloed-by-downstream", buf);
1733 node->add_child_nocopy (_input->state (full_state));
1734 node->add_child_nocopy (_output->state (full_state));
1735 node->add_child_nocopy (_solo_control->get_state ());
1736 node->add_child_nocopy (_mute_master->get_state ());
1738 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1739 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1740 remote_control_node->add_property (X_("id"), buf);
1741 node->add_child_nocopy (*remote_control_node);
1743 if (_comment.length()) {
1744 XMLNode *cmt = node->add_child ("Comment");
1745 cmt->add_content (_comment);
1748 for (i = _processors.begin(); i != _processors.end(); ++i) {
1749 node->add_child_nocopy((*i)->state (full_state));
1753 node->add_child_copy (*_extra_xml);
1760 Route::set_state (const XMLNode& node, int version)
1762 return _set_state (node, version, true);
1766 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1768 if (version < 3000) {
1769 return _set_state_2X (node, version);
1773 XMLNodeConstIterator niter;
1775 XMLPropertyList plist;
1776 const XMLProperty *prop;
1778 if (node.name() != "Route"){
1779 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1783 if ((prop = node.property (X_("name"))) != 0) {
1784 Route::set_name (prop->value());
1787 if ((prop = node.property ("id")) != 0) {
1788 _id = prop->value ();
1791 if ((prop = node.property (X_("flags"))) != 0) {
1792 _flags = Flag (string_2_enum (prop->value(), _flags));
1797 if (is_master() || is_monitor() || is_hidden()) {
1798 _mute_master->set_solo_ignore (true);
1801 /* add all processors (except amp, which is always present) */
1803 nlist = node.children();
1804 XMLNode processor_state (X_("processor_state"));
1806 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1810 if (child->name() == IO::state_node_name) {
1811 if ((prop = child->property (X_("direction"))) == 0) {
1815 if (prop->value() == "Input") {
1816 _input->set_state (*child, version);
1817 } else if (prop->value() == "Output") {
1818 _output->set_state (*child, version);
1822 if (child->name() == X_("Processor")) {
1823 processor_state.add_child_copy (*child);
1827 set_processor_state (processor_state);
1829 if ((prop = node.property ("self-solo")) != 0) {
1830 set_self_solo (string_is_affirmative (prop->value()));
1833 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1834 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1835 mod_solo_by_others_upstream (atoi (prop->value()));
1838 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1839 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1840 mod_solo_by_others_downstream (atoi (prop->value()));
1843 if ((prop = node.property ("solo-isolated")) != 0) {
1844 set_solo_isolated (string_is_affirmative (prop->value()), this);
1847 if ((prop = node.property (X_("phase-invert"))) != 0) {
1848 set_phase_invert (string_is_affirmative (prop->value()));
1851 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1852 set_denormal_protection (string_is_affirmative (prop->value()));
1855 if ((prop = node.property (X_("active"))) != 0) {
1856 bool yn = string_is_affirmative (prop->value());
1857 _active = !yn; // force switch
1861 if ((prop = node.property (X_("meter-point"))) != 0) {
1862 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1863 set_meter_point (mp);
1865 _meter->set_display_to_user (_meter_point == MeterCustom);
1869 if ((prop = node.property (X_("order-keys"))) != 0) {
1873 string::size_type colon, equal;
1874 string remaining = prop->value();
1876 while (remaining.length()) {
1878 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1879 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1882 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1883 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1886 set_order_key (remaining.substr (0, equal), n);
1890 colon = remaining.find_first_of (':');
1892 if (colon != string::npos) {
1893 remaining = remaining.substr (colon+1);
1900 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1903 if (child->name() == X_("Comment")) {
1905 /* XXX this is a terrible API design in libxml++ */
1907 XMLNode *cmt = *(child->children().begin());
1908 _comment = cmt->content();
1910 } else if (child->name() == X_("Extra")) {
1912 _extra_xml = new XMLNode (*child);
1914 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1916 if (prop->value() == "solo") {
1917 _solo_control->set_state (*child, version);
1918 _session.add_controllable (_solo_control);
1921 } else if (child->name() == X_("RemoteControl")) {
1922 if ((prop = child->property (X_("id"))) != 0) {
1924 sscanf (prop->value().c_str(), "%d", &x);
1925 set_remote_control_id (x);
1928 } else if (child->name() == X_("MuteMaster")) {
1929 _mute_master->set_state (*child, version);
1937 Route::_set_state_2X (const XMLNode& node, int version)
1940 XMLNodeConstIterator niter;
1942 XMLPropertyList plist;
1943 const XMLProperty *prop;
1945 /* 2X things which still remain to be handled:
1951 if (node.name() != "Route") {
1952 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1956 if ((prop = node.property (X_("flags"))) != 0) {
1957 _flags = Flag (string_2_enum (prop->value(), _flags));
1962 if ((prop = node.property (X_("phase-invert"))) != 0) {
1963 set_phase_invert (string_is_affirmative (prop->value()));
1966 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1967 set_denormal_protection (string_is_affirmative (prop->value()));
1970 if ((prop = node.property (X_("soloed"))) != 0) {
1971 bool yn = string_is_affirmative (prop->value());
1973 /* XXX force reset of solo status */
1975 set_solo (yn, this);
1978 if ((prop = node.property (X_("muted"))) != 0) {
1981 bool muted = string_is_affirmative (prop->value());
1987 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1989 if (string_is_affirmative (prop->value())){
1990 mute_point = mute_point + "PreFader";
1995 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1997 if (string_is_affirmative (prop->value())){
2000 mute_point = mute_point + ",";
2003 mute_point = mute_point + "PostFader";
2008 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2010 if (string_is_affirmative (prop->value())){
2013 mute_point = mute_point + ",";
2016 mute_point = mute_point + "Listen";
2021 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2023 if (string_is_affirmative (prop->value())){
2026 mute_point = mute_point + ",";
2029 mute_point = mute_point + "Main";
2033 _mute_master->set_mute_points (mute_point);
2037 if ((prop = node.property (X_("meter-point"))) != 0) {
2038 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2041 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2042 don't mean the same thing.
2045 if ((prop = node.property (X_("order-keys"))) != 0) {
2049 string::size_type colon, equal;
2050 string remaining = prop->value();
2052 while (remaining.length()) {
2054 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2055 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2058 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2059 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2062 set_order_key (remaining.substr (0, equal), n);
2066 colon = remaining.find_first_of (':');
2068 if (colon != string::npos) {
2069 remaining = remaining.substr (colon+1);
2076 /* add standard processors */
2078 //_meter.reset (new PeakMeter (_session));
2079 //add_processor (_meter, PreFader);
2082 /* where we listen to tracks */
2083 _intreturn.reset (new InternalReturn (_session));
2084 add_processor (_intreturn, PreFader);
2086 _monitor_control.reset (new MonitorProcessor (_session));
2087 add_processor (_monitor_control, PostFader);
2090 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
2091 add_processor (_main_outs, PostFader);
2095 nlist = node.children ();
2096 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2100 if (child->name() == IO::state_node_name) {
2102 /* there is a note in IO::set_state_2X() about why we have to call
2106 _input->set_state_2X (*child, version, true);
2107 _output->set_state_2X (*child, version, false);
2109 if ((prop = child->property (X_("name"))) != 0) {
2110 Route::set_name (prop->value ());
2113 if ((prop = child->property (X_("id"))) != 0) {
2114 _id = prop->value ();
2117 if ((prop = child->property (X_("active"))) != 0) {
2118 bool yn = string_is_affirmative (prop->value());
2119 _active = !yn; // force switch
2123 if ((prop = child->property (X_("gain"))) != 0) {
2126 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2127 _amp->gain_control()->set_value (val);
2131 /* Set up Panners in the IO */
2132 XMLNodeList io_nlist = child->children ();
2134 XMLNodeConstIterator io_niter;
2137 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2139 io_child = *io_niter;
2141 if (io_child->name() == X_("Panner")) {
2142 _main_outs->panner()->set_state(*io_child, version);
2148 XMLNodeList redirect_nodes;
2150 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2154 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2155 redirect_nodes.push_back(child);
2160 set_processor_state_2X (redirect_nodes, version);
2162 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2165 if (child->name() == X_("Comment")) {
2167 /* XXX this is a terrible API design in libxml++ */
2169 XMLNode *cmt = *(child->children().begin());
2170 _comment = cmt->content();
2172 } else if (child->name() == X_("Extra")) {
2174 _extra_xml = new XMLNode (*child);
2176 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2178 if (prop->value() == "solo") {
2179 _solo_control->set_state (*child, version);
2180 _session.add_controllable (_solo_control);
2183 } else if (child->name() == X_("RemoteControl")) {
2184 if ((prop = child->property (X_("id"))) != 0) {
2186 sscanf (prop->value().c_str(), "%d", &x);
2187 set_remote_control_id (x);
2197 Route::get_processor_state ()
2199 XMLNode* root = new XMLNode (X_("redirects"));
2200 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2201 root->add_child_nocopy ((*i)->state (true));
2208 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2210 /* We don't bother removing existing processors not in nList, as this
2211 method will only be called when creating a Route from scratch, not
2212 for undo purposes. Just put processors in at the appropriate place
2216 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2217 add_processor_from_xml_2X (**i, version, _processors.begin ());
2222 Route::set_processor_state (const XMLNode& node)
2224 const XMLNodeList &nlist = node.children();
2225 XMLNodeConstIterator niter;
2226 ProcessorList new_order;
2227 bool must_configure = false;
2229 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2231 XMLProperty* prop = (*niter)->property ("type");
2233 if (prop->value() == "amp") {
2234 _amp->set_state (**niter, Stateful::current_state_version);
2235 new_order.push_back (_amp);
2236 } else if (prop->value() == "meter") {
2237 _meter->set_state (**niter, Stateful::current_state_version);
2238 new_order.push_back (_meter);
2239 } else if (prop->value() == "main-outs") {
2240 _main_outs->set_state (**niter, Stateful::current_state_version);
2241 new_order.push_back (_main_outs);
2242 } else if (prop->value() == "intreturn") {
2244 _intreturn.reset (new InternalReturn (_session));
2245 must_configure = true;
2247 _intreturn->set_state (**niter, Stateful::current_state_version);
2248 new_order.push_back (_intreturn);
2249 } else if (is_monitor() && prop->value() == "monitor") {
2250 if (!_monitor_control) {
2251 _monitor_control.reset (new MonitorProcessor (_session));
2252 must_configure = true;
2254 _monitor_control->set_state (**niter, Stateful::current_state_version);
2255 new_order.push_back (_monitor_control);
2257 ProcessorList::iterator o;
2259 for (o = _processors.begin(); o != _processors.end(); ++o) {
2260 XMLProperty* id_prop = (*niter)->property(X_("id"));
2261 if (id_prop && (*o)->id() == id_prop->value()) {
2262 (*o)->set_state (**niter, Stateful::current_state_version);
2263 new_order.push_back (*o);
2268 // If the processor (*niter) is not on the route then create it
2270 if (o == _processors.end()) {
2272 boost::shared_ptr<Processor> processor;
2274 if (prop->value() == "intsend") {
2276 processor.reset (new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2278 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2279 prop->value() == "lv2" ||
2280 prop->value() == "vst" ||
2281 prop->value() == "audiounit") {
2283 processor.reset (new PluginInsert(_session));
2285 } else if (prop->value() == "port") {
2287 processor.reset (new PortInsert (_session, _mute_master));
2289 } else if (prop->value() == "send") {
2291 processor.reset (new Send (_session, _mute_master));
2294 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2298 processor->set_state (**niter, Stateful::current_state_version);
2299 new_order.push_back (processor);
2300 must_configure = true;
2306 Glib::RWLock::WriterLock lm (_processor_lock);
2307 _processors = new_order;
2308 if (must_configure) {
2309 configure_processors_unlocked (0);
2313 processors_changed (RouteProcessorChange ());
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::check_physical_connections ()
2590 _physically_connected = _output->physically_connected ();
2594 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2596 nframes_t now = _session.transport_frame();
2599 Glib::RWLock::ReaderLock lm (_processor_lock);
2602 automation_snapshot (now, true);
2605 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2607 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2608 (*i)->deactivate ();
2612 (*i)->transport_stopped (now);
2616 _roll_delay = _initial_delay;
2620 Route::input_change_handler (IOChange change, void * /*src*/)
2622 if ((change & ConfigurationChanged)) {
2623 configure_processors (0);
2628 Route::output_change_handler (IOChange change, void * /*src*/)
2630 if ((change & ConfigurationChanged)) {
2632 /* XXX resize all listeners to match _main_outs? */
2634 // configure_processors (0);
2639 Route::pans_required () const
2641 if (n_outputs().n_audio() < 2) {
2645 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2649 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2650 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2652 if (n_outputs().n_total() == 0) {
2656 if (!_active || n_inputs() == ChanCount::ZERO) {
2660 if (session_state_changing) {
2661 if (_session.transport_speed() != 0.0f) {
2662 /* we're rolling but some state is changing (e.g. our diskstream contents)
2663 so we cannot use them. Be silent till this is over.
2665 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2670 /* we're really not rolling, so we're either delivery silence or actually
2671 monitoring, both of which are safe to do while session_state_changing is true.
2675 _amp->apply_gain_automation (false);
2676 passthru (start_frame, end_frame, nframes, 0);
2682 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2684 if (_roll_delay > nframes) {
2686 _roll_delay -= nframes;
2688 /* transport frame is not legal for caller to use */
2691 } else if (_roll_delay > 0) {
2693 nframes -= _roll_delay;
2694 silence (_roll_delay);
2695 /* we've written _roll_delay of samples into the
2696 output ports, so make a note of that for
2699 _main_outs->increment_output_offset (_roll_delay);
2700 transport_frame += _roll_delay;
2709 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2710 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2713 // automation snapshot can also be called from the non-rt context
2714 // and it uses the processor list, so we try to acquire the lock here
2715 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2718 automation_snapshot (_session.transport_frame(), false);
2722 if (n_outputs().n_total() == 0) {
2726 if (!_active || n_inputs().n_total() == 0) {
2731 nframes_t unused = 0;
2733 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2739 passthru (start_frame, end_frame, nframes, declick);
2745 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2746 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2753 Route::toggle_monitor_input ()
2755 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2756 i->ensure_monitor_input( ! i->monitoring_input());
2761 Route::has_external_redirects () const
2763 // FIXME: what about sends? - they don't return a signal back to ardour?
2765 boost::shared_ptr<const PortInsert> pi;
2767 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2769 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2771 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2773 string port_name = port->name();
2774 string client_name = port_name.substr (0, port_name.find(':'));
2776 /* only say "yes" if the redirect is actually in use */
2778 if (client_name != "ardour" && pi->active()) {
2789 Route::flush_processors ()
2791 /* XXX shouldn't really try to take this lock, since
2792 this is called from the RT audio thread.
2795 Glib::RWLock::ReaderLock lm (_processor_lock);
2797 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2798 (*i)->deactivate ();
2804 Route::set_meter_point (MeterPoint p)
2806 /* CAN BE CALLED FROM PROCESS CONTEXT */
2808 if (_meter_point == p) {
2812 bool meter_was_visible_to_user = _meter->display_to_user ();
2815 Glib::RWLock::WriterLock lm (_processor_lock);
2817 if (p != MeterCustom) {
2818 // Move meter in the processors list to reflect the new position
2819 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2820 _processors.erase(loc);
2823 loc = _processors.begin();
2826 loc = find (_processors.begin(), _processors.end(), _amp);
2828 case MeterPostFader:
2829 loc = _processors.end();
2837 if (loc == _processors.begin()) {
2838 m_in = _input->n_ports();
2840 ProcessorList::iterator before = loc;
2842 m_in = (*before)->output_streams ();
2845 _meter->reflect_inputs (m_in);
2847 _processors.insert (loc, _meter);
2849 /* we do not need to reconfigure the processors, because the meter
2850 (a) is always ready to handle processor_max_streams
2851 (b) is always an N-in/N-out processor, and thus moving
2852 it doesn't require any changes to the other processors.
2855 _meter->set_display_to_user (false);
2859 // just make it visible and let the user move it
2861 _meter->set_display_to_user (true);
2866 meter_change (); /* EMIT SIGNAL */
2868 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2870 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2874 Route::put_monitor_send_at (Placement p)
2876 if (!_monitor_send) {
2881 Glib::RWLock::WriterLock lm (_processor_lock);
2882 ProcessorList as_it_was (_processors);
2883 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _monitor_send);
2884 _processors.erase(loc);
2888 loc = find(_processors.begin(), _processors.end(), _amp);
2889 if (loc != _processors.begin()) {
2894 loc = _processors.end();
2898 _processors.insert (loc, _monitor_send);
2900 if (configure_processors_unlocked (0)) {
2901 _processors = as_it_was;
2902 configure_processors_unlocked (0); // it worked before we tried to add it ...
2907 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2908 _session.set_dirty ();
2912 Route::update_total_latency ()
2914 nframes_t old = _output->effective_latency();
2915 nframes_t own_latency = _output->user_latency();
2917 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2918 if ((*i)->active ()) {
2919 own_latency += (*i)->signal_latency ();
2923 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2925 _output->set_port_latency (own_latency);
2927 if (_output->user_latency() == 0) {
2929 /* this (virtual) function is used for pure Routes,
2930 not derived classes like AudioTrack. this means
2931 that the data processed here comes from an input
2932 port, not prerecorded material, and therefore we
2933 have to take into account any input latency.
2936 own_latency += _input->signal_latency ();
2939 if (old != own_latency) {
2940 _output->set_latency_delay (own_latency);
2941 signal_latency_changed (); /* EMIT SIGNAL */
2944 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2946 return _output->effective_latency ();
2950 Route::set_user_latency (nframes_t nframes)
2952 _output->set_user_latency (nframes);
2953 _session.update_latency_compensation (false, false);
2957 Route::set_latency_delay (nframes_t longest_session_latency)
2959 nframes_t old = _initial_delay;
2961 if (_output->effective_latency() < longest_session_latency) {
2962 _initial_delay = longest_session_latency - _output->effective_latency();
2967 if (_initial_delay != old) {
2968 initial_delay_changed (); /* EMIT SIGNAL */
2971 if (_session.transport_stopped()) {
2972 _roll_delay = _initial_delay;
2977 Route::automation_snapshot (nframes_t now, bool force)
2979 panner()->automation_snapshot (now, force);
2981 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2982 (*i)->automation_snapshot (now, force);
2986 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2987 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2988 boost::shared_ptr<AutomationList>(), name)
2991 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2996 Route::SoloControllable::set_value (float val)
2998 bool bval = ((val >= 0.5f) ? true: false);
3000 this is how it should be done
3002 boost::shared_ptr<RouteList> rl (new RouteList);
3003 rl->push_back (route);
3005 if (Config->get_solo_control_is_listen_control()) {
3006 _session.set_listen (rl, bval);
3008 _session.set_solo (rl, bval);
3011 route.set_solo (bval, this);
3016 Route::SoloControllable::get_value (void) const
3018 if (Config->get_solo_control_is_listen_control()) {
3019 return route.listening() ? 1.0f : 0.0f;
3021 return route.self_soloed() ? 1.0f : 0.0f;
3025 Route::MuteControllable::MuteControllable (std::string name, Route& r)
3026 : AutomationControl (r.session(), Evoral::Parameter (MuteAutomation),
3027 boost::shared_ptr<AutomationList>(), name)
3030 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3035 Route::MuteControllable::set_value (float val)
3037 bool bval = ((val >= 0.5f) ? true: false);
3039 this is how it should be done
3041 boost::shared_ptr<RouteList> rl (new RouteList);
3042 rl->push_back (route);
3043 _session.set_mute (rl, bval);
3045 route.set_mute (bval, this);
3050 Route::MuteControllable::get_value (void) const
3052 return route.muted() ? 1.0f : 0.0f;
3056 Route::set_block_size (nframes_t nframes)
3058 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3059 (*i)->set_block_size (nframes);
3062 _session.ensure_buffers (n_process_buffers ());
3066 Route::protect_automation ()
3068 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3069 (*i)->protect_automation();
3073 Route::set_pending_declick (int declick)
3076 /* this call is not allowed to turn off a pending declick unless "force" is true */
3078 _pending_declick = declick;
3080 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3082 _pending_declick = 0;
3087 /** Shift automation forwards from a particular place, thereby inserting time.
3088 * Adds undo commands for any shifts that are performed.
3090 * @param pos Position to start shifting from.
3091 * @param frames Amount to shift forwards by.
3095 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
3097 #ifdef THIS_NEEDS_FIXING_FOR_V3
3099 /* gain automation */
3100 XMLNode &before = _gain_control->get_state ();
3101 _gain_control->shift (pos, frames);
3102 XMLNode &after = _gain_control->get_state ();
3103 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
3105 /* pan automation */
3106 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
3107 Curve & c = (*i)->automation ();
3108 XMLNode &before = c.get_state ();
3109 c.shift (pos, frames);
3110 XMLNode &after = c.get_state ();
3111 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
3114 /* redirect automation */
3116 Glib::RWLock::ReaderLock lm (redirect_lock);
3117 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
3120 (*i)->what_has_automation (a);
3122 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
3123 AutomationList & al = (*i)->automation_list (*j);
3124 XMLNode &before = al.get_state ();
3125 al.shift (pos, frames);
3126 XMLNode &after = al.get_state ();
3127 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
3137 Route::save_as_template (const string& path, const string& name)
3139 XMLNode& node (state (false));
3142 IO::set_name_in_state (*node.children().front(), name);
3144 tree.set_root (&node);
3145 return tree.write (path.c_str());
3150 Route::set_name (const string& str)
3156 name = Route::ensure_track_or_route_name (str, _session);
3157 SessionObject::set_name (name);
3159 ret = (_input->set_name(name) && _output->set_name(name));
3163 Glib::RWLock::ReaderLock lm (_processor_lock);
3165 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3167 /* rename all I/O processors that have inputs or outputs */
3169 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3171 if (iop && (iop->output() || iop->input())) {
3172 if (!iop->set_name (name)) {
3183 boost::shared_ptr<Send>
3184 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3186 Glib::RWLock::ReaderLock lm (_processor_lock);
3188 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3189 boost::shared_ptr<InternalSend> send;
3191 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3192 if (send->target_route() == target) {
3198 return boost::shared_ptr<Send>();
3202 Route::set_phase_invert (bool yn)
3204 if (_phase_invert != yn) {
3206 _phase_invert = 0xffff; // XXX all channels
3208 _phase_invert = 0; // XXX no channels
3211 phase_invert_changed (); /* EMIT SIGNAL */
3212 _session.set_dirty ();
3217 Route::phase_invert () const
3219 return _phase_invert != 0;
3223 Route::set_denormal_protection (bool yn)
3225 if (_denormal_protection != yn) {
3226 _denormal_protection = yn;
3227 denormal_protection_changed (); /* EMIT SIGNAL */
3232 Route::denormal_protection () const
3234 return _denormal_protection;
3238 Route::set_active (bool yn)
3240 if (_active != yn) {
3242 _input->set_active (yn);
3243 _output->set_active (yn);
3244 active_changed (); // EMIT SIGNAL
3251 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3257 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3259 boost::shared_ptr<Send> s;
3260 boost::shared_ptr<Return> r;
3262 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3263 s->meter()->meter();
3264 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3265 r->meter()->meter ();
3270 boost::shared_ptr<Panner>
3271 Route::panner() const
3273 return _main_outs->panner();
3276 boost::shared_ptr<AutomationControl>
3277 Route::gain_control() const
3279 return _amp->gain_control();
3282 boost::shared_ptr<AutomationControl>
3283 Route::get_control (const Evoral::Parameter& param)
3285 /* either we own the control or .... */
3287 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3291 /* maybe one of our processors does or ... */
3293 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3294 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3295 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3303 /* nobody does so we'll make a new one */
3305 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3312 boost::shared_ptr<Processor>
3313 Route::nth_plugin (uint32_t n)
3315 Glib::RWLock::ReaderLock lm (_processor_lock);
3316 ProcessorList::iterator i;
3318 for (i = _processors.begin(); i != _processors.end(); ++i) {
3319 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3326 return boost::shared_ptr<Processor> ();
3329 boost::shared_ptr<Processor>
3330 Route::nth_send (uint32_t n)
3332 Glib::RWLock::ReaderLock lm (_processor_lock);
3333 ProcessorList::iterator i;
3335 for (i = _processors.begin(); i != _processors.end(); ++i) {
3336 if (boost::dynamic_pointer_cast<Send> (*i)) {
3343 return boost::shared_ptr<Processor> ();
3347 Route::has_io_processor_named (const string& name)
3349 Glib::RWLock::ReaderLock lm (_processor_lock);
3350 ProcessorList::iterator i;
3352 for (i = _processors.begin(); i != _processors.end(); ++i) {
3353 if (boost::dynamic_pointer_cast<Send> (*i) ||
3354 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3355 if ((*i)->name() == name) {
3365 Route::set_graph_level (int32_t l)