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;
133 _mute_points = MuteMaster::AllPoints;
138 _denormal_protection = false;
140 /* add standard controls */
142 add_control (_solo_control);
143 add_control (_mute_master);
145 /* input and output objects */
147 _input.reset (new IO (_session, _name, IO::Input, _default_type));
148 _output.reset (new IO (_session, _name, IO::Output, _default_type));
150 _input->changed.connect (mem_fun (this, &Route::input_change_handler));
151 _output->changed.connect (mem_fun (this, &Route::output_change_handler));
153 /* add amp processor */
155 _amp.reset (new Amp (_session, _mute_master));
156 add_processor (_amp, PostFader);
161 Metering::disconnect (_meter_connection);
163 clear_processors (PreFader);
164 clear_processors (PostFader);
168 Route::set_remote_control_id (uint32_t id)
170 if (id != _remote_control_id) {
171 _remote_control_id = id;
172 RemoteControlIDChanged ();
177 Route::remote_control_id() const
179 return _remote_control_id;
183 Route::order_key (std::string const & name) const
185 OrderKeys::const_iterator i = order_keys.find (name);
186 if (i == order_keys.end()) {
194 Route::set_order_key (std::string const & name, long n)
196 order_keys[name] = n;
198 if (Config->get_sync_all_route_ordering()) {
199 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
204 _session.set_dirty ();
207 /** Set all order keys to be the same as that for `base', if such a key
208 * exists in this route.
209 * @param base Base key.
212 Route::sync_order_keys (std::string const & base)
214 if (order_keys.empty()) {
218 OrderKeys::iterator i;
221 if ((i = order_keys.find (base)) == order_keys.end()) {
222 /* key doesn't exist, use the first existing key (during session initialization) */
223 i = order_keys.begin();
227 /* key exists - use it and reset all others (actually, itself included) */
229 i = order_keys.begin();
232 for (; i != order_keys.end(); ++i) {
238 Route::ensure_track_or_route_name(string name, Session &session)
240 string newname = name;
242 while (session.route_by_name (newname) != NULL) {
243 newname = bump_name_once (newname);
251 Route::inc_gain (gain_t fraction, void *src)
253 _amp->inc_gain (fraction, src);
257 Route::set_gain (gain_t val, void *src)
259 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
261 if (_route_group->is_relative()) {
263 gain_t usable_gain = _amp->gain();
264 if (usable_gain < 0.000001f) {
265 usable_gain = 0.000001f;
269 if (delta < 0.000001f) {
273 delta -= usable_gain;
278 gain_t factor = delta / usable_gain;
281 factor = _route_group->get_max_factor(factor);
282 if (factor == 0.0f) {
283 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
287 factor = _route_group->get_min_factor(factor);
288 if (factor == 0.0f) {
289 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
294 _route_group->apply (&Route::inc_gain, factor, _route_group);
298 _route_group->apply (&Route::set_gain, val, _route_group);
304 if (val == _amp->gain()) {
308 _amp->set_gain (val, src);
311 /** Process this route for one (sub) cycle (process thread)
313 * @param bufs Scratch buffers to use for the signal path
314 * @param start_frame Initial transport frame
315 * @param end_frame Final transport frame
316 * @param nframes Number of frames to output (to ports)
318 * Note that (end_frame - start_frame) may not be equal to nframes when the
319 * transport speed isn't 1.0 (eg varispeed).
322 Route::process_output_buffers (BufferSet& bufs,
323 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
324 bool /*with_processors*/, int declick)
328 bufs.is_silent (false);
330 switch (Config->get_monitoring_model()) {
331 case HardwareMonitoring:
332 case ExternalMonitoring:
333 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
340 declick = _pending_declick;
343 /* figure out if we're going to use gain automation */
344 _amp->setup_gain_automation (start_frame, end_frame, nframes);
347 /* tell main outs what to do about monitoring */
348 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
351 /* -------------------------------------------------------------------------------------------
352 GLOBAL DECLICK (for transport changes etc.)
353 ----------------------------------------------------------------------------------------- */
356 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
357 } else if (declick < 0) {
358 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
361 _pending_declick = 0;
363 /* -------------------------------------------------------------------------------------------
364 DENORMAL CONTROL/PHASE INVERT
365 ----------------------------------------------------------------------------------------- */
371 if (_denormal_protection || Config->get_denormal_protection()) {
373 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
374 Sample* const sp = i->data();
376 if (_phase_invert & chn) {
377 for (nframes_t nx = 0; nx < nframes; ++nx) {
382 for (nframes_t nx = 0; nx < nframes; ++nx) {
390 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
391 Sample* const sp = i->data();
393 if (_phase_invert & chn) {
394 for (nframes_t nx = 0; nx < nframes; ++nx) {
403 if (_denormal_protection || Config->get_denormal_protection()) {
405 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
406 Sample* const sp = i->data();
407 for (nframes_t nx = 0; nx < nframes; ++nx) {
415 /* -------------------------------------------------------------------------------------------
417 ----------------------------------------------------------------------------------------- */
419 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
422 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
423 if (bufs.count() != (*i)->input_streams()) {
424 cerr << _name << " bufs = " << bufs.count()
425 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
428 assert (bufs.count() == (*i)->input_streams());
429 (*i)->run (bufs, start_frame, end_frame, nframes);
430 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
433 if (!_processors.empty()) {
434 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
440 Route::n_process_buffers ()
442 return max (_input->n_ports(), processor_max_streams);
446 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
448 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
452 assert (bufs.available() >= _input->n_ports());
454 if (_input->n_ports() == ChanCount::ZERO) {
458 bufs.set_count (_input->n_ports());
460 if (is_control() && _session.listening()) {
462 /* control/monitor bus ignores input ports when something is
463 feeding the listen "stream". data will "arrive" into the
464 route from the intreturn processor element.
467 bufs.silence (nframes, 0);
471 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
473 BufferSet::iterator o = bufs.begin(*t);
474 PortSet& ports (_input->ports());
476 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
477 o->read_from (i->get_buffer(nframes), nframes);
482 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
483 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
487 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
489 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
490 bufs.set_count (_input->n_ports());
491 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
492 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
496 Route::set_listen (bool yn, void* src)
499 if (yn != _control_outs->active()) {
501 _control_outs->activate ();
503 _control_outs->deactivate ();
506 listen_changed (src); /* EMIT SIGNAL */
512 Route::listening () const
515 return _control_outs->active ();
522 Route::set_solo (bool yn, void *src)
524 if (_solo_safe || _solo_isolated) {
528 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
529 _route_group->apply (&Route::set_solo, yn, _route_group);
533 if (soloed() != yn) {
534 mod_solo_level (yn ? 1 : -1);
535 solo_changed (src); /* EMIT SIGNAL */
536 _solo_control->Changed (); /* EMIT SIGNAL */
541 Route::mod_solo_level (int32_t delta)
544 if (_solo_level >= (uint32_t) delta) {
545 _solo_level += delta;
550 _solo_level += delta;
553 /* tell main outs what the solo situation is
556 _main_outs->set_solo_level (_solo_level);
557 _main_outs->set_solo_isolated (_solo_isolated);
561 Route::set_solo_isolated (bool yn, void *src)
563 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
564 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
568 if (yn != _solo_isolated) {
571 /* tell main outs what the solo situation is
574 _main_outs->set_solo_level (_solo_level);
575 _main_outs->set_solo_isolated (_solo_isolated);
577 solo_isolated_changed (src);
582 Route::solo_isolated () const
584 return _solo_isolated;
588 Route::set_mute_points (MuteMaster::MutePoint mp)
591 mute_points_changed (); /* EMIT SIGNAL */
593 if (_mute_master->muted()) {
594 _mute_master->mute_at (_mute_points);
595 mute_changed (this); /* EMIT SIGNAL */
600 Route::set_mute (bool yn, void *src)
602 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
603 _route_group->apply (&Route::set_mute, yn, _route_group);
609 _mute_master->mute_at (_mute_points);
611 _mute_master->clear_mute ();
614 mute_changed (src); /* EMIT SIGNAL */
621 return _mute_master->muted ();
626 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
628 cerr << name << " {" << endl;
629 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
630 p != procs.end(); ++p) {
631 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
638 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
640 ProcessorList::iterator loc;
642 /* XXX this is not thread safe - we don't hold the lock across determining the iter
643 to add before and actually doing the insertion. dammit.
646 if (placement == PreFader) {
647 /* generic pre-fader: insert immediately before the amp */
648 loc = find (_processors.begin(), _processors.end(), _amp);
650 /* generic post-fader: insert right before the main outs */
651 loc = find (_processors.begin(), _processors.end(), _main_outs);
654 return add_processor (processor, loc, err);
658 /** Add a processor to the route.
659 * If @a iter is not NULL, it must point to an iterator in _processors and the new
660 * processor will be inserted immediately before this location. Otherwise,
661 * @a position is used.
664 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
666 ChanCount old_pms = processor_max_streams;
668 if (!_session.engine().connected() || !processor) {
673 Glib::RWLock::WriterLock lm (_processor_lock);
675 boost::shared_ptr<PluginInsert> pi;
676 boost::shared_ptr<PortInsert> porti;
678 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
680 if (processor == _amp || processor == _meter || processor == _main_outs) {
681 // Ensure only one of these are in the list at any time
682 if (loc != _processors.end()) {
683 if (iter == loc) { // Already in place, do nothing
685 } else { // New position given, relocate
686 _processors.erase (loc);
691 if (loc != _processors.end()) {
692 cerr << "ERROR: Processor added to route twice!" << endl;
699 _processors.insert (loc, processor);
701 // Set up processor list channels. This will set processor->[input|output]_streams(),
702 // configure redirect ports properly, etc.
704 if (configure_processors_unlocked (err)) {
705 ProcessorList::iterator ploc = loc;
707 _processors.erase(ploc);
708 configure_processors_unlocked (0); // it worked before we tried to add it ...
709 cerr << "configure failed\n";
713 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
715 if (pi->natural_input_streams() == ChanCount::ZERO) {
716 /* generator plugin */
717 _have_internal_generator = true;
722 if (_control_outs != processor) {
723 // XXX: do we want to emit the signal here ? change call order.
724 processor->activate ();
726 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
728 _output->set_user_latency (0);
731 processors_changed (); /* EMIT SIGNAL */
737 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
739 const XMLProperty *prop;
741 if (node.name() != "Processor") {
746 if ((prop = node.property ("type")) != 0) {
748 boost::shared_ptr<Processor> processor;
750 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
751 prop->value() == "lv2" ||
752 prop->value() == "vst" ||
753 prop->value() == "audiounit") {
755 processor.reset (new PluginInsert(_session, node));
757 } else if (prop->value() == "port") {
759 processor.reset (new PortInsert (_session, _mute_master, node));
761 } else if (prop->value() == "send") {
763 processor.reset (new Send (_session, _mute_master, node));
765 } else if (prop->value() == "meter") {
768 if (_meter->set_state (node, Stateful::loading_state_version)) {
775 _meter.reset (new PeakMeter (_session, node));
778 } else if (prop->value() == "amp") {
780 /* amp always exists */
783 if (processor->set_state (node, Stateful::loading_state_version)) {
786 /* never any reason to add it */
790 } else if (prop->value() == "intsend") {
792 processor.reset (new InternalSend (_session, _mute_master, node));
794 } else if (prop->value() == "intreturn") {
797 if (_intreturn->set_state (node, Stateful::loading_state_version)) {
803 _intreturn.reset (new InternalReturn (_session, node));
804 processor = _intreturn;
806 } else if (prop->value() == "main-outs") {
809 if (_main_outs->set_state (node, Stateful::loading_state_version)) {
816 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
817 processor = _main_outs;
820 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
824 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
825 /* check for invisible processors stacked at the end and leave them there */
826 ProcessorList::iterator p;
827 p = _processors.end();
829 while (!(*p)->visible() && p != _processors.begin()) {
836 return (add_processor (processor, iter) == 0);
839 error << _("Processor XML node has no type property") << endmsg;
844 catch (failed_constructor &err) {
845 warning << _("processor could not be created. Ignored.") << endmsg;
852 Route::add_processor_from_xml_2X (const XMLNode& node, int version, ProcessorList::iterator iter)
854 const XMLProperty *prop;
857 boost::shared_ptr<Processor> processor;
859 if (node.name() == "Insert") {
861 if ((prop = node.property ("type")) != 0) {
863 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
864 prop->value() == "lv2" ||
865 prop->value() == "vst" ||
866 prop->value() == "audiounit") {
868 processor.reset (new PluginInsert (_session, node));
872 processor.reset (new PortInsert (_session, _mute_master, node));
877 } else if (node.name() == "Send") {
879 processor.reset (new Send (_session, _mute_master, node, version));
883 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
887 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
888 /* check for invisible processors stacked at the end and leave them there */
889 ProcessorList::iterator p;
890 p = _processors.end();
892 while (!(*p)->visible() && p != _processors.begin()) {
899 return (add_processor (processor, iter) == 0);
902 catch (failed_constructor &err) {
903 warning << _("processor could not be created. Ignored.") << endmsg;
909 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
911 ProcessorList::iterator loc;
914 loc = find(_processors.begin(), _processors.end(), before);
916 /* nothing specified - at end but before main outs */
917 loc = find (_processors.begin(), _processors.end(), _main_outs);
920 return add_processors (others, loc, err);
924 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
926 /* NOTE: this is intended to be used ONLY when copying
927 processors from another Route. Hence the subtle
928 differences between this and ::add_processor()
931 ChanCount old_pms = processor_max_streams;
933 if (!_session.engine().connected()) {
937 if (others.empty()) {
942 Glib::RWLock::WriterLock lm (_processor_lock);
943 ProcessorList::iterator existing_end = _processors.end();
946 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
948 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
950 // Ensure meter only appears in the list once
952 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
953 if (m != _processors.end()) {
954 _processors.erase(m);
958 boost::shared_ptr<PluginInsert> pi;
960 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
963 ChanCount m = max (pi->input_streams(), pi->output_streams());
965 if (m > potential_max_streams) {
966 potential_max_streams = m;
970 _processors.insert (iter, *i);
972 if (configure_processors_unlocked (err)) {
974 _processors.erase (existing_end, _processors.end());
975 configure_processors_unlocked (0); // it worked before we tried to add it ...
979 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
982 _output->set_user_latency (0);
985 processors_changed (); /* EMIT SIGNAL */
991 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
994 start = _processors.begin();
995 end = find(_processors.begin(), _processors.end(), _amp);
997 start = find(_processors.begin(), _processors.end(), _amp);
999 end = _processors.end();
1003 /** Turn off all processors with a given placement
1004 * @param p Placement of processors to disable
1007 Route::disable_processors (Placement p)
1009 Glib::RWLock::ReaderLock lm (_processor_lock);
1011 ProcessorList::iterator start, end;
1012 placement_range(p, start, end);
1014 for (ProcessorList::iterator i = start; i != end; ++i) {
1015 (*i)->deactivate ();
1018 _session.set_dirty ();
1021 /** Turn off all redirects
1024 Route::disable_processors ()
1026 Glib::RWLock::ReaderLock lm (_processor_lock);
1028 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1029 (*i)->deactivate ();
1032 _session.set_dirty ();
1035 /** Turn off all redirects with a given placement
1036 * @param p Placement of redirects to disable
1039 Route::disable_plugins (Placement p)
1041 Glib::RWLock::ReaderLock lm (_processor_lock);
1043 ProcessorList::iterator start, end;
1044 placement_range(p, start, end);
1046 for (ProcessorList::iterator i = start; i != end; ++i) {
1047 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1048 (*i)->deactivate ();
1052 _session.set_dirty ();
1055 /** Turn off all plugins
1058 Route::disable_plugins ()
1060 Glib::RWLock::ReaderLock lm (_processor_lock);
1062 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1063 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1064 (*i)->deactivate ();
1068 _session.set_dirty ();
1073 Route::ab_plugins (bool forward)
1075 Glib::RWLock::ReaderLock lm (_processor_lock);
1079 /* forward = turn off all active redirects, and mark them so that the next time
1080 we go the other way, we will revert them
1083 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1084 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1088 if ((*i)->active()) {
1089 (*i)->deactivate ();
1090 (*i)->set_next_ab_is_active (true);
1092 (*i)->set_next_ab_is_active (false);
1098 /* backward = if the redirect was marked to go active on the next ab, do so */
1100 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1102 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1106 if ((*i)->get_next_ab_is_active()) {
1109 (*i)->deactivate ();
1114 _session.set_dirty ();
1118 /** Remove processors with a given placement.
1119 * @param p Placement of processors to remove.
1122 Route::clear_processors (Placement p)
1124 const ChanCount old_pms = processor_max_streams;
1126 if (!_session.engine().connected()) {
1130 bool already_deleting = _session.deletion_in_progress();
1131 if (!already_deleting) {
1132 _session.set_deletion_in_progress();
1136 Glib::RWLock::WriterLock lm (_processor_lock);
1137 ProcessorList new_list;
1138 ProcessorStreams err;
1139 bool seen_amp = false;
1141 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1147 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1149 /* you can't remove these */
1151 new_list.push_back (*i);
1158 new_list.push_back (*i);
1161 (*i)->drop_references ();
1169 (*i)->drop_references ();
1172 new_list.push_back (*i);
1179 _processors = new_list;
1180 configure_processors_unlocked (&err); // this can't fail
1183 processor_max_streams.reset();
1184 _have_internal_generator = false;
1185 processors_changed (); /* EMIT SIGNAL */
1187 if (!already_deleting) {
1188 _session.clear_deletion_in_progress();
1193 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1195 /* these can never be removed */
1197 if (processor == _amp || processor == _meter || processor == _main_outs) {
1201 ChanCount old_pms = processor_max_streams;
1203 if (!_session.engine().connected()) {
1207 processor_max_streams.reset();
1210 Glib::RWLock::WriterLock lm (_processor_lock);
1211 ProcessorList::iterator i;
1212 bool removed = false;
1214 for (i = _processors.begin(); i != _processors.end(); ) {
1215 if (*i == processor) {
1217 /* move along, see failure case for configure_processors()
1218 where we may need to reconfigure the processor.
1221 /* stop redirects that send signals to JACK ports
1222 from causing noise as a result of no longer being
1226 boost::shared_ptr<IOProcessor> iop;
1228 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1230 iop->input()->disconnect (this);
1232 if (iop->output()) {
1233 iop->output()->disconnect (this);
1237 i = _processors.erase (i);
1245 _output->set_user_latency (0);
1253 if (configure_processors_unlocked (err)) {
1254 /* get back to where we where */
1255 _processors.insert (i, processor);
1256 /* we know this will work, because it worked before :) */
1257 configure_processors_unlocked (0);
1261 _have_internal_generator = false;
1263 for (i = _processors.begin(); i != _processors.end(); ++i) {
1264 boost::shared_ptr<PluginInsert> pi;
1266 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1267 if (pi->is_generator()) {
1268 _have_internal_generator = true;
1275 processor->drop_references ();
1276 processors_changed (); /* EMIT SIGNAL */
1282 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1284 ProcessorList deleted;
1285 ProcessorList as_we_were;
1287 if (!_session.engine().connected()) {
1291 processor_max_streams.reset();
1294 Glib::RWLock::WriterLock lm (_processor_lock);
1295 ProcessorList::iterator i;
1296 boost::shared_ptr<Processor> processor;
1298 as_we_were = _processors;
1300 for (i = _processors.begin(); i != _processors.end(); ) {
1304 /* these can never be removed */
1306 if (processor == _amp || processor == _meter || processor == _main_outs) {
1311 /* see if its in the list of processors to delete */
1313 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1318 /* stop IOProcessors that send to JACK ports
1319 from causing noise as a result of no longer being
1323 boost::shared_ptr<IOProcessor> iop;
1325 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1329 deleted.push_back (processor);
1330 i = _processors.erase (i);
1333 if (deleted.empty()) {
1334 /* none of those in the requested list were found */
1338 _output->set_user_latency (0);
1340 if (configure_processors_unlocked (err)) {
1341 /* get back to where we where */
1342 _processors = as_we_were;
1343 /* we know this will work, because it worked before :) */
1344 configure_processors_unlocked (0);
1348 _have_internal_generator = false;
1350 for (i = _processors.begin(); i != _processors.end(); ++i) {
1351 boost::shared_ptr<PluginInsert> pi;
1353 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1354 if (pi->is_generator()) {
1355 _have_internal_generator = true;
1362 /* now try to do what we need to so that those that were removed will be deleted */
1364 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1365 (*i)->drop_references ();
1368 processors_changed (); /* EMIT SIGNAL */
1375 Route::configure_processors (ProcessorStreams* err)
1377 if (!_in_configure_processors) {
1378 Glib::RWLock::WriterLock lm (_processor_lock);
1379 return configure_processors_unlocked (err);
1384 /** Configure the input/output configuration of each processor in the processors list.
1385 * Return 0 on success, otherwise configuration is impossible.
1388 Route::configure_processors_unlocked (ProcessorStreams* err)
1390 if (_in_configure_processors) {
1394 _in_configure_processors = true;
1396 // Check each processor in order to see if we can configure as requested
1397 ChanCount in = _input->n_ports ();
1399 list< pair<ChanCount,ChanCount> > configuration;
1402 cerr << _name << " CONFIGURE PROCESSORS\n";
1403 dump_processors (_name, _processors);
1405 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1407 if ((*p)->can_support_io_configuration(in, out)) {
1408 cerr << "\t" << (*p)->name() << " in = " << in << " out = " << out << endl;
1409 configuration.push_back(make_pair(in, out));
1416 _in_configure_processors = false;
1421 /* Take the process lock so that if we add a processor which increases the required
1422 number of scratch buffers, we create those scratch buffers before the process
1423 thread has a chance to ask for them.
1424 XXX: in an ideal world we'd perhaps use some RCU magic to avoid having to take
1428 Glib::Mutex::Lock pl (_session.engine().process_lock ());
1430 // We can, so configure everything
1431 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1432 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1433 (*p)->configure_io(c->first, c->second);
1434 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1435 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1439 /* make sure we have sufficient scratch buffers to cope with the new processor
1441 _session.ensure_buffers (n_process_buffers ());
1443 _in_configure_processors = false;
1448 Route::all_processors_flip ()
1450 Glib::RWLock::ReaderLock lm (_processor_lock);
1452 if (_processors.empty()) {
1456 bool first_is_on = _processors.front()->active();
1458 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1460 (*i)->deactivate ();
1466 _session.set_dirty ();
1469 /** Set all processors with a given placement to a given active state.
1470 * @param p Placement of processors to change.
1471 * @param state New active state for those processors.
1474 Route::all_processors_active (Placement p, bool state)
1476 Glib::RWLock::ReaderLock lm (_processor_lock);
1478 if (_processors.empty()) {
1481 ProcessorList::iterator start, end;
1482 placement_range(p, start, end);
1484 bool before_amp = true;
1485 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1490 if (p == PreFader && before_amp) {
1494 (*i)->deactivate ();
1499 _session.set_dirty ();
1503 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1505 bool pre_fader = true;
1506 Glib::RWLock::ReaderLock lm (_processor_lock);
1508 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1510 /* semantic note: if p == amp, we want to return true, so test
1511 for equality before checking if this is the amp
1528 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1530 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1531 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1532 processors in the current actual processor list that are hidden. Any visible processors
1533 in the current list but not in "new_order" will be assumed to be deleted.
1537 Glib::RWLock::WriterLock lm (_processor_lock);
1538 ChanCount old_pms = processor_max_streams;
1539 ProcessorList::iterator oiter;
1540 ProcessorList::const_iterator niter;
1541 ProcessorList as_it_was_before = _processors;
1542 ProcessorList as_it_will_be;
1544 oiter = _processors.begin();
1545 niter = new_order.begin();
1547 while (niter != new_order.end()) {
1549 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1550 then append it to the temp list.
1552 Otherwise, see if the next processor in the old list is in the new list. if not,
1553 its been deleted. If its there, append it to the temp list.
1556 if (oiter == _processors.end()) {
1558 /* no more elements in the old list, so just stick the rest of
1559 the new order onto the temp list.
1562 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1563 while (niter != new_order.end()) {
1570 if (!(*oiter)->visible()) {
1572 as_it_will_be.push_back (*oiter);
1576 /* visible processor: check that its in the new order */
1578 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1579 /* deleted: do nothing, shared_ptr<> will clean up */
1581 /* ignore this one, and add the next item from the new order instead */
1582 as_it_will_be.push_back (*niter);
1587 /* now remove from old order - its taken care of no matter what */
1588 oiter = _processors.erase (oiter);
1593 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1595 if (configure_processors_unlocked (err)) {
1596 _processors = as_it_was_before;
1597 processor_max_streams = old_pms;
1602 processors_changed (); /* EMIT SIGNAL */
1614 Route::get_template()
1616 return state(false);
1620 Route::state(bool full_state)
1622 XMLNode *node = new XMLNode("Route");
1623 ProcessorList::iterator i;
1626 id().print (buf, sizeof (buf));
1627 node->add_property("id", buf);
1628 node->add_property ("name", _name);
1629 node->add_property("default-type", _default_type.to_string());
1632 node->add_property("flags", enum_2_string (_flags));
1635 node->add_property("active", _active?"yes":"no");
1636 node->add_property("phase-invert", _phase_invert?"yes":"no");
1637 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1638 node->add_property("meter-point", enum_2_string (_meter_point));
1641 node->add_property("route-group", _route_group->name());
1644 string order_string;
1645 OrderKeys::iterator x = order_keys.begin();
1647 while (x != order_keys.end()) {
1648 order_string += string ((*x).first);
1649 order_string += '=';
1650 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1651 order_string += buf;
1655 if (x == order_keys.end()) {
1659 order_string += ':';
1661 node->add_property ("order-keys", order_string);
1663 node->add_child_nocopy (_input->state (full_state));
1664 node->add_child_nocopy (_output->state (full_state));
1665 node->add_child_nocopy (_solo_control->get_state ());
1666 node->add_child_nocopy (_mute_master->get_state ());
1668 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1669 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1670 remote_control_node->add_property (X_("id"), buf);
1671 node->add_child_nocopy (*remote_control_node);
1673 if (_comment.length()) {
1674 XMLNode *cmt = node->add_child ("Comment");
1675 cmt->add_content (_comment);
1678 for (i = _processors.begin(); i != _processors.end(); ++i) {
1679 node->add_child_nocopy((*i)->state (full_state));
1683 node->add_child_copy (*_extra_xml);
1690 Route::set_state (const XMLNode& node, int version)
1692 return _set_state (node, version, true);
1696 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1698 if (version < 3000) {
1699 return _set_state_2X (node, version);
1703 XMLNodeConstIterator niter;
1705 XMLPropertyList plist;
1706 const XMLProperty *prop;
1708 if (node.name() != "Route"){
1709 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1713 if ((prop = node.property (X_("name"))) != 0) {
1714 Route::set_name (prop->value());
1717 if ((prop = node.property ("id")) != 0) {
1718 _id = prop->value ();
1721 if ((prop = node.property (X_("flags"))) != 0) {
1722 _flags = Flag (string_2_enum (prop->value(), _flags));
1727 /* add all processors (except amp, which is always present) */
1729 nlist = node.children();
1730 XMLNode processor_state (X_("processor_state"));
1732 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1736 if (child->name() == IO::state_node_name) {
1737 if ((prop = child->property (X_("direction"))) == 0) {
1741 if (prop->value() == "Input") {
1742 _input->set_state (*child, version);
1743 } else if (prop->value() == "Output") {
1744 _output->set_state (*child, version);
1748 if (child->name() == X_("Processor")) {
1749 processor_state.add_child_copy (*child);
1753 set_processor_state (processor_state);
1755 if ((prop = node.property ("solo_level")) != 0) {
1756 _solo_level = 0; // needed for mod_solo_level() to work
1757 mod_solo_level (atoi (prop->value()));
1760 if ((prop = node.property ("solo-isolated")) != 0) {
1761 set_solo_isolated (string_is_affirmative (prop->value()), this);
1764 if ((prop = node.property (X_("phase-invert"))) != 0) {
1765 set_phase_invert (string_is_affirmative (prop->value()));
1768 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1769 set_denormal_protection (string_is_affirmative (prop->value()));
1772 if ((prop = node.property (X_("active"))) != 0) {
1773 bool yn = string_is_affirmative (prop->value());
1774 _active = !yn; // force switch
1778 if ((prop = node.property (X_("soloed"))) != 0) {
1779 bool yn = string_is_affirmative (prop->value());
1781 /* XXX force reset of solo status */
1783 set_solo (yn, this);
1786 if ((prop = node.property (X_("meter-point"))) != 0) {
1787 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1790 if ((prop = node.property (X_("route-group"))) != 0) {
1791 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1792 if (route_group == 0) {
1793 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1795 set_route_group (route_group, this);
1799 if ((prop = node.property (X_("order-keys"))) != 0) {
1803 string::size_type colon, equal;
1804 string remaining = prop->value();
1806 while (remaining.length()) {
1808 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1809 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1812 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1813 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1816 set_order_key (remaining.substr (0, equal), n);
1820 colon = remaining.find_first_of (':');
1822 if (colon != string::npos) {
1823 remaining = remaining.substr (colon+1);
1830 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1833 if (child->name() == X_("Comment")) {
1835 /* XXX this is a terrible API design in libxml++ */
1837 XMLNode *cmt = *(child->children().begin());
1838 _comment = cmt->content();
1840 } else if (child->name() == X_("Extra")) {
1842 _extra_xml = new XMLNode (*child);
1844 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1846 if (prop->value() == "solo") {
1847 _solo_control->set_state (*child, version);
1848 _session.add_controllable (_solo_control);
1851 } else if (child->name() == X_("RemoteControl")) {
1852 if ((prop = child->property (X_("id"))) != 0) {
1854 sscanf (prop->value().c_str(), "%d", &x);
1855 set_remote_control_id (x);
1858 } else if (child->name() == X_("MuteMaster")) {
1859 _mute_master->set_state (*child, version);
1867 Route::_set_state_2X (const XMLNode& node, int version)
1870 XMLNodeConstIterator niter;
1872 XMLPropertyList plist;
1873 const XMLProperty *prop;
1875 /* 2X things which still remain to be handled:
1878 * mute-affects-pre-fader
1879 * mute-affects-post-fader
1880 * mute-affects-control-outs
1881 * mute-affects-main-outs
1886 if (node.name() != "Route") {
1887 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1891 if ((prop = node.property (X_("flags"))) != 0) {
1892 _flags = Flag (string_2_enum (prop->value(), _flags));
1897 /* add standard processors */
1899 _meter.reset (new PeakMeter (_session));
1900 add_processor (_meter, PreFader);
1902 if (_flags & ControlOut) {
1903 /* where we listen to tracks */
1904 _intreturn.reset (new InternalReturn (_session));
1905 add_processor (_intreturn, PreFader);
1908 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
1909 add_processor (_main_outs, PostFader);
1913 nlist = node.children ();
1914 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1918 if (child->name() == IO::state_node_name) {
1920 /* there is a note in IO::set_state_2X() about why we have to call
1924 _input->set_state_2X (*child, version, true);
1925 _output->set_state_2X (*child, version, false);
1927 if ((prop = child->property (X_("name"))) != 0) {
1928 set_name (prop->value ());
1931 if ((prop = child->property (X_("id"))) != 0) {
1932 _id = prop->value ();
1935 if ((prop = child->property (X_("active"))) != 0) {
1936 bool yn = string_is_affirmative (prop->value());
1937 _active = !yn; // force switch
1945 if ((prop = node.property (X_("phase-invert"))) != 0) {
1946 set_phase_invert (string_is_affirmative (prop->value()));
1949 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1950 set_denormal_protection (string_is_affirmative (prop->value()));
1953 if ((prop = node.property (X_("soloed"))) != 0) {
1954 bool yn = string_is_affirmative (prop->value());
1956 /* XXX force reset of solo status */
1958 set_solo (yn, this);
1961 if ((prop = node.property (X_("meter-point"))) != 0) {
1962 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1965 /* XXX: if the route was in both a mix group and an edit group, it'll end up
1966 just in the edit group. */
1968 if ((prop = node.property (X_("mix-group"))) != 0) {
1969 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1970 if (route_group == 0) {
1971 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1973 set_route_group (route_group, this);
1977 if ((prop = node.property (X_("edit-group"))) != 0) {
1978 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1979 if (route_group == 0) {
1980 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1982 set_route_group (route_group, this);
1986 if ((prop = node.property (X_("order-keys"))) != 0) {
1990 string::size_type colon, equal;
1991 string remaining = prop->value();
1993 while (remaining.length()) {
1995 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1996 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1999 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2000 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2003 set_order_key (remaining.substr (0, equal), n);
2007 colon = remaining.find_first_of (':');
2009 if (colon != string::npos) {
2010 remaining = remaining.substr (colon+1);
2017 XMLNodeList redirect_nodes;
2019 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2023 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2024 redirect_nodes.push_back(child);
2029 set_processor_state_2X (redirect_nodes, version);
2031 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2034 if (child->name() == X_("Comment")) {
2036 /* XXX this is a terrible API design in libxml++ */
2038 XMLNode *cmt = *(child->children().begin());
2039 _comment = cmt->content();
2041 } else if (child->name() == X_("Extra")) {
2043 _extra_xml = new XMLNode (*child);
2045 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
2047 if (prop->value() == "solo") {
2048 _solo_control->set_state (*child, version);
2049 _session.add_controllable (_solo_control);
2052 } else if (child->name() == X_("RemoteControl")) {
2053 if ((prop = child->property (X_("id"))) != 0) {
2055 sscanf (prop->value().c_str(), "%d", &x);
2056 set_remote_control_id (x);
2066 Route::get_processor_state ()
2068 XMLNode* root = new XMLNode (X_("redirects"));
2069 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2070 root->add_child_nocopy ((*i)->state (true));
2077 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2079 /* We don't bother removing existing processors not in nList, as this
2080 method will only be called when creating a Route from scratch, not
2081 for undo purposes. Just put processors in at the appropriate place
2085 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2086 add_processor_from_xml_2X (**i, version, _processors.begin ());
2091 Route::set_processor_state (const XMLNode& node)
2093 const XMLNodeList &nlist = node.children();
2094 XMLNodeConstIterator niter;
2095 ProcessorList::iterator i, o;
2097 // Iterate through existing processors, remove those which are not in the state list
2099 for (i = _processors.begin(); i != _processors.end(); ) {
2101 /* leave amp alone, always */
2108 ProcessorList::iterator tmp = i;
2111 bool processorInStateList = false;
2113 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2115 XMLProperty* id_prop = (*niter)->property(X_("id"));
2117 if (id_prop && (*i)->id() == id_prop->value()) {
2118 processorInStateList = true;
2123 if (!processorInStateList) {
2124 remove_processor (*i);
2130 // Iterate through state list and make sure all processors are on the track and in the correct order,
2131 // set the state of existing processors according to the new state on the same go
2133 i = _processors.begin();
2135 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
2137 XMLProperty* prop = (*niter)->property ("type");
2141 // Check whether the next processor in the list is the right one,
2142 // except for "amp" which is always there and may not have the
2143 // old ID since it is always created anew in every Route
2145 if (prop->value() != "amp") {
2146 while (o != _processors.end()) {
2147 XMLProperty* id_prop = (*niter)->property(X_("id"));
2148 if (id_prop && (*o)->id() == id_prop->value()) {
2156 // If the processor (*niter) is not on the route,
2157 // create it and move it to the correct location
2159 if (o == _processors.end()) {
2161 if (add_processor_from_xml (**niter, i)) {
2162 --i; // move iterator to the newly inserted processor
2164 cerr << "Error restoring route: unable to restore processor" << endl;
2169 // Otherwise, the processor already exists; just
2170 // ensure it is at the location provided in the XML state
2173 boost::shared_ptr<Processor> tmp = (*o);
2174 _processors.erase (o); // remove the old copy
2175 _processors.insert (i, tmp); // insert the processor at the correct location
2176 --i; // move iterator to the correct processor
2179 // and make it (just) so
2181 (*i)->set_state (**niter, Stateful::current_state_version);
2185 /* note: there is no configure_processors() call because we figure that
2186 the XML state represents a working signal route.
2189 processors_changed ();
2193 Route::curve_reallocate ()
2195 // _gain_automation_curve.finish_resize ();
2196 // _pan_automation_curve.finish_resize ();
2200 Route::silence (nframes_t nframes)
2204 _output->silence (nframes);
2207 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2210 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2211 boost::shared_ptr<PluginInsert> pi;
2213 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2214 // skip plugins, they don't need anything when we're not active
2218 (*i)->silence (nframes);
2221 if (nframes == _session.get_block_size()) {
2231 Route::add_internal_return ()
2234 _intreturn.reset (new InternalReturn (_session));
2235 add_processor (_intreturn, PreFader);
2240 Route::get_return_buffer () const
2242 Glib::RWLock::ReaderLock rm (_processor_lock);
2244 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2245 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2248 BufferSet* bs = d->get_buffers ();
2257 Route::release_return_buffer () const
2259 Glib::RWLock::ReaderLock rm (_processor_lock);
2261 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2262 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2265 return d->release_buffers ();
2271 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2273 vector<string> ports;
2274 vector<string>::const_iterator i;
2277 Glib::RWLock::ReaderLock rm (_processor_lock);
2279 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2281 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2283 if (d && d->target_route() == route) {
2285 /* if the target is the control outs, then make sure
2286 we take note of which i-send is doing that.
2289 if (route == _session.control_out()) {
2290 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
2293 /* already listening via the specified IO: do nothing */
2300 boost::shared_ptr<InternalSend> listener;
2303 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2305 } catch (failed_constructor& err) {
2309 if (route == _session.control_out()) {
2310 _control_outs = listener;
2313 add_processor (listener, placement);
2319 Route::drop_listen (boost::shared_ptr<Route> route)
2321 ProcessorStreams err;
2322 ProcessorList::iterator tmp;
2324 Glib::RWLock::ReaderLock rl(_processor_lock);
2328 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2330 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2332 if (d && d->target_route() == route) {
2334 remove_processor (*x, &err);
2337 /* list could have been demolished while we dropped the lock
2347 if (route == _session.control_out()) {
2348 _control_outs.reset ();
2353 Route::set_route_group (RouteGroup *rg, void *src)
2355 if (rg == _route_group) {
2360 _route_group->remove (this);
2363 if ((_route_group = rg) != 0) {
2364 _route_group->add (this);
2367 _session.set_dirty ();
2368 route_group_changed (src); /* EMIT SIGNAL */
2372 Route::drop_route_group (void *src)
2375 _session.set_dirty ();
2376 route_group_changed (src); /* EMIT SIGNAL */
2380 Route::set_comment (string cmt, void *src)
2383 comment_changed (src);
2384 _session.set_dirty ();
2388 Route::feeds (boost::shared_ptr<Route> other, bool* only_send)
2390 // cerr << _name << endl;
2392 if (_output->connected_to (other->input())) {
2393 // cerr << "\tdirect FEEDS " << other->name() << endl;
2403 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2405 boost::shared_ptr<IOProcessor> iop;
2407 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2408 if (iop->feeds (other)) {
2409 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2415 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2420 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2425 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2427 nframes_t now = _session.transport_frame();
2430 Glib::RWLock::ReaderLock lm (_processor_lock);
2433 automation_snapshot (now, true);
2436 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2438 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2439 (*i)->deactivate ();
2443 (*i)->transport_stopped (now);
2447 _roll_delay = _initial_delay;
2451 Route::input_change_handler (IOChange change, void * /*src*/)
2453 if ((change & ConfigurationChanged)) {
2454 configure_processors (0);
2459 Route::output_change_handler (IOChange change, void * /*src*/)
2461 if ((change & ConfigurationChanged)) {
2463 /* XXX resize all listeners to match _main_outs? */
2465 // configure_processors (0);
2470 Route::pans_required () const
2472 if (n_outputs().n_audio() < 2) {
2476 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2480 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2481 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2483 if (n_outputs().n_total() == 0) {
2487 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2492 _amp->apply_gain_automation (false);
2493 passthru (start_frame, end_frame, nframes, 0);
2499 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2501 if (_roll_delay > nframes) {
2503 _roll_delay -= nframes;
2505 /* transport frame is not legal for caller to use */
2508 } else if (_roll_delay > 0) {
2510 nframes -= _roll_delay;
2511 silence (_roll_delay);
2512 /* we've written _roll_delay of samples into the
2513 output ports, so make a note of that for
2516 _main_outs->increment_output_offset (_roll_delay);
2517 transport_frame += _roll_delay;
2526 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2527 bool /*can_record*/, bool /*rec_monitors_input*/)
2530 // automation snapshot can also be called from the non-rt context
2531 // and it uses the processor list, so we try to acquire the lock here
2532 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2535 automation_snapshot (_session.transport_frame(), false);
2539 if (n_outputs().n_total() == 0) {
2543 if (!_active || n_inputs().n_total() == 0) {
2548 nframes_t unused = 0;
2550 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2556 passthru (start_frame, end_frame, nframes, declick);
2562 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2563 bool /*can_record*/, bool /*rec_monitors_input*/)
2570 Route::toggle_monitor_input ()
2572 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2573 i->ensure_monitor_input( ! i->monitoring_input());
2578 Route::has_external_redirects () const
2580 // FIXME: what about sends? - they don't return a signal back to ardour?
2582 boost::shared_ptr<const PortInsert> pi;
2584 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2586 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2588 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2590 string port_name = port->name();
2591 string client_name = port_name.substr (0, port_name.find(':'));
2593 /* only say "yes" if the redirect is actually in use */
2595 if (client_name != "ardour" && pi->active()) {
2606 Route::flush_processors ()
2608 /* XXX shouldn't really try to take this lock, since
2609 this is called from the RT audio thread.
2612 Glib::RWLock::ReaderLock lm (_processor_lock);
2614 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2615 (*i)->deactivate ();
2621 Route::set_meter_point (MeterPoint p, void *src)
2623 if (_meter_point == p) {
2628 Glib::RWLock::WriterLock lm (_processor_lock);
2629 ProcessorList as_it_was (_processors);
2631 // Move meter in the processors list
2632 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2633 _processors.erase(loc);
2636 loc = _processors.begin();
2639 loc = find(_processors.begin(), _processors.end(), _amp);
2641 case MeterPostFader:
2642 loc = _processors.end();
2646 _processors.insert(loc, _meter);
2648 if (configure_processors_unlocked (0)) {
2649 _processors = as_it_was;
2650 configure_processors_unlocked (0); // it worked before we tried to add it ...
2657 meter_change (src); /* EMIT SIGNAL */
2658 processors_changed (); /* EMIT SIGNAL */
2659 _session.set_dirty ();
2663 Route::put_control_outs_at (Placement p)
2665 if (!_control_outs) {
2670 Glib::RWLock::WriterLock lm (_processor_lock);
2671 ProcessorList as_it_was (_processors);
2672 // Move meter in the processors list
2673 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2674 _processors.erase(loc);
2678 loc = find(_processors.begin(), _processors.end(), _amp);
2679 if (loc != _processors.begin()) {
2684 loc = find(_processors.begin(), _processors.end(), _amp);
2685 assert (loc != _processors.end());
2690 _processors.insert(loc, _control_outs);
2692 if (configure_processors_unlocked (0)) {
2693 _processors = as_it_was;
2694 configure_processors_unlocked (0); // it worked before we tried to add it ...
2699 processors_changed (); /* EMIT SIGNAL */
2700 _session.set_dirty ();
2704 Route::update_total_latency ()
2706 nframes_t old = _output->effective_latency();
2707 nframes_t own_latency = _output->user_latency();
2709 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2710 if ((*i)->active ()) {
2711 own_latency += (*i)->signal_latency ();
2715 #undef DEBUG_LATENCY
2716 #ifdef DEBUG_LATENCY
2717 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2720 _output->set_port_latency (own_latency);
2722 if (_output->user_latency() == 0) {
2724 /* this (virtual) function is used for pure Routes,
2725 not derived classes like AudioTrack. this means
2726 that the data processed here comes from an input
2727 port, not prerecorded material, and therefore we
2728 have to take into account any input latency.
2731 own_latency += _input->signal_latency ();
2734 if (old != own_latency) {
2735 _output->set_latency_delay (own_latency);
2736 signal_latency_changed (); /* EMIT SIGNAL */
2739 #ifdef DEBUG_LATENCY
2740 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2741 << own_latency << endl;
2744 return _output->effective_latency ();
2748 Route::set_user_latency (nframes_t nframes)
2750 _output->set_user_latency (nframes);
2751 _session.update_latency_compensation (false, false);
2755 Route::set_latency_delay (nframes_t longest_session_latency)
2757 nframes_t old = _initial_delay;
2759 if (_output->effective_latency() < longest_session_latency) {
2760 _initial_delay = longest_session_latency - _output->effective_latency();
2765 if (_initial_delay != old) {
2766 initial_delay_changed (); /* EMIT SIGNAL */
2769 if (_session.transport_stopped()) {
2770 _roll_delay = _initial_delay;
2775 Route::automation_snapshot (nframes_t now, bool force)
2777 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2778 (*i)->automation_snapshot (now, force);
2782 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2783 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2784 boost::shared_ptr<AutomationList>(), name)
2787 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2792 Route::SoloControllable::set_value (float val)
2794 bool bval = ((val >= 0.5f) ? true: false);
2796 route.set_solo (bval, this);
2800 Route::SoloControllable::get_value (void) const
2802 return route.soloed() ? 1.0f : 0.0f;
2806 Route::set_block_size (nframes_t nframes)
2808 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2809 (*i)->set_block_size (nframes);
2812 _session.ensure_buffers (n_process_buffers ());
2816 Route::protect_automation ()
2818 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2819 (*i)->protect_automation();
2823 Route::set_pending_declick (int declick)
2826 /* this call is not allowed to turn off a pending declick unless "force" is true */
2828 _pending_declick = declick;
2830 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2832 _pending_declick = 0;
2837 /** Shift automation forwards from a particular place, thereby inserting time.
2838 * Adds undo commands for any shifts that are performed.
2840 * @param pos Position to start shifting from.
2841 * @param frames Amount to shift forwards by.
2845 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2847 #ifdef THIS_NEEDS_FIXING_FOR_V3
2849 /* gain automation */
2850 XMLNode &before = _gain_control->get_state ();
2851 _gain_control->shift (pos, frames);
2852 XMLNode &after = _gain_control->get_state ();
2853 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2855 /* pan automation */
2856 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2857 Curve & c = (*i)->automation ();
2858 XMLNode &before = c.get_state ();
2859 c.shift (pos, frames);
2860 XMLNode &after = c.get_state ();
2861 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2864 /* redirect automation */
2866 Glib::RWLock::ReaderLock lm (redirect_lock);
2867 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2870 (*i)->what_has_automation (a);
2872 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2873 AutomationList & al = (*i)->automation_list (*j);
2874 XMLNode &before = al.get_state ();
2875 al.shift (pos, frames);
2876 XMLNode &after = al.get_state ();
2877 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2887 Route::save_as_template (const string& path, const string& name)
2889 XMLNode& node (state (false));
2892 IO::set_name_in_state (*node.children().front(), name);
2894 tree.set_root (&node);
2895 return tree.write (path.c_str());
2900 Route::set_name (const string& str)
2906 name = Route::ensure_track_or_route_name (str, _session);
2907 SessionObject::set_name (name);
2909 ret = (_input->set_name(name) && _output->set_name(name));
2913 Glib::RWLock::ReaderLock lm (_processor_lock);
2915 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2917 /* rename all I/O processors that have inputs or outputs */
2919 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2921 if (iop && (iop->output() || iop->input())) {
2922 if (!iop->set_name (name)) {
2933 boost::shared_ptr<Send>
2934 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2936 Glib::RWLock::ReaderLock lm (_processor_lock);
2938 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2939 boost::shared_ptr<InternalSend> send;
2941 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2942 if (send->target_route() == target) {
2948 return boost::shared_ptr<Send>();
2952 Route::set_phase_invert (bool yn)
2954 if (_phase_invert != yn) {
2955 _phase_invert = 0xffff; // XXX all channels
2956 phase_invert_changed (); /* EMIT SIGNAL */
2961 Route::phase_invert () const
2963 return _phase_invert != 0;
2967 Route::set_denormal_protection (bool yn)
2969 if (_denormal_protection != yn) {
2970 _denormal_protection = yn;
2971 denormal_protection_changed (); /* EMIT SIGNAL */
2976 Route::denormal_protection () const
2978 return _denormal_protection;
2982 Route::set_active (bool yn)
2984 if (_active != yn) {
2986 _input->set_active (yn);
2987 _output->set_active (yn);
2988 active_changed (); // EMIT SIGNAL
2995 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3001 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3003 boost::shared_ptr<Send> s;
3004 boost::shared_ptr<Return> r;
3006 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3007 s->meter()->meter();
3008 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3009 r->meter()->meter ();
3014 boost::shared_ptr<Panner>
3015 Route::panner() const
3018 return _main_outs->panner();
3021 boost::shared_ptr<AutomationControl>
3022 Route::gain_control() const
3025 return _amp->gain_control();
3028 boost::shared_ptr<AutomationControl>
3029 Route::get_control (const Evoral::Parameter& param)
3031 /* either we own the control or .... */
3033 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
3037 /* maybe one of our processors does or ... */
3039 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3040 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3041 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
3049 /* nobody does so we'll make a new one */
3051 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));