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/delivery.h"
40 #include "ardour/dB.h"
41 #include "ardour/internal_send.h"
42 #include "ardour/internal_return.h"
43 #include "ardour/ladspa_plugin.h"
44 #include "ardour/meter.h"
45 #include "ardour/mix.h"
46 #include "ardour/panner.h"
47 #include "ardour/plugin_insert.h"
48 #include "ardour/port.h"
49 #include "ardour/port_insert.h"
50 #include "ardour/processor.h"
51 #include "ardour/profile.h"
52 #include "ardour/route.h"
53 #include "ardour/route_group.h"
54 #include "ardour/send.h"
55 #include "ardour/session.h"
56 #include "ardour/timestamps.h"
57 #include "ardour/utils.h"
62 using namespace ARDOUR;
65 uint32_t Route::order_key_cnt = 0;
66 sigc::signal<void, string const &> Route::SyncOrderKeys;
68 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
69 : SessionObject (sess, name)
70 , AutomatableControls (sess)
72 , _solo_control (new SoloControllable (X_("solo"), *this))
73 , _mute_master (new MuteMaster (sess, name))
74 , _default_type (default_type)
79 /* add standard processors other than amp (added by ::init()) */
81 _meter.reset (new PeakMeter (_session));
82 add_processor (_meter, PreFader);
84 if (_flags & ControlOut) {
85 /* where we listen to tracks */
86 _intreturn.reset (new InternalReturn (_session));
87 add_processor (_intreturn, PreFader);
90 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
91 add_processor (_main_outs, PostFader);
93 /* now that we have _meter, its safe to connect to this */
95 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
98 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
99 : SessionObject (sess, "toBeReset")
100 , AutomatableControls (sess)
101 , _solo_control (new SoloControllable (X_("solo"), *this))
102 , _mute_master (new MuteMaster (sess, "toBeReset"))
103 , _default_type (default_type)
107 _set_state (node, Stateful::loading_state_version, false);
109 /* now that we have _meter, its safe to connect to this */
111 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
118 _solo_isolated = false;
120 processor_max_streams.reset();
123 order_keys[N_("signal")] = order_key_cnt++;
125 _meter_point = MeterPostFader;
128 _have_internal_generator = false;
129 _declickable = false;
130 _pending_declick = true;
131 _remote_control_id = 0;
132 _in_configure_processors = false;
137 _denormal_protection = false;
139 /* add standard controls */
141 add_control (_solo_control);
142 add_control (_mute_master);
144 /* input and output objects */
146 _input.reset (new IO (_session, _name, IO::Input, _default_type));
147 _output.reset (new IO (_session, _name, IO::Output, _default_type));
149 _input->changed.connect (mem_fun (this, &Route::input_change_handler));
150 _output->changed.connect (mem_fun (this, &Route::output_change_handler));
152 /* add amp processor */
154 _amp.reset (new Amp (_session, _mute_master));
155 add_processor (_amp, PostFader);
160 Metering::disconnect (_meter_connection);
162 clear_processors (PreFader);
163 clear_processors (PostFader);
167 Route::set_remote_control_id (uint32_t id)
169 if (id != _remote_control_id) {
170 _remote_control_id = id;
171 RemoteControlIDChanged ();
176 Route::remote_control_id() const
178 return _remote_control_id;
182 Route::order_key (std::string const & name) const
184 OrderKeys::const_iterator i = order_keys.find (name);
185 if (i == order_keys.end()) {
193 Route::set_order_key (std::string const & name, long n)
195 order_keys[name] = n;
197 if (Config->get_sync_all_route_ordering()) {
198 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
203 _session.set_dirty ();
206 /** Set all order keys to be the same as that for `base', if such a key
207 * exists in this route.
208 * @param base Base key.
211 Route::sync_order_keys (std::string const & base)
213 if (order_keys.empty()) {
217 OrderKeys::iterator i;
220 if ((i = order_keys.find (base)) == order_keys.end()) {
221 /* key doesn't exist, use the first existing key (during session initialization) */
222 i = order_keys.begin();
226 /* key exists - use it and reset all others (actually, itself included) */
228 i = order_keys.begin();
231 for (; i != order_keys.end(); ++i) {
237 Route::ensure_track_or_route_name(string name, Session &session)
239 string newname = name;
241 while (session.route_by_name (newname) != NULL) {
242 newname = bump_name_once (newname);
250 Route::inc_gain (gain_t fraction, void *src)
252 _amp->inc_gain (fraction, src);
256 Route::set_gain (gain_t val, void *src)
258 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
260 if (_route_group->is_relative()) {
262 gain_t usable_gain = _amp->gain();
263 if (usable_gain < 0.000001f) {
264 usable_gain = 0.000001f;
268 if (delta < 0.000001f) {
272 delta -= usable_gain;
277 gain_t factor = delta / usable_gain;
280 factor = _route_group->get_max_factor(factor);
281 if (factor == 0.0f) {
282 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
286 factor = _route_group->get_min_factor(factor);
287 if (factor == 0.0f) {
288 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
293 _route_group->apply (&Route::inc_gain, factor, _route_group);
297 _route_group->apply (&Route::set_gain, val, _route_group);
303 if (val == _amp->gain()) {
307 _amp->set_gain (val, src);
310 /** Process this route for one (sub) cycle (process thread)
312 * @param bufs Scratch buffers to use for the signal path
313 * @param start_frame Initial transport frame
314 * @param end_frame Final transport frame
315 * @param nframes Number of frames to output (to ports)
317 * Note that (end_frame - start_frame) may not be equal to nframes when the
318 * transport speed isn't 1.0 (eg varispeed).
321 Route::process_output_buffers (BufferSet& bufs,
322 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
323 bool /*with_processors*/, int declick)
327 bufs.is_silent (false);
329 switch (Config->get_monitoring_model()) {
330 case HardwareMonitoring:
331 case ExternalMonitoring:
332 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
339 declick = _pending_declick;
342 /* figure out if we're going to use gain automation */
343 _amp->setup_gain_automation (start_frame, end_frame, nframes);
346 /* tell main outs what to do about monitoring */
347 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
350 /* -------------------------------------------------------------------------------------------
351 GLOBAL DECLICK (for transport changes etc.)
352 ----------------------------------------------------------------------------------------- */
355 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
356 } else if (declick < 0) {
357 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
360 _pending_declick = 0;
362 /* -------------------------------------------------------------------------------------------
363 DENORMAL CONTROL/PHASE INVERT
364 ----------------------------------------------------------------------------------------- */
370 if (_denormal_protection || Config->get_denormal_protection()) {
372 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
373 Sample* const sp = i->data();
375 if (_phase_invert & chn) {
376 for (nframes_t nx = 0; nx < nframes; ++nx) {
381 for (nframes_t nx = 0; nx < nframes; ++nx) {
389 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
390 Sample* const sp = i->data();
392 if (_phase_invert & chn) {
393 for (nframes_t nx = 0; nx < nframes; ++nx) {
402 if (_denormal_protection || Config->get_denormal_protection()) {
404 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
405 Sample* const sp = i->data();
406 for (nframes_t nx = 0; nx < nframes; ++nx) {
414 /* -------------------------------------------------------------------------------------------
416 ----------------------------------------------------------------------------------------- */
418 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
421 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
422 if (bufs.count() != (*i)->input_streams()) {
423 cerr << _name << " bufs = " << bufs.count()
424 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
427 assert (bufs.count() == (*i)->input_streams());
428 (*i)->run (bufs, start_frame, end_frame, nframes);
429 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
432 if (!_processors.empty()) {
433 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
439 Route::n_process_buffers ()
441 return max (_input->n_ports(), processor_max_streams);
445 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
447 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
451 assert (bufs.available() >= _input->n_ports());
453 if (_input->n_ports() == ChanCount::ZERO) {
457 bufs.set_count (_input->n_ports());
459 if (is_control() && _session.listening()) {
461 /* control/monitor bus ignores input ports when something is
462 feeding the listen "stream". data will "arrive" into the
463 route from the intreturn processor element.
466 bufs.silence (nframes, 0);
470 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
472 BufferSet::iterator o = bufs.begin(*t);
473 PortSet& ports (_input->ports());
475 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
476 o->read_from (i->get_buffer(nframes), nframes);
481 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
482 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
486 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
488 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
489 bufs.set_count (_input->n_ports());
490 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
491 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
495 Route::set_listen (bool yn, void* src)
498 if (yn != _control_outs->active()) {
500 _control_outs->activate ();
502 _control_outs->deactivate ();
505 listen_changed (src); /* EMIT SIGNAL */
511 Route::listening () const
514 return _control_outs->active ();
521 Route::set_solo (bool yn, void *src)
523 if (_solo_safe || _solo_isolated) {
527 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
528 _route_group->apply (&Route::set_solo, yn, _route_group);
532 if (soloed() != yn) {
533 mod_solo_level (yn ? 1 : -1);
534 solo_changed (src); /* EMIT SIGNAL */
535 _solo_control->Changed (); /* EMIT SIGNAL */
540 Route::mod_solo_level (int32_t delta)
543 if (_solo_level >= (uint32_t) delta) {
544 _solo_level += delta;
549 _solo_level += delta;
552 /* tell main outs what the solo situation is
555 _main_outs->set_solo_level (_solo_level);
556 _main_outs->set_solo_isolated (_solo_isolated);
560 Route::set_solo_isolated (bool yn, void *src)
562 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
563 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
567 if (yn != _solo_isolated) {
570 /* tell main outs what the solo situation is
573 _main_outs->set_solo_level (_solo_level);
574 _main_outs->set_solo_isolated (_solo_isolated);
576 solo_isolated_changed (src);
581 Route::solo_isolated () const
583 return _solo_isolated;
587 Route::set_mute (bool yn, void *src)
589 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
590 _route_group->apply (&Route::set_mute, yn, _route_group);
595 _mute_master->mute (yn);
603 return _mute_master->muted ();
608 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
610 cerr << name << " {" << endl;
611 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
612 p != procs.end(); ++p) {
613 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
620 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
622 ProcessorList::iterator loc;
624 /* XXX this is not thread safe - we don't hold the lock across determining the iter
625 to add before and actually doing the insertion. dammit.
628 if (placement == PreFader) {
629 /* generic pre-fader: insert immediately before the amp */
630 loc = find (_processors.begin(), _processors.end(), _amp);
632 /* generic post-fader: insert right before the main outs */
633 loc = find (_processors.begin(), _processors.end(), _main_outs);
636 return add_processor (processor, loc, err);
640 /** Add a processor to the route.
641 * If @a iter is not NULL, it must point to an iterator in _processors and the new
642 * processor will be inserted immediately before this location. Otherwise,
643 * @a position is used.
646 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
648 ChanCount old_pms = processor_max_streams;
650 if (!_session.engine().connected() || !processor) {
655 Glib::RWLock::WriterLock lm (_processor_lock);
657 boost::shared_ptr<PluginInsert> pi;
658 boost::shared_ptr<PortInsert> porti;
660 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
662 if (processor == _amp || processor == _meter || processor == _main_outs) {
663 // Ensure only one of these are in the list at any time
664 if (loc != _processors.end()) {
665 if (iter == loc) { // Already in place, do nothing
667 } else { // New position given, relocate
668 _processors.erase (loc);
673 if (loc != _processors.end()) {
674 cerr << "ERROR: Processor added to route twice!" << endl;
681 _processors.insert (loc, processor);
683 // Set up processor list channels. This will set processor->[input|output]_streams(),
684 // configure redirect ports properly, etc.
686 if (configure_processors_unlocked (err)) {
687 ProcessorList::iterator ploc = loc;
689 _processors.erase(ploc);
690 configure_processors_unlocked (0); // it worked before we tried to add it ...
691 cerr << "configure failed\n";
695 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
697 if (pi->natural_input_streams() == ChanCount::ZERO) {
698 /* generator plugin */
699 _have_internal_generator = true;
704 if (_control_outs != processor) {
705 // XXX: do we want to emit the signal here ? change call order.
706 processor->activate ();
708 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
710 _output->set_user_latency (0);
713 processors_changed (); /* EMIT SIGNAL */
719 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
721 const XMLProperty *prop;
723 if (node.name() != "Processor") {
728 if ((prop = node.property ("type")) != 0) {
730 boost::shared_ptr<Processor> processor;
732 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
733 prop->value() == "lv2" ||
734 prop->value() == "vst" ||
735 prop->value() == "audiounit") {
737 processor.reset (new PluginInsert(_session, node));
739 } else if (prop->value() == "port") {
741 processor.reset (new PortInsert (_session, _mute_master, node));
743 } else if (prop->value() == "send") {
745 processor.reset (new Send (_session, _mute_master, node));
747 } else if (prop->value() == "meter") {
750 if (_meter->set_state (node, Stateful::loading_state_version)) {
757 _meter.reset (new PeakMeter (_session, node));
760 } else if (prop->value() == "amp") {
762 /* amp always exists */
765 if (processor->set_state (node, Stateful::loading_state_version)) {
768 /* never any reason to add it */
772 } else if (prop->value() == "intsend") {
774 processor.reset (new InternalSend (_session, _mute_master, node));
776 } else if (prop->value() == "intreturn") {
779 if (_intreturn->set_state (node, Stateful::loading_state_version)) {
785 _intreturn.reset (new InternalReturn (_session, node));
786 processor = _intreturn;
788 } else if (prop->value() == "main-outs") {
791 if (_main_outs->set_state (node, Stateful::loading_state_version)) {
798 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
799 processor = _main_outs;
802 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
806 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
807 /* check for invisible processors stacked at the end and leave them there */
808 ProcessorList::iterator p;
809 p = _processors.end();
811 while (!(*p)->visible() && p != _processors.begin()) {
818 return (add_processor (processor, iter) == 0);
821 error << _("Processor XML node has no type property") << endmsg;
826 catch (failed_constructor &err) {
827 warning << _("processor could not be created. Ignored.") << endmsg;
834 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
836 const XMLProperty *prop;
839 boost::shared_ptr<Processor> processor;
841 if (node.name() == "Insert") {
843 if ((prop = node.property ("type")) != 0) {
845 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
846 prop->value() == "lv2" ||
847 prop->value() == "vst" ||
848 prop->value() == "audiounit") {
850 processor.reset (new PluginInsert (_session, node));
854 processor.reset (new PortInsert (_session, _mute_master, node));
859 } else if (node.name() == "Send") {
861 processor.reset (new Send (_session, _mute_master, node, version));
865 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
869 if (iter == _processors.end() && processor->visible() && !_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)->visible() && p != _processors.begin()) {
881 return (add_processor (processor, iter) == 0);
884 catch (failed_constructor &err) {
885 warning << _("processor could not be created. Ignored.") << endmsg;
891 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
893 ProcessorList::iterator loc;
896 loc = find(_processors.begin(), _processors.end(), before);
898 /* nothing specified - at end but before main outs */
899 loc = find (_processors.begin(), _processors.end(), _main_outs);
902 return add_processors (others, loc, err);
906 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
908 /* NOTE: this is intended to be used ONLY when copying
909 processors from another Route. Hence the subtle
910 differences between this and ::add_processor()
913 ChanCount old_pms = processor_max_streams;
915 if (!_session.engine().connected()) {
919 if (others.empty()) {
924 Glib::RWLock::WriterLock lm (_processor_lock);
925 ProcessorList::iterator existing_end = _processors.end();
928 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
930 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
932 // Ensure meter only appears in the list once
934 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
935 if (m != _processors.end()) {
936 _processors.erase(m);
940 boost::shared_ptr<PluginInsert> pi;
942 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
945 ChanCount m = max (pi->input_streams(), pi->output_streams());
947 if (m > potential_max_streams) {
948 potential_max_streams = m;
952 _processors.insert (iter, *i);
954 if (configure_processors_unlocked (err)) {
956 _processors.erase (existing_end, _processors.end());
957 configure_processors_unlocked (0); // it worked before we tried to add it ...
961 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
964 _output->set_user_latency (0);
967 processors_changed (); /* EMIT SIGNAL */
973 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
976 start = _processors.begin();
977 end = find(_processors.begin(), _processors.end(), _amp);
979 start = find(_processors.begin(), _processors.end(), _amp);
981 end = _processors.end();
985 /** Turn off all processors with a given placement
986 * @param p Placement of processors to disable
989 Route::disable_processors (Placement p)
991 Glib::RWLock::ReaderLock lm (_processor_lock);
993 ProcessorList::iterator start, end;
994 placement_range(p, start, end);
996 for (ProcessorList::iterator i = start; i != end; ++i) {
1000 _session.set_dirty ();
1003 /** Turn off all redirects
1006 Route::disable_processors ()
1008 Glib::RWLock::ReaderLock lm (_processor_lock);
1010 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1011 (*i)->deactivate ();
1014 _session.set_dirty ();
1017 /** Turn off all redirects with a given placement
1018 * @param p Placement of redirects to disable
1021 Route::disable_plugins (Placement p)
1023 Glib::RWLock::ReaderLock lm (_processor_lock);
1025 ProcessorList::iterator start, end;
1026 placement_range(p, start, end);
1028 for (ProcessorList::iterator i = start; i != end; ++i) {
1029 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1030 (*i)->deactivate ();
1034 _session.set_dirty ();
1037 /** Turn off all plugins
1040 Route::disable_plugins ()
1042 Glib::RWLock::ReaderLock lm (_processor_lock);
1044 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1045 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1046 (*i)->deactivate ();
1050 _session.set_dirty ();
1055 Route::ab_plugins (bool forward)
1057 Glib::RWLock::ReaderLock lm (_processor_lock);
1061 /* forward = turn off all active redirects, and mark them so that the next time
1062 we go the other way, we will revert them
1065 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1066 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1070 if ((*i)->active()) {
1071 (*i)->deactivate ();
1072 (*i)->set_next_ab_is_active (true);
1074 (*i)->set_next_ab_is_active (false);
1080 /* backward = if the redirect was marked to go active on the next ab, do so */
1082 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1084 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1088 if ((*i)->get_next_ab_is_active()) {
1091 (*i)->deactivate ();
1096 _session.set_dirty ();
1100 /** Remove processors with a given placement.
1101 * @param p Placement of processors to remove.
1104 Route::clear_processors (Placement p)
1106 const ChanCount old_pms = processor_max_streams;
1108 if (!_session.engine().connected()) {
1112 bool already_deleting = _session.deletion_in_progress();
1113 if (!already_deleting) {
1114 _session.set_deletion_in_progress();
1118 Glib::RWLock::WriterLock lm (_processor_lock);
1119 ProcessorList new_list;
1120 ProcessorStreams err;
1121 bool seen_amp = false;
1123 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1129 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1131 /* you can't remove these */
1133 new_list.push_back (*i);
1140 new_list.push_back (*i);
1143 (*i)->drop_references ();
1151 (*i)->drop_references ();
1154 new_list.push_back (*i);
1161 _processors = new_list;
1162 configure_processors_unlocked (&err); // this can't fail
1165 processor_max_streams.reset();
1166 _have_internal_generator = false;
1167 processors_changed (); /* EMIT SIGNAL */
1169 if (!already_deleting) {
1170 _session.clear_deletion_in_progress();
1175 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1177 /* these can never be removed */
1179 if (processor == _amp || processor == _meter || processor == _main_outs) {
1183 ChanCount old_pms = processor_max_streams;
1185 if (!_session.engine().connected()) {
1189 processor_max_streams.reset();
1192 Glib::RWLock::WriterLock lm (_processor_lock);
1193 ProcessorList::iterator i;
1194 bool removed = false;
1196 for (i = _processors.begin(); i != _processors.end(); ) {
1197 if (*i == processor) {
1199 /* move along, see failure case for configure_processors()
1200 where we may need to reconfigure the processor.
1203 /* stop redirects that send signals to JACK ports
1204 from causing noise as a result of no longer being
1208 boost::shared_ptr<IOProcessor> iop;
1210 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1212 iop->input()->disconnect (this);
1214 if (iop->output()) {
1215 iop->output()->disconnect (this);
1219 i = _processors.erase (i);
1227 _output->set_user_latency (0);
1235 if (configure_processors_unlocked (err)) {
1236 /* get back to where we where */
1237 _processors.insert (i, processor);
1238 /* we know this will work, because it worked before :) */
1239 configure_processors_unlocked (0);
1243 _have_internal_generator = false;
1245 for (i = _processors.begin(); i != _processors.end(); ++i) {
1246 boost::shared_ptr<PluginInsert> pi;
1248 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1249 if (pi->is_generator()) {
1250 _have_internal_generator = true;
1257 processor->drop_references ();
1258 processors_changed (); /* EMIT SIGNAL */
1264 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1266 ProcessorList deleted;
1267 ProcessorList as_we_were;
1269 if (!_session.engine().connected()) {
1273 processor_max_streams.reset();
1276 Glib::RWLock::WriterLock lm (_processor_lock);
1277 ProcessorList::iterator i;
1278 boost::shared_ptr<Processor> processor;
1280 as_we_were = _processors;
1282 for (i = _processors.begin(); i != _processors.end(); ) {
1286 /* these can never be removed */
1288 if (processor == _amp || processor == _meter || processor == _main_outs) {
1293 /* see if its in the list of processors to delete */
1295 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1300 /* stop IOProcessors that send to JACK ports
1301 from causing noise as a result of no longer being
1305 boost::shared_ptr<IOProcessor> iop;
1307 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1311 deleted.push_back (processor);
1312 i = _processors.erase (i);
1315 if (deleted.empty()) {
1316 /* none of those in the requested list were found */
1320 _output->set_user_latency (0);
1322 if (configure_processors_unlocked (err)) {
1323 /* get back to where we where */
1324 _processors = as_we_were;
1325 /* we know this will work, because it worked before :) */
1326 configure_processors_unlocked (0);
1330 _have_internal_generator = false;
1332 for (i = _processors.begin(); i != _processors.end(); ++i) {
1333 boost::shared_ptr<PluginInsert> pi;
1335 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1336 if (pi->is_generator()) {
1337 _have_internal_generator = true;
1344 /* now try to do what we need to so that those that were removed will be deleted */
1346 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1347 (*i)->drop_references ();
1350 processors_changed (); /* EMIT SIGNAL */
1357 Route::configure_processors (ProcessorStreams* err)
1359 if (!_in_configure_processors) {
1360 Glib::RWLock::WriterLock lm (_processor_lock);
1361 return configure_processors_unlocked (err);
1366 /** Configure the input/output configuration of each processor in the processors list.
1367 * Return 0 on success, otherwise configuration is impossible.
1370 Route::configure_processors_unlocked (ProcessorStreams* err)
1372 if (_in_configure_processors) {
1376 _in_configure_processors = true;
1378 // Check each processor in order to see if we can configure as requested
1379 ChanCount in = _input->n_ports ();
1381 list< pair<ChanCount,ChanCount> > configuration;
1384 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1386 if ((*p)->can_support_io_configuration(in, out)) {
1387 configuration.push_back(make_pair(in, out));
1394 _in_configure_processors = false;
1399 /* Take the process lock so that if we add a processor which increases the required
1400 number of scratch buffers, we create those scratch buffers before the process
1401 thread has a chance to ask for them.
1402 XXX: in an ideal world we'd perhaps use some RCU magic to avoid having to take
1406 Glib::Mutex::Lock pl (_session.engine().process_lock ());
1408 // We can, so configure everything
1409 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1410 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1411 (*p)->configure_io(c->first, c->second);
1412 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1413 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1417 /* make sure we have sufficient scratch buffers to cope with the new processor
1419 _session.ensure_buffers (n_process_buffers ());
1421 _in_configure_processors = false;
1426 Route::all_processors_flip ()
1428 Glib::RWLock::ReaderLock lm (_processor_lock);
1430 if (_processors.empty()) {
1434 bool first_is_on = _processors.front()->active();
1436 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1438 (*i)->deactivate ();
1444 _session.set_dirty ();
1447 /** Set all processors with a given placement to a given active state.
1448 * @param p Placement of processors to change.
1449 * @param state New active state for those processors.
1452 Route::all_processors_active (Placement p, bool state)
1454 Glib::RWLock::ReaderLock lm (_processor_lock);
1456 if (_processors.empty()) {
1459 ProcessorList::iterator start, end;
1460 placement_range(p, start, end);
1462 bool before_amp = true;
1463 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1468 if (p == PreFader && before_amp) {
1472 (*i)->deactivate ();
1477 _session.set_dirty ();
1481 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1483 bool pre_fader = true;
1484 Glib::RWLock::ReaderLock lm (_processor_lock);
1486 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1488 /* semantic note: if p == amp, we want to return true, so test
1489 for equality before checking if this is the amp
1506 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1508 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1509 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1510 processors in the current actual processor list that are hidden. Any visible processors
1511 in the current list but not in "new_order" will be assumed to be deleted.
1515 Glib::RWLock::WriterLock lm (_processor_lock);
1516 ChanCount old_pms = processor_max_streams;
1517 ProcessorList::iterator oiter;
1518 ProcessorList::const_iterator niter;
1519 ProcessorList as_it_was_before = _processors;
1520 ProcessorList as_it_will_be;
1522 oiter = _processors.begin();
1523 niter = new_order.begin();
1525 while (niter != new_order.end()) {
1527 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1528 then append it to the temp list.
1530 Otherwise, see if the next processor in the old list is in the new list. if not,
1531 its been deleted. If its there, append it to the temp list.
1534 if (oiter == _processors.end()) {
1536 /* no more elements in the old list, so just stick the rest of
1537 the new order onto the temp list.
1540 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1541 while (niter != new_order.end()) {
1548 if (!(*oiter)->visible()) {
1550 as_it_will_be.push_back (*oiter);
1554 /* visible processor: check that its in the new order */
1556 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1557 /* deleted: do nothing, shared_ptr<> will clean up */
1559 /* ignore this one, and add the next item from the new order instead */
1560 as_it_will_be.push_back (*niter);
1565 /* now remove from old order - its taken care of no matter what */
1566 oiter = _processors.erase (oiter);
1571 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1573 if (configure_processors_unlocked (err)) {
1574 _processors = as_it_was_before;
1575 processor_max_streams = old_pms;
1580 processors_changed (); /* EMIT SIGNAL */
1592 Route::get_template()
1594 return state(false);
1598 Route::state(bool full_state)
1600 XMLNode *node = new XMLNode("Route");
1601 ProcessorList::iterator i;
1604 id().print (buf, sizeof (buf));
1605 node->add_property("id", buf);
1606 node->add_property ("name", _name);
1607 node->add_property("default-type", _default_type.to_string());
1610 node->add_property("flags", enum_2_string (_flags));
1613 node->add_property("active", _active?"yes":"no");
1614 node->add_property("phase-invert", _phase_invert?"yes":"no");
1615 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1616 node->add_property("meter-point", enum_2_string (_meter_point));
1619 node->add_property("route-group", _route_group->name());
1622 string order_string;
1623 OrderKeys::iterator x = order_keys.begin();
1625 while (x != order_keys.end()) {
1626 order_string += string ((*x).first);
1627 order_string += '=';
1628 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1629 order_string += buf;
1633 if (x == order_keys.end()) {
1637 order_string += ':';
1639 node->add_property ("order-keys", order_string);
1641 node->add_child_nocopy (_input->state (full_state));
1642 node->add_child_nocopy (_output->state (full_state));
1643 node->add_child_nocopy (_solo_control->get_state ());
1644 node->add_child_nocopy (_mute_master->get_state ());
1646 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1647 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1648 remote_control_node->add_property (X_("id"), buf);
1649 node->add_child_nocopy (*remote_control_node);
1651 if (_comment.length()) {
1652 XMLNode *cmt = node->add_child ("Comment");
1653 cmt->add_content (_comment);
1656 for (i = _processors.begin(); i != _processors.end(); ++i) {
1657 node->add_child_nocopy((*i)->state (full_state));
1661 node->add_child_copy (*_extra_xml);
1668 Route::set_state (const XMLNode& node, int version)
1670 return _set_state (node, version, true);
1674 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1676 if (version < 3000) {
1677 return _set_state_2X (node, version);
1681 XMLNodeConstIterator niter;
1683 XMLPropertyList plist;
1684 const XMLProperty *prop;
1686 if (node.name() != "Route"){
1687 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1691 if ((prop = node.property (X_("name"))) != 0) {
1692 Route::set_name (prop->value());
1695 if ((prop = node.property ("id")) != 0) {
1696 _id = prop->value ();
1699 if ((prop = node.property (X_("flags"))) != 0) {
1700 _flags = Flag (string_2_enum (prop->value(), _flags));
1705 /* add all processors (except amp, which is always present) */
1707 nlist = node.children();
1708 XMLNode processor_state (X_("processor_state"));
1710 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1714 if (child->name() == IO::state_node_name) {
1715 if ((prop = child->property (X_("direction"))) == 0) {
1719 if (prop->value() == "Input") {
1720 _input->set_state (*child, version);
1721 } else if (prop->value() == "Output") {
1722 _output->set_state (*child, version);
1726 if (child->name() == X_("Processor")) {
1727 processor_state.add_child_copy (*child);
1731 set_processor_state (processor_state);
1733 if ((prop = node.property ("solo_level")) != 0) {
1734 _solo_level = 0; // needed for mod_solo_level() to work
1735 mod_solo_level (atoi (prop->value()));
1738 if ((prop = node.property ("solo-isolated")) != 0) {
1739 set_solo_isolated (string_is_affirmative (prop->value()), this);
1742 if ((prop = node.property (X_("phase-invert"))) != 0) {
1743 set_phase_invert (string_is_affirmative (prop->value()));
1746 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1747 set_denormal_protection (string_is_affirmative (prop->value()));
1750 if ((prop = node.property (X_("active"))) != 0) {
1751 bool yn = string_is_affirmative (prop->value());
1752 _active = !yn; // force switch
1756 if ((prop = node.property (X_("soloed"))) != 0) {
1757 bool yn = string_is_affirmative (prop->value());
1759 /* XXX force reset of solo status */
1761 set_solo (yn, this);
1764 if ((prop = node.property (X_("meter-point"))) != 0) {
1765 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1768 if ((prop = node.property (X_("route-group"))) != 0) {
1769 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1770 if (route_group == 0) {
1771 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1773 set_route_group (route_group, this);
1777 if ((prop = node.property (X_("order-keys"))) != 0) {
1781 string::size_type colon, equal;
1782 string remaining = prop->value();
1784 while (remaining.length()) {
1786 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1787 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1790 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1791 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1794 set_order_key (remaining.substr (0, equal), n);
1798 colon = remaining.find_first_of (':');
1800 if (colon != string::npos) {
1801 remaining = remaining.substr (colon+1);
1808 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1811 if (child->name() == X_("Comment")) {
1813 /* XXX this is a terrible API design in libxml++ */
1815 XMLNode *cmt = *(child->children().begin());
1816 _comment = cmt->content();
1818 } else if (child->name() == X_("Extra")) {
1820 _extra_xml = new XMLNode (*child);
1822 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1824 if (prop->value() == "solo") {
1825 _solo_control->set_state (*child, version);
1826 _session.add_controllable (_solo_control);
1829 } else if (child->name() == X_("RemoteControl")) {
1830 if ((prop = child->property (X_("id"))) != 0) {
1832 sscanf (prop->value().c_str(), "%d", &x);
1833 set_remote_control_id (x);
1836 } else if (child->name() == X_("MuteMaster")) {
1837 _mute_master->set_state (*child, version);
1845 Route::_set_state_2X (const XMLNode& node, int version)
1848 XMLNodeConstIterator niter;
1850 XMLPropertyList plist;
1851 const XMLProperty *prop;
1853 /* 2X things which still remain to be handled:
1856 * mute-affects-pre-fader
1857 * mute-affects-post-fader
1858 * mute-affects-control-outs
1859 * mute-affects-main-outs
1864 if (node.name() != "Route") {
1865 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1869 if ((prop = node.property (X_("flags"))) != 0) {
1870 _flags = Flag (string_2_enum (prop->value(), _flags));
1875 /* add standard processors */
1877 _meter.reset (new PeakMeter (_session));
1878 add_processor (_meter, PreFader);
1880 if (_flags & ControlOut) {
1881 /* where we listen to tracks */
1882 _intreturn.reset (new InternalReturn (_session));
1883 add_processor (_intreturn, PreFader);
1886 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
1887 add_processor (_main_outs, PostFader);
1891 nlist = node.children ();
1892 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1896 if (child->name() == IO::state_node_name) {
1898 /* there is a note in IO::set_state_2X() about why we have to call
1902 _input->set_state_2X (*child, version, true);
1903 _output->set_state_2X (*child, version, false);
1905 if ((prop = child->property (X_("name"))) != 0) {
1906 set_name (prop->value ());
1909 if ((prop = child->property (X_("id"))) != 0) {
1910 _id = prop->value ();
1913 if ((prop = child->property (X_("active"))) != 0) {
1914 bool yn = string_is_affirmative (prop->value());
1915 _active = !yn; // force switch
1923 if ((prop = node.property (X_("phase-invert"))) != 0) {
1924 set_phase_invert (string_is_affirmative (prop->value()));
1927 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1928 set_denormal_protection (string_is_affirmative (prop->value()));
1931 if ((prop = node.property (X_("soloed"))) != 0) {
1932 bool yn = string_is_affirmative (prop->value());
1934 /* XXX force reset of solo status */
1936 set_solo (yn, this);
1939 if ((prop = node.property (X_("meter-point"))) != 0) {
1940 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1943 /* XXX: if the route was in both a mix group and an edit group, it'll end up
1944 just in the edit group. */
1946 if ((prop = node.property (X_("mix-group"))) != 0) {
1947 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1948 if (route_group == 0) {
1949 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1951 set_route_group (route_group, this);
1955 if ((prop = node.property (X_("edit-group"))) != 0) {
1956 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1957 if (route_group == 0) {
1958 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1960 set_route_group (route_group, this);
1964 if ((prop = node.property (X_("order-keys"))) != 0) {
1968 string::size_type colon, equal;
1969 string remaining = prop->value();
1971 while (remaining.length()) {
1973 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1974 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1977 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1978 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1981 set_order_key (remaining.substr (0, equal), n);
1985 colon = remaining.find_first_of (':');
1987 if (colon != string::npos) {
1988 remaining = remaining.substr (colon+1);
1995 XMLNodeList redirect_nodes;
1997 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2001 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2002 redirect_nodes.push_back(child);
2007 set_processor_state_2X (redirect_nodes, version);
2009 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2012 if (child->name() == X_("Comment")) {
2014 /* XXX this is a terrible API design in libxml++ */
2016 XMLNode *cmt = *(child->children().begin());
2017 _comment = cmt->content();
2019 } else if (child->name() == X_("Extra")) {
2021 _extra_xml = new XMLNode (*child);
2023 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2025 if (prop->value() == "solo") {
2026 _solo_control->set_state (*child, version);
2027 _session.add_controllable (_solo_control);
2030 } else if (child->name() == X_("RemoteControl")) {
2031 if ((prop = child->property (X_("id"))) != 0) {
2033 sscanf (prop->value().c_str(), "%d", &x);
2034 set_remote_control_id (x);
2044 Route::get_processor_state ()
2046 XMLNode* root = new XMLNode (X_("redirects"));
2047 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2048 root->add_child_nocopy ((*i)->state (true));
2055 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2057 /* We don't bother removing existing processors not in nList, as this
2058 method will only be called when creating a Route from scratch, not
2059 for undo purposes. Just put processors in at the appropriate place
2063 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2064 add_processor_from_xml_2X (**i, version, _processors.begin ());
2069 Route::set_processor_state (const XMLNode& node)
2071 const XMLNodeList &nlist = node.children();
2072 XMLNodeConstIterator niter;
2073 ProcessorList::iterator i, o;
2075 // Iterate through existing processors, remove those which are not in the state list
2077 for (i = _processors.begin(); i != _processors.end(); ) {
2079 /* leave amp alone, always */
2086 ProcessorList::iterator tmp = i;
2089 bool processorInStateList = false;
2091 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2093 XMLProperty* id_prop = (*niter)->property(X_("id"));
2095 if (id_prop && (*i)->id() == id_prop->value()) {
2096 processorInStateList = true;
2101 if (!processorInStateList) {
2102 remove_processor (*i);
2108 // Iterate through state list and make sure all processors are on the track and in the correct order,
2109 // set the state of existing processors according to the new state on the same go
2111 i = _processors.begin();
2113 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
2115 XMLProperty* prop = (*niter)->property ("type");
2119 // Check whether the next processor in the list is the right one,
2120 // except for "amp" which is always there and may not have the
2121 // old ID since it is always created anew in every Route
2123 if (prop->value() != "amp") {
2124 while (o != _processors.end()) {
2125 XMLProperty* id_prop = (*niter)->property(X_("id"));
2126 if (id_prop && (*o)->id() == id_prop->value()) {
2134 // If the processor (*niter) is not on the route,
2135 // create it and move it to the correct location
2137 if (o == _processors.end()) {
2139 if (add_processor_from_xml (**niter, i)) {
2140 --i; // move iterator to the newly inserted processor
2142 cerr << "Error restoring route: unable to restore processor" << endl;
2147 // Otherwise, the processor already exists; just
2148 // ensure it is at the location provided in the XML state
2151 boost::shared_ptr<Processor> tmp = (*o);
2152 _processors.erase (o); // remove the old copy
2153 _processors.insert (i, tmp); // insert the processor at the correct location
2154 --i; // move iterator to the correct processor
2157 // and make it (just) so
2159 (*i)->set_state (**niter, Stateful::current_state_version);
2163 /* note: there is no configure_processors() call because we figure that
2164 the XML state represents a working signal route.
2167 processors_changed ();
2171 Route::curve_reallocate ()
2173 // _gain_automation_curve.finish_resize ();
2174 // _pan_automation_curve.finish_resize ();
2178 Route::silence (nframes_t nframes)
2182 _output->silence (nframes);
2185 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2188 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2189 boost::shared_ptr<PluginInsert> pi;
2191 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2192 // skip plugins, they don't need anything when we're not active
2196 (*i)->silence (nframes);
2199 if (nframes == _session.get_block_size()) {
2209 Route::add_internal_return ()
2212 _intreturn.reset (new InternalReturn (_session));
2213 add_processor (_intreturn, PreFader);
2218 Route::get_return_buffer () const
2220 Glib::RWLock::ReaderLock rm (_processor_lock);
2222 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2223 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2226 BufferSet* bs = d->get_buffers ();
2235 Route::release_return_buffer () const
2237 Glib::RWLock::ReaderLock rm (_processor_lock);
2239 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2240 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2243 return d->release_buffers ();
2249 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2251 vector<string> ports;
2252 vector<string>::const_iterator i;
2255 Glib::RWLock::ReaderLock rm (_processor_lock);
2257 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2259 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2261 if (d && d->target_route() == route) {
2263 /* if the target is the control outs, then make sure
2264 we take note of which i-send is doing that.
2267 if (route == _session.control_out()) {
2268 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
2271 /* already listening via the specified IO: do nothing */
2278 boost::shared_ptr<InternalSend> listener;
2281 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2283 } catch (failed_constructor& err) {
2287 if (route == _session.control_out()) {
2288 _control_outs = listener;
2291 add_processor (listener, placement);
2297 Route::drop_listen (boost::shared_ptr<Route> route)
2299 ProcessorStreams err;
2300 ProcessorList::iterator tmp;
2302 Glib::RWLock::ReaderLock rl(_processor_lock);
2306 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2308 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2310 if (d && d->target_route() == route) {
2312 remove_processor (*x, &err);
2315 /* list could have been demolished while we dropped the lock
2325 if (route == _session.control_out()) {
2326 _control_outs.reset ();
2331 Route::set_route_group (RouteGroup *rg, void *src)
2333 if (rg == _route_group) {
2338 _route_group->remove (this);
2341 if ((_route_group = rg) != 0) {
2342 _route_group->add (this);
2345 _session.set_dirty ();
2346 route_group_changed (src); /* EMIT SIGNAL */
2350 Route::drop_route_group (void *src)
2353 _session.set_dirty ();
2354 route_group_changed (src); /* EMIT SIGNAL */
2358 Route::set_comment (string cmt, void *src)
2361 comment_changed (src);
2362 _session.set_dirty ();
2366 Route::feeds (boost::shared_ptr<Route> other, bool* only_send)
2368 // cerr << _name << endl;
2370 if (_output->connected_to (other->input())) {
2371 // cerr << "\tdirect FEEDS " << other->name() << endl;
2381 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2383 boost::shared_ptr<IOProcessor> iop;
2385 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2386 if (iop->feeds (other)) {
2387 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2393 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2398 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2403 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2405 nframes_t now = _session.transport_frame();
2408 Glib::RWLock::ReaderLock lm (_processor_lock);
2411 automation_snapshot (now, true);
2414 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2416 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2417 (*i)->deactivate ();
2421 (*i)->transport_stopped (now);
2425 _roll_delay = _initial_delay;
2429 Route::input_change_handler (IOChange change, void * /*src*/)
2431 if ((change & ConfigurationChanged)) {
2432 configure_processors (0);
2437 Route::output_change_handler (IOChange change, void * /*src*/)
2439 if ((change & ConfigurationChanged)) {
2441 /* XXX resize all listeners to match _main_outs? */
2443 // configure_processors (0);
2448 Route::pans_required () const
2450 if (n_outputs().n_audio() < 2) {
2454 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2458 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2459 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2461 if (n_outputs().n_total() == 0) {
2465 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2470 _amp->apply_gain_automation (false);
2471 passthru (start_frame, end_frame, nframes, 0);
2477 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2479 if (_roll_delay > nframes) {
2481 _roll_delay -= nframes;
2483 /* transport frame is not legal for caller to use */
2486 } else if (_roll_delay > 0) {
2488 nframes -= _roll_delay;
2489 silence (_roll_delay);
2490 /* we've written _roll_delay of samples into the
2491 output ports, so make a note of that for
2494 _main_outs->increment_output_offset (_roll_delay);
2495 transport_frame += _roll_delay;
2504 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2505 bool /*can_record*/, bool /*rec_monitors_input*/)
2508 // automation snapshot can also be called from the non-rt context
2509 // and it uses the processor list, so we try to acquire the lock here
2510 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2513 automation_snapshot (_session.transport_frame(), false);
2517 if (n_outputs().n_total() == 0) {
2521 if (!_active || n_inputs().n_total() == 0) {
2526 nframes_t unused = 0;
2528 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2534 passthru (start_frame, end_frame, nframes, declick);
2540 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2541 bool /*can_record*/, bool /*rec_monitors_input*/)
2548 Route::toggle_monitor_input ()
2550 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2551 i->ensure_monitor_input( ! i->monitoring_input());
2556 Route::has_external_redirects () const
2558 // FIXME: what about sends? - they don't return a signal back to ardour?
2560 boost::shared_ptr<const PortInsert> pi;
2562 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2564 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2566 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2568 string port_name = port->name();
2569 string client_name = port_name.substr (0, port_name.find(':'));
2571 /* only say "yes" if the redirect is actually in use */
2573 if (client_name != "ardour" && pi->active()) {
2584 Route::flush_processors ()
2586 /* XXX shouldn't really try to take this lock, since
2587 this is called from the RT audio thread.
2590 Glib::RWLock::ReaderLock lm (_processor_lock);
2592 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2593 (*i)->deactivate ();
2599 Route::set_meter_point (MeterPoint p, void *src)
2601 if (_meter_point != p) {
2604 // Move meter in the processors list
2605 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2606 _processors.erase(loc);
2609 loc = _processors.begin();
2612 loc = find(_processors.begin(), _processors.end(), _amp);
2614 case MeterPostFader:
2615 loc = _processors.end();
2618 _processors.insert(loc, _meter);
2620 meter_change (src); /* EMIT SIGNAL */
2621 processors_changed (); /* EMIT SIGNAL */
2622 _session.set_dirty ();
2626 Route::put_control_outs_at (Placement p)
2628 if (!_control_outs) {
2632 // Move meter in the processors list
2633 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2634 _processors.erase(loc);
2638 loc = find(_processors.begin(), _processors.end(), _amp);
2639 if (loc != _processors.begin()) {
2644 loc = find(_processors.begin(), _processors.end(), _amp);
2645 assert (loc != _processors.end());
2650 _processors.insert(loc, _control_outs);
2652 processors_changed (); /* EMIT SIGNAL */
2653 _session.set_dirty ();
2657 Route::update_total_latency ()
2659 nframes_t old = _output->effective_latency();
2660 nframes_t own_latency = _output->user_latency();
2662 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2663 if ((*i)->active ()) {
2664 own_latency += (*i)->signal_latency ();
2668 #undef DEBUG_LATENCY
2669 #ifdef DEBUG_LATENCY
2670 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2673 _output->set_port_latency (own_latency);
2675 if (_output->user_latency() == 0) {
2677 /* this (virtual) function is used for pure Routes,
2678 not derived classes like AudioTrack. this means
2679 that the data processed here comes from an input
2680 port, not prerecorded material, and therefore we
2681 have to take into account any input latency.
2684 own_latency += _input->signal_latency ();
2687 if (old != own_latency) {
2688 _output->set_latency_delay (own_latency);
2689 signal_latency_changed (); /* EMIT SIGNAL */
2692 #ifdef DEBUG_LATENCY
2693 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2694 << own_latency << endl;
2697 return _output->effective_latency ();
2701 Route::set_user_latency (nframes_t nframes)
2703 _output->set_user_latency (nframes);
2704 _session.update_latency_compensation (false, false);
2708 Route::set_latency_delay (nframes_t longest_session_latency)
2710 nframes_t old = _initial_delay;
2712 if (_output->effective_latency() < longest_session_latency) {
2713 _initial_delay = longest_session_latency - _output->effective_latency();
2718 if (_initial_delay != old) {
2719 initial_delay_changed (); /* EMIT SIGNAL */
2722 if (_session.transport_stopped()) {
2723 _roll_delay = _initial_delay;
2728 Route::automation_snapshot (nframes_t now, bool force)
2730 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2731 (*i)->automation_snapshot (now, force);
2735 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2736 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2737 boost::shared_ptr<AutomationList>(), name)
2740 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2745 Route::SoloControllable::set_value (float val)
2747 bool bval = ((val >= 0.5f) ? true: false);
2749 route.set_solo (bval, this);
2753 Route::SoloControllable::get_value (void) const
2755 return route.soloed() ? 1.0f : 0.0f;
2759 Route::set_block_size (nframes_t nframes)
2761 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2762 (*i)->set_block_size (nframes);
2765 _session.ensure_buffers (n_process_buffers ());
2769 Route::protect_automation ()
2771 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2772 (*i)->protect_automation();
2776 Route::set_pending_declick (int declick)
2779 /* this call is not allowed to turn off a pending declick unless "force" is true */
2781 _pending_declick = declick;
2783 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2785 _pending_declick = 0;
2790 /** Shift automation forwards from a particular place, thereby inserting time.
2791 * Adds undo commands for any shifts that are performed.
2793 * @param pos Position to start shifting from.
2794 * @param frames Amount to shift forwards by.
2798 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2800 #ifdef THIS_NEEDS_FIXING_FOR_V3
2802 /* gain automation */
2803 XMLNode &before = _gain_control->get_state ();
2804 _gain_control->shift (pos, frames);
2805 XMLNode &after = _gain_control->get_state ();
2806 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2808 /* pan automation */
2809 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2810 Curve & c = (*i)->automation ();
2811 XMLNode &before = c.get_state ();
2812 c.shift (pos, frames);
2813 XMLNode &after = c.get_state ();
2814 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2817 /* redirect automation */
2819 Glib::RWLock::ReaderLock lm (redirect_lock);
2820 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2823 (*i)->what_has_automation (a);
2825 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2826 AutomationList & al = (*i)->automation_list (*j);
2827 XMLNode &before = al.get_state ();
2828 al.shift (pos, frames);
2829 XMLNode &after = al.get_state ();
2830 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2840 Route::save_as_template (const string& path, const string& name)
2842 XMLNode& node (state (false));
2845 IO::set_name_in_state (*node.children().front(), name);
2847 tree.set_root (&node);
2848 return tree.write (path.c_str());
2853 Route::set_name (const string& str)
2859 name = Route::ensure_track_or_route_name (str, _session);
2860 SessionObject::set_name (name);
2862 ret = (_input->set_name(name) && _output->set_name(name));
2866 Glib::RWLock::ReaderLock lm (_processor_lock);
2868 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2870 /* rename all I/O processors that have inputs or outputs */
2872 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2874 if (iop && (iop->output() || iop->input())) {
2875 if (!iop->set_name (name)) {
2886 boost::shared_ptr<Send>
2887 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2889 Glib::RWLock::ReaderLock lm (_processor_lock);
2891 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2892 boost::shared_ptr<InternalSend> send;
2894 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2895 if (send->target_route() == target) {
2901 return boost::shared_ptr<Send>();
2905 Route::set_phase_invert (bool yn)
2907 if (_phase_invert != yn) {
2908 _phase_invert = 0xffff; // XXX all channels
2909 phase_invert_changed (); /* EMIT SIGNAL */
2914 Route::phase_invert () const
2916 return _phase_invert != 0;
2920 Route::set_denormal_protection (bool yn)
2922 if (_denormal_protection != yn) {
2923 _denormal_protection = yn;
2924 denormal_protection_changed (); /* EMIT SIGNAL */
2929 Route::denormal_protection () const
2931 return _denormal_protection;
2935 Route::set_active (bool yn)
2937 if (_active != yn) {
2939 _input->set_active (yn);
2940 _output->set_active (yn);
2941 active_changed (); // EMIT SIGNAL
2948 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2954 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2956 boost::shared_ptr<Send> s;
2957 boost::shared_ptr<Return> r;
2959 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
2960 s->meter()->meter();
2961 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
2962 r->meter()->meter ();
2967 boost::shared_ptr<Panner>
2968 Route::panner() const
2971 return _main_outs->panner();
2974 boost::shared_ptr<AutomationControl>
2975 Route::gain_control() const
2978 return _amp->gain_control();
2981 boost::shared_ptr<AutomationControl>
2982 Route::get_control (const Evoral::Parameter& param)
2984 /* either we own the control or .... */
2986 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2990 /* maybe one of our processors does or ... */
2992 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2993 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2994 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
3002 /* nobody does so we'll make a new one */
3004 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));