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 <sigc++/bind.h>
26 #include "pbd/xml++.h"
27 #include "pbd/enumwriter.h"
28 #include "pbd/memento_command.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 sigc::signal<void, string const &> Route::SyncOrderKeys;
69 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
70 : SessionObject (sess, name)
71 , AutomatableControls (sess)
73 , _solo_control (new SoloControllable (X_("solo"), *this))
74 , _mute_master (new MuteMaster (sess, name))
75 , _default_type (default_type)
80 /* add standard processors other than amp (added by ::init()) */
82 _meter.reset (new PeakMeter (_session));
83 _meter->set_display_to_user (_meter_point == MeterCustom);
84 add_processor (_meter, PreFader);
86 if (_flags & ControlOut) {
87 /* where we listen to tracks */
88 _intreturn.reset (new InternalReturn (_session));
89 add_processor (_intreturn, PreFader);
92 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
93 add_processor (_main_outs, PostFader);
95 /* now that we have _meter, its safe to connect to this */
97 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
100 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
101 : SessionObject (sess, "toBeReset")
102 , AutomatableControls (sess)
103 , _solo_control (new SoloControllable (X_("solo"), *this))
104 , _mute_master (new MuteMaster (sess, "toBeReset"))
105 , _default_type (default_type)
109 _set_state (node, Stateful::loading_state_version, false);
111 /* now that we have _meter, its safe to connect to this */
113 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
120 _soloed_by_others = 0;
121 _solo_isolated = false;
124 processor_max_streams.reset();
126 order_keys[N_("signal")] = order_key_cnt++;
128 _meter_point = MeterPostFader;
131 _have_internal_generator = false;
132 _declickable = false;
133 _pending_declick = true;
134 _remote_control_id = 0;
135 _in_configure_processors = false;
136 _mute_points = MuteMaster::AllPoints;
141 _denormal_protection = false;
143 /* add standard controls */
145 add_control (_solo_control);
146 add_control (_mute_master);
148 /* input and output objects */
150 _input.reset (new IO (_session, _name, IO::Input, _default_type));
151 _output.reset (new IO (_session, _name, IO::Output, _default_type));
153 _input->changed.connect (mem_fun (this, &Route::input_change_handler));
154 _output->changed.connect (mem_fun (this, &Route::output_change_handler));
156 /* add amp processor */
158 _amp.reset (new Amp (_session, _mute_master));
159 add_processor (_amp, PostFader);
164 Metering::disconnect (_meter_connection);
166 clear_processors (PreFader);
167 clear_processors (PostFader);
171 Route::set_remote_control_id (uint32_t id)
173 if (id != _remote_control_id) {
174 _remote_control_id = id;
175 RemoteControlIDChanged ();
180 Route::remote_control_id() const
182 return _remote_control_id;
186 Route::order_key (std::string const & name) const
188 OrderKeys::const_iterator i = order_keys.find (name);
189 if (i == order_keys.end()) {
197 Route::set_order_key (std::string const & name, long n)
199 order_keys[name] = n;
201 if (Config->get_sync_all_route_ordering()) {
202 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
207 _session.set_dirty ();
210 /** Set all order keys to be the same as that for `base', if such a key
211 * exists in this route.
212 * @param base Base key.
215 Route::sync_order_keys (std::string const & base)
217 if (order_keys.empty()) {
221 OrderKeys::iterator i;
224 if ((i = order_keys.find (base)) == order_keys.end()) {
225 /* key doesn't exist, use the first existing key (during session initialization) */
226 i = order_keys.begin();
230 /* key exists - use it and reset all others (actually, itself included) */
232 i = order_keys.begin();
235 for (; i != order_keys.end(); ++i) {
241 Route::ensure_track_or_route_name(string name, Session &session)
243 string newname = name;
245 while (session.route_by_name (newname) != NULL) {
246 newname = bump_name_once (newname);
254 Route::inc_gain (gain_t fraction, void *src)
256 _amp->inc_gain (fraction, src);
260 Route::set_gain (gain_t val, void *src)
262 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
264 if (_route_group->is_relative()) {
266 gain_t usable_gain = _amp->gain();
267 if (usable_gain < 0.000001f) {
268 usable_gain = 0.000001f;
272 if (delta < 0.000001f) {
276 delta -= usable_gain;
281 gain_t factor = delta / usable_gain;
284 factor = _route_group->get_max_factor(factor);
285 if (factor == 0.0f) {
286 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
290 factor = _route_group->get_min_factor(factor);
291 if (factor == 0.0f) {
292 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
297 _route_group->apply (&Route::inc_gain, factor, _route_group);
301 _route_group->apply (&Route::set_gain, val, _route_group);
307 if (val == _amp->gain()) {
311 _amp->set_gain (val, src);
314 /** Process this route for one (sub) cycle (process thread)
316 * @param bufs Scratch buffers to use for the signal path
317 * @param start_frame Initial transport frame
318 * @param end_frame Final transport frame
319 * @param nframes Number of frames to output (to ports)
321 * Note that (end_frame - start_frame) may not be equal to nframes when the
322 * transport speed isn't 1.0 (eg varispeed).
325 Route::process_output_buffers (BufferSet& bufs,
326 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
327 bool /*with_processors*/, int declick)
331 bufs.is_silent (false);
333 switch (Config->get_monitoring_model()) {
334 case HardwareMonitoring:
335 case ExternalMonitoring:
336 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
343 declick = _pending_declick;
346 /* figure out if we're going to use gain automation */
347 _amp->setup_gain_automation (start_frame, end_frame, nframes);
350 /* tell main outs what to do about monitoring */
351 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
354 /* -------------------------------------------------------------------------------------------
355 GLOBAL DECLICK (for transport changes etc.)
356 ----------------------------------------------------------------------------------------- */
359 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
360 } else if (declick < 0) {
361 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
364 _pending_declick = 0;
366 /* -------------------------------------------------------------------------------------------
367 DENORMAL CONTROL/PHASE INVERT
368 ----------------------------------------------------------------------------------------- */
374 if (_denormal_protection || Config->get_denormal_protection()) {
376 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
377 Sample* const sp = i->data();
379 if (_phase_invert & chn) {
380 for (nframes_t nx = 0; nx < nframes; ++nx) {
385 for (nframes_t nx = 0; nx < nframes; ++nx) {
393 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
394 Sample* const sp = i->data();
396 if (_phase_invert & chn) {
397 for (nframes_t nx = 0; nx < nframes; ++nx) {
406 if (_denormal_protection || Config->get_denormal_protection()) {
408 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
409 Sample* const sp = i->data();
410 for (nframes_t nx = 0; nx < nframes; ++nx) {
418 /* -------------------------------------------------------------------------------------------
420 ----------------------------------------------------------------------------------------- */
422 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
425 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
427 if (bufs.count() != (*i)->input_streams()) {
428 cerr << _name << " bufs = " << bufs.count()
429 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
432 assert (bufs.count() == (*i)->input_streams());
434 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
435 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
438 if (!_processors.empty()) {
439 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
445 Route::n_process_buffers ()
447 return max (_input->n_ports(), processor_max_streams);
451 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
453 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
457 assert (bufs.available() >= _input->n_ports());
459 if (_input->n_ports() == ChanCount::ZERO) {
463 bufs.set_count (_input->n_ports());
465 if (is_control() && _session.listening()) {
467 /* control/monitor bus ignores input ports when something is
468 feeding the listen "stream". data will "arrive" into the
469 route from the intreturn processor element.
472 bufs.silence (nframes, 0);
476 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
478 BufferSet::iterator o = bufs.begin(*t);
479 PortSet& ports (_input->ports());
481 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
482 o->read_from (i->get_buffer(nframes), nframes);
487 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
488 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
492 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
494 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
495 bufs.set_count (_input->n_ports());
496 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
497 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
501 Route::set_listen (bool yn, void* src)
504 if (yn != _control_outs->active()) {
506 _control_outs->activate ();
508 _control_outs->deactivate ();
511 listen_changed (src); /* EMIT SIGNAL */
517 Route::listening () const
520 return _control_outs->active ();
527 Route::set_solo_safe (bool yn, void *src)
529 if (_solo_safe != yn) {
531 solo_safe_changed (src);
536 Route::solo_safe() const
542 Route::set_solo (bool yn, void *src)
548 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
549 _route_group->apply (&Route::set_solo, yn, _route_group);
553 if (self_soloed() != yn) {
555 set_delivery_solo ();
556 solo_changed (src); /* EMIT SIGNAL */
557 _solo_control->Changed (); /* EMIT SIGNAL */
562 Route::set_self_solo (bool yn)
568 Route::mod_solo_by_others (int32_t delta)
571 if (_soloed_by_others >= (uint32_t) delta) {
572 _soloed_by_others += delta;
574 _soloed_by_others = 0;
577 _soloed_by_others += delta;
580 set_delivery_solo ();
584 Route::set_delivery_solo ()
586 /* tell all delivery processors what the solo situation is, so that they keep
587 delivering even though Session::soloing() is true and they were not
591 Glib::RWLock::ReaderLock rm (_processor_lock);
592 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
593 boost::shared_ptr<Delivery> d;
595 if ((d = boost::dynamic_pointer_cast<Delivery> (*i)) != 0) {
596 d->set_solo_level (soloed ());
597 d->set_solo_isolated (solo_isolated());
603 Route::set_solo_isolated (bool yn, void *src)
605 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
606 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
610 if (yn != _solo_isolated) {
612 set_delivery_solo ();
613 solo_isolated_changed (src);
618 Route::solo_isolated () const
620 return _solo_isolated;
624 Route::set_mute_points (MuteMaster::MutePoint mp)
627 mute_points_changed (); /* EMIT SIGNAL */
629 if (_mute_master->muted()) {
630 _mute_master->mute_at (_mute_points);
631 mute_changed (this); /* EMIT SIGNAL */
636 Route::set_mute (bool yn, void *src)
638 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
639 _route_group->apply (&Route::set_mute, yn, _route_group);
645 _mute_master->mute_at (_mute_points);
647 _mute_master->clear_mute ();
650 mute_changed (src); /* EMIT SIGNAL */
657 return _mute_master->muted ();
662 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
664 cerr << name << " {" << endl;
665 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
666 p != procs.end(); ++p) {
667 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
674 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
676 ProcessorList::iterator loc;
678 /* XXX this is not thread safe - we don't hold the lock across determining the iter
679 to add before and actually doing the insertion. dammit.
682 if (placement == PreFader) {
683 /* generic pre-fader: insert immediately before the amp */
684 loc = find (_processors.begin(), _processors.end(), _amp);
686 /* generic post-fader: insert right before the main outs */
687 loc = find (_processors.begin(), _processors.end(), _main_outs);
690 return add_processor (processor, loc, err);
694 /** Add a processor to the route.
695 * If @a iter is not NULL, it must point to an iterator in _processors and the new
696 * processor will be inserted immediately before this location. Otherwise,
697 * @a position is used.
700 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
702 ChanCount old_pms = processor_max_streams;
704 if (!_session.engine().connected() || !processor) {
709 Glib::RWLock::WriterLock lm (_processor_lock);
711 boost::shared_ptr<PluginInsert> pi;
712 boost::shared_ptr<PortInsert> porti;
714 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
716 if (processor == _amp || processor == _meter || processor == _main_outs) {
717 // Ensure only one of these are in the list at any time
718 if (loc != _processors.end()) {
719 if (iter == loc) { // Already in place, do nothing
721 } else { // New position given, relocate
722 _processors.erase (loc);
727 if (loc != _processors.end()) {
728 cerr << "ERROR: Processor added to route twice!" << endl;
735 _processors.insert (loc, processor);
737 // Set up processor list channels. This will set processor->[input|output]_streams(),
738 // configure redirect ports properly, etc.
740 if (configure_processors_unlocked (err)) {
741 ProcessorList::iterator ploc = loc;
743 _processors.erase(ploc);
744 configure_processors_unlocked (0); // it worked before we tried to add it ...
745 cerr << "configure failed\n";
749 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
751 if (pi->natural_input_streams() == ChanCount::ZERO) {
752 /* generator plugin */
753 _have_internal_generator = true;
758 if (_control_outs != processor) {
759 // XXX: do we want to emit the signal here ? change call order.
760 processor->activate ();
762 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
764 _output->set_user_latency (0);
767 processors_changed (); /* EMIT SIGNAL */
773 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
775 const XMLProperty *prop;
777 if (node.name() != "Processor") {
782 if ((prop = node.property ("type")) != 0) {
784 boost::shared_ptr<Processor> processor;
786 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
787 prop->value() == "lv2" ||
788 prop->value() == "vst" ||
789 prop->value() == "audiounit") {
791 processor.reset (new PluginInsert(_session, node));
793 } else if (prop->value() == "port") {
795 processor.reset (new PortInsert (_session, _mute_master, node));
797 } else if (prop->value() == "send") {
799 processor.reset (new Send (_session, _mute_master, node));
801 } else if (prop->value() == "meter") {
804 if (_meter->set_state (node, Stateful::loading_state_version)) {
811 _meter.reset (new PeakMeter (_session, node));
812 _meter->set_display_to_user (_meter_point == MeterCustom);
815 } else if (prop->value() == "amp") {
817 /* amp always exists */
820 if (processor->set_state (node, Stateful::loading_state_version)) {
823 /* never any reason to add it */
827 } else if (prop->value() == "intsend") {
829 processor.reset (new InternalSend (_session, _mute_master, node));
831 } else if (prop->value() == "intreturn") {
834 if (_intreturn->set_state (node, Stateful::loading_state_version)) {
840 _intreturn.reset (new InternalReturn (_session, node));
841 processor = _intreturn;
843 } else if (prop->value() == "main-outs") {
846 if (_main_outs->set_state (node, Stateful::loading_state_version)) {
853 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
854 processor = _main_outs;
857 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
861 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
862 /* check for invisible processors stacked at the end and leave them there */
863 ProcessorList::iterator p;
864 p = _processors.end();
866 while (!(*p)->display_to_user() && p != _processors.begin()) {
873 return (add_processor (processor, iter) == 0);
876 error << _("Processor XML node has no type property") << endmsg;
881 catch (failed_constructor &err) {
882 warning << _("processor could not be created. Ignored.") << endmsg;
889 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
891 const XMLProperty *prop;
894 boost::shared_ptr<Processor> processor;
896 if (node.name() == "Insert") {
898 if ((prop = node.property ("type")) != 0) {
900 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
901 prop->value() == "lv2" ||
902 prop->value() == "vst" ||
903 prop->value() == "audiounit") {
905 processor.reset (new PluginInsert (_session, node));
909 processor.reset (new PortInsert (_session, _mute_master, node));
914 } else if (node.name() == "Send") {
916 processor.reset (new Send (_session, _mute_master, node, version));
920 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
924 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
925 /* check for invisible processors stacked at the end and leave them there */
926 ProcessorList::iterator p;
927 p = _processors.end();
929 while (!(*p)->display_to_user() && p != _processors.begin()) {
936 return (add_processor (processor, iter) == 0);
939 catch (failed_constructor &err) {
940 warning << _("processor could not be created. Ignored.") << endmsg;
946 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
948 ProcessorList::iterator loc;
951 loc = find(_processors.begin(), _processors.end(), before);
953 /* nothing specified - at end but before main outs */
954 loc = find (_processors.begin(), _processors.end(), _main_outs);
957 return add_processors (others, loc, err);
961 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
963 /* NOTE: this is intended to be used ONLY when copying
964 processors from another Route. Hence the subtle
965 differences between this and ::add_processor()
968 ChanCount old_pms = processor_max_streams;
970 if (!_session.engine().connected()) {
974 if (others.empty()) {
979 Glib::RWLock::WriterLock lm (_processor_lock);
980 ProcessorList::iterator existing_end = _processors.end();
983 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
985 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
987 // Ensure meter only appears in the list once
989 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
990 if (m != _processors.end()) {
991 _processors.erase(m);
995 boost::shared_ptr<PluginInsert> pi;
997 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1000 ChanCount m = max (pi->input_streams(), pi->output_streams());
1002 if (m > potential_max_streams) {
1003 potential_max_streams = m;
1007 _processors.insert (iter, *i);
1009 if (configure_processors_unlocked (err)) {
1011 _processors.erase (existing_end, _processors.end());
1012 configure_processors_unlocked (0); // it worked before we tried to add it ...
1016 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
1019 _output->set_user_latency (0);
1022 processors_changed (); /* EMIT SIGNAL */
1028 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1030 if (p == PreFader) {
1031 start = _processors.begin();
1032 end = find(_processors.begin(), _processors.end(), _amp);
1034 start = find(_processors.begin(), _processors.end(), _amp);
1036 end = _processors.end();
1040 /** Turn off all processors with a given placement
1041 * @param p Placement of processors to disable
1044 Route::disable_processors (Placement p)
1046 Glib::RWLock::ReaderLock lm (_processor_lock);
1048 ProcessorList::iterator start, end;
1049 placement_range(p, start, end);
1051 for (ProcessorList::iterator i = start; i != end; ++i) {
1052 (*i)->deactivate ();
1055 _session.set_dirty ();
1058 /** Turn off all redirects
1061 Route::disable_processors ()
1063 Glib::RWLock::ReaderLock lm (_processor_lock);
1065 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1066 (*i)->deactivate ();
1069 _session.set_dirty ();
1072 /** Turn off all redirects with a given placement
1073 * @param p Placement of redirects to disable
1076 Route::disable_plugins (Placement p)
1078 Glib::RWLock::ReaderLock lm (_processor_lock);
1080 ProcessorList::iterator start, end;
1081 placement_range(p, start, end);
1083 for (ProcessorList::iterator i = start; i != end; ++i) {
1084 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1085 (*i)->deactivate ();
1089 _session.set_dirty ();
1092 /** Turn off all plugins
1095 Route::disable_plugins ()
1097 Glib::RWLock::ReaderLock lm (_processor_lock);
1099 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1100 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1101 (*i)->deactivate ();
1105 _session.set_dirty ();
1110 Route::ab_plugins (bool forward)
1112 Glib::RWLock::ReaderLock lm (_processor_lock);
1116 /* forward = turn off all active redirects, and mark them so that the next time
1117 we go the other way, we will revert them
1120 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1121 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1125 if ((*i)->active()) {
1126 (*i)->deactivate ();
1127 (*i)->set_next_ab_is_active (true);
1129 (*i)->set_next_ab_is_active (false);
1135 /* backward = if the redirect was marked to go active on the next ab, do so */
1137 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1139 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1143 if ((*i)->get_next_ab_is_active()) {
1146 (*i)->deactivate ();
1151 _session.set_dirty ();
1155 /** Remove processors with a given placement.
1156 * @param p Placement of processors to remove.
1159 Route::clear_processors (Placement p)
1161 const ChanCount old_pms = processor_max_streams;
1163 if (!_session.engine().connected()) {
1167 bool already_deleting = _session.deletion_in_progress();
1168 if (!already_deleting) {
1169 _session.set_deletion_in_progress();
1173 Glib::RWLock::WriterLock lm (_processor_lock);
1174 ProcessorList new_list;
1175 ProcessorStreams err;
1176 bool seen_amp = false;
1178 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1184 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1186 /* you can't remove these */
1188 new_list.push_back (*i);
1195 new_list.push_back (*i);
1198 (*i)->drop_references ();
1206 (*i)->drop_references ();
1209 new_list.push_back (*i);
1216 _processors = new_list;
1217 configure_processors_unlocked (&err); // this can't fail
1220 processor_max_streams.reset();
1221 _have_internal_generator = false;
1222 processors_changed (); /* EMIT SIGNAL */
1224 if (!already_deleting) {
1225 _session.clear_deletion_in_progress();
1230 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1232 /* these can never be removed */
1234 if (processor == _amp || processor == _meter || processor == _main_outs) {
1238 ChanCount old_pms = processor_max_streams;
1240 if (!_session.engine().connected()) {
1244 processor_max_streams.reset();
1247 Glib::RWLock::WriterLock lm (_processor_lock);
1248 ProcessorList::iterator i;
1249 bool removed = false;
1251 for (i = _processors.begin(); i != _processors.end(); ) {
1252 if (*i == processor) {
1254 /* move along, see failure case for configure_processors()
1255 where we may need to reconfigure the processor.
1258 /* stop redirects that send signals to JACK ports
1259 from causing noise as a result of no longer being
1263 boost::shared_ptr<IOProcessor> iop;
1265 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1267 iop->input()->disconnect (this);
1269 if (iop->output()) {
1270 iop->output()->disconnect (this);
1274 i = _processors.erase (i);
1282 _output->set_user_latency (0);
1290 if (configure_processors_unlocked (err)) {
1291 /* get back to where we where */
1292 _processors.insert (i, processor);
1293 /* we know this will work, because it worked before :) */
1294 configure_processors_unlocked (0);
1298 _have_internal_generator = false;
1300 for (i = _processors.begin(); i != _processors.end(); ++i) {
1301 boost::shared_ptr<PluginInsert> pi;
1303 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1304 if (pi->is_generator()) {
1305 _have_internal_generator = true;
1312 processor->drop_references ();
1313 processors_changed (); /* EMIT SIGNAL */
1319 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1321 ProcessorList deleted;
1322 ProcessorList as_we_were;
1324 if (!_session.engine().connected()) {
1328 processor_max_streams.reset();
1331 Glib::RWLock::WriterLock lm (_processor_lock);
1332 ProcessorList::iterator i;
1333 boost::shared_ptr<Processor> processor;
1335 as_we_were = _processors;
1337 for (i = _processors.begin(); i != _processors.end(); ) {
1341 /* these can never be removed */
1343 if (processor == _amp || processor == _meter || processor == _main_outs) {
1348 /* see if its in the list of processors to delete */
1350 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1355 /* stop IOProcessors that send to JACK ports
1356 from causing noise as a result of no longer being
1360 boost::shared_ptr<IOProcessor> iop;
1362 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1366 deleted.push_back (processor);
1367 i = _processors.erase (i);
1370 if (deleted.empty()) {
1371 /* none of those in the requested list were found */
1375 _output->set_user_latency (0);
1377 if (configure_processors_unlocked (err)) {
1378 /* get back to where we where */
1379 _processors = as_we_were;
1380 /* we know this will work, because it worked before :) */
1381 configure_processors_unlocked (0);
1385 _have_internal_generator = false;
1387 for (i = _processors.begin(); i != _processors.end(); ++i) {
1388 boost::shared_ptr<PluginInsert> pi;
1390 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1391 if (pi->is_generator()) {
1392 _have_internal_generator = true;
1399 /* now try to do what we need to so that those that were removed will be deleted */
1401 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1402 (*i)->drop_references ();
1405 processors_changed (); /* EMIT SIGNAL */
1412 Route::configure_processors (ProcessorStreams* err)
1414 if (!_in_configure_processors) {
1415 Glib::RWLock::WriterLock lm (_processor_lock);
1416 return configure_processors_unlocked (err);
1421 /** Configure the input/output configuration of each processor in the processors list.
1422 * Return 0 on success, otherwise configuration is impossible.
1425 Route::configure_processors_unlocked (ProcessorStreams* err)
1427 if (_in_configure_processors) {
1431 _in_configure_processors = true;
1433 // Check each processor in order to see if we can configure as requested
1434 ChanCount in = _input->n_ports ();
1436 list< pair<ChanCount,ChanCount> > configuration;
1439 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1441 DEBUG_TRACE (DEBUG::Processors, "{\n");
1442 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1443 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1445 DEBUG_TRACE (DEBUG::Processors, "}\n");
1448 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1450 if ((*p)->can_support_io_configuration(in, out)) {
1451 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
1452 configuration.push_back(make_pair(in, out));
1459 _in_configure_processors = false;
1464 /* Take the process lock so that if we add a processor which increases the required
1465 number of scratch buffers, we create those scratch buffers before the process
1466 thread has a chance to ask for them.
1467 XXX: in an ideal world we'd perhaps use some RCU magic to avoid having to take
1471 Glib::Mutex::Lock pl (_session.engine().process_lock ());
1473 // We can, so configure everything
1474 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1475 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1476 (*p)->configure_io(c->first, c->second);
1477 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1478 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1482 /* make sure we have sufficient scratch buffers to cope with the new processor
1484 _session.ensure_buffers (n_process_buffers ());
1486 _in_configure_processors = false;
1491 Route::all_processors_flip ()
1493 Glib::RWLock::ReaderLock lm (_processor_lock);
1495 if (_processors.empty()) {
1499 bool first_is_on = _processors.front()->active();
1501 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1503 (*i)->deactivate ();
1509 _session.set_dirty ();
1512 /** Set all processors with a given placement to a given active state.
1513 * @param p Placement of processors to change.
1514 * @param state New active state for those processors.
1517 Route::all_processors_active (Placement p, bool state)
1519 Glib::RWLock::ReaderLock lm (_processor_lock);
1521 if (_processors.empty()) {
1524 ProcessorList::iterator start, end;
1525 placement_range(p, start, end);
1527 bool before_amp = true;
1528 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1533 if (p == PreFader && before_amp) {
1537 (*i)->deactivate ();
1542 _session.set_dirty ();
1546 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1548 bool pre_fader = true;
1549 Glib::RWLock::ReaderLock lm (_processor_lock);
1551 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1553 /* semantic note: if p == amp, we want to return true, so test
1554 for equality before checking if this is the amp
1571 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1573 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1574 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1575 processors in the current actual processor list that are hidden. Any visible processors
1576 in the current list but not in "new_order" will be assumed to be deleted.
1580 Glib::RWLock::WriterLock lm (_processor_lock);
1581 ChanCount old_pms = processor_max_streams;
1582 ProcessorList::iterator oiter;
1583 ProcessorList::const_iterator niter;
1584 ProcessorList as_it_was_before = _processors;
1585 ProcessorList as_it_will_be;
1587 oiter = _processors.begin();
1588 niter = new_order.begin();
1590 while (niter != new_order.end()) {
1592 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1593 then append it to the temp list.
1595 Otherwise, see if the next processor in the old list is in the new list. if not,
1596 its been deleted. If its there, append it to the temp list.
1599 if (oiter == _processors.end()) {
1601 /* no more elements in the old list, so just stick the rest of
1602 the new order onto the temp list.
1605 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1606 while (niter != new_order.end()) {
1613 if (!(*oiter)->display_to_user()) {
1615 as_it_will_be.push_back (*oiter);
1619 /* visible processor: check that its in the new order */
1621 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1622 /* deleted: do nothing, shared_ptr<> will clean up */
1624 /* ignore this one, and add the next item from the new order instead */
1625 as_it_will_be.push_back (*niter);
1630 /* now remove from old order - its taken care of no matter what */
1631 oiter = _processors.erase (oiter);
1636 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1638 if (configure_processors_unlocked (err)) {
1639 _processors = as_it_was_before;
1640 processor_max_streams = old_pms;
1645 processors_changed (); /* EMIT SIGNAL */
1657 Route::get_template()
1659 return state(false);
1663 Route::state(bool full_state)
1665 XMLNode *node = new XMLNode("Route");
1666 ProcessorList::iterator i;
1669 id().print (buf, sizeof (buf));
1670 node->add_property("id", buf);
1671 node->add_property ("name", _name);
1672 node->add_property("default-type", _default_type.to_string());
1675 node->add_property("flags", enum_2_string (_flags));
1678 node->add_property("active", _active?"yes":"no");
1679 node->add_property("phase-invert", _phase_invert?"yes":"no");
1680 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1681 node->add_property("meter-point", enum_2_string (_meter_point));
1684 node->add_property("route-group", _route_group->name());
1687 string order_string;
1688 OrderKeys::iterator x = order_keys.begin();
1690 while (x != order_keys.end()) {
1691 order_string += string ((*x).first);
1692 order_string += '=';
1693 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1694 order_string += buf;
1698 if (x == order_keys.end()) {
1702 order_string += ':';
1704 node->add_property ("order-keys", order_string);
1705 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1706 snprintf (buf, sizeof (buf), "%d", _soloed_by_others);
1707 node->add_property ("soloed-by-others", buf);
1709 node->add_child_nocopy (_input->state (full_state));
1710 node->add_child_nocopy (_output->state (full_state));
1711 node->add_child_nocopy (_solo_control->get_state ());
1712 node->add_child_nocopy (_mute_master->get_state ());
1714 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1715 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1716 remote_control_node->add_property (X_("id"), buf);
1717 node->add_child_nocopy (*remote_control_node);
1719 if (_comment.length()) {
1720 XMLNode *cmt = node->add_child ("Comment");
1721 cmt->add_content (_comment);
1724 for (i = _processors.begin(); i != _processors.end(); ++i) {
1725 node->add_child_nocopy((*i)->state (full_state));
1729 node->add_child_copy (*_extra_xml);
1736 Route::set_state (const XMLNode& node, int version)
1738 return _set_state (node, version, true);
1742 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1744 if (version < 3000) {
1745 return _set_state_2X (node, version);
1749 XMLNodeConstIterator niter;
1751 XMLPropertyList plist;
1752 const XMLProperty *prop;
1754 if (node.name() != "Route"){
1755 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1759 if ((prop = node.property (X_("name"))) != 0) {
1760 Route::set_name (prop->value());
1763 if ((prop = node.property ("id")) != 0) {
1764 _id = prop->value ();
1767 if ((prop = node.property (X_("flags"))) != 0) {
1768 _flags = Flag (string_2_enum (prop->value(), _flags));
1773 /* add all processors (except amp, which is always present) */
1775 nlist = node.children();
1776 XMLNode processor_state (X_("processor_state"));
1778 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1782 if (child->name() == IO::state_node_name) {
1783 if ((prop = child->property (X_("direction"))) == 0) {
1787 if (prop->value() == "Input") {
1788 _input->set_state (*child, version);
1789 } else if (prop->value() == "Output") {
1790 _output->set_state (*child, version);
1794 if (child->name() == X_("Processor")) {
1795 processor_state.add_child_copy (*child);
1799 set_processor_state (processor_state);
1801 if ((prop = node.property ("self-solo")) != 0) {
1802 set_self_solo (string_is_affirmative (prop->value()));
1805 if ((prop = node.property ("soloed-by-others")) != 0) {
1806 _soloed_by_others = 0; // needed for mod_solo_by_others () to work
1807 mod_solo_by_others (atoi (prop->value()));
1810 if ((prop = node.property ("solo-isolated")) != 0) {
1811 set_solo_isolated (string_is_affirmative (prop->value()), this);
1814 if ((prop = node.property (X_("phase-invert"))) != 0) {
1815 set_phase_invert (string_is_affirmative (prop->value()));
1818 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1819 set_denormal_protection (string_is_affirmative (prop->value()));
1822 if ((prop = node.property (X_("active"))) != 0) {
1823 bool yn = string_is_affirmative (prop->value());
1824 _active = !yn; // force switch
1828 if ((prop = node.property (X_("meter-point"))) != 0) {
1829 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1831 _meter->set_display_to_user (_meter_point == MeterCustom);
1835 if ((prop = node.property (X_("route-group"))) != 0) {
1836 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1837 if (route_group == 0) {
1838 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1840 set_route_group (route_group, this);
1844 if ((prop = node.property (X_("order-keys"))) != 0) {
1848 string::size_type colon, equal;
1849 string remaining = prop->value();
1851 while (remaining.length()) {
1853 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1854 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1857 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1858 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1861 set_order_key (remaining.substr (0, equal), n);
1865 colon = remaining.find_first_of (':');
1867 if (colon != string::npos) {
1868 remaining = remaining.substr (colon+1);
1875 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1878 if (child->name() == X_("Comment")) {
1880 /* XXX this is a terrible API design in libxml++ */
1882 XMLNode *cmt = *(child->children().begin());
1883 _comment = cmt->content();
1885 } else if (child->name() == X_("Extra")) {
1887 _extra_xml = new XMLNode (*child);
1889 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1891 if (prop->value() == "solo") {
1892 _solo_control->set_state (*child, version);
1893 _session.add_controllable (_solo_control);
1896 } else if (child->name() == X_("RemoteControl")) {
1897 if ((prop = child->property (X_("id"))) != 0) {
1899 sscanf (prop->value().c_str(), "%d", &x);
1900 set_remote_control_id (x);
1903 } else if (child->name() == X_("MuteMaster")) {
1904 _mute_master->set_state (*child, version);
1912 Route::_set_state_2X (const XMLNode& node, int version)
1915 XMLNodeConstIterator niter;
1917 XMLPropertyList plist;
1918 const XMLProperty *prop;
1920 /* 2X things which still remain to be handled:
1923 * mute-affects-pre-fader
1924 * mute-affects-post-fader
1925 * mute-affects-control-outs
1926 * mute-affects-main-outs
1931 if (node.name() != "Route") {
1932 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1936 if ((prop = node.property (X_("flags"))) != 0) {
1937 _flags = Flag (string_2_enum (prop->value(), _flags));
1942 /* add standard processors */
1944 _meter.reset (new PeakMeter (_session));
1945 add_processor (_meter, PreFader);
1947 if (_flags & ControlOut) {
1948 /* where we listen to tracks */
1949 _intreturn.reset (new InternalReturn (_session));
1950 add_processor (_intreturn, PreFader);
1953 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
1954 add_processor (_main_outs, PostFader);
1958 nlist = node.children ();
1959 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1963 if (child->name() == IO::state_node_name) {
1965 /* there is a note in IO::set_state_2X() about why we have to call
1969 _input->set_state_2X (*child, version, true);
1970 _output->set_state_2X (*child, version, false);
1972 if ((prop = child->property (X_("name"))) != 0) {
1973 set_name (prop->value ());
1976 if ((prop = child->property (X_("id"))) != 0) {
1977 _id = prop->value ();
1980 if ((prop = child->property (X_("active"))) != 0) {
1981 bool yn = string_is_affirmative (prop->value());
1982 _active = !yn; // force switch
1990 if ((prop = node.property (X_("phase-invert"))) != 0) {
1991 set_phase_invert (string_is_affirmative (prop->value()));
1994 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1995 set_denormal_protection (string_is_affirmative (prop->value()));
1998 if ((prop = node.property (X_("soloed"))) != 0) {
1999 bool yn = string_is_affirmative (prop->value());
2001 /* XXX force reset of solo status */
2003 set_solo (yn, this);
2006 if ((prop = node.property (X_("meter-point"))) != 0) {
2007 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2010 /* XXX: if the route was in both a mix group and an edit group, it'll end up
2011 just in the edit group. */
2013 if ((prop = node.property (X_("mix-group"))) != 0) {
2014 RouteGroup* route_group = _session.route_group_by_name(prop->value());
2015 if (route_group == 0) {
2016 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
2018 set_route_group (route_group, this);
2022 if ((prop = node.property (X_("edit-group"))) != 0) {
2023 RouteGroup* route_group = _session.route_group_by_name(prop->value());
2024 if (route_group == 0) {
2025 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
2027 set_route_group (route_group, this);
2031 if ((prop = node.property (X_("order-keys"))) != 0) {
2035 string::size_type colon, equal;
2036 string remaining = prop->value();
2038 while (remaining.length()) {
2040 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2041 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2044 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2045 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2048 set_order_key (remaining.substr (0, equal), n);
2052 colon = remaining.find_first_of (':');
2054 if (colon != string::npos) {
2055 remaining = remaining.substr (colon+1);
2062 XMLNodeList redirect_nodes;
2064 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2068 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2069 redirect_nodes.push_back(child);
2074 set_processor_state_2X (redirect_nodes, version);
2076 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2079 if (child->name() == X_("Comment")) {
2081 /* XXX this is a terrible API design in libxml++ */
2083 XMLNode *cmt = *(child->children().begin());
2084 _comment = cmt->content();
2086 } else if (child->name() == X_("Extra")) {
2088 _extra_xml = new XMLNode (*child);
2090 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2092 if (prop->value() == "solo") {
2093 _solo_control->set_state (*child, version);
2094 _session.add_controllable (_solo_control);
2097 } else if (child->name() == X_("RemoteControl")) {
2098 if ((prop = child->property (X_("id"))) != 0) {
2100 sscanf (prop->value().c_str(), "%d", &x);
2101 set_remote_control_id (x);
2111 Route::get_processor_state ()
2113 XMLNode* root = new XMLNode (X_("redirects"));
2114 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2115 root->add_child_nocopy ((*i)->state (true));
2122 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2124 /* We don't bother removing existing processors not in nList, as this
2125 method will only be called when creating a Route from scratch, not
2126 for undo purposes. Just put processors in at the appropriate place
2130 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2131 add_processor_from_xml_2X (**i, version, _processors.begin ());
2136 Route::set_processor_state (const XMLNode& node)
2138 const XMLNodeList &nlist = node.children();
2139 XMLNodeConstIterator niter;
2140 ProcessorList::iterator i, o;
2142 // Iterate through existing processors, remove those which are not in the state list
2144 for (i = _processors.begin(); i != _processors.end(); ) {
2146 /* leave amp alone, always */
2153 ProcessorList::iterator tmp = i;
2156 bool processorInStateList = false;
2158 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2160 XMLProperty* id_prop = (*niter)->property(X_("id"));
2162 if (id_prop && (*i)->id() == id_prop->value()) {
2163 processorInStateList = true;
2168 if (!processorInStateList) {
2169 remove_processor (*i);
2175 // Iterate through state list and make sure all processors are on the track and in the correct order,
2176 // set the state of existing processors according to the new state on the same go
2178 i = _processors.begin();
2180 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
2182 XMLProperty* prop = (*niter)->property ("type");
2186 // Check whether the next processor in the list is the right one,
2187 // except for "amp" which is always there and may not have the
2188 // old ID since it is always created anew in every Route
2190 if (prop->value() != "amp") {
2191 while (o != _processors.end()) {
2192 XMLProperty* id_prop = (*niter)->property(X_("id"));
2193 if (id_prop && (*o)->id() == id_prop->value()) {
2201 // If the processor (*niter) is not on the route,
2202 // create it and move it to the correct location
2204 if (o == _processors.end()) {
2206 if (add_processor_from_xml (**niter, i)) {
2207 --i; // move iterator to the newly inserted processor
2209 cerr << "Error restoring route: unable to restore processor" << endl;
2214 // Otherwise, the processor already exists; just
2215 // ensure it is at the location provided in the XML state
2218 boost::shared_ptr<Processor> tmp = (*o);
2219 _processors.erase (o); // remove the old copy
2220 _processors.insert (i, tmp); // insert the processor at the correct location
2221 --i; // move iterator to the correct processor
2224 // and make it (just) so
2226 (*i)->set_state (**niter, Stateful::current_state_version);
2230 /* note: there is no configure_processors() call because we figure that
2231 the XML state represents a working signal route.
2234 processors_changed ();
2238 Route::curve_reallocate ()
2240 // _gain_automation_curve.finish_resize ();
2241 // _pan_automation_curve.finish_resize ();
2245 Route::silence (nframes_t nframes)
2249 _output->silence (nframes);
2252 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2255 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2256 boost::shared_ptr<PluginInsert> pi;
2258 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2259 // skip plugins, they don't need anything when we're not active
2263 (*i)->silence (nframes);
2266 if (nframes == _session.get_block_size()) {
2276 Route::add_internal_return ()
2279 _intreturn.reset (new InternalReturn (_session));
2280 add_processor (_intreturn, PreFader);
2285 Route::get_return_buffer () const
2287 Glib::RWLock::ReaderLock rm (_processor_lock);
2289 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2290 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2293 BufferSet* bs = d->get_buffers ();
2302 Route::release_return_buffer () const
2304 Glib::RWLock::ReaderLock rm (_processor_lock);
2306 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2307 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2310 return d->release_buffers ();
2316 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2318 vector<string> ports;
2319 vector<string>::const_iterator i;
2322 Glib::RWLock::ReaderLock rm (_processor_lock);
2324 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2326 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2328 if (d && d->target_route() == route) {
2330 /* if the target is the control outs, then make sure
2331 we take note of which i-send is doing that.
2334 if (route == _session.control_out()) {
2335 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
2338 /* already listening via the specified IO: do nothing */
2345 boost::shared_ptr<InternalSend> listener;
2348 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2350 } catch (failed_constructor& err) {
2354 if (route == _session.control_out()) {
2355 _control_outs = listener;
2358 add_processor (listener, placement);
2364 Route::drop_listen (boost::shared_ptr<Route> route)
2366 ProcessorStreams err;
2367 ProcessorList::iterator tmp;
2369 Glib::RWLock::ReaderLock rl(_processor_lock);
2373 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2375 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2377 if (d && d->target_route() == route) {
2379 remove_processor (*x, &err);
2382 /* list could have been demolished while we dropped the lock
2392 if (route == _session.control_out()) {
2393 _control_outs.reset ();
2398 Route::set_route_group (RouteGroup *rg, void *src)
2400 if (rg == _route_group) {
2405 _route_group->remove (this);
2408 if ((_route_group = rg) != 0) {
2409 _route_group->add (this);
2412 _session.set_dirty ();
2413 route_group_changed (src); /* EMIT SIGNAL */
2417 Route::drop_route_group (void *src)
2420 _session.set_dirty ();
2421 route_group_changed (src); /* EMIT SIGNAL */
2425 Route::set_comment (string cmt, void *src)
2428 comment_changed (src);
2429 _session.set_dirty ();
2433 Route::feeds (boost::shared_ptr<Route> other, bool* only_send)
2435 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2437 if (_output->connected_to (other->input())) {
2438 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2447 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2449 boost::shared_ptr<IOProcessor> iop;
2451 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2452 if (iop->feeds (other)) {
2453 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2459 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2462 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2467 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2472 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2474 nframes_t now = _session.transport_frame();
2477 Glib::RWLock::ReaderLock lm (_processor_lock);
2480 automation_snapshot (now, true);
2483 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2485 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2486 (*i)->deactivate ();
2490 (*i)->transport_stopped (now);
2494 _roll_delay = _initial_delay;
2498 Route::input_change_handler (IOChange change, void * /*src*/)
2500 if ((change & ConfigurationChanged)) {
2501 configure_processors (0);
2506 Route::output_change_handler (IOChange change, void * /*src*/)
2508 if ((change & ConfigurationChanged)) {
2510 /* XXX resize all listeners to match _main_outs? */
2512 // configure_processors (0);
2517 Route::pans_required () const
2519 if (n_outputs().n_audio() < 2) {
2523 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2527 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2528 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2530 if (n_outputs().n_total() == 0) {
2534 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2539 _amp->apply_gain_automation (false);
2540 passthru (start_frame, end_frame, nframes, 0);
2546 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2548 if (_roll_delay > nframes) {
2550 _roll_delay -= nframes;
2552 /* transport frame is not legal for caller to use */
2555 } else if (_roll_delay > 0) {
2557 nframes -= _roll_delay;
2558 silence (_roll_delay);
2559 /* we've written _roll_delay of samples into the
2560 output ports, so make a note of that for
2563 _main_outs->increment_output_offset (_roll_delay);
2564 transport_frame += _roll_delay;
2573 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2574 bool /*can_record*/, bool /*rec_monitors_input*/)
2577 // automation snapshot can also be called from the non-rt context
2578 // and it uses the processor list, so we try to acquire the lock here
2579 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2582 automation_snapshot (_session.transport_frame(), false);
2586 if (n_outputs().n_total() == 0) {
2590 if (!_active || n_inputs().n_total() == 0) {
2595 nframes_t unused = 0;
2597 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2603 passthru (start_frame, end_frame, nframes, declick);
2609 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2610 bool /*can_record*/, bool /*rec_monitors_input*/)
2617 Route::toggle_monitor_input ()
2619 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2620 i->ensure_monitor_input( ! i->monitoring_input());
2625 Route::has_external_redirects () const
2627 // FIXME: what about sends? - they don't return a signal back to ardour?
2629 boost::shared_ptr<const PortInsert> pi;
2631 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2633 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2635 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2637 string port_name = port->name();
2638 string client_name = port_name.substr (0, port_name.find(':'));
2640 /* only say "yes" if the redirect is actually in use */
2642 if (client_name != "ardour" && pi->active()) {
2653 Route::flush_processors ()
2655 /* XXX shouldn't really try to take this lock, since
2656 this is called from the RT audio thread.
2659 Glib::RWLock::ReaderLock lm (_processor_lock);
2661 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2662 (*i)->deactivate ();
2668 Route::set_meter_point (MeterPoint p, void *src)
2670 if (_meter_point == p) {
2675 Glib::RWLock::WriterLock lm (_processor_lock);
2676 ProcessorList as_it_was (_processors);
2678 if (p != MeterCustom) {
2679 // Move meter in the processors list to reflect the new position
2680 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2681 _processors.erase(loc);
2684 loc = _processors.begin();
2687 loc = find(_processors.begin(), _processors.end(), _amp);
2689 case MeterPostFader:
2690 loc = _processors.end();
2696 _processors.insert(loc, _meter);
2698 if (configure_processors_unlocked (0)) {
2699 _processors = as_it_was;
2700 configure_processors_unlocked (0); // it worked before we tried to add it ...
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);
2716 meter_change (src); /* EMIT SIGNAL */
2717 processors_changed (); /* EMIT SIGNAL */
2718 _session.set_dirty ();
2722 Route::put_control_outs_at (Placement p)
2724 if (!_control_outs) {
2729 Glib::RWLock::WriterLock lm (_processor_lock);
2730 ProcessorList as_it_was (_processors);
2731 // Move meter in the processors list
2732 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2733 _processors.erase(loc);
2737 loc = find(_processors.begin(), _processors.end(), _amp);
2738 if (loc != _processors.begin()) {
2743 loc = find(_processors.begin(), _processors.end(), _amp);
2744 assert (loc != _processors.end());
2749 _processors.insert(loc, _control_outs);
2751 if (configure_processors_unlocked (0)) {
2752 _processors = as_it_was;
2753 configure_processors_unlocked (0); // it worked before we tried to add it ...
2758 processors_changed (); /* EMIT SIGNAL */
2759 _session.set_dirty ();
2763 Route::update_total_latency ()
2765 nframes_t old = _output->effective_latency();
2766 nframes_t own_latency = _output->user_latency();
2768 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2769 if ((*i)->active ()) {
2770 own_latency += (*i)->signal_latency ();
2774 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2776 _output->set_port_latency (own_latency);
2778 if (_output->user_latency() == 0) {
2780 /* this (virtual) function is used for pure Routes,
2781 not derived classes like AudioTrack. this means
2782 that the data processed here comes from an input
2783 port, not prerecorded material, and therefore we
2784 have to take into account any input latency.
2787 own_latency += _input->signal_latency ();
2790 if (old != own_latency) {
2791 _output->set_latency_delay (own_latency);
2792 signal_latency_changed (); /* EMIT SIGNAL */
2795 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2797 return _output->effective_latency ();
2801 Route::set_user_latency (nframes_t nframes)
2803 _output->set_user_latency (nframes);
2804 _session.update_latency_compensation (false, false);
2808 Route::set_latency_delay (nframes_t longest_session_latency)
2810 nframes_t old = _initial_delay;
2812 if (_output->effective_latency() < longest_session_latency) {
2813 _initial_delay = longest_session_latency - _output->effective_latency();
2818 if (_initial_delay != old) {
2819 initial_delay_changed (); /* EMIT SIGNAL */
2822 if (_session.transport_stopped()) {
2823 _roll_delay = _initial_delay;
2828 Route::automation_snapshot (nframes_t now, bool force)
2830 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2831 (*i)->automation_snapshot (now, force);
2835 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2836 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2837 boost::shared_ptr<AutomationList>(), name)
2840 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2845 Route::SoloControllable::set_value (float val)
2847 bool bval = ((val >= 0.5f) ? true: false);
2849 route.set_solo (bval, this);
2853 Route::SoloControllable::get_value (void) const
2855 return route.self_soloed() ? 1.0f : 0.0f;
2859 Route::set_block_size (nframes_t nframes)
2861 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2862 (*i)->set_block_size (nframes);
2865 _session.ensure_buffers (n_process_buffers ());
2869 Route::protect_automation ()
2871 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2872 (*i)->protect_automation();
2876 Route::set_pending_declick (int declick)
2879 /* this call is not allowed to turn off a pending declick unless "force" is true */
2881 _pending_declick = declick;
2883 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2885 _pending_declick = 0;
2890 /** Shift automation forwards from a particular place, thereby inserting time.
2891 * Adds undo commands for any shifts that are performed.
2893 * @param pos Position to start shifting from.
2894 * @param frames Amount to shift forwards by.
2898 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2900 #ifdef THIS_NEEDS_FIXING_FOR_V3
2902 /* gain automation */
2903 XMLNode &before = _gain_control->get_state ();
2904 _gain_control->shift (pos, frames);
2905 XMLNode &after = _gain_control->get_state ();
2906 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2908 /* pan automation */
2909 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2910 Curve & c = (*i)->automation ();
2911 XMLNode &before = c.get_state ();
2912 c.shift (pos, frames);
2913 XMLNode &after = c.get_state ();
2914 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2917 /* redirect automation */
2919 Glib::RWLock::ReaderLock lm (redirect_lock);
2920 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2923 (*i)->what_has_automation (a);
2925 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2926 AutomationList & al = (*i)->automation_list (*j);
2927 XMLNode &before = al.get_state ();
2928 al.shift (pos, frames);
2929 XMLNode &after = al.get_state ();
2930 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2940 Route::save_as_template (const string& path, const string& name)
2942 XMLNode& node (state (false));
2945 IO::set_name_in_state (*node.children().front(), name);
2947 tree.set_root (&node);
2948 return tree.write (path.c_str());
2953 Route::set_name (const string& str)
2959 name = Route::ensure_track_or_route_name (str, _session);
2960 SessionObject::set_name (name);
2962 ret = (_input->set_name(name) && _output->set_name(name));
2966 Glib::RWLock::ReaderLock lm (_processor_lock);
2968 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2970 /* rename all I/O processors that have inputs or outputs */
2972 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2974 if (iop && (iop->output() || iop->input())) {
2975 if (!iop->set_name (name)) {
2986 boost::shared_ptr<Send>
2987 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2989 Glib::RWLock::ReaderLock lm (_processor_lock);
2991 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2992 boost::shared_ptr<InternalSend> send;
2994 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2995 if (send->target_route() == target) {
3001 return boost::shared_ptr<Send>();
3005 Route::set_phase_invert (bool yn)
3007 if (_phase_invert != yn) {
3008 _phase_invert = 0xffff; // XXX all channels
3009 phase_invert_changed (); /* EMIT SIGNAL */
3014 Route::phase_invert () const
3016 return _phase_invert != 0;
3020 Route::set_denormal_protection (bool yn)
3022 if (_denormal_protection != yn) {
3023 _denormal_protection = yn;
3024 denormal_protection_changed (); /* EMIT SIGNAL */
3029 Route::denormal_protection () const
3031 return _denormal_protection;
3035 Route::set_active (bool yn)
3037 if (_active != yn) {
3039 _input->set_active (yn);
3040 _output->set_active (yn);
3041 active_changed (); // EMIT SIGNAL
3048 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3054 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3056 boost::shared_ptr<Send> s;
3057 boost::shared_ptr<Return> r;
3059 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3060 s->meter()->meter();
3061 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3062 r->meter()->meter ();
3067 boost::shared_ptr<Panner>
3068 Route::panner() const
3071 return _main_outs->panner();
3074 boost::shared_ptr<AutomationControl>
3075 Route::gain_control() const
3078 return _amp->gain_control();
3081 boost::shared_ptr<AutomationControl>
3082 Route::get_control (const Evoral::Parameter& param)
3084 /* either we own the control or .... */
3086 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
3090 /* maybe one of our processors does or ... */
3092 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3093 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3094 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
3102 /* nobody does so we'll make a new one */
3104 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));