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"
30 #include "evoral/Curve.hpp"
32 #include "ardour/amp.h"
33 #include "ardour/audio_port.h"
34 #include "ardour/audioengine.h"
35 #include "ardour/buffer.h"
36 #include "ardour/buffer_set.h"
37 #include "ardour/configuration.h"
38 #include "ardour/cycle_timer.h"
39 #include "ardour/debug.h"
40 #include "ardour/delivery.h"
41 #include "ardour/dB.h"
42 #include "ardour/internal_send.h"
43 #include "ardour/internal_return.h"
44 #include "ardour/ladspa_plugin.h"
45 #include "ardour/meter.h"
46 #include "ardour/mix.h"
47 #include "ardour/panner.h"
48 #include "ardour/plugin_insert.h"
49 #include "ardour/port.h"
50 #include "ardour/port_insert.h"
51 #include "ardour/processor.h"
52 #include "ardour/profile.h"
53 #include "ardour/route.h"
54 #include "ardour/route_group.h"
55 #include "ardour/send.h"
56 #include "ardour/session.h"
57 #include "ardour/timestamps.h"
58 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 uint32_t Route::order_key_cnt = 0;
67 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
68 PBD::Signal0<void> Route::RemoteControlIDChange;
70 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
71 : SessionObject (sess, name)
72 , AutomatableControls (sess)
74 , _solo_control (new SoloControllable (X_("solo"), *this))
75 , _mute_master (new MuteMaster (sess, name))
76 , _default_type (default_type)
81 /* add standard processors other than amp (added by ::init()) */
83 _meter.reset (new PeakMeter (_session));
84 _meter->set_display_to_user (false);
85 add_processor (_meter, PostFader);
87 if (_flags & ControlOut) {
88 /* where we listen to tracks */
89 _intreturn.reset (new InternalReturn (_session));
90 add_processor (_intreturn, PreFader);
93 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
94 add_processor (_main_outs, PostFader);
96 /* now that we have _meter, its safe to connect to this */
98 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
101 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
102 : SessionObject (sess, "toBeReset")
103 , AutomatableControls (sess)
104 , _solo_control (new SoloControllable (X_("solo"), *this))
105 , _mute_master (new MuteMaster (sess, "toBeReset"))
106 , _default_type (default_type)
110 _set_state (node, Stateful::loading_state_version, false);
112 /* now that we have _meter, its safe to connect to this */
114 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
121 _soloed_by_others = 0;
125 processor_max_streams.reset();
127 order_keys[N_("signal")] = order_key_cnt++;
129 _meter_point = MeterPostFader;
132 _have_internal_generator = false;
133 _declickable = false;
134 _pending_declick = true;
135 _remote_control_id = 0;
136 _in_configure_processors = false;
137 _mute_points = MuteMaster::AllPoints;
140 _denormal_protection = false;
142 /* add standard controls */
144 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
145 _mute_master->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
147 add_control (_solo_control);
148 add_control (_mute_master);
150 /* input and output objects */
152 _input.reset (new IO (_session, _name, IO::Input, _default_type));
153 _output.reset (new IO (_session, _name, IO::Output, _default_type));
155 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
156 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
158 /* add amp processor */
160 _amp.reset (new Amp (_session, _mute_master));
161 add_processor (_amp, PostFader);
166 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
168 /* don't use clear_processors here, as it depends on the session which may
169 be half-destroyed by now */
171 Glib::RWLock::WriterLock lm (_processor_lock);
172 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
173 (*i)->drop_references ();
176 _processors.clear ();
180 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
182 if (id != _remote_control_id) {
183 _remote_control_id = id;
184 RemoteControlIDChanged ();
185 if (notify_class_listeners) {
186 RemoteControlIDChange ();
192 Route::remote_control_id() const
194 return _remote_control_id;
198 Route::order_key (std::string const & name) const
200 OrderKeys::const_iterator i = order_keys.find (name);
201 if (i == order_keys.end()) {
209 Route::set_order_key (std::string const & name, long n)
211 order_keys[name] = n;
213 if (Config->get_sync_all_route_ordering()) {
214 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
219 _session.set_dirty ();
222 /** Set all order keys to be the same as that for `base', if such a key
223 * exists in this route.
224 * @param base Base key.
227 Route::sync_order_keys (std::string const & base)
229 if (order_keys.empty()) {
233 OrderKeys::iterator i;
236 if ((i = order_keys.find (base)) == order_keys.end()) {
237 /* key doesn't exist, use the first existing key (during session initialization) */
238 i = order_keys.begin();
242 /* key exists - use it and reset all others (actually, itself included) */
244 i = order_keys.begin();
247 for (; i != order_keys.end(); ++i) {
253 Route::ensure_track_or_route_name(string name, Session &session)
255 string newname = name;
257 while (session.route_by_name (newname) != NULL) {
258 newname = bump_name_once (newname);
266 Route::inc_gain (gain_t fraction, void *src)
268 _amp->inc_gain (fraction, src);
272 Route::set_gain (gain_t val, void *src)
274 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
276 if (_route_group->is_relative()) {
278 gain_t usable_gain = _amp->gain();
279 if (usable_gain < 0.000001f) {
280 usable_gain = 0.000001f;
284 if (delta < 0.000001f) {
288 delta -= usable_gain;
293 gain_t factor = delta / usable_gain;
296 factor = _route_group->get_max_factor(factor);
297 if (factor == 0.0f) {
298 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
302 factor = _route_group->get_min_factor(factor);
303 if (factor == 0.0f) {
304 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
309 _route_group->apply (&Route::inc_gain, factor, _route_group);
313 _route_group->apply (&Route::set_gain, val, _route_group);
319 if (val == _amp->gain()) {
323 _amp->set_gain (val, src);
326 /** Process this route for one (sub) cycle (process thread)
328 * @param bufs Scratch buffers to use for the signal path
329 * @param start_frame Initial transport frame
330 * @param end_frame Final transport frame
331 * @param nframes Number of frames to output (to ports)
333 * Note that (end_frame - start_frame) may not be equal to nframes when the
334 * transport speed isn't 1.0 (eg varispeed).
337 Route::process_output_buffers (BufferSet& bufs,
338 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
339 bool /*with_processors*/, int declick)
343 bufs.is_silent (false);
345 switch (Config->get_monitoring_model()) {
346 case HardwareMonitoring:
347 case ExternalMonitoring:
348 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
355 declick = _pending_declick;
358 /* figure out if we're going to use gain automation */
359 _amp->setup_gain_automation (start_frame, end_frame, nframes);
362 /* tell main outs what to do about monitoring */
363 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
366 /* -------------------------------------------------------------------------------------------
367 GLOBAL DECLICK (for transport changes etc.)
368 ----------------------------------------------------------------------------------------- */
371 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
372 } else if (declick < 0) {
373 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
376 _pending_declick = 0;
378 /* -------------------------------------------------------------------------------------------
379 DENORMAL CONTROL/PHASE INVERT
380 ----------------------------------------------------------------------------------------- */
386 if (_denormal_protection || Config->get_denormal_protection()) {
388 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
389 Sample* const sp = i->data();
391 if (_phase_invert & chn) {
392 for (nframes_t nx = 0; nx < nframes; ++nx) {
397 for (nframes_t nx = 0; nx < nframes; ++nx) {
405 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
406 Sample* const sp = i->data();
408 if (_phase_invert & chn) {
409 for (nframes_t nx = 0; nx < nframes; ++nx) {
418 if (_denormal_protection || Config->get_denormal_protection()) {
420 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
421 Sample* const sp = i->data();
422 for (nframes_t nx = 0; nx < nframes; ++nx) {
430 /* -------------------------------------------------------------------------------------------
432 ----------------------------------------------------------------------------------------- */
434 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
437 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
439 if (bufs.count() != (*i)->input_streams()) {
440 cerr << _name << " bufs = " << bufs.count()
441 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
444 assert (bufs.count() == (*i)->input_streams());
446 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
447 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
450 if (!_processors.empty()) {
451 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
457 Route::n_process_buffers ()
459 return max (_input->n_ports(), processor_max_streams);
463 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
465 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
469 assert (bufs.available() >= _input->n_ports());
471 if (_input->n_ports() == ChanCount::ZERO) {
475 bufs.set_count (_input->n_ports());
477 if (is_control() && _session.listening()) {
479 /* control/monitor bus ignores input ports when something is
480 feeding the listen "stream". data will "arrive" into the
481 route from the intreturn processor element.
484 bufs.silence (nframes, 0);
488 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
490 BufferSet::iterator o = bufs.begin(*t);
491 PortSet& ports (_input->ports());
493 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
494 o->read_from (i->get_buffer(nframes), nframes);
499 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
500 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
504 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
506 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
507 bufs.set_count (_input->n_ports());
508 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
509 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
513 Route::set_listen (bool yn, void* src)
516 if (yn != _control_outs->active()) {
518 _control_outs->activate ();
520 _control_outs->deactivate ();
523 listen_changed (src); /* EMIT SIGNAL */
529 Route::listening () const
532 return _control_outs->active ();
539 Route::set_solo_safe (bool yn, void *src)
541 if (_solo_safe != yn) {
543 solo_safe_changed (src);
548 Route::solo_safe() const
554 Route::set_solo (bool yn, void *src)
560 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
561 _route_group->apply (&Route::set_solo, yn, _route_group);
565 if (self_soloed() != yn) {
567 set_delivery_solo ();
568 solo_changed (src); /* EMIT SIGNAL */
569 _solo_control->Changed (); /* EMIT SIGNAL */
574 Route::set_self_solo (bool yn)
580 Route::mod_solo_by_others (int32_t delta)
583 if (_soloed_by_others >= (uint32_t) delta) {
584 _soloed_by_others += delta;
586 _soloed_by_others = 0;
589 _soloed_by_others += delta;
592 set_delivery_solo ();
596 Route::set_delivery_solo ()
598 /* tell all delivery processors what the solo situation is, so that they keep
599 delivering even though Session::soloing() is true and they were not
603 Glib::RWLock::ReaderLock rm (_processor_lock);
604 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
605 boost::shared_ptr<Delivery> d;
607 if ((d = boost::dynamic_pointer_cast<Delivery> (*i)) != 0) {
608 d->set_solo_level (soloed ());
609 d->set_solo_isolated (solo_isolated());
615 Route::set_solo_isolated (bool yn, void *src)
617 if (is_master() || is_control() || is_hidden()) {
621 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
622 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
626 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
628 boost::shared_ptr<RouteList> routes = _session.get_routes ();
629 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
631 bool does_feed = feeds (*i, &sends_only);
633 if (does_feed && !sends_only) {
634 (*i)->set_solo_isolated (yn, (*i)->route_group());
638 bool changed = false;
641 if (_solo_isolated == 0) {
646 changed = (_solo_isolated == 1);
647 if (_solo_isolated > 0) {
653 set_delivery_solo ();
654 solo_isolated_changed (src);
659 Route::solo_isolated () const
661 return _solo_isolated > 0;
665 Route::set_mute_points (MuteMaster::MutePoint mp)
668 mute_points_changed (); /* EMIT SIGNAL */
670 if (_mute_master->muted()) {
671 _mute_master->mute_at (_mute_points);
672 mute_changed (this); /* EMIT SIGNAL */
677 Route::set_mute (bool yn, void *src)
679 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
680 _route_group->apply (&Route::set_mute, yn, _route_group);
686 _mute_master->mute_at (_mute_points);
688 _mute_master->clear_mute ();
691 mute_changed (src); /* EMIT SIGNAL */
698 return _mute_master->muted ();
703 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
705 cerr << name << " {" << endl;
706 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
707 p != procs.end(); ++p) {
708 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
715 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
717 ProcessorList::iterator loc;
719 /* XXX this is not thread safe - we don't hold the lock across determining the iter
720 to add before and actually doing the insertion. dammit.
723 if (placement == PreFader) {
724 /* generic pre-fader: insert immediately before the amp */
725 loc = find (_processors.begin(), _processors.end(), _amp);
727 /* generic post-fader: insert right before the main outs */
728 loc = find (_processors.begin(), _processors.end(), _main_outs);
731 return add_processor (processor, loc, err);
735 /** Add a processor to the route.
736 * If @a iter is not NULL, it must point to an iterator in _processors and the new
737 * processor will be inserted immediately before this location. Otherwise,
738 * @a position is used.
741 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
743 ChanCount old_pms = processor_max_streams;
745 if (!_session.engine().connected() || !processor) {
750 Glib::RWLock::WriterLock lm (_processor_lock);
752 boost::shared_ptr<PluginInsert> pi;
753 boost::shared_ptr<PortInsert> porti;
755 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
757 if (processor == _amp || processor == _meter || processor == _main_outs) {
758 // Ensure only one of these are in the list at any time
759 if (loc != _processors.end()) {
760 if (iter == loc) { // Already in place, do nothing
762 } else { // New position given, relocate
763 _processors.erase (loc);
768 if (loc != _processors.end()) {
769 cerr << "ERROR: Processor added to route twice!" << endl;
776 _processors.insert (loc, processor);
778 // Set up processor list channels. This will set processor->[input|output]_streams(),
779 // configure redirect ports properly, etc.
781 if (configure_processors_unlocked (err)) {
782 ProcessorList::iterator ploc = loc;
784 _processors.erase(ploc);
785 configure_processors_unlocked (0); // it worked before we tried to add it ...
786 cerr << "configure failed\n";
790 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
792 if (pi->natural_input_streams() == ChanCount::ZERO) {
793 /* generator plugin */
794 _have_internal_generator = true;
799 if (_control_outs != processor) {
800 // XXX: do we want to emit the signal here ? change call order.
801 processor->activate ();
804 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
806 _output->set_user_latency (0);
809 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
815 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
817 const XMLProperty *prop;
819 if (node.name() != "Processor") {
824 if ((prop = node.property ("type")) != 0) {
826 boost::shared_ptr<Processor> processor;
828 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
829 prop->value() == "lv2" ||
830 prop->value() == "vst" ||
831 prop->value() == "audiounit") {
833 processor.reset (new PluginInsert(_session, node));
835 } else if (prop->value() == "port") {
837 processor.reset (new PortInsert (_session, _mute_master, node));
839 } else if (prop->value() == "send") {
841 processor.reset (new Send (_session, _mute_master, node));
843 } else if (prop->value() == "meter") {
846 if (_meter->set_state (node, Stateful::loading_state_version)) {
853 _meter.reset (new PeakMeter (_session, node));
854 _meter->set_display_to_user (_meter_point == MeterCustom);
857 } else if (prop->value() == "amp") {
859 /* amp always exists */
862 if (processor->set_state (node, Stateful::loading_state_version)) {
865 /* never any reason to add it */
869 } else if (prop->value() == "intsend") {
871 processor.reset (new InternalSend (_session, _mute_master, node));
873 } else if (prop->value() == "intreturn") {
876 if (_intreturn->set_state (node, Stateful::loading_state_version)) {
882 _intreturn.reset (new InternalReturn (_session, node));
883 processor = _intreturn;
885 } else if (prop->value() == "main-outs") {
888 if (_main_outs->set_state (node, Stateful::loading_state_version)) {
895 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
896 processor = _main_outs;
899 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
903 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
904 /* check for invisible processors stacked at the end and leave them there */
905 ProcessorList::iterator p;
906 p = _processors.end();
908 while (!(*p)->display_to_user() && p != _processors.begin()) {
915 return (add_processor (processor, iter) == 0);
918 error << _("Processor XML node has no type property") << endmsg;
923 catch (failed_constructor &err) {
924 warning << _("processor could not be created. Ignored.") << endmsg;
931 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
933 const XMLProperty *prop;
936 boost::shared_ptr<Processor> processor;
938 if (node.name() == "Insert") {
940 if ((prop = node.property ("type")) != 0) {
942 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
943 prop->value() == "lv2" ||
944 prop->value() == "vst" ||
945 prop->value() == "audiounit") {
947 processor.reset (new PluginInsert (_session, node));
951 processor.reset (new PortInsert (_session, _mute_master, node));
956 } else if (node.name() == "Send") {
958 processor.reset (new Send (_session, _mute_master, node, version));
962 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
966 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
967 /* check for invisible processors stacked at the end and leave them there */
968 ProcessorList::iterator p;
969 p = _processors.end();
971 while (!(*p)->display_to_user() && p != _processors.begin()) {
978 return (add_processor (processor, iter) == 0);
981 catch (failed_constructor &err) {
982 warning << _("processor could not be created. Ignored.") << endmsg;
988 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
990 ProcessorList::iterator loc;
993 loc = find(_processors.begin(), _processors.end(), before);
995 /* nothing specified - at end but before main outs */
996 loc = find (_processors.begin(), _processors.end(), _main_outs);
999 return add_processors (others, loc, err);
1003 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
1005 /* NOTE: this is intended to be used ONLY when copying
1006 processors from another Route. Hence the subtle
1007 differences between this and ::add_processor()
1010 ChanCount old_pms = processor_max_streams;
1012 if (!_session.engine().connected()) {
1016 if (others.empty()) {
1021 Glib::RWLock::WriterLock lm (_processor_lock);
1023 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
1025 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1027 // Ensure meter only appears in the list once
1029 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
1030 if (m != _processors.end()) {
1031 _processors.erase(m);
1035 boost::shared_ptr<PluginInsert> pi;
1037 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1040 ChanCount m = max (pi->input_streams(), pi->output_streams());
1042 if (m > potential_max_streams) {
1043 potential_max_streams = m;
1047 ProcessorList::iterator inserted = _processors.insert (iter, *i);
1049 if ((*i)->active()) {
1053 if (configure_processors_unlocked (err)) {
1054 _processors.erase (inserted);
1055 configure_processors_unlocked (0); // it worked before we tried to add it ...
1059 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1062 _output->set_user_latency (0);
1065 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1071 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1073 if (p == PreFader) {
1074 start = _processors.begin();
1075 end = find(_processors.begin(), _processors.end(), _amp);
1077 start = find(_processors.begin(), _processors.end(), _amp);
1079 end = _processors.end();
1083 /** Turn off all processors with a given placement
1084 * @param p Placement of processors to disable
1087 Route::disable_processors (Placement p)
1089 Glib::RWLock::ReaderLock lm (_processor_lock);
1091 ProcessorList::iterator start, end;
1092 placement_range(p, start, end);
1094 for (ProcessorList::iterator i = start; i != end; ++i) {
1095 (*i)->deactivate ();
1098 _session.set_dirty ();
1101 /** Turn off all redirects
1104 Route::disable_processors ()
1106 Glib::RWLock::ReaderLock lm (_processor_lock);
1108 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1109 (*i)->deactivate ();
1112 _session.set_dirty ();
1115 /** Turn off all redirects with a given placement
1116 * @param p Placement of redirects to disable
1119 Route::disable_plugins (Placement p)
1121 Glib::RWLock::ReaderLock lm (_processor_lock);
1123 ProcessorList::iterator start, end;
1124 placement_range(p, start, end);
1126 for (ProcessorList::iterator i = start; i != end; ++i) {
1127 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1128 (*i)->deactivate ();
1132 _session.set_dirty ();
1135 /** Turn off all plugins
1138 Route::disable_plugins ()
1140 Glib::RWLock::ReaderLock lm (_processor_lock);
1142 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1143 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1144 (*i)->deactivate ();
1148 _session.set_dirty ();
1153 Route::ab_plugins (bool forward)
1155 Glib::RWLock::ReaderLock lm (_processor_lock);
1159 /* forward = turn off all active redirects, and mark them so that the next time
1160 we go the other way, we will revert them
1163 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1164 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1168 if ((*i)->active()) {
1169 (*i)->deactivate ();
1170 (*i)->set_next_ab_is_active (true);
1172 (*i)->set_next_ab_is_active (false);
1178 /* backward = if the redirect was marked to go active on the next ab, do so */
1180 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1182 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1186 if ((*i)->get_next_ab_is_active()) {
1189 (*i)->deactivate ();
1194 _session.set_dirty ();
1198 /** Remove processors with a given placement.
1199 * @param p Placement of processors to remove.
1202 Route::clear_processors (Placement p)
1204 const ChanCount old_pms = processor_max_streams;
1206 if (!_session.engine().connected()) {
1210 bool already_deleting = _session.deletion_in_progress();
1211 if (!already_deleting) {
1212 _session.set_deletion_in_progress();
1216 Glib::RWLock::WriterLock lm (_processor_lock);
1217 ProcessorList new_list;
1218 ProcessorStreams err;
1219 bool seen_amp = false;
1221 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1227 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1229 /* you can't remove these */
1231 new_list.push_back (*i);
1238 new_list.push_back (*i);
1241 (*i)->drop_references ();
1249 (*i)->drop_references ();
1252 new_list.push_back (*i);
1259 _processors = new_list;
1260 configure_processors_unlocked (&err); // this can't fail
1263 processor_max_streams.reset();
1264 _have_internal_generator = false;
1265 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1267 if (!already_deleting) {
1268 _session.clear_deletion_in_progress();
1273 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1275 /* these can never be removed */
1277 if (processor == _amp || processor == _meter || processor == _main_outs) {
1281 ChanCount old_pms = processor_max_streams;
1283 if (!_session.engine().connected()) {
1287 processor_max_streams.reset();
1290 Glib::RWLock::WriterLock lm (_processor_lock);
1291 ProcessorList::iterator i;
1292 bool removed = false;
1294 for (i = _processors.begin(); i != _processors.end(); ) {
1295 if (*i == processor) {
1297 /* move along, see failure case for configure_processors()
1298 where we may need to reconfigure the processor.
1301 /* stop redirects that send signals to JACK ports
1302 from causing noise as a result of no longer being
1306 boost::shared_ptr<IOProcessor> iop;
1308 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1310 iop->input()->disconnect (this);
1312 if (iop->output()) {
1313 iop->output()->disconnect (this);
1317 i = _processors.erase (i);
1325 _output->set_user_latency (0);
1333 if (configure_processors_unlocked (err)) {
1334 /* get back to where we where */
1335 _processors.insert (i, processor);
1336 /* we know this will work, because it worked before :) */
1337 configure_processors_unlocked (0);
1341 _have_internal_generator = false;
1343 for (i = _processors.begin(); i != _processors.end(); ++i) {
1344 boost::shared_ptr<PluginInsert> pi;
1346 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1347 if (pi->is_generator()) {
1348 _have_internal_generator = true;
1355 processor->drop_references ();
1356 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1362 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1364 ProcessorList deleted;
1365 ProcessorList as_we_were;
1367 if (!_session.engine().connected()) {
1371 processor_max_streams.reset();
1374 Glib::RWLock::WriterLock lm (_processor_lock);
1375 ProcessorList::iterator i;
1376 boost::shared_ptr<Processor> processor;
1378 as_we_were = _processors;
1380 for (i = _processors.begin(); i != _processors.end(); ) {
1384 /* these can never be removed */
1386 if (processor == _amp || processor == _meter || processor == _main_outs) {
1391 /* see if its in the list of processors to delete */
1393 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1398 /* stop IOProcessors that send to JACK ports
1399 from causing noise as a result of no longer being
1403 boost::shared_ptr<IOProcessor> iop;
1405 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1409 deleted.push_back (processor);
1410 i = _processors.erase (i);
1413 if (deleted.empty()) {
1414 /* none of those in the requested list were found */
1418 _output->set_user_latency (0);
1420 if (configure_processors_unlocked (err)) {
1421 /* get back to where we where */
1422 _processors = as_we_were;
1423 /* we know this will work, because it worked before :) */
1424 configure_processors_unlocked (0);
1428 _have_internal_generator = false;
1430 for (i = _processors.begin(); i != _processors.end(); ++i) {
1431 boost::shared_ptr<PluginInsert> pi;
1433 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1434 if (pi->is_generator()) {
1435 _have_internal_generator = true;
1442 /* now try to do what we need to so that those that were removed will be deleted */
1444 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1445 (*i)->drop_references ();
1448 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1455 Route::configure_processors (ProcessorStreams* err)
1457 if (!_in_configure_processors) {
1458 Glib::RWLock::WriterLock lm (_processor_lock);
1459 return configure_processors_unlocked (err);
1464 /** Configure the input/output configuration of each processor in the processors list.
1465 * Return 0 on success, otherwise configuration is impossible.
1468 Route::configure_processors_unlocked (ProcessorStreams* err)
1470 if (_in_configure_processors) {
1474 _in_configure_processors = true;
1476 // Check each processor in order to see if we can configure as requested
1477 ChanCount in = _input->n_ports ();
1479 list< pair<ChanCount,ChanCount> > configuration;
1482 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1484 DEBUG_TRACE (DEBUG::Processors, "{\n");
1485 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1486 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1488 DEBUG_TRACE (DEBUG::Processors, "}\n");
1491 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1493 if ((*p)->can_support_io_configuration(in, out)) {
1494 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
1495 configuration.push_back(make_pair(in, out));
1502 _in_configure_processors = false;
1507 // We can, so configure everything
1508 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1509 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1510 (*p)->configure_io(c->first, c->second);
1511 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1512 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1517 _meter->reset_max_channels (processor_max_streams);
1520 /* make sure we have sufficient scratch buffers to cope with the new processor
1522 _session.ensure_buffers (n_process_buffers ());
1524 _in_configure_processors = false;
1529 Route::all_processors_flip ()
1531 Glib::RWLock::ReaderLock lm (_processor_lock);
1533 if (_processors.empty()) {
1537 bool first_is_on = _processors.front()->active();
1539 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1541 (*i)->deactivate ();
1547 _session.set_dirty ();
1550 /** Set all processors with a given placement to a given active state.
1551 * @param p Placement of processors to change.
1552 * @param state New active state for those processors.
1555 Route::all_processors_active (Placement p, bool state)
1557 Glib::RWLock::ReaderLock lm (_processor_lock);
1559 if (_processors.empty()) {
1562 ProcessorList::iterator start, end;
1563 placement_range(p, start, end);
1565 bool before_amp = true;
1566 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1571 if (p == PreFader && before_amp) {
1575 (*i)->deactivate ();
1580 _session.set_dirty ();
1584 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1586 bool pre_fader = true;
1587 Glib::RWLock::ReaderLock lm (_processor_lock);
1589 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1591 /* semantic note: if p == amp, we want to return true, so test
1592 for equality before checking if this is the amp
1609 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1611 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1612 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1613 processors in the current actual processor list that are hidden. Any visible processors
1614 in the current list but not in "new_order" will be assumed to be deleted.
1618 Glib::RWLock::WriterLock lm (_processor_lock);
1619 ChanCount old_pms = processor_max_streams;
1620 ProcessorList::iterator oiter;
1621 ProcessorList::const_iterator niter;
1622 ProcessorList as_it_was_before = _processors;
1623 ProcessorList as_it_will_be;
1625 oiter = _processors.begin();
1626 niter = new_order.begin();
1628 while (niter != new_order.end()) {
1630 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1631 then append it to the temp list.
1633 Otherwise, see if the next processor in the old list is in the new list. if not,
1634 its been deleted. If its there, append it to the temp list.
1637 if (oiter == _processors.end()) {
1639 /* no more elements in the old list, so just stick the rest of
1640 the new order onto the temp list.
1643 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1644 while (niter != new_order.end()) {
1651 if (!(*oiter)->display_to_user()) {
1653 as_it_will_be.push_back (*oiter);
1657 /* visible processor: check that its in the new order */
1659 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1660 /* deleted: do nothing, shared_ptr<> will clean up */
1662 /* ignore this one, and add the next item from the new order instead */
1663 as_it_will_be.push_back (*niter);
1668 /* now remove from old order - its taken care of no matter what */
1669 oiter = _processors.erase (oiter);
1674 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1676 if (configure_processors_unlocked (err)) {
1677 _processors = as_it_was_before;
1678 processor_max_streams = old_pms;
1683 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1695 Route::get_template()
1697 return state(false);
1701 Route::state(bool full_state)
1703 XMLNode *node = new XMLNode("Route");
1704 ProcessorList::iterator i;
1707 id().print (buf, sizeof (buf));
1708 node->add_property("id", buf);
1709 node->add_property ("name", _name);
1710 node->add_property("default-type", _default_type.to_string());
1713 node->add_property("flags", enum_2_string (_flags));
1716 node->add_property("active", _active?"yes":"no");
1717 node->add_property("phase-invert", _phase_invert?"yes":"no");
1718 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1719 node->add_property("meter-point", enum_2_string (_meter_point));
1722 node->add_property("route-group", _route_group->name());
1725 string order_string;
1726 OrderKeys::iterator x = order_keys.begin();
1728 while (x != order_keys.end()) {
1729 order_string += string ((*x).first);
1730 order_string += '=';
1731 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1732 order_string += buf;
1736 if (x == order_keys.end()) {
1740 order_string += ':';
1742 node->add_property ("order-keys", order_string);
1743 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1744 snprintf (buf, sizeof (buf), "%d", _soloed_by_others);
1745 node->add_property ("soloed-by-others", buf);
1747 node->add_child_nocopy (_input->state (full_state));
1748 node->add_child_nocopy (_output->state (full_state));
1749 node->add_child_nocopy (_solo_control->get_state ());
1750 node->add_child_nocopy (_mute_master->get_state ());
1752 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1753 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1754 remote_control_node->add_property (X_("id"), buf);
1755 node->add_child_nocopy (*remote_control_node);
1757 if (_comment.length()) {
1758 XMLNode *cmt = node->add_child ("Comment");
1759 cmt->add_content (_comment);
1762 for (i = _processors.begin(); i != _processors.end(); ++i) {
1763 node->add_child_nocopy((*i)->state (full_state));
1767 node->add_child_copy (*_extra_xml);
1774 Route::set_state (const XMLNode& node, int version)
1776 return _set_state (node, version, true);
1780 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1782 if (version < 3000) {
1783 return _set_state_2X (node, version);
1787 XMLNodeConstIterator niter;
1789 XMLPropertyList plist;
1790 const XMLProperty *prop;
1792 if (node.name() != "Route"){
1793 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1797 if ((prop = node.property (X_("name"))) != 0) {
1798 Route::set_name (prop->value());
1801 if ((prop = node.property ("id")) != 0) {
1802 _id = prop->value ();
1805 if ((prop = node.property (X_("flags"))) != 0) {
1806 _flags = Flag (string_2_enum (prop->value(), _flags));
1811 /* add all processors (except amp, which is always present) */
1813 nlist = node.children();
1814 XMLNode processor_state (X_("processor_state"));
1816 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1820 if (child->name() == IO::state_node_name) {
1821 if ((prop = child->property (X_("direction"))) == 0) {
1825 if (prop->value() == "Input") {
1826 _input->set_state (*child, version);
1827 } else if (prop->value() == "Output") {
1828 _output->set_state (*child, version);
1832 if (child->name() == X_("Processor")) {
1833 processor_state.add_child_copy (*child);
1837 set_processor_state (processor_state);
1839 if ((prop = node.property ("self-solo")) != 0) {
1840 set_self_solo (string_is_affirmative (prop->value()));
1843 if ((prop = node.property ("soloed-by-others")) != 0) {
1844 _soloed_by_others = 0; // needed for mod_solo_by_others () to work
1845 mod_solo_by_others (atoi (prop->value()));
1848 if ((prop = node.property ("solo-isolated")) != 0) {
1849 set_solo_isolated (string_is_affirmative (prop->value()), this);
1852 if ((prop = node.property (X_("phase-invert"))) != 0) {
1853 set_phase_invert (string_is_affirmative (prop->value()));
1856 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1857 set_denormal_protection (string_is_affirmative (prop->value()));
1860 if ((prop = node.property (X_("active"))) != 0) {
1861 bool yn = string_is_affirmative (prop->value());
1862 _active = !yn; // force switch
1866 if ((prop = node.property (X_("meter-point"))) != 0) {
1867 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1869 _meter->set_display_to_user (_meter_point == MeterCustom);
1873 if ((prop = node.property (X_("order-keys"))) != 0) {
1877 string::size_type colon, equal;
1878 string remaining = prop->value();
1880 while (remaining.length()) {
1882 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1883 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1886 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1887 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1890 set_order_key (remaining.substr (0, equal), n);
1894 colon = remaining.find_first_of (':');
1896 if (colon != string::npos) {
1897 remaining = remaining.substr (colon+1);
1904 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1907 if (child->name() == X_("Comment")) {
1909 /* XXX this is a terrible API design in libxml++ */
1911 XMLNode *cmt = *(child->children().begin());
1912 _comment = cmt->content();
1914 } else if (child->name() == X_("Extra")) {
1916 _extra_xml = new XMLNode (*child);
1918 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1920 if (prop->value() == "solo") {
1921 _solo_control->set_state (*child, version);
1922 _session.add_controllable (_solo_control);
1925 } else if (child->name() == X_("RemoteControl")) {
1926 if ((prop = child->property (X_("id"))) != 0) {
1928 sscanf (prop->value().c_str(), "%d", &x);
1929 set_remote_control_id (x);
1932 } else if (child->name() == X_("MuteMaster")) {
1933 _mute_master->set_state (*child, version);
1941 Route::_set_state_2X (const XMLNode& node, int version)
1944 XMLNodeConstIterator niter;
1946 XMLPropertyList plist;
1947 const XMLProperty *prop;
1949 /* 2X things which still remain to be handled:
1952 * mute-affects-pre-fader
1953 * mute-affects-post-fader
1954 * mute-affects-control-outs
1955 * mute-affects-main-outs
1960 if (node.name() != "Route") {
1961 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1965 if ((prop = node.property (X_("flags"))) != 0) {
1966 _flags = Flag (string_2_enum (prop->value(), _flags));
1971 /* add standard processors */
1973 _meter.reset (new PeakMeter (_session));
1974 add_processor (_meter, PreFader);
1976 if (_flags & ControlOut) {
1977 /* where we listen to tracks */
1978 _intreturn.reset (new InternalReturn (_session));
1979 add_processor (_intreturn, PreFader);
1982 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
1983 add_processor (_main_outs, PostFader);
1987 nlist = node.children ();
1988 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1992 if (child->name() == IO::state_node_name) {
1994 /* there is a note in IO::set_state_2X() about why we have to call
1998 _input->set_state_2X (*child, version, true);
1999 _output->set_state_2X (*child, version, false);
2001 if ((prop = child->property (X_("name"))) != 0) {
2002 set_name (prop->value ());
2005 if ((prop = child->property (X_("id"))) != 0) {
2006 _id = prop->value ();
2009 if ((prop = child->property (X_("active"))) != 0) {
2010 bool yn = string_is_affirmative (prop->value());
2011 _active = !yn; // force switch
2019 if ((prop = node.property (X_("phase-invert"))) != 0) {
2020 set_phase_invert (string_is_affirmative (prop->value()));
2023 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2024 set_denormal_protection (string_is_affirmative (prop->value()));
2027 if ((prop = node.property (X_("soloed"))) != 0) {
2028 bool yn = string_is_affirmative (prop->value());
2030 /* XXX force reset of solo status */
2032 set_solo (yn, this);
2035 if ((prop = node.property (X_("meter-point"))) != 0) {
2036 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2039 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2040 don't mean the same thing.
2043 if ((prop = node.property (X_("order-keys"))) != 0) {
2047 string::size_type colon, equal;
2048 string remaining = prop->value();
2050 while (remaining.length()) {
2052 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2053 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2056 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2057 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2060 set_order_key (remaining.substr (0, equal), n);
2064 colon = remaining.find_first_of (':');
2066 if (colon != string::npos) {
2067 remaining = remaining.substr (colon+1);
2074 XMLNodeList redirect_nodes;
2076 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2080 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2081 redirect_nodes.push_back(child);
2086 set_processor_state_2X (redirect_nodes, version);
2088 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2091 if (child->name() == X_("Comment")) {
2093 /* XXX this is a terrible API design in libxml++ */
2095 XMLNode *cmt = *(child->children().begin());
2096 _comment = cmt->content();
2098 } else if (child->name() == X_("Extra")) {
2100 _extra_xml = new XMLNode (*child);
2102 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2104 if (prop->value() == "solo") {
2105 _solo_control->set_state (*child, version);
2106 _session.add_controllable (_solo_control);
2109 } else if (child->name() == X_("RemoteControl")) {
2110 if ((prop = child->property (X_("id"))) != 0) {
2112 sscanf (prop->value().c_str(), "%d", &x);
2113 set_remote_control_id (x);
2123 Route::get_processor_state ()
2125 XMLNode* root = new XMLNode (X_("redirects"));
2126 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2127 root->add_child_nocopy ((*i)->state (true));
2134 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2136 /* We don't bother removing existing processors not in nList, as this
2137 method will only be called when creating a Route from scratch, not
2138 for undo purposes. Just put processors in at the appropriate place
2142 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2143 add_processor_from_xml_2X (**i, version, _processors.begin ());
2148 Route::set_processor_state (const XMLNode& node)
2150 const XMLNodeList &nlist = node.children();
2151 XMLNodeConstIterator niter;
2152 ProcessorList::iterator i, o;
2154 // Iterate through existing processors, remove those which are not in the state list
2156 for (i = _processors.begin(); i != _processors.end(); ) {
2158 /* leave amp alone, always */
2165 ProcessorList::iterator tmp = i;
2168 bool processorInStateList = false;
2170 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2172 XMLProperty* id_prop = (*niter)->property(X_("id"));
2174 if (id_prop && (*i)->id() == id_prop->value()) {
2175 processorInStateList = true;
2180 if (!processorInStateList) {
2181 remove_processor (*i);
2187 // Iterate through state list and make sure all processors are on the track and in the correct order,
2188 // set the state of existing processors according to the new state on the same go
2190 i = _processors.begin();
2192 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
2194 XMLProperty* prop = (*niter)->property ("type");
2198 // Check whether the next processor in the list is the right one,
2199 // except for "amp" which is always there and may not have the
2200 // old ID since it is always created anew in every Route
2202 if (prop->value() != "amp") {
2203 while (o != _processors.end()) {
2204 XMLProperty* id_prop = (*niter)->property(X_("id"));
2205 if (id_prop && (*o)->id() == id_prop->value()) {
2213 // If the processor (*niter) is not on the route,
2214 // create it and move it to the correct location
2216 if (o == _processors.end()) {
2218 if (add_processor_from_xml (**niter, i)) {
2219 --i; // move iterator to the newly inserted processor
2221 cerr << "Error restoring route: unable to restore processor" << endl;
2226 // Otherwise, the processor already exists; just
2227 // ensure it is at the location provided in the XML state
2230 boost::shared_ptr<Processor> tmp = (*o);
2231 _processors.erase (o); // remove the old copy
2232 _processors.insert (i, tmp); // insert the processor at the correct location
2233 --i; // move iterator to the correct processor
2236 // and make it (just) so
2238 (*i)->set_state (**niter, Stateful::current_state_version);
2242 /* note: there is no configure_processors() call because we figure that
2243 the XML state represents a working signal route.
2246 processors_changed (RouteProcessorChange ());
2250 Route::curve_reallocate ()
2252 // _gain_automation_curve.finish_resize ();
2253 // _pan_automation_curve.finish_resize ();
2257 Route::silence (nframes_t nframes)
2261 _output->silence (nframes);
2264 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2267 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2268 boost::shared_ptr<PluginInsert> pi;
2270 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2271 // skip plugins, they don't need anything when we're not active
2275 (*i)->silence (nframes);
2278 if (nframes == _session.get_block_size()) {
2288 Route::add_internal_return ()
2291 _intreturn.reset (new InternalReturn (_session));
2292 add_processor (_intreturn, PreFader);
2297 Route::get_return_buffer () const
2299 Glib::RWLock::ReaderLock rm (_processor_lock);
2301 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2302 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2305 BufferSet* bs = d->get_buffers ();
2314 Route::release_return_buffer () const
2316 Glib::RWLock::ReaderLock rm (_processor_lock);
2318 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2319 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2322 return d->release_buffers ();
2328 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2330 vector<string> ports;
2331 vector<string>::const_iterator i;
2334 Glib::RWLock::ReaderLock rm (_processor_lock);
2336 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2338 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2340 if (d && d->target_route() == route) {
2342 /* if the target is the control outs, then make sure
2343 we take note of which i-send is doing that.
2346 if (route == _session.control_out()) {
2347 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
2350 /* already listening via the specified IO: do nothing */
2357 boost::shared_ptr<InternalSend> listener;
2360 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2362 } catch (failed_constructor& err) {
2366 if (route == _session.control_out()) {
2367 _control_outs = listener;
2370 add_processor (listener, placement);
2376 Route::drop_listen (boost::shared_ptr<Route> route)
2378 ProcessorStreams err;
2379 ProcessorList::iterator tmp;
2381 Glib::RWLock::ReaderLock rl(_processor_lock);
2385 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2387 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2389 if (d && d->target_route() == route) {
2391 remove_processor (*x, &err);
2394 /* list could have been demolished while we dropped the lock
2404 if (route == _session.control_out()) {
2405 _control_outs.reset ();
2410 Route::set_comment (string cmt, void *src)
2413 comment_changed (src);
2414 _session.set_dirty ();
2418 Route::feeds (boost::shared_ptr<Route> other, bool* only_send)
2420 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2422 if (_output->connected_to (other->input())) {
2423 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2432 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2434 boost::shared_ptr<IOProcessor> iop;
2436 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2437 if (iop->feeds (other)) {
2438 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2444 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2447 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2452 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2457 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2459 nframes_t now = _session.transport_frame();
2462 Glib::RWLock::ReaderLock lm (_processor_lock);
2465 automation_snapshot (now, true);
2468 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2470 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2471 (*i)->deactivate ();
2475 (*i)->transport_stopped (now);
2479 _roll_delay = _initial_delay;
2483 Route::input_change_handler (IOChange change, void * /*src*/)
2485 if ((change & ConfigurationChanged)) {
2486 configure_processors (0);
2491 Route::output_change_handler (IOChange change, void * /*src*/)
2493 if ((change & ConfigurationChanged)) {
2495 /* XXX resize all listeners to match _main_outs? */
2497 // configure_processors (0);
2502 Route::pans_required () const
2504 if (n_outputs().n_audio() < 2) {
2508 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2512 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2513 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2515 if (n_outputs().n_total() == 0) {
2519 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2524 _amp->apply_gain_automation (false);
2525 passthru (start_frame, end_frame, nframes, 0);
2531 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2533 if (_roll_delay > nframes) {
2535 _roll_delay -= nframes;
2537 /* transport frame is not legal for caller to use */
2540 } else if (_roll_delay > 0) {
2542 nframes -= _roll_delay;
2543 silence (_roll_delay);
2544 /* we've written _roll_delay of samples into the
2545 output ports, so make a note of that for
2548 _main_outs->increment_output_offset (_roll_delay);
2549 transport_frame += _roll_delay;
2558 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2559 bool /*can_record*/, bool /*rec_monitors_input*/)
2562 // automation snapshot can also be called from the non-rt context
2563 // and it uses the processor list, so we try to acquire the lock here
2564 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2567 automation_snapshot (_session.transport_frame(), false);
2571 if (n_outputs().n_total() == 0) {
2575 if (!_active || n_inputs().n_total() == 0) {
2580 nframes_t unused = 0;
2582 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2588 passthru (start_frame, end_frame, nframes, declick);
2594 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2595 bool /*can_record*/, bool /*rec_monitors_input*/)
2602 Route::toggle_monitor_input ()
2604 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2605 i->ensure_monitor_input( ! i->monitoring_input());
2610 Route::has_external_redirects () const
2612 // FIXME: what about sends? - they don't return a signal back to ardour?
2614 boost::shared_ptr<const PortInsert> pi;
2616 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2618 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2620 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2622 string port_name = port->name();
2623 string client_name = port_name.substr (0, port_name.find(':'));
2625 /* only say "yes" if the redirect is actually in use */
2627 if (client_name != "ardour" && pi->active()) {
2638 Route::flush_processors ()
2640 /* XXX shouldn't really try to take this lock, since
2641 this is called from the RT audio thread.
2644 Glib::RWLock::ReaderLock lm (_processor_lock);
2646 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2647 (*i)->deactivate ();
2653 Route::set_meter_point (MeterPoint p, void *src)
2655 /* CAN BE CALLED FROM PROCESS CONTEXT */
2657 if (_meter_point == p) {
2661 bool meter_was_visible_to_user = _meter->display_to_user ();
2664 Glib::RWLock::WriterLock lm (_processor_lock);
2666 if (p != MeterCustom) {
2667 // Move meter in the processors list to reflect the new position
2668 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2669 _processors.erase(loc);
2672 loc = _processors.begin();
2675 loc = find (_processors.begin(), _processors.end(), _amp);
2677 case MeterPostFader:
2678 loc = _processors.end();
2686 if (loc == _processors.begin()) {
2687 m_in = _input->n_ports();
2689 ProcessorList::iterator before = loc;
2691 m_in = (*before)->output_streams ();
2694 _meter->reflect_inputs (m_in);
2696 _processors.insert (loc, _meter);
2698 /* we do not need to reconfigure the processors, because the meter
2699 (a) is always ready to handle processor_max_streams
2700 (b) is always an N-in/N-out processor, and thus moving
2701 it doesn't require any changes to the other processors.
2704 _meter->set_display_to_user (false);
2708 // just make it visible and let the user move it
2710 _meter->set_display_to_user (true);
2715 meter_change (src); /* EMIT SIGNAL */
2717 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2719 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2723 Route::put_control_outs_at (Placement p)
2725 if (!_control_outs) {
2730 Glib::RWLock::WriterLock lm (_processor_lock);
2731 ProcessorList as_it_was (_processors);
2732 // Move meter in the processors list
2733 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2734 _processors.erase(loc);
2738 loc = find(_processors.begin(), _processors.end(), _amp);
2739 if (loc != _processors.begin()) {
2744 loc = find(_processors.begin(), _processors.end(), _amp);
2745 assert (loc != _processors.end());
2750 _processors.insert(loc, _control_outs);
2752 if (configure_processors_unlocked (0)) {
2753 _processors = as_it_was;
2754 configure_processors_unlocked (0); // it worked before we tried to add it ...
2759 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2760 _session.set_dirty ();
2764 Route::update_total_latency ()
2766 nframes_t old = _output->effective_latency();
2767 nframes_t own_latency = _output->user_latency();
2769 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2770 if ((*i)->active ()) {
2771 own_latency += (*i)->signal_latency ();
2775 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2777 _output->set_port_latency (own_latency);
2779 if (_output->user_latency() == 0) {
2781 /* this (virtual) function is used for pure Routes,
2782 not derived classes like AudioTrack. this means
2783 that the data processed here comes from an input
2784 port, not prerecorded material, and therefore we
2785 have to take into account any input latency.
2788 own_latency += _input->signal_latency ();
2791 if (old != own_latency) {
2792 _output->set_latency_delay (own_latency);
2793 signal_latency_changed (); /* EMIT SIGNAL */
2796 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2798 return _output->effective_latency ();
2802 Route::set_user_latency (nframes_t nframes)
2804 _output->set_user_latency (nframes);
2805 _session.update_latency_compensation (false, false);
2809 Route::set_latency_delay (nframes_t longest_session_latency)
2811 nframes_t old = _initial_delay;
2813 if (_output->effective_latency() < longest_session_latency) {
2814 _initial_delay = longest_session_latency - _output->effective_latency();
2819 if (_initial_delay != old) {
2820 initial_delay_changed (); /* EMIT SIGNAL */
2823 if (_session.transport_stopped()) {
2824 _roll_delay = _initial_delay;
2829 Route::automation_snapshot (nframes_t now, bool force)
2831 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2832 (*i)->automation_snapshot (now, force);
2836 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2837 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2838 boost::shared_ptr<AutomationList>(), name)
2841 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2846 Route::SoloControllable::set_value (float val)
2848 bool bval = ((val >= 0.5f) ? true: false);
2850 route.set_solo (bval, this);
2854 Route::SoloControllable::get_value (void) const
2856 return route.self_soloed() ? 1.0f : 0.0f;
2860 Route::set_block_size (nframes_t nframes)
2862 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2863 (*i)->set_block_size (nframes);
2866 _session.ensure_buffers (n_process_buffers ());
2870 Route::protect_automation ()
2872 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2873 (*i)->protect_automation();
2877 Route::set_pending_declick (int declick)
2880 /* this call is not allowed to turn off a pending declick unless "force" is true */
2882 _pending_declick = declick;
2884 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2886 _pending_declick = 0;
2891 /** Shift automation forwards from a particular place, thereby inserting time.
2892 * Adds undo commands for any shifts that are performed.
2894 * @param pos Position to start shifting from.
2895 * @param frames Amount to shift forwards by.
2899 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2901 #ifdef THIS_NEEDS_FIXING_FOR_V3
2903 /* gain automation */
2904 XMLNode &before = _gain_control->get_state ();
2905 _gain_control->shift (pos, frames);
2906 XMLNode &after = _gain_control->get_state ();
2907 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2909 /* pan automation */
2910 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2911 Curve & c = (*i)->automation ();
2912 XMLNode &before = c.get_state ();
2913 c.shift (pos, frames);
2914 XMLNode &after = c.get_state ();
2915 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2918 /* redirect automation */
2920 Glib::RWLock::ReaderLock lm (redirect_lock);
2921 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2924 (*i)->what_has_automation (a);
2926 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2927 AutomationList & al = (*i)->automation_list (*j);
2928 XMLNode &before = al.get_state ();
2929 al.shift (pos, frames);
2930 XMLNode &after = al.get_state ();
2931 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2941 Route::save_as_template (const string& path, const string& name)
2943 XMLNode& node (state (false));
2946 IO::set_name_in_state (*node.children().front(), name);
2948 tree.set_root (&node);
2949 return tree.write (path.c_str());
2954 Route::set_name (const string& str)
2960 name = Route::ensure_track_or_route_name (str, _session);
2961 SessionObject::set_name (name);
2963 ret = (_input->set_name(name) && _output->set_name(name));
2967 Glib::RWLock::ReaderLock lm (_processor_lock);
2969 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2971 /* rename all I/O processors that have inputs or outputs */
2973 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2975 if (iop && (iop->output() || iop->input())) {
2976 if (!iop->set_name (name)) {
2987 boost::shared_ptr<Send>
2988 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2990 Glib::RWLock::ReaderLock lm (_processor_lock);
2992 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2993 boost::shared_ptr<InternalSend> send;
2995 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2996 if (send->target_route() == target) {
3002 return boost::shared_ptr<Send>();
3006 Route::set_phase_invert (bool yn)
3008 if (_phase_invert != yn) {
3009 _phase_invert = 0xffff; // XXX all channels
3010 phase_invert_changed (); /* EMIT SIGNAL */
3015 Route::phase_invert () const
3017 return _phase_invert != 0;
3021 Route::set_denormal_protection (bool yn)
3023 if (_denormal_protection != yn) {
3024 _denormal_protection = yn;
3025 denormal_protection_changed (); /* EMIT SIGNAL */
3030 Route::denormal_protection () const
3032 return _denormal_protection;
3036 Route::set_active (bool yn)
3038 if (_active != yn) {
3040 _input->set_active (yn);
3041 _output->set_active (yn);
3042 active_changed (); // EMIT SIGNAL
3049 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3055 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3057 boost::shared_ptr<Send> s;
3058 boost::shared_ptr<Return> r;
3060 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3061 s->meter()->meter();
3062 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3063 r->meter()->meter ();
3068 boost::shared_ptr<Panner>
3069 Route::panner() const
3072 return _main_outs->panner();
3075 boost::shared_ptr<AutomationControl>
3076 Route::gain_control() const
3079 return _amp->gain_control();
3082 boost::shared_ptr<AutomationControl>
3083 Route::get_control (const Evoral::Parameter& param)
3085 /* either we own the control or .... */
3087 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
3091 /* maybe one of our processors does or ... */
3093 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3094 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3095 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
3103 /* nobody does so we'll make a new one */
3105 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3112 boost::shared_ptr<Processor>
3113 Route::nth_plugin (uint32_t n)
3115 Glib::RWLock::ReaderLock lm (_processor_lock);
3116 ProcessorList::iterator i;
3118 for (i = _processors.begin(); i != _processors.end(); ++i) {
3119 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3126 return boost::shared_ptr<Processor> ();
3129 boost::shared_ptr<Processor>
3130 Route::nth_send (uint32_t n)
3132 Glib::RWLock::ReaderLock lm (_processor_lock);
3133 ProcessorList::iterator i;
3135 for (i = _processors.begin(); i != _processors.end(); ++i) {
3136 cerr << "check " << (*i)->name() << endl;
3137 if (boost::dynamic_pointer_cast<Send> (*i)) {
3142 cerr << "\tnot a send\n";
3146 return boost::shared_ptr<Processor> ();