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"
61 #include "ardour/graph.h"
66 using namespace ARDOUR;
69 uint32_t Route::order_key_cnt = 0;
70 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
71 PBD::Signal0<void> Route::RemoteControlIDChange;
73 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
74 : SessionObject (sess, name)
76 , GraphNode( sess.route_graph )
81 , _pending_declick (true)
82 , _meter_point (MeterPostFader)
85 , _soloed_by_others_upstream (0)
86 , _soloed_by_others_downstream (0)
88 , _denormal_protection (false)
91 , _declickable (false)
92 , _solo_control (new SoloControllable (X_("solo"), *this))
93 , _mute_control (new MuteControllable (X_("mute"), *this))
94 , _mute_master (new MuteMaster (sess, name))
95 , _have_internal_generator (false)
97 , _default_type (default_type)
98 , _remote_control_id (0)
99 , _in_configure_processors (false)
101 processor_max_streams.reset();
102 order_keys[N_("signal")] = order_key_cnt++;
108 /* add standard controls */
110 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
111 _mute_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
113 add_control (_solo_control);
114 add_control (_mute_control);
116 /* input and output objects */
118 _input.reset (new IO (_session, _name, IO::Input, _default_type));
119 _output.reset (new IO (_session, _name, IO::Output, _default_type));
121 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
122 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
124 /* add amp processor */
126 _amp.reset (new Amp (_session));
127 add_processor (_amp, PostFader);
129 /* add standard processors: meter, main outs, monitor out */
131 _meter.reset (new PeakMeter (_session));
132 _meter->set_display_to_user (false);
134 add_processor (_meter, PostFader);
136 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
138 add_processor (_main_outs, PostFader);
141 /* where we listen to tracks */
142 _intreturn.reset (new InternalReturn (_session));
143 add_processor (_intreturn, PreFader);
145 ProcessorList::iterator i;
147 for (i = _processors.begin(); i != _processors.end(); ++i) {
148 if (*i == _intreturn) {
154 /* the thing that provides proper control over a control/monitor/listen bus
155 (such as per-channel cut, dim, solo, invert, etc).
156 It always goes right after the internal return;
158 _monitor_control.reset (new MonitorProcessor (_session));
159 add_processor (_monitor_control, i);
161 /* no panning on the monitor main outs */
163 _main_outs->panner()->set_bypassed (true);
166 if (is_master() || is_monitor() || is_hidden()) {
167 _mute_master->set_solo_ignore (true);
170 /* now that we have _meter, its safe to connect to this */
172 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
179 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
181 /* do this early so that we don't get incoming signals as we are going through destruction
186 /* don't use clear_processors here, as it depends on the session which may
187 be half-destroyed by now
190 Glib::RWLock::WriterLock lm (_processor_lock);
191 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
192 (*i)->drop_references ();
195 _processors.clear ();
199 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
201 if (id != _remote_control_id) {
202 _remote_control_id = id;
203 RemoteControlIDChanged ();
204 if (notify_class_listeners) {
205 RemoteControlIDChange ();
211 Route::remote_control_id() const
213 return _remote_control_id;
217 Route::order_key (std::string const & name) const
219 OrderKeys::const_iterator i = order_keys.find (name);
220 if (i == order_keys.end()) {
228 Route::set_order_key (std::string const & name, long n)
230 order_keys[name] = n;
232 if (Config->get_sync_all_route_ordering()) {
233 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
238 _session.set_dirty ();
241 /** Set all order keys to be the same as that for `base', if such a key
242 * exists in this route.
243 * @param base Base key.
246 Route::sync_order_keys (std::string const & base)
248 if (order_keys.empty()) {
252 OrderKeys::iterator i;
255 if ((i = order_keys.find (base)) == order_keys.end()) {
256 /* key doesn't exist, use the first existing key (during session initialization) */
257 i = order_keys.begin();
261 /* key exists - use it and reset all others (actually, itself included) */
263 i = order_keys.begin();
266 for (; i != order_keys.end(); ++i) {
272 Route::ensure_track_or_route_name(string name, Session &session)
274 string newname = name;
276 while (!session.io_name_is_legal (newname)) {
277 newname = bump_name_once (newname, '.');
285 Route::inc_gain (gain_t fraction, void *src)
287 _amp->inc_gain (fraction, src);
291 Route::set_gain (gain_t val, void *src)
293 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
295 if (_route_group->is_relative()) {
297 gain_t usable_gain = _amp->gain();
298 if (usable_gain < 0.000001f) {
299 usable_gain = 0.000001f;
303 if (delta < 0.000001f) {
307 delta -= usable_gain;
312 gain_t factor = delta / usable_gain;
315 factor = _route_group->get_max_factor(factor);
316 if (factor == 0.0f) {
317 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
321 factor = _route_group->get_min_factor(factor);
322 if (factor == 0.0f) {
323 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
328 _route_group->apply (&Route::inc_gain, factor, _route_group);
332 _route_group->apply (&Route::set_gain, val, _route_group);
338 if (val == _amp->gain()) {
342 _amp->set_gain (val, src);
345 /** Process this route for one (sub) cycle (process thread)
347 * @param bufs Scratch buffers to use for the signal path
348 * @param start_frame Initial transport frame
349 * @param end_frame Final transport frame
350 * @param nframes Number of frames to output (to ports)
352 * Note that (end_frame - start_frame) may not be equal to nframes when the
353 * transport speed isn't 1.0 (eg varispeed).
356 Route::process_output_buffers (BufferSet& bufs,
357 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
358 bool /*with_processors*/, int declick)
362 bufs.is_silent (false);
364 switch (Config->get_monitoring_model()) {
365 case HardwareMonitoring:
366 case ExternalMonitoring:
367 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
374 declick = _pending_declick;
377 /* figure out if we're going to use gain automation */
378 _amp->setup_gain_automation (start_frame, end_frame, nframes);
381 /* tell main outs what to do about monitoring */
382 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
385 /* -------------------------------------------------------------------------------------------
386 GLOBAL DECLICK (for transport changes etc.)
387 ----------------------------------------------------------------------------------------- */
390 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
391 } else if (declick < 0) {
392 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
395 _pending_declick = 0;
397 /* -------------------------------------------------------------------------------------------
398 DENORMAL CONTROL/PHASE INVERT
399 ----------------------------------------------------------------------------------------- */
405 if (_denormal_protection || Config->get_denormal_protection()) {
407 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
408 Sample* const sp = i->data();
410 if (_phase_invert & chn) {
411 for (nframes_t nx = 0; nx < nframes; ++nx) {
416 for (nframes_t nx = 0; nx < nframes; ++nx) {
424 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
425 Sample* const sp = i->data();
427 if (_phase_invert & (1<<chn)) {
428 for (nframes_t nx = 0; nx < nframes; ++nx) {
437 if (_denormal_protection || Config->get_denormal_protection()) {
439 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
440 Sample* const sp = i->data();
441 for (nframes_t nx = 0; nx < nframes; ++nx) {
449 /* -------------------------------------------------------------------------------------------
451 ----------------------------------------------------------------------------------------- */
453 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
455 if (bufs.count() != (*i)->input_streams()) {
456 cerr << _name << " bufs = " << bufs.count()
457 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
460 assert (bufs.count() == (*i)->input_streams());
462 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
463 bufs.set_count ((*i)->output_streams());
468 Route::n_process_buffers ()
470 return max (_input->n_ports(), processor_max_streams);
474 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
476 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
480 assert (bufs.available() >= input_streams());
482 if (_input->n_ports() == ChanCount::ZERO) {
483 silence_unlocked (nframes);
486 bufs.set_count (input_streams());
488 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
490 /* control/monitor bus ignores input ports when something is
491 feeding the listen "stream". data will "arrive" into the
492 route from the intreturn processor element.
494 bufs.silence (nframes, 0);
498 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
500 BufferSet::iterator o = bufs.begin(*t);
501 PortSet& ports (_input->ports());
503 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
504 o->read_from (i->get_buffer(nframes), nframes);
509 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
510 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
514 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
516 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
517 bufs.set_count (_input->n_ports());
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::set_listen (bool yn, void* src)
530 if (yn != _monitor_send->active()) {
532 _monitor_send->activate ();
533 _mute_master->set_soloed (true);
535 _monitor_send->deactivate ();
536 _mute_master->set_soloed (false);
539 listen_changed (src); /* EMIT SIGNAL */
545 Route::listening () const
548 return _monitor_send->active ();
555 Route::set_solo_safe (bool yn, void *src)
557 if (_solo_safe != yn) {
559 solo_safe_changed (src);
564 Route::solo_safe() const
570 Route::set_solo (bool yn, void *src)
576 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
577 _route_group->apply (&Route::set_solo, yn, _route_group);
581 if (self_soloed() != yn) {
583 set_mute_master_solo ();
584 solo_changed (true, src); /* EMIT SIGNAL */
585 _solo_control->Changed (); /* EMIT SIGNAL */
590 Route::set_self_solo (bool yn)
596 Route::mod_solo_by_others_upstream (int32_t delta)
602 uint32_t old_sbu = _soloed_by_others_upstream;
605 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
606 _soloed_by_others_upstream += delta;
608 _soloed_by_others_upstream = 0;
611 _soloed_by_others_upstream += delta;
614 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
615 name(), delta, _soloed_by_others_upstream, old_sbu,
616 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
618 /* push the inverse solo change to everything that feeds us.
620 This is important for solo-within-group. When we solo 1 track out of N that
621 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
622 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
623 tracks that feed it. This will silence them if they were audible because
624 of a bus solo, but the newly soloed track will still be audible (because
627 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
631 if ((_self_solo || _soloed_by_others_downstream) &&
632 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
633 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
635 if (delta > 0 || !Config->get_exclusive_solo()) {
636 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
637 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
638 boost::shared_ptr<Route> sr = i->r.lock();
640 sr->mod_solo_by_others_downstream (-delta);
646 set_mute_master_solo ();
647 solo_changed (false, this);
651 Route::mod_solo_by_others_downstream (int32_t delta)
658 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
659 _soloed_by_others_downstream += delta;
661 _soloed_by_others_downstream = 0;
664 _soloed_by_others_downstream += delta;
667 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
669 set_mute_master_solo ();
670 solo_changed (false, this);
674 Route::set_mute_master_solo ()
676 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
680 Route::set_solo_isolated (bool yn, void *src)
682 if (is_master() || is_monitor() || is_hidden()) {
686 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
687 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
691 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
693 boost::shared_ptr<RouteList> routes = _session.get_routes ();
694 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
696 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
701 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
703 if (does_feed && !sends_only) {
704 (*i)->set_solo_isolated (yn, (*i)->route_group());
708 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
710 bool changed = false;
713 if (_solo_isolated == 0) {
714 _mute_master->set_solo_ignore (true);
719 if (_solo_isolated > 0) {
721 if (_solo_isolated == 0) {
722 _mute_master->set_solo_ignore (false);
729 solo_isolated_changed (src);
734 Route::solo_isolated () const
736 return _solo_isolated > 0;
740 Route::set_mute_points (MuteMaster::MutePoint mp)
742 _mute_master->set_mute_points (mp);
743 mute_points_changed (); /* EMIT SIGNAL */
745 if (_mute_master->muted_by_self()) {
746 mute_changed (this); /* EMIT SIGNAL */
751 Route::set_mute (bool yn, void *src)
753 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
754 _route_group->apply (&Route::set_mute, yn, _route_group);
759 _mute_master->set_muted_by_self (yn);
760 mute_changed (src); /* EMIT SIGNAL */
765 Route::muted () const
767 return _mute_master->muted_by_self();
772 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
774 cerr << name << " {" << endl;
775 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
776 p != procs.end(); ++p) {
777 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
784 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
786 ProcessorList::iterator loc;
788 /* XXX this is not thread safe - we don't hold the lock across determining the iter
789 to add before and actually doing the insertion. dammit.
792 if (placement == PreFader) {
793 /* generic pre-fader: insert immediately before the amp */
794 loc = find (_processors.begin(), _processors.end(), _amp);
796 /* generic post-fader: insert right before the main outs */
797 loc = find (_processors.begin(), _processors.end(), _main_outs);
800 return add_processor (processor, loc, err);
804 /** Add a processor to the route.
805 * @a iter must point to an iterator in _processors and the new
806 * processor will be inserted immediately before this location. Otherwise,
807 * @a position is used.
810 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
812 ChanCount old_pms = processor_max_streams;
814 if (!_session.engine().connected() || !processor) {
819 Glib::RWLock::WriterLock lm (_processor_lock);
821 boost::shared_ptr<PluginInsert> pi;
822 boost::shared_ptr<PortInsert> porti;
824 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
826 if (processor == _amp || processor == _meter || processor == _main_outs) {
827 // Ensure only one of these are in the list at any time
828 if (loc != _processors.end()) {
829 if (iter == loc) { // Already in place, do nothing
831 } else { // New position given, relocate
832 _processors.erase (loc);
837 if (loc != _processors.end()) {
838 cerr << "ERROR: Processor added to route twice!" << endl;
845 _processors.insert (loc, processor);
847 // Set up processor list channels. This will set processor->[input|output]_streams(),
848 // configure redirect ports properly, etc.
850 if (configure_processors_unlocked (err)) {
851 ProcessorList::iterator ploc = loc;
853 _processors.erase(ploc);
854 configure_processors_unlocked (0); // it worked before we tried to add it ...
855 cerr << "configure failed\n";
859 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
861 if (pi->natural_input_streams() == ChanCount::ZERO) {
862 /* generator plugin */
863 _have_internal_generator = true;
868 /* is this the monitor send ? if so, make sure we keep track of it */
870 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
872 if (isend && _session.monitor_out() && (isend->target_id() == _session.monitor_out()->id())) {
873 _monitor_send = isend;
876 if (activation_allowed && (processor != _monitor_send)) {
877 processor->activate ();
880 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
882 _output->set_user_latency (0);
885 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
886 set_processor_positions ();
892 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
894 const XMLProperty *prop;
897 boost::shared_ptr<Processor> processor;
899 if (node.name() == "Insert") {
901 if ((prop = node.property ("type")) != 0) {
903 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
904 prop->value() == "lv2" ||
905 prop->value() == "vst" ||
906 prop->value() == "audiounit") {
908 processor.reset (new PluginInsert (_session));
912 processor.reset (new PortInsert (_session, _mute_master));
917 } else if (node.name() == "Send") {
919 processor.reset (new Send (_session, _mute_master));
923 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
927 if (processor->set_state (node, version)) {
931 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
932 /* check for invisible processors stacked at the end and leave them there */
933 ProcessorList::iterator p;
934 p = _processors.end();
936 while (!(*p)->display_to_user() && p != _processors.begin()) {
943 return (add_processor (processor, iter) == 0);
946 catch (failed_constructor &err) {
947 warning << _("processor could not be created. Ignored.") << endmsg;
953 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
955 ProcessorList::iterator loc;
958 loc = find(_processors.begin(), _processors.end(), before);
960 /* nothing specified - at end but before main outs */
961 loc = find (_processors.begin(), _processors.end(), _main_outs);
964 return add_processors (others, loc, err);
968 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
970 /* NOTE: this is intended to be used ONLY when copying
971 processors from another Route. Hence the subtle
972 differences between this and ::add_processor()
975 ChanCount old_pms = processor_max_streams;
977 if (!_session.engine().connected()) {
981 if (others.empty()) {
986 Glib::RWLock::WriterLock lm (_processor_lock);
988 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
990 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
992 // Ensure meter only appears in the list once
994 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
995 if (m != _processors.end()) {
996 _processors.erase(m);
1000 boost::shared_ptr<PluginInsert> pi;
1002 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1005 ChanCount m = max (pi->input_streams(), pi->output_streams());
1007 if (m > potential_max_streams) {
1008 potential_max_streams = m;
1012 ProcessorList::iterator inserted = _processors.insert (iter, *i);
1014 if ((*i)->active()) {
1018 if (configure_processors_unlocked (err)) {
1019 _processors.erase (inserted);
1020 configure_processors_unlocked (0); // it worked before we tried to add it ...
1024 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1027 _output->set_user_latency (0);
1030 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1031 set_processor_positions ();
1037 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1039 if (p == PreFader) {
1040 start = _processors.begin();
1041 end = find(_processors.begin(), _processors.end(), _amp);
1043 start = find(_processors.begin(), _processors.end(), _amp);
1045 end = _processors.end();
1049 /** Turn off all processors with a given placement
1050 * @param p Placement of processors to disable
1053 Route::disable_processors (Placement p)
1055 Glib::RWLock::ReaderLock lm (_processor_lock);
1057 ProcessorList::iterator start, end;
1058 placement_range(p, start, end);
1060 for (ProcessorList::iterator i = start; i != end; ++i) {
1061 (*i)->deactivate ();
1064 _session.set_dirty ();
1067 /** Turn off all redirects
1070 Route::disable_processors ()
1072 Glib::RWLock::ReaderLock lm (_processor_lock);
1074 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1075 (*i)->deactivate ();
1078 _session.set_dirty ();
1081 /** Turn off all redirects with a given placement
1082 * @param p Placement of redirects to disable
1085 Route::disable_plugins (Placement p)
1087 Glib::RWLock::ReaderLock lm (_processor_lock);
1089 ProcessorList::iterator start, end;
1090 placement_range(p, start, end);
1092 for (ProcessorList::iterator i = start; i != end; ++i) {
1093 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1094 (*i)->deactivate ();
1098 _session.set_dirty ();
1101 /** Turn off all plugins
1104 Route::disable_plugins ()
1106 Glib::RWLock::ReaderLock lm (_processor_lock);
1108 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1109 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1110 (*i)->deactivate ();
1114 _session.set_dirty ();
1119 Route::ab_plugins (bool forward)
1121 Glib::RWLock::ReaderLock lm (_processor_lock);
1125 /* forward = turn off all active redirects, and mark them so that the next time
1126 we go the other way, we will revert them
1129 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1130 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1134 if ((*i)->active()) {
1135 (*i)->deactivate ();
1136 (*i)->set_next_ab_is_active (true);
1138 (*i)->set_next_ab_is_active (false);
1144 /* backward = if the redirect was marked to go active on the next ab, do so */
1146 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1148 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1152 if ((*i)->get_next_ab_is_active()) {
1155 (*i)->deactivate ();
1160 _session.set_dirty ();
1164 /** Remove processors with a given placement.
1165 * @param p Placement of processors to remove.
1168 Route::clear_processors (Placement p)
1170 const ChanCount old_pms = processor_max_streams;
1172 if (!_session.engine().connected()) {
1176 bool already_deleting = _session.deletion_in_progress();
1177 if (!already_deleting) {
1178 _session.set_deletion_in_progress();
1182 Glib::RWLock::WriterLock lm (_processor_lock);
1183 ProcessorList new_list;
1184 ProcessorStreams err;
1185 bool seen_amp = false;
1187 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1193 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1195 /* you can't remove these */
1197 new_list.push_back (*i);
1204 new_list.push_back (*i);
1207 (*i)->drop_references ();
1215 (*i)->drop_references ();
1218 new_list.push_back (*i);
1225 _processors = new_list;
1226 configure_processors_unlocked (&err); // this can't fail
1229 processor_max_streams.reset();
1230 _have_internal_generator = false;
1231 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1232 set_processor_positions ();
1234 if (!already_deleting) {
1235 _session.clear_deletion_in_progress();
1240 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1242 /* these can never be removed */
1244 if (processor == _amp || processor == _meter || processor == _main_outs) {
1248 ChanCount old_pms = processor_max_streams;
1250 if (!_session.engine().connected()) {
1254 processor_max_streams.reset();
1257 Glib::RWLock::WriterLock lm (_processor_lock);
1258 ProcessorList::iterator i;
1259 bool removed = false;
1261 for (i = _processors.begin(); i != _processors.end(); ) {
1262 if (*i == processor) {
1264 /* move along, see failure case for configure_processors()
1265 where we may need to reconfigure the processor.
1268 /* stop redirects that send signals to JACK ports
1269 from causing noise as a result of no longer being
1273 boost::shared_ptr<IOProcessor> iop;
1275 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1277 iop->input()->disconnect (this);
1279 if (iop->output()) {
1280 iop->output()->disconnect (this);
1284 i = _processors.erase (i);
1292 _output->set_user_latency (0);
1300 if (configure_processors_unlocked (err)) {
1301 /* get back to where we where */
1302 _processors.insert (i, processor);
1303 /* we know this will work, because it worked before :) */
1304 configure_processors_unlocked (0);
1308 _have_internal_generator = false;
1310 for (i = _processors.begin(); i != _processors.end(); ++i) {
1311 boost::shared_ptr<PluginInsert> pi;
1313 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1314 if (pi->is_generator()) {
1315 _have_internal_generator = true;
1322 processor->drop_references ();
1323 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1324 set_processor_positions ();
1330 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1332 ProcessorList deleted;
1334 if (!_session.engine().connected()) {
1338 processor_max_streams.reset();
1341 Glib::RWLock::WriterLock lm (_processor_lock);
1342 ProcessorList::iterator i;
1343 boost::shared_ptr<Processor> processor;
1345 ProcessorList as_we_were = _processors;
1347 for (i = _processors.begin(); i != _processors.end(); ) {
1351 /* these can never be removed */
1353 if (processor == _amp || processor == _meter || processor == _main_outs) {
1358 /* see if its in the list of processors to delete */
1360 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1365 /* stop IOProcessors that send to JACK ports
1366 from causing noise as a result of no longer being
1370 boost::shared_ptr<IOProcessor> iop;
1372 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1376 deleted.push_back (processor);
1377 i = _processors.erase (i);
1380 if (deleted.empty()) {
1381 /* none of those in the requested list were found */
1385 _output->set_user_latency (0);
1387 if (configure_processors_unlocked (err)) {
1388 /* get back to where we where */
1389 _processors = as_we_were;
1390 /* we know this will work, because it worked before :) */
1391 configure_processors_unlocked (0);
1395 _have_internal_generator = false;
1397 for (i = _processors.begin(); i != _processors.end(); ++i) {
1398 boost::shared_ptr<PluginInsert> pi;
1400 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1401 if (pi->is_generator()) {
1402 _have_internal_generator = true;
1409 /* now try to do what we need to so that those that were removed will be deleted */
1411 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1412 (*i)->drop_references ();
1415 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1416 set_processor_positions ();
1423 Route::configure_processors (ProcessorStreams* err)
1425 if (!_in_configure_processors) {
1426 Glib::RWLock::WriterLock lm (_processor_lock);
1427 return configure_processors_unlocked (err);
1433 Route::input_streams () const
1435 return _input->n_ports ();
1438 /** Configure the input/output configuration of each processor in the processors list.
1439 * Return 0 on success, otherwise configuration is impossible.
1442 Route::configure_processors_unlocked (ProcessorStreams* err)
1444 if (_in_configure_processors) {
1448 _in_configure_processors = true;
1450 // Check each processor in order to see if we can configure as requested
1451 ChanCount in = input_streams ();
1453 list< pair<ChanCount,ChanCount> > configuration;
1456 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1457 DEBUG_TRACE (DEBUG::Processors, "{\n");
1458 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1459 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1461 DEBUG_TRACE (DEBUG::Processors, "}\n");
1463 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1465 if ((*p)->can_support_io_configuration(in, out)) {
1466 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 in = %2 out = %3\n",(*p)->name(), in, out));
1467 configuration.push_back(make_pair(in, out));
1474 _in_configure_processors = false;
1479 // We can, so configure everything
1480 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1481 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1482 (*p)->configure_io(c->first, c->second);
1483 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1484 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1489 _meter->reset_max_channels (processor_max_streams);
1492 /* make sure we have sufficient scratch buffers to cope with the new processor
1495 Glib::Mutex::Lock em (_session.engine().process_lock ());
1496 _session.ensure_buffers (n_process_buffers ());
1499 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1501 _in_configure_processors = false;
1506 Route::all_processors_flip ()
1508 Glib::RWLock::ReaderLock lm (_processor_lock);
1510 if (_processors.empty()) {
1514 bool first_is_on = _processors.front()->active();
1516 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1518 (*i)->deactivate ();
1524 _session.set_dirty ();
1527 /** Set all processors with a given placement to a given active state.
1528 * @param p Placement of processors to change.
1529 * @param state New active state for those processors.
1532 Route::all_processors_active (Placement p, bool state)
1534 Glib::RWLock::ReaderLock lm (_processor_lock);
1536 if (_processors.empty()) {
1539 ProcessorList::iterator start, end;
1540 placement_range(p, start, end);
1542 bool before_amp = true;
1543 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1548 if (p == PreFader && before_amp) {
1552 (*i)->deactivate ();
1557 _session.set_dirty ();
1561 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1563 bool pre_fader = true;
1564 Glib::RWLock::ReaderLock lm (_processor_lock);
1566 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1568 /* semantic note: if p == amp, we want to return true, so test
1569 for equality before checking if this is the amp
1586 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1588 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1589 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1590 processors in the current actual processor list that are hidden. Any visible processors
1591 in the current list but not in "new_order" will be assumed to be deleted.
1595 Glib::RWLock::WriterLock lm (_processor_lock);
1596 ChanCount old_pms = processor_max_streams;
1597 ProcessorList::iterator oiter;
1598 ProcessorList::const_iterator niter;
1599 ProcessorList as_it_was_before = _processors;
1600 ProcessorList as_it_will_be;
1602 oiter = _processors.begin();
1603 niter = new_order.begin();
1605 while (niter != new_order.end()) {
1607 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1608 then append it to the temp list.
1610 Otherwise, see if the next processor in the old list is in the new list. if not,
1611 its been deleted. If its there, append it to the temp list.
1614 if (oiter == _processors.end()) {
1616 /* no more elements in the old list, so just stick the rest of
1617 the new order onto the temp list.
1620 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1621 while (niter != new_order.end()) {
1628 if (!(*oiter)->display_to_user()) {
1630 as_it_will_be.push_back (*oiter);
1634 /* visible processor: check that its in the new order */
1636 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1637 /* deleted: do nothing, shared_ptr<> will clean up */
1639 /* ignore this one, and add the next item from the new order instead */
1640 as_it_will_be.push_back (*niter);
1645 /* now remove from old order - its taken care of no matter what */
1646 oiter = _processors.erase (oiter);
1651 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1653 if (configure_processors_unlocked (err)) {
1654 _processors = as_it_was_before;
1655 processor_max_streams = old_pms;
1661 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1662 set_processor_positions ();
1675 Route::get_template()
1677 return state(false);
1681 Route::state(bool full_state)
1683 XMLNode *node = new XMLNode("Route");
1684 ProcessorList::iterator i;
1687 id().print (buf, sizeof (buf));
1688 node->add_property("id", buf);
1689 node->add_property ("name", _name);
1690 node->add_property("default-type", _default_type.to_string());
1693 node->add_property("flags", enum_2_string (_flags));
1696 node->add_property("active", _active?"yes":"no");
1697 node->add_property("phase-invert", _phase_invert?"yes":"no");
1698 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1699 node->add_property("meter-point", enum_2_string (_meter_point));
1702 node->add_property("route-group", _route_group->name());
1705 string order_string;
1706 OrderKeys::iterator x = order_keys.begin();
1708 while (x != order_keys.end()) {
1709 order_string += string ((*x).first);
1710 order_string += '=';
1711 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1712 order_string += buf;
1716 if (x == order_keys.end()) {
1720 order_string += ':';
1722 node->add_property ("order-keys", order_string);
1723 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1724 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1725 node->add_property ("soloed-by-upstream", buf);
1726 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1727 node->add_property ("soloed-by-downstream", buf);
1729 node->add_child_nocopy (_input->state (full_state));
1730 node->add_child_nocopy (_output->state (full_state));
1731 node->add_child_nocopy (_solo_control->get_state ());
1732 node->add_child_nocopy (_mute_master->get_state ());
1734 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1735 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1736 remote_control_node->add_property (X_("id"), buf);
1737 node->add_child_nocopy (*remote_control_node);
1739 if (_comment.length()) {
1740 XMLNode *cmt = node->add_child ("Comment");
1741 cmt->add_content (_comment);
1744 for (i = _processors.begin(); i != _processors.end(); ++i) {
1745 node->add_child_nocopy((*i)->state (full_state));
1749 node->add_child_copy (*_extra_xml);
1756 Route::set_state (const XMLNode& node, int version)
1758 return _set_state (node, version, true);
1762 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1764 if (version < 3000) {
1765 return _set_state_2X (node, version);
1769 XMLNodeConstIterator niter;
1771 XMLPropertyList plist;
1772 const XMLProperty *prop;
1774 if (node.name() != "Route"){
1775 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1779 if ((prop = node.property (X_("name"))) != 0) {
1780 Route::set_name (prop->value());
1783 if ((prop = node.property ("id")) != 0) {
1784 _id = prop->value ();
1787 if ((prop = node.property (X_("flags"))) != 0) {
1788 _flags = Flag (string_2_enum (prop->value(), _flags));
1793 if (is_master() || is_monitor() || is_hidden()) {
1794 _mute_master->set_solo_ignore (true);
1797 /* add all processors (except amp, which is always present) */
1799 nlist = node.children();
1800 XMLNode processor_state (X_("processor_state"));
1802 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1806 if (child->name() == IO::state_node_name) {
1807 if ((prop = child->property (X_("direction"))) == 0) {
1811 if (prop->value() == "Input") {
1812 _input->set_state (*child, version);
1813 } else if (prop->value() == "Output") {
1814 _output->set_state (*child, version);
1818 if (child->name() == X_("Processor")) {
1819 processor_state.add_child_copy (*child);
1823 set_processor_state (processor_state);
1825 if ((prop = node.property ("self-solo")) != 0) {
1826 set_self_solo (string_is_affirmative (prop->value()));
1829 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1830 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1831 mod_solo_by_others_upstream (atoi (prop->value()));
1834 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1835 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1836 mod_solo_by_others_downstream (atoi (prop->value()));
1839 if ((prop = node.property ("solo-isolated")) != 0) {
1840 set_solo_isolated (string_is_affirmative (prop->value()), this);
1843 if ((prop = node.property (X_("phase-invert"))) != 0) {
1844 set_phase_invert (string_is_affirmative (prop->value()));
1847 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1848 set_denormal_protection (string_is_affirmative (prop->value()));
1851 if ((prop = node.property (X_("active"))) != 0) {
1852 bool yn = string_is_affirmative (prop->value());
1853 _active = !yn; // force switch
1857 if ((prop = node.property (X_("meter-point"))) != 0) {
1858 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1859 set_meter_point (mp);
1861 _meter->set_display_to_user (_meter_point == MeterCustom);
1865 if ((prop = node.property (X_("order-keys"))) != 0) {
1869 string::size_type colon, equal;
1870 string remaining = prop->value();
1872 while (remaining.length()) {
1874 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1875 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1878 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1879 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1882 set_order_key (remaining.substr (0, equal), n);
1886 colon = remaining.find_first_of (':');
1888 if (colon != string::npos) {
1889 remaining = remaining.substr (colon+1);
1896 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1899 if (child->name() == X_("Comment")) {
1901 /* XXX this is a terrible API design in libxml++ */
1903 XMLNode *cmt = *(child->children().begin());
1904 _comment = cmt->content();
1906 } else if (child->name() == X_("Extra")) {
1908 _extra_xml = new XMLNode (*child);
1910 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1912 if (prop->value() == "solo") {
1913 _solo_control->set_state (*child, version);
1914 _session.add_controllable (_solo_control);
1917 } else if (child->name() == X_("RemoteControl")) {
1918 if ((prop = child->property (X_("id"))) != 0) {
1920 sscanf (prop->value().c_str(), "%d", &x);
1921 set_remote_control_id (x);
1924 } else if (child->name() == X_("MuteMaster")) {
1925 _mute_master->set_state (*child, version);
1933 Route::_set_state_2X (const XMLNode& node, int version)
1936 XMLNodeConstIterator niter;
1938 XMLPropertyList plist;
1939 const XMLProperty *prop;
1941 /* 2X things which still remain to be handled:
1947 if (node.name() != "Route") {
1948 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1952 if ((prop = node.property (X_("flags"))) != 0) {
1953 _flags = Flag (string_2_enum (prop->value(), _flags));
1958 if ((prop = node.property (X_("phase-invert"))) != 0) {
1959 set_phase_invert (string_is_affirmative (prop->value()));
1962 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1963 set_denormal_protection (string_is_affirmative (prop->value()));
1966 if ((prop = node.property (X_("soloed"))) != 0) {
1967 bool yn = string_is_affirmative (prop->value());
1969 /* XXX force reset of solo status */
1971 set_solo (yn, this);
1974 if ((prop = node.property (X_("muted"))) != 0) {
1977 bool muted = string_is_affirmative (prop->value());
1983 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1985 if (string_is_affirmative (prop->value())){
1986 mute_point = mute_point + "PreFader";
1991 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1993 if (string_is_affirmative (prop->value())){
1996 mute_point = mute_point + ",";
1999 mute_point = mute_point + "PostFader";
2004 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2006 if (string_is_affirmative (prop->value())){
2009 mute_point = mute_point + ",";
2012 mute_point = mute_point + "Listen";
2017 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2019 if (string_is_affirmative (prop->value())){
2022 mute_point = mute_point + ",";
2025 mute_point = mute_point + "Main";
2029 _mute_master->set_mute_points (mute_point);
2033 if ((prop = node.property (X_("meter-point"))) != 0) {
2034 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2037 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2038 don't mean the same thing.
2041 if ((prop = node.property (X_("order-keys"))) != 0) {
2045 string::size_type colon, equal;
2046 string remaining = prop->value();
2048 while (remaining.length()) {
2050 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2051 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2054 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2055 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2058 set_order_key (remaining.substr (0, equal), n);
2062 colon = remaining.find_first_of (':');
2064 if (colon != string::npos) {
2065 remaining = remaining.substr (colon+1);
2072 /* add standard processors */
2074 //_meter.reset (new PeakMeter (_session));
2075 //add_processor (_meter, PreFader);
2078 /* where we listen to tracks */
2079 _intreturn.reset (new InternalReturn (_session));
2080 add_processor (_intreturn, PreFader);
2082 _monitor_control.reset (new MonitorProcessor (_session));
2083 add_processor (_monitor_control, PostFader);
2086 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
2087 add_processor (_main_outs, PostFader);
2091 nlist = node.children ();
2092 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2096 if (child->name() == IO::state_node_name) {
2098 /* there is a note in IO::set_state_2X() about why we have to call
2102 _input->set_state_2X (*child, version, true);
2103 _output->set_state_2X (*child, version, false);
2105 if ((prop = child->property (X_("name"))) != 0) {
2106 Route::set_name (prop->value ());
2109 if ((prop = child->property (X_("id"))) != 0) {
2110 _id = prop->value ();
2113 if ((prop = child->property (X_("active"))) != 0) {
2114 bool yn = string_is_affirmative (prop->value());
2115 _active = !yn; // force switch
2119 if ((prop = child->property (X_("gain"))) != 0) {
2122 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2123 _amp->gain_control()->set_value (val);
2127 /* Set up Panners in the IO */
2128 XMLNodeList io_nlist = child->children ();
2130 XMLNodeConstIterator io_niter;
2133 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2135 io_child = *io_niter;
2137 if (io_child->name() == X_("Panner")) {
2138 _main_outs->panner()->set_state(*io_child, version);
2144 XMLNodeList redirect_nodes;
2146 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2150 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2151 redirect_nodes.push_back(child);
2156 set_processor_state_2X (redirect_nodes, version);
2158 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2161 if (child->name() == X_("Comment")) {
2163 /* XXX this is a terrible API design in libxml++ */
2165 XMLNode *cmt = *(child->children().begin());
2166 _comment = cmt->content();
2168 } else if (child->name() == X_("Extra")) {
2170 _extra_xml = new XMLNode (*child);
2172 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2174 if (prop->value() == "solo") {
2175 _solo_control->set_state (*child, version);
2176 _session.add_controllable (_solo_control);
2179 } else if (child->name() == X_("RemoteControl")) {
2180 if ((prop = child->property (X_("id"))) != 0) {
2182 sscanf (prop->value().c_str(), "%d", &x);
2183 set_remote_control_id (x);
2193 Route::get_processor_state ()
2195 XMLNode* root = new XMLNode (X_("redirects"));
2196 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2197 root->add_child_nocopy ((*i)->state (true));
2204 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2206 /* We don't bother removing existing processors not in nList, as this
2207 method will only be called when creating a Route from scratch, not
2208 for undo purposes. Just put processors in at the appropriate place
2212 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2213 add_processor_from_xml_2X (**i, version, _processors.begin ());
2218 Route::set_processor_state (const XMLNode& node)
2220 const XMLNodeList &nlist = node.children();
2221 XMLNodeConstIterator niter;
2222 ProcessorList new_order;
2223 bool must_configure = false;
2225 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2227 XMLProperty* prop = (*niter)->property ("type");
2229 if (prop->value() == "amp") {
2230 _amp->set_state (**niter, Stateful::current_state_version);
2231 new_order.push_back (_amp);
2232 } else if (prop->value() == "meter") {
2233 _meter->set_state (**niter, Stateful::current_state_version);
2234 new_order.push_back (_meter);
2235 } else if (prop->value() == "main-outs") {
2236 _main_outs->set_state (**niter, Stateful::current_state_version);
2237 new_order.push_back (_main_outs);
2238 } else if (prop->value() == "intreturn") {
2240 _intreturn.reset (new InternalReturn (_session));
2241 must_configure = true;
2243 _intreturn->set_state (**niter, Stateful::current_state_version);
2244 new_order.push_back (_intreturn);
2245 } else if (is_monitor() && prop->value() == "monitor") {
2246 if (!_monitor_control) {
2247 _monitor_control.reset (new MonitorProcessor (_session));
2248 must_configure = true;
2250 _monitor_control->set_state (**niter, Stateful::current_state_version);
2251 new_order.push_back (_monitor_control);
2253 ProcessorList::iterator o;
2255 for (o = _processors.begin(); o != _processors.end(); ++o) {
2256 XMLProperty* id_prop = (*niter)->property(X_("id"));
2257 if (id_prop && (*o)->id() == id_prop->value()) {
2258 (*o)->set_state (**niter, Stateful::current_state_version);
2259 new_order.push_back (*o);
2264 // If the processor (*niter) is not on the route then create it
2266 if (o == _processors.end()) {
2268 boost::shared_ptr<Processor> processor;
2270 if (prop->value() == "intsend") {
2272 processor.reset (new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2274 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2275 prop->value() == "lv2" ||
2276 prop->value() == "vst" ||
2277 prop->value() == "audiounit") {
2279 processor.reset (new PluginInsert(_session));
2281 } else if (prop->value() == "port") {
2283 processor.reset (new PortInsert (_session, _mute_master));
2285 } else if (prop->value() == "send") {
2287 processor.reset (new Send (_session, _mute_master));
2290 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2294 processor->set_state (**niter, Stateful::current_state_version);
2295 new_order.push_back (processor);
2296 must_configure = true;
2302 Glib::RWLock::WriterLock lm (_processor_lock);
2303 _processors = new_order;
2304 if (must_configure) {
2305 configure_processors_unlocked (0);
2309 processors_changed (RouteProcessorChange ());
2310 set_processor_positions ();
2314 Route::curve_reallocate ()
2316 // _gain_automation_curve.finish_resize ();
2317 // _pan_automation_curve.finish_resize ();
2321 Route::silence (nframes_t nframes)
2323 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2328 silence_unlocked (nframes);
2332 Route::silence_unlocked (nframes_t nframes)
2334 /* Must be called with the processor lock held */
2338 _output->silence (nframes);
2340 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2341 boost::shared_ptr<PluginInsert> pi;
2343 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2344 // skip plugins, they don't need anything when we're not active
2348 (*i)->silence (nframes);
2351 if (nframes == _session.get_block_size()) {
2358 Route::add_internal_return ()
2361 _intreturn.reset (new InternalReturn (_session));
2362 add_processor (_intreturn, PreFader);
2367 Route::get_return_buffer () const
2369 Glib::RWLock::ReaderLock rm (_processor_lock);
2371 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2372 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2375 BufferSet* bs = d->get_buffers ();
2384 Route::release_return_buffer () const
2386 Glib::RWLock::ReaderLock rm (_processor_lock);
2388 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2389 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2392 return d->release_buffers ();
2398 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2400 vector<string> ports;
2401 vector<string>::const_iterator i;
2404 Glib::RWLock::ReaderLock rm (_processor_lock);
2406 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2408 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2410 if (d && d->target_route() == route) {
2412 /* if the target is the control outs, then make sure
2413 we take note of which i-send is doing that.
2416 if (route == _session.monitor_out()) {
2417 _monitor_send = boost::dynamic_pointer_cast<Delivery>(d);
2420 /* already listening via the specified IO: do nothing */
2427 boost::shared_ptr<InternalSend> listener;
2433 if (route == _session.monitor_out()) {
2434 /* master never sends to control outs */
2437 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2441 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2444 } catch (failed_constructor& err) {
2448 if (route == _session.monitor_out()) {
2449 _monitor_send = listener;
2452 if (placement == PostFader) {
2453 /* put it *really* at the end, not just after the panner (main outs)
2455 add_processor (listener, _processors.end());
2457 add_processor (listener, PreFader);
2464 Route::drop_listen (boost::shared_ptr<Route> route)
2466 ProcessorStreams err;
2467 ProcessorList::iterator tmp;
2469 Glib::RWLock::ReaderLock rl(_processor_lock);
2473 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2475 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2477 if (d && d->target_route() == route) {
2479 remove_processor (*x, &err);
2482 /* list could have been demolished while we dropped the lock
2492 if (route == _session.monitor_out()) {
2493 _monitor_send.reset ();
2498 Route::set_comment (string cmt, void *src)
2501 comment_changed (src);
2502 _session.set_dirty ();
2506 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2508 FeedRecord fr (other, via_sends_only);
2510 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2512 if (!result.second) {
2514 /* already a record for "other" - make sure sends-only information is correct */
2515 if (!via_sends_only && result.first->sends_only) {
2516 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2517 frp->sends_only = false;
2521 return result.second;
2525 Route::clear_fed_by ()
2531 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2533 const FedBy& fed_by (other->fed_by());
2535 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2536 boost::shared_ptr<Route> sr = f->r.lock();
2538 if (sr && (sr.get() == this)) {
2540 if (via_sends_only) {
2541 *via_sends_only = f->sends_only;
2552 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2554 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2556 if (_output->connected_to (other->input())) {
2557 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2566 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2568 boost::shared_ptr<IOProcessor> iop;
2570 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2571 if (iop->feeds (other)) {
2572 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2578 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2581 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2586 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2591 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2593 nframes_t now = _session.transport_frame();
2596 Glib::RWLock::ReaderLock lm (_processor_lock);
2599 automation_snapshot (now, true);
2602 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2604 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2605 (*i)->deactivate ();
2609 (*i)->transport_stopped (now);
2613 _roll_delay = _initial_delay;
2617 Route::input_change_handler (IOChange change, void * /*src*/)
2619 if ((change & ConfigurationChanged)) {
2620 configure_processors (0);
2625 Route::output_change_handler (IOChange change, void * /*src*/)
2627 if ((change & ConfigurationChanged)) {
2629 /* XXX resize all listeners to match _main_outs? */
2631 // configure_processors (0);
2636 Route::pans_required () const
2638 if (n_outputs().n_audio() < 2) {
2642 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2646 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2647 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2649 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2654 if (n_outputs().n_total() == 0) {
2658 if (!_active || n_inputs() == ChanCount::ZERO) {
2659 silence_unlocked (nframes);
2662 if (session_state_changing) {
2663 if (_session.transport_speed() != 0.0f) {
2664 /* we're rolling but some state is changing (e.g. our diskstream contents)
2665 so we cannot use them. Be silent till this is over.
2667 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2669 silence_unlocked (nframes);
2672 /* we're really not rolling, so we're either delivery silence or actually
2673 monitoring, both of which are safe to do while session_state_changing is true.
2677 _amp->apply_gain_automation (false);
2678 passthru (start_frame, end_frame, nframes, 0);
2684 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2686 if (_roll_delay > nframes) {
2688 _roll_delay -= nframes;
2689 silence_unlocked (nframes);
2690 /* transport frame is not legal for caller to use */
2693 } else if (_roll_delay > 0) {
2695 nframes -= _roll_delay;
2696 silence_unlocked (_roll_delay);
2697 /* we've written _roll_delay of samples into the
2698 output ports, so make a note of that for
2701 _main_outs->increment_output_offset (_roll_delay);
2702 transport_frame += _roll_delay;
2711 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2712 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2714 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2719 automation_snapshot (_session.transport_frame(), false);
2721 if (n_outputs().n_total() == 0) {
2725 if (!_active || n_inputs().n_total() == 0) {
2726 silence_unlocked (nframes);
2730 nframes_t unused = 0;
2732 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2738 passthru (start_frame, end_frame, nframes, declick);
2744 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2745 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2752 Route::toggle_monitor_input ()
2754 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2755 i->ensure_monitor_input( ! i->monitoring_input());
2760 Route::has_external_redirects () const
2762 // FIXME: what about sends? - they don't return a signal back to ardour?
2764 boost::shared_ptr<const PortInsert> pi;
2766 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2768 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2770 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2772 string port_name = port->name();
2773 string client_name = port_name.substr (0, port_name.find(':'));
2775 /* only say "yes" if the redirect is actually in use */
2777 if (client_name != "ardour" && pi->active()) {
2788 Route::flush_processors ()
2790 /* XXX shouldn't really try to take this lock, since
2791 this is called from the RT audio thread.
2794 Glib::RWLock::ReaderLock lm (_processor_lock);
2796 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2797 (*i)->deactivate ();
2803 Route::set_meter_point (MeterPoint p)
2805 /* CAN BE CALLED FROM PROCESS CONTEXT */
2807 if (_meter_point == p) {
2811 bool meter_was_visible_to_user = _meter->display_to_user ();
2814 Glib::RWLock::WriterLock lm (_processor_lock);
2816 if (p != MeterCustom) {
2817 // Move meter in the processors list to reflect the new position
2818 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2819 _processors.erase(loc);
2822 loc = _processors.begin();
2825 loc = find (_processors.begin(), _processors.end(), _amp);
2827 case MeterPostFader:
2828 loc = _processors.end();
2836 if (loc == _processors.begin()) {
2837 m_in = _input->n_ports();
2839 ProcessorList::iterator before = loc;
2841 m_in = (*before)->output_streams ();
2844 _meter->reflect_inputs (m_in);
2846 _processors.insert (loc, _meter);
2848 /* we do not need to reconfigure the processors, because the meter
2849 (a) is always ready to handle processor_max_streams
2850 (b) is always an N-in/N-out processor, and thus moving
2851 it doesn't require any changes to the other processors.
2854 _meter->set_display_to_user (false);
2858 // just make it visible and let the user move it
2860 _meter->set_display_to_user (true);
2865 meter_change (); /* EMIT SIGNAL */
2867 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2869 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2873 Route::put_monitor_send_at (Placement p)
2875 if (!_monitor_send) {
2880 Glib::RWLock::WriterLock lm (_processor_lock);
2881 ProcessorList as_it_was (_processors);
2882 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _monitor_send);
2883 _processors.erase(loc);
2887 loc = find(_processors.begin(), _processors.end(), _amp);
2888 if (loc != _processors.begin()) {
2893 loc = _processors.end();
2897 _processors.insert (loc, _monitor_send);
2899 if (configure_processors_unlocked (0)) {
2900 _processors = as_it_was;
2901 configure_processors_unlocked (0); // it worked before we tried to add it ...
2906 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2907 _session.set_dirty ();
2911 Route::update_total_latency ()
2913 nframes_t old = _output->effective_latency();
2914 nframes_t own_latency = _output->user_latency();
2916 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2917 if ((*i)->active ()) {
2918 own_latency += (*i)->signal_latency ();
2922 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2924 _output->set_port_latency (own_latency);
2926 if (_output->user_latency() == 0) {
2928 /* this (virtual) function is used for pure Routes,
2929 not derived classes like AudioTrack. this means
2930 that the data processed here comes from an input
2931 port, not prerecorded material, and therefore we
2932 have to take into account any input latency.
2935 own_latency += _input->signal_latency ();
2938 if (old != own_latency) {
2939 _output->set_latency_delay (own_latency);
2940 signal_latency_changed (); /* EMIT SIGNAL */
2943 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2945 return _output->effective_latency ();
2949 Route::set_user_latency (nframes_t nframes)
2951 _output->set_user_latency (nframes);
2952 _session.update_latency_compensation (false, false);
2956 Route::set_latency_delay (nframes_t longest_session_latency)
2958 nframes_t old = _initial_delay;
2960 if (_output->effective_latency() < longest_session_latency) {
2961 _initial_delay = longest_session_latency - _output->effective_latency();
2966 if (_initial_delay != old) {
2967 initial_delay_changed (); /* EMIT SIGNAL */
2970 if (_session.transport_stopped()) {
2971 _roll_delay = _initial_delay;
2976 Route::automation_snapshot (nframes_t now, bool force)
2978 panner()->automation_snapshot (now, force);
2980 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2981 (*i)->automation_snapshot (now, force);
2985 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2986 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2987 boost::shared_ptr<AutomationList>(), name)
2990 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2995 Route::SoloControllable::set_value (float val)
2997 bool bval = ((val >= 0.5f) ? true: false);
2999 this is how it should be done
3001 boost::shared_ptr<RouteList> rl (new RouteList);
3002 rl->push_back (route);
3004 if (Config->get_solo_control_is_listen_control()) {
3005 _session.set_listen (rl, bval);
3007 _session.set_solo (rl, bval);
3010 route.set_solo (bval, this);
3015 Route::SoloControllable::get_value (void) const
3017 if (Config->get_solo_control_is_listen_control()) {
3018 return route.listening() ? 1.0f : 0.0f;
3020 return route.self_soloed() ? 1.0f : 0.0f;
3024 Route::MuteControllable::MuteControllable (std::string name, Route& r)
3025 : AutomationControl (r.session(), Evoral::Parameter (MuteAutomation),
3026 boost::shared_ptr<AutomationList>(), name)
3029 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3034 Route::MuteControllable::set_value (float val)
3036 bool bval = ((val >= 0.5f) ? true: false);
3038 this is how it should be done
3040 boost::shared_ptr<RouteList> rl (new RouteList);
3041 rl->push_back (route);
3042 _session.set_mute (rl, bval);
3044 route.set_mute (bval, this);
3049 Route::MuteControllable::get_value (void) const
3051 return route.muted() ? 1.0f : 0.0f;
3055 Route::set_block_size (nframes_t nframes)
3057 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3058 (*i)->set_block_size (nframes);
3061 _session.ensure_buffers (n_process_buffers ());
3065 Route::protect_automation ()
3067 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3068 (*i)->protect_automation();
3072 Route::set_pending_declick (int declick)
3075 /* this call is not allowed to turn off a pending declick unless "force" is true */
3077 _pending_declick = declick;
3079 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3081 _pending_declick = 0;
3086 /** Shift automation forwards from a particular place, thereby inserting time.
3087 * Adds undo commands for any shifts that are performed.
3089 * @param pos Position to start shifting from.
3090 * @param frames Amount to shift forwards by.
3094 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
3096 #ifdef THIS_NEEDS_FIXING_FOR_V3
3098 /* gain automation */
3099 XMLNode &before = _gain_control->get_state ();
3100 _gain_control->shift (pos, frames);
3101 XMLNode &after = _gain_control->get_state ();
3102 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
3104 /* pan automation */
3105 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
3106 Curve & c = (*i)->automation ();
3107 XMLNode &before = c.get_state ();
3108 c.shift (pos, frames);
3109 XMLNode &after = c.get_state ();
3110 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
3113 /* redirect automation */
3115 Glib::RWLock::ReaderLock lm (redirect_lock);
3116 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
3119 (*i)->what_has_automation (a);
3121 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
3122 AutomationList & al = (*i)->automation_list (*j);
3123 XMLNode &before = al.get_state ();
3124 al.shift (pos, frames);
3125 XMLNode &after = al.get_state ();
3126 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
3136 Route::save_as_template (const string& path, const string& name)
3138 XMLNode& node (state (false));
3141 IO::set_name_in_state (*node.children().front(), name);
3143 tree.set_root (&node);
3144 return tree.write (path.c_str());
3149 Route::set_name (const string& str)
3155 name = Route::ensure_track_or_route_name (str, _session);
3156 SessionObject::set_name (name);
3158 ret = (_input->set_name(name) && _output->set_name(name));
3162 Glib::RWLock::ReaderLock lm (_processor_lock);
3164 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3166 /* rename all I/O processors that have inputs or outputs */
3168 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3170 if (iop && (iop->output() || iop->input())) {
3171 if (!iop->set_name (name)) {
3182 boost::shared_ptr<Send>
3183 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3185 Glib::RWLock::ReaderLock lm (_processor_lock);
3187 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3188 boost::shared_ptr<InternalSend> send;
3190 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3191 if (send->target_route() == target) {
3197 return boost::shared_ptr<Send>();
3201 Route::set_phase_invert (bool yn)
3203 if (_phase_invert != yn) {
3205 _phase_invert = 0xffff; // XXX all channels
3207 _phase_invert = 0; // XXX no channels
3210 phase_invert_changed (); /* EMIT SIGNAL */
3211 _session.set_dirty ();
3216 Route::phase_invert () const
3218 return _phase_invert != 0;
3222 Route::set_denormal_protection (bool yn)
3224 if (_denormal_protection != yn) {
3225 _denormal_protection = yn;
3226 denormal_protection_changed (); /* EMIT SIGNAL */
3231 Route::denormal_protection () const
3233 return _denormal_protection;
3237 Route::set_active (bool yn)
3239 if (_active != yn) {
3241 _input->set_active (yn);
3242 _output->set_active (yn);
3243 active_changed (); // EMIT SIGNAL
3250 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3256 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3258 boost::shared_ptr<Send> s;
3259 boost::shared_ptr<Return> r;
3261 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3262 s->meter()->meter();
3263 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3264 r->meter()->meter ();
3269 boost::shared_ptr<Panner>
3270 Route::panner() const
3272 return _main_outs->panner();
3275 boost::shared_ptr<AutomationControl>
3276 Route::gain_control() const
3278 return _amp->gain_control();
3281 boost::shared_ptr<AutomationControl>
3282 Route::get_control (const Evoral::Parameter& param)
3284 /* either we own the control or .... */
3286 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3290 /* maybe one of our processors does or ... */
3292 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3293 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3294 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3302 /* nobody does so we'll make a new one */
3304 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3311 boost::shared_ptr<Processor>
3312 Route::nth_plugin (uint32_t n)
3314 Glib::RWLock::ReaderLock lm (_processor_lock);
3315 ProcessorList::iterator i;
3317 for (i = _processors.begin(); i != _processors.end(); ++i) {
3318 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3325 return boost::shared_ptr<Processor> ();
3328 boost::shared_ptr<Processor>
3329 Route::nth_send (uint32_t n)
3331 Glib::RWLock::ReaderLock lm (_processor_lock);
3332 ProcessorList::iterator i;
3334 for (i = _processors.begin(); i != _processors.end(); ++i) {
3335 if (boost::dynamic_pointer_cast<Send> (*i)) {
3342 return boost::shared_ptr<Processor> ();
3346 Route::has_io_processor_named (const string& name)
3348 Glib::RWLock::ReaderLock lm (_processor_lock);
3349 ProcessorList::iterator i;
3351 for (i = _processors.begin(); i != _processors.end(); ++i) {
3352 if (boost::dynamic_pointer_cast<Send> (*i) ||
3353 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3354 if ((*i)->name() == name) {
3363 MuteMaster::MutePoint
3364 Route::mute_points () const
3366 return _mute_master->mute_points ();
3370 Route::set_processor_positions ()
3372 Glib::RWLock::ReaderLock lm (_processor_lock);
3374 bool had_amp = false;
3375 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3376 (*i)->set_pre_fader (!had_amp);
3377 if (boost::dynamic_pointer_cast<Amp> (*i)) {