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 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
165 Metering::disconnect (_meter_connection);
167 /* don't use clear_processors here, as it depends on the session which may
168 be half-destroyed by now */
170 Glib::RWLock::WriterLock lm (_processor_lock);
171 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
172 (*i)->drop_references ();
175 _processors.clear ();
179 Route::set_remote_control_id (uint32_t id)
181 if (id != _remote_control_id) {
182 _remote_control_id = id;
183 RemoteControlIDChanged ();
188 Route::remote_control_id() const
190 return _remote_control_id;
194 Route::order_key (std::string const & name) const
196 OrderKeys::const_iterator i = order_keys.find (name);
197 if (i == order_keys.end()) {
205 Route::set_order_key (std::string const & name, long n)
207 order_keys[name] = n;
209 if (Config->get_sync_all_route_ordering()) {
210 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
215 _session.set_dirty ();
218 /** Set all order keys to be the same as that for `base', if such a key
219 * exists in this route.
220 * @param base Base key.
223 Route::sync_order_keys (std::string const & base)
225 if (order_keys.empty()) {
229 OrderKeys::iterator i;
232 if ((i = order_keys.find (base)) == order_keys.end()) {
233 /* key doesn't exist, use the first existing key (during session initialization) */
234 i = order_keys.begin();
238 /* key exists - use it and reset all others (actually, itself included) */
240 i = order_keys.begin();
243 for (; i != order_keys.end(); ++i) {
249 Route::ensure_track_or_route_name(string name, Session &session)
251 string newname = name;
253 while (session.route_by_name (newname) != NULL) {
254 newname = bump_name_once (newname);
262 Route::inc_gain (gain_t fraction, void *src)
264 _amp->inc_gain (fraction, src);
268 Route::set_gain (gain_t val, void *src)
270 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
272 if (_route_group->is_relative()) {
274 gain_t usable_gain = _amp->gain();
275 if (usable_gain < 0.000001f) {
276 usable_gain = 0.000001f;
280 if (delta < 0.000001f) {
284 delta -= usable_gain;
289 gain_t factor = delta / usable_gain;
292 factor = _route_group->get_max_factor(factor);
293 if (factor == 0.0f) {
294 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
298 factor = _route_group->get_min_factor(factor);
299 if (factor == 0.0f) {
300 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
305 _route_group->apply (&Route::inc_gain, factor, _route_group);
309 _route_group->apply (&Route::set_gain, val, _route_group);
315 if (val == _amp->gain()) {
319 _amp->set_gain (val, src);
322 /** Process this route for one (sub) cycle (process thread)
324 * @param bufs Scratch buffers to use for the signal path
325 * @param start_frame Initial transport frame
326 * @param end_frame Final transport frame
327 * @param nframes Number of frames to output (to ports)
329 * Note that (end_frame - start_frame) may not be equal to nframes when the
330 * transport speed isn't 1.0 (eg varispeed).
333 Route::process_output_buffers (BufferSet& bufs,
334 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
335 bool /*with_processors*/, int declick)
339 bufs.is_silent (false);
341 switch (Config->get_monitoring_model()) {
342 case HardwareMonitoring:
343 case ExternalMonitoring:
344 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
351 declick = _pending_declick;
354 /* figure out if we're going to use gain automation */
355 _amp->setup_gain_automation (start_frame, end_frame, nframes);
358 /* tell main outs what to do about monitoring */
359 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
362 /* -------------------------------------------------------------------------------------------
363 GLOBAL DECLICK (for transport changes etc.)
364 ----------------------------------------------------------------------------------------- */
367 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
368 } else if (declick < 0) {
369 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
372 _pending_declick = 0;
374 /* -------------------------------------------------------------------------------------------
375 DENORMAL CONTROL/PHASE INVERT
376 ----------------------------------------------------------------------------------------- */
382 if (_denormal_protection || Config->get_denormal_protection()) {
384 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
385 Sample* const sp = i->data();
387 if (_phase_invert & chn) {
388 for (nframes_t nx = 0; nx < nframes; ++nx) {
393 for (nframes_t nx = 0; nx < nframes; ++nx) {
401 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
402 Sample* const sp = i->data();
404 if (_phase_invert & chn) {
405 for (nframes_t nx = 0; nx < nframes; ++nx) {
414 if (_denormal_protection || Config->get_denormal_protection()) {
416 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
417 Sample* const sp = i->data();
418 for (nframes_t nx = 0; nx < nframes; ++nx) {
426 /* -------------------------------------------------------------------------------------------
428 ----------------------------------------------------------------------------------------- */
430 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
433 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
435 if (bufs.count() != (*i)->input_streams()) {
436 cerr << _name << " bufs = " << bufs.count()
437 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
440 assert (bufs.count() == (*i)->input_streams());
442 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
443 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
446 if (!_processors.empty()) {
447 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
453 Route::n_process_buffers ()
455 return max (_input->n_ports(), processor_max_streams);
459 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
461 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
465 assert (bufs.available() >= _input->n_ports());
467 if (_input->n_ports() == ChanCount::ZERO) {
471 bufs.set_count (_input->n_ports());
473 if (is_control() && _session.listening()) {
475 /* control/monitor bus ignores input ports when something is
476 feeding the listen "stream". data will "arrive" into the
477 route from the intreturn processor element.
480 bufs.silence (nframes, 0);
484 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
486 BufferSet::iterator o = bufs.begin(*t);
487 PortSet& ports (_input->ports());
489 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
490 o->read_from (i->get_buffer(nframes), nframes);
495 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
496 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
500 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
502 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
503 bufs.set_count (_input->n_ports());
504 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
505 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
509 Route::set_listen (bool yn, void* src)
512 if (yn != _control_outs->active()) {
514 _control_outs->activate ();
516 _control_outs->deactivate ();
519 listen_changed (src); /* EMIT SIGNAL */
525 Route::listening () const
528 return _control_outs->active ();
535 Route::set_solo_safe (bool yn, void *src)
537 if (_solo_safe != yn) {
539 solo_safe_changed (src);
544 Route::solo_safe() const
550 Route::set_solo (bool yn, void *src)
556 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
557 _route_group->apply (&Route::set_solo, yn, _route_group);
561 if (self_soloed() != yn) {
563 set_delivery_solo ();
564 solo_changed (src); /* EMIT SIGNAL */
565 _solo_control->Changed (); /* EMIT SIGNAL */
570 Route::set_self_solo (bool yn)
576 Route::mod_solo_by_others (int32_t delta)
579 if (_soloed_by_others >= (uint32_t) delta) {
580 _soloed_by_others += delta;
582 _soloed_by_others = 0;
585 _soloed_by_others += delta;
588 set_delivery_solo ();
592 Route::set_delivery_solo ()
594 /* tell all delivery processors what the solo situation is, so that they keep
595 delivering even though Session::soloing() is true and they were not
599 Glib::RWLock::ReaderLock rm (_processor_lock);
600 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
601 boost::shared_ptr<Delivery> d;
603 if ((d = boost::dynamic_pointer_cast<Delivery> (*i)) != 0) {
604 d->set_solo_level (soloed ());
605 d->set_solo_isolated (solo_isolated());
611 Route::set_solo_isolated (bool yn, void *src)
613 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
614 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
618 if (yn != _solo_isolated) {
620 set_delivery_solo ();
621 solo_isolated_changed (src);
626 Route::solo_isolated () const
628 return _solo_isolated;
632 Route::set_mute_points (MuteMaster::MutePoint mp)
635 mute_points_changed (); /* EMIT SIGNAL */
637 if (_mute_master->muted()) {
638 _mute_master->mute_at (_mute_points);
639 mute_changed (this); /* EMIT SIGNAL */
644 Route::set_mute (bool yn, void *src)
646 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
647 _route_group->apply (&Route::set_mute, yn, _route_group);
653 _mute_master->mute_at (_mute_points);
655 _mute_master->clear_mute ();
658 mute_changed (src); /* EMIT SIGNAL */
665 return _mute_master->muted ();
670 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
672 cerr << name << " {" << endl;
673 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
674 p != procs.end(); ++p) {
675 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
682 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
684 ProcessorList::iterator loc;
686 /* XXX this is not thread safe - we don't hold the lock across determining the iter
687 to add before and actually doing the insertion. dammit.
690 if (placement == PreFader) {
691 /* generic pre-fader: insert immediately before the amp */
692 loc = find (_processors.begin(), _processors.end(), _amp);
694 /* generic post-fader: insert right before the main outs */
695 loc = find (_processors.begin(), _processors.end(), _main_outs);
698 return add_processor (processor, loc, err);
702 /** Add a processor to the route.
703 * If @a iter is not NULL, it must point to an iterator in _processors and the new
704 * processor will be inserted immediately before this location. Otherwise,
705 * @a position is used.
708 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
710 ChanCount old_pms = processor_max_streams;
712 if (!_session.engine().connected() || !processor) {
717 Glib::RWLock::WriterLock lm (_processor_lock);
719 boost::shared_ptr<PluginInsert> pi;
720 boost::shared_ptr<PortInsert> porti;
722 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
724 if (processor == _amp || processor == _meter || processor == _main_outs) {
725 // Ensure only one of these are in the list at any time
726 if (loc != _processors.end()) {
727 if (iter == loc) { // Already in place, do nothing
729 } else { // New position given, relocate
730 _processors.erase (loc);
735 if (loc != _processors.end()) {
736 cerr << "ERROR: Processor added to route twice!" << endl;
743 _processors.insert (loc, processor);
745 // Set up processor list channels. This will set processor->[input|output]_streams(),
746 // configure redirect ports properly, etc.
748 if (configure_processors_unlocked (err)) {
749 ProcessorList::iterator ploc = loc;
751 _processors.erase(ploc);
752 configure_processors_unlocked (0); // it worked before we tried to add it ...
753 cerr << "configure failed\n";
757 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
759 if (pi->natural_input_streams() == ChanCount::ZERO) {
760 /* generator plugin */
761 _have_internal_generator = true;
766 if (_control_outs != processor) {
767 // XXX: do we want to emit the signal here ? change call order.
768 processor->activate ();
770 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
772 _output->set_user_latency (0);
775 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
781 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
783 const XMLProperty *prop;
785 if (node.name() != "Processor") {
790 if ((prop = node.property ("type")) != 0) {
792 boost::shared_ptr<Processor> processor;
794 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
795 prop->value() == "lv2" ||
796 prop->value() == "vst" ||
797 prop->value() == "audiounit") {
799 processor.reset (new PluginInsert(_session, node));
801 } else if (prop->value() == "port") {
803 processor.reset (new PortInsert (_session, _mute_master, node));
805 } else if (prop->value() == "send") {
807 processor.reset (new Send (_session, _mute_master, node));
809 } else if (prop->value() == "meter") {
812 if (_meter->set_state (node, Stateful::loading_state_version)) {
819 _meter.reset (new PeakMeter (_session, node));
820 _meter->set_display_to_user (_meter_point == MeterCustom);
823 } else if (prop->value() == "amp") {
825 /* amp always exists */
828 if (processor->set_state (node, Stateful::loading_state_version)) {
831 /* never any reason to add it */
835 } else if (prop->value() == "intsend") {
837 processor.reset (new InternalSend (_session, _mute_master, node));
839 } else if (prop->value() == "intreturn") {
842 if (_intreturn->set_state (node, Stateful::loading_state_version)) {
848 _intreturn.reset (new InternalReturn (_session, node));
849 processor = _intreturn;
851 } else if (prop->value() == "main-outs") {
854 if (_main_outs->set_state (node, Stateful::loading_state_version)) {
861 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
862 processor = _main_outs;
865 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
869 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
870 /* check for invisible processors stacked at the end and leave them there */
871 ProcessorList::iterator p;
872 p = _processors.end();
874 while (!(*p)->display_to_user() && p != _processors.begin()) {
881 return (add_processor (processor, iter) == 0);
884 error << _("Processor XML node has no type property") << endmsg;
889 catch (failed_constructor &err) {
890 warning << _("processor could not be created. Ignored.") << endmsg;
897 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
899 const XMLProperty *prop;
902 boost::shared_ptr<Processor> processor;
904 if (node.name() == "Insert") {
906 if ((prop = node.property ("type")) != 0) {
908 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
909 prop->value() == "lv2" ||
910 prop->value() == "vst" ||
911 prop->value() == "audiounit") {
913 processor.reset (new PluginInsert (_session, node));
917 processor.reset (new PortInsert (_session, _mute_master, node));
922 } else if (node.name() == "Send") {
924 processor.reset (new Send (_session, _mute_master, node, version));
928 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
932 if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
933 /* check for invisible processors stacked at the end and leave them there */
934 ProcessorList::iterator p;
935 p = _processors.end();
937 while (!(*p)->display_to_user() && p != _processors.begin()) {
944 return (add_processor (processor, iter) == 0);
947 catch (failed_constructor &err) {
948 warning << _("processor could not be created. Ignored.") << endmsg;
954 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
956 ProcessorList::iterator loc;
959 loc = find(_processors.begin(), _processors.end(), before);
961 /* nothing specified - at end but before main outs */
962 loc = find (_processors.begin(), _processors.end(), _main_outs);
965 return add_processors (others, loc, err);
969 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
971 /* NOTE: this is intended to be used ONLY when copying
972 processors from another Route. Hence the subtle
973 differences between this and ::add_processor()
976 ChanCount old_pms = processor_max_streams;
978 if (!_session.engine().connected()) {
982 if (others.empty()) {
987 Glib::RWLock::WriterLock lm (_processor_lock);
988 ProcessorList::iterator existing_end = _processors.end();
991 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
993 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
995 // Ensure meter only appears in the list once
997 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
998 if (m != _processors.end()) {
999 _processors.erase(m);
1003 boost::shared_ptr<PluginInsert> pi;
1005 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1008 ChanCount m = max (pi->input_streams(), pi->output_streams());
1010 if (m > potential_max_streams) {
1011 potential_max_streams = m;
1015 _processors.insert (iter, *i);
1017 if ((*i)->active()) {
1021 if (configure_processors_unlocked (err)) {
1023 _processors.erase (existing_end, _processors.end());
1024 configure_processors_unlocked (0); // it worked before we tried to add it ...
1028 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
1031 _output->set_user_latency (0);
1034 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1040 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1042 if (p == PreFader) {
1043 start = _processors.begin();
1044 end = find(_processors.begin(), _processors.end(), _amp);
1046 start = find(_processors.begin(), _processors.end(), _amp);
1048 end = _processors.end();
1052 /** Turn off all processors with a given placement
1053 * @param p Placement of processors to disable
1056 Route::disable_processors (Placement p)
1058 Glib::RWLock::ReaderLock lm (_processor_lock);
1060 ProcessorList::iterator start, end;
1061 placement_range(p, start, end);
1063 for (ProcessorList::iterator i = start; i != end; ++i) {
1064 (*i)->deactivate ();
1067 _session.set_dirty ();
1070 /** Turn off all redirects
1073 Route::disable_processors ()
1075 Glib::RWLock::ReaderLock lm (_processor_lock);
1077 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1078 (*i)->deactivate ();
1081 _session.set_dirty ();
1084 /** Turn off all redirects with a given placement
1085 * @param p Placement of redirects to disable
1088 Route::disable_plugins (Placement p)
1090 Glib::RWLock::ReaderLock lm (_processor_lock);
1092 ProcessorList::iterator start, end;
1093 placement_range(p, start, end);
1095 for (ProcessorList::iterator i = start; i != end; ++i) {
1096 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1097 (*i)->deactivate ();
1101 _session.set_dirty ();
1104 /** Turn off all plugins
1107 Route::disable_plugins ()
1109 Glib::RWLock::ReaderLock lm (_processor_lock);
1111 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1112 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1113 (*i)->deactivate ();
1117 _session.set_dirty ();
1122 Route::ab_plugins (bool forward)
1124 Glib::RWLock::ReaderLock lm (_processor_lock);
1128 /* forward = turn off all active redirects, and mark them so that the next time
1129 we go the other way, we will revert them
1132 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1133 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1137 if ((*i)->active()) {
1138 (*i)->deactivate ();
1139 (*i)->set_next_ab_is_active (true);
1141 (*i)->set_next_ab_is_active (false);
1147 /* backward = if the redirect was marked to go active on the next ab, do so */
1149 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1151 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1155 if ((*i)->get_next_ab_is_active()) {
1158 (*i)->deactivate ();
1163 _session.set_dirty ();
1167 /** Remove processors with a given placement.
1168 * @param p Placement of processors to remove.
1171 Route::clear_processors (Placement p)
1173 const ChanCount old_pms = processor_max_streams;
1175 if (!_session.engine().connected()) {
1179 bool already_deleting = _session.deletion_in_progress();
1180 if (!already_deleting) {
1181 _session.set_deletion_in_progress();
1185 Glib::RWLock::WriterLock lm (_processor_lock);
1186 ProcessorList new_list;
1187 ProcessorStreams err;
1188 bool seen_amp = false;
1190 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1196 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1198 /* you can't remove these */
1200 new_list.push_back (*i);
1207 new_list.push_back (*i);
1210 (*i)->drop_references ();
1218 (*i)->drop_references ();
1221 new_list.push_back (*i);
1228 _processors = new_list;
1229 configure_processors_unlocked (&err); // this can't fail
1232 processor_max_streams.reset();
1233 _have_internal_generator = false;
1234 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1236 if (!already_deleting) {
1237 _session.clear_deletion_in_progress();
1242 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1244 /* these can never be removed */
1246 if (processor == _amp || processor == _meter || processor == _main_outs) {
1250 ChanCount old_pms = processor_max_streams;
1252 if (!_session.engine().connected()) {
1256 processor_max_streams.reset();
1259 Glib::RWLock::WriterLock lm (_processor_lock);
1260 ProcessorList::iterator i;
1261 bool removed = false;
1263 for (i = _processors.begin(); i != _processors.end(); ) {
1264 if (*i == processor) {
1266 /* move along, see failure case for configure_processors()
1267 where we may need to reconfigure the processor.
1270 /* stop redirects that send signals to JACK ports
1271 from causing noise as a result of no longer being
1275 boost::shared_ptr<IOProcessor> iop;
1277 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1279 iop->input()->disconnect (this);
1281 if (iop->output()) {
1282 iop->output()->disconnect (this);
1286 i = _processors.erase (i);
1294 _output->set_user_latency (0);
1302 if (configure_processors_unlocked (err)) {
1303 /* get back to where we where */
1304 _processors.insert (i, processor);
1305 /* we know this will work, because it worked before :) */
1306 configure_processors_unlocked (0);
1310 _have_internal_generator = false;
1312 for (i = _processors.begin(); i != _processors.end(); ++i) {
1313 boost::shared_ptr<PluginInsert> pi;
1315 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1316 if (pi->is_generator()) {
1317 _have_internal_generator = true;
1324 processor->drop_references ();
1325 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1331 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1333 ProcessorList deleted;
1334 ProcessorList as_we_were;
1336 if (!_session.engine().connected()) {
1340 processor_max_streams.reset();
1343 Glib::RWLock::WriterLock lm (_processor_lock);
1344 ProcessorList::iterator i;
1345 boost::shared_ptr<Processor> processor;
1347 as_we_were = _processors;
1349 for (i = _processors.begin(); i != _processors.end(); ) {
1353 /* these can never be removed */
1355 if (processor == _amp || processor == _meter || processor == _main_outs) {
1360 /* see if its in the list of processors to delete */
1362 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1367 /* stop IOProcessors that send to JACK ports
1368 from causing noise as a result of no longer being
1372 boost::shared_ptr<IOProcessor> iop;
1374 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1378 deleted.push_back (processor);
1379 i = _processors.erase (i);
1382 if (deleted.empty()) {
1383 /* none of those in the requested list were found */
1387 _output->set_user_latency (0);
1389 if (configure_processors_unlocked (err)) {
1390 /* get back to where we where */
1391 _processors = as_we_were;
1392 /* we know this will work, because it worked before :) */
1393 configure_processors_unlocked (0);
1397 _have_internal_generator = false;
1399 for (i = _processors.begin(); i != _processors.end(); ++i) {
1400 boost::shared_ptr<PluginInsert> pi;
1402 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1403 if (pi->is_generator()) {
1404 _have_internal_generator = true;
1411 /* now try to do what we need to so that those that were removed will be deleted */
1413 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1414 (*i)->drop_references ();
1417 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1424 Route::configure_processors (ProcessorStreams* err)
1426 if (!_in_configure_processors) {
1427 Glib::RWLock::WriterLock lm (_processor_lock);
1428 return configure_processors_unlocked (err);
1433 /** Configure the input/output configuration of each processor in the processors list.
1434 * Return 0 on success, otherwise configuration is impossible.
1437 Route::configure_processors_unlocked (ProcessorStreams* err)
1439 if (_in_configure_processors) {
1443 _in_configure_processors = true;
1445 // Check each processor in order to see if we can configure as requested
1446 ChanCount in = _input->n_ports ();
1448 list< pair<ChanCount,ChanCount> > configuration;
1451 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1453 DEBUG_TRACE (DEBUG::Processors, "{\n");
1454 for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
1455 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
1457 DEBUG_TRACE (DEBUG::Processors, "}\n");
1460 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1462 if ((*p)->can_support_io_configuration(in, out)) {
1463 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
1464 configuration.push_back(make_pair(in, out));
1471 _in_configure_processors = false;
1476 /* Take the process lock so that if we add a processor which increases the required
1477 number of scratch buffers, we create those scratch buffers before the process
1478 thread has a chance to ask for them.
1479 XXX: in an ideal world we'd perhaps use some RCU magic to avoid having to take
1483 Glib::Mutex::Lock pl (_session.engine().process_lock ());
1485 // We can, so configure everything
1486 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1487 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1488 (*p)->configure_io(c->first, c->second);
1489 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1490 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1494 /* make sure we have sufficient scratch buffers to cope with the new processor
1496 _session.ensure_buffers (n_process_buffers ());
1498 _in_configure_processors = false;
1503 Route::all_processors_flip ()
1505 Glib::RWLock::ReaderLock lm (_processor_lock);
1507 if (_processors.empty()) {
1511 bool first_is_on = _processors.front()->active();
1513 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1515 (*i)->deactivate ();
1521 _session.set_dirty ();
1524 /** Set all processors with a given placement to a given active state.
1525 * @param p Placement of processors to change.
1526 * @param state New active state for those processors.
1529 Route::all_processors_active (Placement p, bool state)
1531 Glib::RWLock::ReaderLock lm (_processor_lock);
1533 if (_processors.empty()) {
1536 ProcessorList::iterator start, end;
1537 placement_range(p, start, end);
1539 bool before_amp = true;
1540 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1545 if (p == PreFader && before_amp) {
1549 (*i)->deactivate ();
1554 _session.set_dirty ();
1558 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1560 bool pre_fader = true;
1561 Glib::RWLock::ReaderLock lm (_processor_lock);
1563 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1565 /* semantic note: if p == amp, we want to return true, so test
1566 for equality before checking if this is the amp
1583 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1585 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1586 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1587 processors in the current actual processor list that are hidden. Any visible processors
1588 in the current list but not in "new_order" will be assumed to be deleted.
1592 Glib::RWLock::WriterLock lm (_processor_lock);
1593 ChanCount old_pms = processor_max_streams;
1594 ProcessorList::iterator oiter;
1595 ProcessorList::const_iterator niter;
1596 ProcessorList as_it_was_before = _processors;
1597 ProcessorList as_it_will_be;
1599 oiter = _processors.begin();
1600 niter = new_order.begin();
1602 while (niter != new_order.end()) {
1604 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1605 then append it to the temp list.
1607 Otherwise, see if the next processor in the old list is in the new list. if not,
1608 its been deleted. If its there, append it to the temp list.
1611 if (oiter == _processors.end()) {
1613 /* no more elements in the old list, so just stick the rest of
1614 the new order onto the temp list.
1617 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1618 while (niter != new_order.end()) {
1625 if (!(*oiter)->display_to_user()) {
1627 as_it_will_be.push_back (*oiter);
1631 /* visible processor: check that its in the new order */
1633 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1634 /* deleted: do nothing, shared_ptr<> will clean up */
1636 /* ignore this one, and add the next item from the new order instead */
1637 as_it_will_be.push_back (*niter);
1642 /* now remove from old order - its taken care of no matter what */
1643 oiter = _processors.erase (oiter);
1648 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1650 if (configure_processors_unlocked (err)) {
1651 _processors = as_it_was_before;
1652 processor_max_streams = old_pms;
1657 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1669 Route::get_template()
1671 return state(false);
1675 Route::state(bool full_state)
1677 XMLNode *node = new XMLNode("Route");
1678 ProcessorList::iterator i;
1681 id().print (buf, sizeof (buf));
1682 node->add_property("id", buf);
1683 node->add_property ("name", _name);
1684 node->add_property("default-type", _default_type.to_string());
1687 node->add_property("flags", enum_2_string (_flags));
1690 node->add_property("active", _active?"yes":"no");
1691 node->add_property("phase-invert", _phase_invert?"yes":"no");
1692 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1693 node->add_property("meter-point", enum_2_string (_meter_point));
1696 node->add_property("route-group", _route_group->name());
1699 string order_string;
1700 OrderKeys::iterator x = order_keys.begin();
1702 while (x != order_keys.end()) {
1703 order_string += string ((*x).first);
1704 order_string += '=';
1705 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1706 order_string += buf;
1710 if (x == order_keys.end()) {
1714 order_string += ':';
1716 node->add_property ("order-keys", order_string);
1717 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1718 snprintf (buf, sizeof (buf), "%d", _soloed_by_others);
1719 node->add_property ("soloed-by-others", buf);
1721 node->add_child_nocopy (_input->state (full_state));
1722 node->add_child_nocopy (_output->state (full_state));
1723 node->add_child_nocopy (_solo_control->get_state ());
1724 node->add_child_nocopy (_mute_master->get_state ());
1726 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1727 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1728 remote_control_node->add_property (X_("id"), buf);
1729 node->add_child_nocopy (*remote_control_node);
1731 if (_comment.length()) {
1732 XMLNode *cmt = node->add_child ("Comment");
1733 cmt->add_content (_comment);
1736 for (i = _processors.begin(); i != _processors.end(); ++i) {
1737 node->add_child_nocopy((*i)->state (full_state));
1741 node->add_child_copy (*_extra_xml);
1748 Route::set_state (const XMLNode& node, int version)
1750 return _set_state (node, version, true);
1754 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1756 if (version < 3000) {
1757 return _set_state_2X (node, version);
1761 XMLNodeConstIterator niter;
1763 XMLPropertyList plist;
1764 const XMLProperty *prop;
1766 if (node.name() != "Route"){
1767 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1771 if ((prop = node.property (X_("name"))) != 0) {
1772 Route::set_name (prop->value());
1775 if ((prop = node.property ("id")) != 0) {
1776 _id = prop->value ();
1779 if ((prop = node.property (X_("flags"))) != 0) {
1780 _flags = Flag (string_2_enum (prop->value(), _flags));
1785 /* add all processors (except amp, which is always present) */
1787 nlist = node.children();
1788 XMLNode processor_state (X_("processor_state"));
1790 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1794 if (child->name() == IO::state_node_name) {
1795 if ((prop = child->property (X_("direction"))) == 0) {
1799 if (prop->value() == "Input") {
1800 _input->set_state (*child, version);
1801 } else if (prop->value() == "Output") {
1802 _output->set_state (*child, version);
1806 if (child->name() == X_("Processor")) {
1807 processor_state.add_child_copy (*child);
1811 set_processor_state (processor_state);
1813 if ((prop = node.property ("self-solo")) != 0) {
1814 set_self_solo (string_is_affirmative (prop->value()));
1817 if ((prop = node.property ("soloed-by-others")) != 0) {
1818 _soloed_by_others = 0; // needed for mod_solo_by_others () to work
1819 mod_solo_by_others (atoi (prop->value()));
1822 if ((prop = node.property ("solo-isolated")) != 0) {
1823 set_solo_isolated (string_is_affirmative (prop->value()), this);
1826 if ((prop = node.property (X_("phase-invert"))) != 0) {
1827 set_phase_invert (string_is_affirmative (prop->value()));
1830 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1831 set_denormal_protection (string_is_affirmative (prop->value()));
1834 if ((prop = node.property (X_("active"))) != 0) {
1835 bool yn = string_is_affirmative (prop->value());
1836 _active = !yn; // force switch
1840 if ((prop = node.property (X_("meter-point"))) != 0) {
1841 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1843 _meter->set_display_to_user (_meter_point == MeterCustom);
1847 if ((prop = node.property (X_("route-group"))) != 0) {
1848 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1849 if (route_group == 0) {
1850 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1852 set_route_group (route_group, this);
1856 if ((prop = node.property (X_("order-keys"))) != 0) {
1860 string::size_type colon, equal;
1861 string remaining = prop->value();
1863 while (remaining.length()) {
1865 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1866 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1869 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1870 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1873 set_order_key (remaining.substr (0, equal), n);
1877 colon = remaining.find_first_of (':');
1879 if (colon != string::npos) {
1880 remaining = remaining.substr (colon+1);
1887 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1890 if (child->name() == X_("Comment")) {
1892 /* XXX this is a terrible API design in libxml++ */
1894 XMLNode *cmt = *(child->children().begin());
1895 _comment = cmt->content();
1897 } else if (child->name() == X_("Extra")) {
1899 _extra_xml = new XMLNode (*child);
1901 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1903 if (prop->value() == "solo") {
1904 _solo_control->set_state (*child, version);
1905 _session.add_controllable (_solo_control);
1908 } else if (child->name() == X_("RemoteControl")) {
1909 if ((prop = child->property (X_("id"))) != 0) {
1911 sscanf (prop->value().c_str(), "%d", &x);
1912 set_remote_control_id (x);
1915 } else if (child->name() == X_("MuteMaster")) {
1916 _mute_master->set_state (*child, version);
1924 Route::_set_state_2X (const XMLNode& node, int version)
1927 XMLNodeConstIterator niter;
1929 XMLPropertyList plist;
1930 const XMLProperty *prop;
1932 /* 2X things which still remain to be handled:
1935 * mute-affects-pre-fader
1936 * mute-affects-post-fader
1937 * mute-affects-control-outs
1938 * mute-affects-main-outs
1943 if (node.name() != "Route") {
1944 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1948 if ((prop = node.property (X_("flags"))) != 0) {
1949 _flags = Flag (string_2_enum (prop->value(), _flags));
1954 /* add standard processors */
1956 _meter.reset (new PeakMeter (_session));
1957 add_processor (_meter, PreFader);
1959 if (_flags & ControlOut) {
1960 /* where we listen to tracks */
1961 _intreturn.reset (new InternalReturn (_session));
1962 add_processor (_intreturn, PreFader);
1965 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
1966 add_processor (_main_outs, PostFader);
1970 nlist = node.children ();
1971 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1975 if (child->name() == IO::state_node_name) {
1977 /* there is a note in IO::set_state_2X() about why we have to call
1981 _input->set_state_2X (*child, version, true);
1982 _output->set_state_2X (*child, version, false);
1984 if ((prop = child->property (X_("name"))) != 0) {
1985 set_name (prop->value ());
1988 if ((prop = child->property (X_("id"))) != 0) {
1989 _id = prop->value ();
1992 if ((prop = child->property (X_("active"))) != 0) {
1993 bool yn = string_is_affirmative (prop->value());
1994 _active = !yn; // force switch
2002 if ((prop = node.property (X_("phase-invert"))) != 0) {
2003 set_phase_invert (string_is_affirmative (prop->value()));
2006 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2007 set_denormal_protection (string_is_affirmative (prop->value()));
2010 if ((prop = node.property (X_("soloed"))) != 0) {
2011 bool yn = string_is_affirmative (prop->value());
2013 /* XXX force reset of solo status */
2015 set_solo (yn, this);
2018 if ((prop = node.property (X_("meter-point"))) != 0) {
2019 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2022 /* XXX: if the route was in both a mix group and an edit group, it'll end up
2023 just in the edit group. */
2025 if ((prop = node.property (X_("mix-group"))) != 0) {
2026 RouteGroup* route_group = _session.route_group_by_name(prop->value());
2027 if (route_group == 0) {
2028 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
2030 set_route_group (route_group, this);
2034 if ((prop = node.property (X_("edit-group"))) != 0) {
2035 RouteGroup* route_group = _session.route_group_by_name(prop->value());
2036 if (route_group == 0) {
2037 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
2039 set_route_group (route_group, this);
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_route_group (RouteGroup *rg, void *src)
2412 if (rg == _route_group) {
2417 _route_group->remove (this);
2420 if ((_route_group = rg) != 0) {
2421 _route_group->add (this);
2424 _session.set_dirty ();
2425 route_group_changed (src); /* EMIT SIGNAL */
2429 Route::drop_route_group (void *src)
2432 _session.set_dirty ();
2433 route_group_changed (src); /* EMIT SIGNAL */
2437 Route::set_comment (string cmt, void *src)
2440 comment_changed (src);
2441 _session.set_dirty ();
2445 Route::feeds (boost::shared_ptr<Route> other, bool* only_send)
2447 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2449 if (_output->connected_to (other->input())) {
2450 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2459 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2461 boost::shared_ptr<IOProcessor> iop;
2463 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2464 if (iop->feeds (other)) {
2465 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2471 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2474 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2479 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2484 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2486 nframes_t now = _session.transport_frame();
2489 Glib::RWLock::ReaderLock lm (_processor_lock);
2492 automation_snapshot (now, true);
2495 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2497 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2498 (*i)->deactivate ();
2502 (*i)->transport_stopped (now);
2506 _roll_delay = _initial_delay;
2510 Route::input_change_handler (IOChange change, void * /*src*/)
2512 if ((change & ConfigurationChanged)) {
2513 configure_processors (0);
2518 Route::output_change_handler (IOChange change, void * /*src*/)
2520 if ((change & ConfigurationChanged)) {
2522 /* XXX resize all listeners to match _main_outs? */
2524 // configure_processors (0);
2529 Route::pans_required () const
2531 if (n_outputs().n_audio() < 2) {
2535 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2539 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2540 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2542 if (n_outputs().n_total() == 0) {
2546 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2551 _amp->apply_gain_automation (false);
2552 passthru (start_frame, end_frame, nframes, 0);
2558 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2560 if (_roll_delay > nframes) {
2562 _roll_delay -= nframes;
2564 /* transport frame is not legal for caller to use */
2567 } else if (_roll_delay > 0) {
2569 nframes -= _roll_delay;
2570 silence (_roll_delay);
2571 /* we've written _roll_delay of samples into the
2572 output ports, so make a note of that for
2575 _main_outs->increment_output_offset (_roll_delay);
2576 transport_frame += _roll_delay;
2585 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2586 bool /*can_record*/, bool /*rec_monitors_input*/)
2589 // automation snapshot can also be called from the non-rt context
2590 // and it uses the processor list, so we try to acquire the lock here
2591 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2594 automation_snapshot (_session.transport_frame(), false);
2598 if (n_outputs().n_total() == 0) {
2602 if (!_active || n_inputs().n_total() == 0) {
2607 nframes_t unused = 0;
2609 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2615 passthru (start_frame, end_frame, nframes, declick);
2621 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2622 bool /*can_record*/, bool /*rec_monitors_input*/)
2629 Route::toggle_monitor_input ()
2631 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2632 i->ensure_monitor_input( ! i->monitoring_input());
2637 Route::has_external_redirects () const
2639 // FIXME: what about sends? - they don't return a signal back to ardour?
2641 boost::shared_ptr<const PortInsert> pi;
2643 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2645 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2647 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2649 string port_name = port->name();
2650 string client_name = port_name.substr (0, port_name.find(':'));
2652 /* only say "yes" if the redirect is actually in use */
2654 if (client_name != "ardour" && pi->active()) {
2665 Route::flush_processors ()
2667 /* XXX shouldn't really try to take this lock, since
2668 this is called from the RT audio thread.
2671 Glib::RWLock::ReaderLock lm (_processor_lock);
2673 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2674 (*i)->deactivate ();
2680 Route::set_meter_point (MeterPoint p, void *src)
2682 if (_meter_point == p) {
2686 bool meter_was_visible_to_user = _meter->display_to_user ();
2689 Glib::RWLock::WriterLock lm (_processor_lock);
2690 ProcessorList as_it_was (_processors);
2692 if (p != MeterCustom) {
2693 // Move meter in the processors list to reflect the new position
2694 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2695 _processors.erase(loc);
2698 loc = _processors.begin();
2701 loc = find(_processors.begin(), _processors.end(), _amp);
2703 case MeterPostFader:
2704 loc = _processors.end();
2710 _processors.insert(loc, _meter);
2712 if (configure_processors_unlocked (0)) {
2713 _processors = as_it_was;
2714 configure_processors_unlocked (0); // it worked before we tried to add it ...
2718 _meter->set_display_to_user (false);
2722 // just make it visible and let the user move it
2724 _meter->set_display_to_user (true);
2730 meter_change (src); /* EMIT SIGNAL */
2732 /* the meter has visibly changed if it is not visible to the user, or if it was and now isn't */
2733 bool const meter_visibly_changed = _meter->display_to_user() || meter_was_visible_to_user;
2735 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2737 _session.set_dirty ();
2741 Route::put_control_outs_at (Placement p)
2743 if (!_control_outs) {
2748 Glib::RWLock::WriterLock lm (_processor_lock);
2749 ProcessorList as_it_was (_processors);
2750 // Move meter in the processors list
2751 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2752 _processors.erase(loc);
2756 loc = find(_processors.begin(), _processors.end(), _amp);
2757 if (loc != _processors.begin()) {
2762 loc = find(_processors.begin(), _processors.end(), _amp);
2763 assert (loc != _processors.end());
2768 _processors.insert(loc, _control_outs);
2770 if (configure_processors_unlocked (0)) {
2771 _processors = as_it_was;
2772 configure_processors_unlocked (0); // it worked before we tried to add it ...
2777 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2778 _session.set_dirty ();
2782 Route::update_total_latency ()
2784 nframes_t old = _output->effective_latency();
2785 nframes_t own_latency = _output->user_latency();
2787 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2788 if ((*i)->active ()) {
2789 own_latency += (*i)->signal_latency ();
2793 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
2795 _output->set_port_latency (own_latency);
2797 if (_output->user_latency() == 0) {
2799 /* this (virtual) function is used for pure Routes,
2800 not derived classes like AudioTrack. this means
2801 that the data processed here comes from an input
2802 port, not prerecorded material, and therefore we
2803 have to take into account any input latency.
2806 own_latency += _input->signal_latency ();
2809 if (old != own_latency) {
2810 _output->set_latency_delay (own_latency);
2811 signal_latency_changed (); /* EMIT SIGNAL */
2814 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
2816 return _output->effective_latency ();
2820 Route::set_user_latency (nframes_t nframes)
2822 _output->set_user_latency (nframes);
2823 _session.update_latency_compensation (false, false);
2827 Route::set_latency_delay (nframes_t longest_session_latency)
2829 nframes_t old = _initial_delay;
2831 if (_output->effective_latency() < longest_session_latency) {
2832 _initial_delay = longest_session_latency - _output->effective_latency();
2837 if (_initial_delay != old) {
2838 initial_delay_changed (); /* EMIT SIGNAL */
2841 if (_session.transport_stopped()) {
2842 _roll_delay = _initial_delay;
2847 Route::automation_snapshot (nframes_t now, bool force)
2849 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2850 (*i)->automation_snapshot (now, force);
2854 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2855 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2856 boost::shared_ptr<AutomationList>(), name)
2859 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2864 Route::SoloControllable::set_value (float val)
2866 bool bval = ((val >= 0.5f) ? true: false);
2868 route.set_solo (bval, this);
2872 Route::SoloControllable::get_value (void) const
2874 return route.self_soloed() ? 1.0f : 0.0f;
2878 Route::set_block_size (nframes_t nframes)
2880 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2881 (*i)->set_block_size (nframes);
2884 _session.ensure_buffers (n_process_buffers ());
2888 Route::protect_automation ()
2890 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2891 (*i)->protect_automation();
2895 Route::set_pending_declick (int declick)
2898 /* this call is not allowed to turn off a pending declick unless "force" is true */
2900 _pending_declick = declick;
2902 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2904 _pending_declick = 0;
2909 /** Shift automation forwards from a particular place, thereby inserting time.
2910 * Adds undo commands for any shifts that are performed.
2912 * @param pos Position to start shifting from.
2913 * @param frames Amount to shift forwards by.
2917 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2919 #ifdef THIS_NEEDS_FIXING_FOR_V3
2921 /* gain automation */
2922 XMLNode &before = _gain_control->get_state ();
2923 _gain_control->shift (pos, frames);
2924 XMLNode &after = _gain_control->get_state ();
2925 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2927 /* pan automation */
2928 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2929 Curve & c = (*i)->automation ();
2930 XMLNode &before = c.get_state ();
2931 c.shift (pos, frames);
2932 XMLNode &after = c.get_state ();
2933 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2936 /* redirect automation */
2938 Glib::RWLock::ReaderLock lm (redirect_lock);
2939 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2942 (*i)->what_has_automation (a);
2944 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2945 AutomationList & al = (*i)->automation_list (*j);
2946 XMLNode &before = al.get_state ();
2947 al.shift (pos, frames);
2948 XMLNode &after = al.get_state ();
2949 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2959 Route::save_as_template (const string& path, const string& name)
2961 XMLNode& node (state (false));
2964 IO::set_name_in_state (*node.children().front(), name);
2966 tree.set_root (&node);
2967 return tree.write (path.c_str());
2972 Route::set_name (const string& str)
2978 name = Route::ensure_track_or_route_name (str, _session);
2979 SessionObject::set_name (name);
2981 ret = (_input->set_name(name) && _output->set_name(name));
2985 Glib::RWLock::ReaderLock lm (_processor_lock);
2987 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2989 /* rename all I/O processors that have inputs or outputs */
2991 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2993 if (iop && (iop->output() || iop->input())) {
2994 if (!iop->set_name (name)) {
3005 boost::shared_ptr<Send>
3006 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3008 Glib::RWLock::ReaderLock lm (_processor_lock);
3010 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3011 boost::shared_ptr<InternalSend> send;
3013 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3014 if (send->target_route() == target) {
3020 return boost::shared_ptr<Send>();
3024 Route::set_phase_invert (bool yn)
3026 if (_phase_invert != yn) {
3027 _phase_invert = 0xffff; // XXX all channels
3028 phase_invert_changed (); /* EMIT SIGNAL */
3033 Route::phase_invert () const
3035 return _phase_invert != 0;
3039 Route::set_denormal_protection (bool yn)
3041 if (_denormal_protection != yn) {
3042 _denormal_protection = yn;
3043 denormal_protection_changed (); /* EMIT SIGNAL */
3048 Route::denormal_protection () const
3050 return _denormal_protection;
3054 Route::set_active (bool yn)
3056 if (_active != yn) {
3058 _input->set_active (yn);
3059 _output->set_active (yn);
3060 active_changed (); // EMIT SIGNAL
3067 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3073 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3075 boost::shared_ptr<Send> s;
3076 boost::shared_ptr<Return> r;
3078 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3079 s->meter()->meter();
3080 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3081 r->meter()->meter ();
3086 boost::shared_ptr<Panner>
3087 Route::panner() const
3090 return _main_outs->panner();
3093 boost::shared_ptr<AutomationControl>
3094 Route::gain_control() const
3097 return _amp->gain_control();
3100 boost::shared_ptr<AutomationControl>
3101 Route::get_control (const Evoral::Parameter& param)
3103 /* either we own the control or .... */
3105 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
3109 /* maybe one of our processors does or ... */
3111 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3112 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3113 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
3121 /* nobody does so we'll make a new one */
3123 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));