2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "pbd/xml++.h"
26 #include "pbd/enumwriter.h"
27 #include "pbd/memento_command.h"
28 #include "pbd/stacktrace.h"
29 #include "pbd/convert.h"
31 #include "evoral/Curve.hpp"
33 #include "ardour/amp.h"
34 #include "ardour/audio_port.h"
35 #include "ardour/audioengine.h"
36 #include "ardour/buffer.h"
37 #include "ardour/buffer_set.h"
38 #include "ardour/configuration.h"
39 #include "ardour/cycle_timer.h"
40 #include "ardour/debug.h"
41 #include "ardour/delivery.h"
42 #include "ardour/dB.h"
43 #include "ardour/internal_send.h"
44 #include "ardour/internal_return.h"
45 #include "ardour/ladspa_plugin.h"
46 #include "ardour/meter.h"
47 #include "ardour/mix.h"
48 #include "ardour/monitor_processor.h"
49 #include "ardour/panner.h"
50 #include "ardour/plugin_insert.h"
51 #include "ardour/port.h"
52 #include "ardour/port_insert.h"
53 #include "ardour/processor.h"
54 #include "ardour/profile.h"
55 #include "ardour/route.h"
56 #include "ardour/route_group.h"
57 #include "ardour/send.h"
58 #include "ardour/session.h"
59 #include "ardour/timestamps.h"
60 #include "ardour/utils.h"
61 #include "ardour/graph.h"
62 #include "ardour/unknown_processor.h"
63 #include "ardour/capturing_processor.h"
68 using namespace ARDOUR;
71 uint32_t Route::order_key_cnt = 0;
72 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
73 PBD::Signal0<void> Route::RemoteControlIDChange;
75 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
76 : SessionObject (sess, name)
78 , GraphNode( sess.route_graph )
83 , _pending_declick (true)
84 , _meter_point (MeterPostFader)
86 , _soloed_by_others_upstream (0)
87 , _soloed_by_others_downstream (0)
89 , _denormal_protection (false)
92 , _declickable (false)
93 , _solo_control (new SoloControllable (X_("solo"), *this))
94 , _mute_control (new MuteControllable (X_("mute"), *this))
95 , _mute_master (new MuteMaster (sess, name))
96 , _have_internal_generator (false)
98 , _default_type (default_type)
99 , _remote_control_id (0)
100 , _in_configure_processors (false)
102 processor_max_streams.reset();
103 order_keys[N_("signal")] = order_key_cnt++;
109 /* add standard controls */
111 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
112 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
114 add_control (_solo_control);
115 add_control (_mute_control);
117 /* input and output objects */
119 _input.reset (new IO (_session, _name, IO::Input, _default_type));
120 _output.reset (new IO (_session, _name, IO::Output, _default_type));
122 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
123 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
125 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
127 /* add amp processor */
129 _amp.reset (new Amp (_session));
130 add_processor (_amp, PostFader);
132 /* add standard processors: meter, main outs, monitor out */
134 _meter.reset (new PeakMeter (_session));
135 _meter->set_display_to_user (false);
137 add_processor (_meter, PostFader);
139 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
141 add_processor (_main_outs, PostFader);
144 /* where we listen to tracks */
145 _intreturn.reset (new InternalReturn (_session));
146 add_processor (_intreturn, PreFader);
148 ProcessorList::iterator i;
150 for (i = _processors.begin(); i != _processors.end(); ++i) {
151 if (*i == _intreturn) {
157 /* the thing that provides proper control over a control/monitor/listen bus
158 (such as per-channel cut, dim, solo, invert, etc).
159 It always goes right after the internal return;
161 _monitor_control.reset (new MonitorProcessor (_session));
162 add_processor (_monitor_control, i);
164 /* no panning on the monitor main outs */
166 _main_outs->panner()->set_bypassed (true);
169 if (is_master() || is_monitor() || is_hidden()) {
170 _mute_master->set_solo_ignore (true);
173 /* now that we have _meter, its safe to connect to this */
175 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
182 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
184 /* do this early so that we don't get incoming signals as we are going through destruction
189 /* don't use clear_processors here, as it depends on the session which may
190 be half-destroyed by now
193 Glib::RWLock::WriterLock lm (_processor_lock);
194 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
195 (*i)->drop_references ();
198 _processors.clear ();
202 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
204 if (id != _remote_control_id) {
205 _remote_control_id = id;
206 RemoteControlIDChanged ();
207 if (notify_class_listeners) {
208 RemoteControlIDChange ();
214 Route::remote_control_id() const
216 return _remote_control_id;
220 Route::order_key (std::string const & name) const
222 OrderKeys::const_iterator i = order_keys.find (name);
223 if (i == order_keys.end()) {
231 Route::set_order_key (std::string const & name, int32_t n)
233 bool changed = false;
235 /* This method looks more complicated than it should, but
236 it's important that we don't emit order_key_changed unless
237 it actually has, as expensive things happen on receipt of that
241 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
242 order_keys[name] = n;
246 if (Config->get_sync_all_route_ordering()) {
247 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
248 if (x->second != n) {
256 order_key_changed (); /* EMIT SIGNAL */
257 _session.set_dirty ();
261 /** Set all order keys to be the same as that for `base', if such a key
262 * exists in this route.
263 * @param base Base key.
266 Route::sync_order_keys (std::string const & base)
268 if (order_keys.empty()) {
272 OrderKeys::iterator i;
275 if ((i = order_keys.find (base)) == order_keys.end()) {
276 /* key doesn't exist, use the first existing key (during session initialization) */
277 i = order_keys.begin();
281 /* key exists - use it and reset all others (actually, itself included) */
283 i = order_keys.begin();
286 bool changed = false;
288 for (; i != order_keys.end(); ++i) {
289 if (i->second != key) {
296 order_key_changed (); /* EMIT SIGNAL */
301 Route::ensure_track_or_route_name(string name, Session &session)
303 string newname = name;
305 while (!session.io_name_is_legal (newname)) {
306 newname = bump_name_once (newname, '.');
314 Route::inc_gain (gain_t fraction, void *src)
316 _amp->inc_gain (fraction, src);
320 Route::set_gain (gain_t val, void *src)
322 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
324 if (_route_group->is_relative()) {
326 gain_t usable_gain = _amp->gain();
327 if (usable_gain < 0.000001f) {
328 usable_gain = 0.000001f;
332 if (delta < 0.000001f) {
336 delta -= usable_gain;
341 gain_t factor = delta / usable_gain;
344 factor = _route_group->get_max_factor(factor);
345 if (factor == 0.0f) {
346 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
350 factor = _route_group->get_min_factor(factor);
351 if (factor == 0.0f) {
352 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
357 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
361 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
367 if (val == _amp->gain()) {
371 _amp->set_gain (val, src);
374 /** Process this route for one (sub) cycle (process thread)
376 * @param bufs Scratch buffers to use for the signal path
377 * @param start_frame Initial transport frame
378 * @param end_frame Final transport frame
379 * @param nframes Number of frames to output (to ports)
381 * Note that (end_frame - start_frame) may not be equal to nframes when the
382 * transport speed isn't 1.0 (eg varispeed).
385 Route::process_output_buffers (BufferSet& bufs,
386 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
387 bool /*with_processors*/, int declick,
388 bool gain_automation_ok)
392 bufs.is_silent (false);
394 switch (Config->get_monitoring_model()) {
395 case HardwareMonitoring:
396 case ExternalMonitoring:
397 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
404 declick = _pending_declick;
407 /* figure out if we're going to use gain automation */
408 if (gain_automation_ok) {
409 _amp->setup_gain_automation (start_frame, end_frame, nframes);
411 _amp->apply_gain_automation (false);
414 /* tell main outs what to do about monitoring */
415 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
418 /* -------------------------------------------------------------------------------------------
419 GLOBAL DECLICK (for transport changes etc.)
420 ----------------------------------------------------------------------------------------- */
423 Amp::declick (bufs, nframes, 1);
424 } else if (declick < 0) {
425 Amp::declick (bufs, nframes, -1);
428 _pending_declick = 0;
430 /* -------------------------------------------------------------------------------------------
431 DENORMAL CONTROL/PHASE INVERT
432 ----------------------------------------------------------------------------------------- */
434 if (_phase_invert.any ()) {
438 if (_denormal_protection || Config->get_denormal_protection()) {
440 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
441 Sample* const sp = i->data();
443 if (_phase_invert[chn]) {
444 for (pframes_t nx = 0; nx < nframes; ++nx) {
449 for (pframes_t nx = 0; nx < nframes; ++nx) {
457 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
458 Sample* const sp = i->data();
460 if (_phase_invert[chn]) {
461 for (pframes_t nx = 0; nx < nframes; ++nx) {
470 if (_denormal_protection || Config->get_denormal_protection()) {
472 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
473 Sample* const sp = i->data();
474 for (pframes_t nx = 0; nx < nframes; ++nx) {
482 /* -------------------------------------------------------------------------------------------
484 ----------------------------------------------------------------------------------------- */
486 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
488 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i)) {
492 if (bufs.count() != (*i)->input_streams()) {
493 cerr << _name << " bufs = " << bufs.count()
494 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
497 assert (bufs.count() == (*i)->input_streams());
499 /* should we NOT run plugins here if the route is inactive?
500 do we catch route != active somewhere higher?
503 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
504 bufs.set_count ((*i)->output_streams());
509 Route::n_process_buffers ()
511 return max (_input->n_ports(), processor_max_streams);
515 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
517 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
521 assert (bufs.available() >= input_streams());
523 if (_input->n_ports() == ChanCount::ZERO) {
524 silence_unlocked (nframes);
527 bufs.set_count (input_streams());
529 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
531 /* control/monitor bus ignores input ports when something is
532 feeding the listen "stream". data will "arrive" into the
533 route from the intreturn processor element.
535 bufs.silence (nframes, 0);
539 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
541 BufferSet::iterator o = bufs.begin(*t);
542 PortSet& ports (_input->ports());
544 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
545 o->read_from (i->get_buffer(nframes), nframes);
550 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
551 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick, true);
555 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
557 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
558 bufs.set_count (_input->n_ports());
559 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
560 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick, false);
564 Route::set_listen (bool yn, void* src)
571 if (yn != _monitor_send->active()) {
573 _monitor_send->activate ();
574 _mute_master->set_soloed (true);
576 _monitor_send->deactivate ();
577 _mute_master->set_soloed (false);
580 listen_changed (src); /* EMIT SIGNAL */
586 Route::listening () const
589 return _monitor_send->active ();
596 Route::set_solo_safe (bool yn, void *src)
598 if (_solo_safe != yn) {
600 solo_safe_changed (src);
605 Route::solo_safe() const
611 Route::set_solo (bool yn, void *src)
617 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
618 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
622 if (self_soloed() != yn) {
624 set_mute_master_solo ();
625 solo_changed (true, src); /* EMIT SIGNAL */
626 _solo_control->Changed (); /* EMIT SIGNAL */
631 Route::set_self_solo (bool yn)
637 Route::mod_solo_by_others_upstream (int32_t delta)
643 uint32_t old_sbu = _soloed_by_others_upstream;
646 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
647 _soloed_by_others_upstream += delta;
649 _soloed_by_others_upstream = 0;
652 _soloed_by_others_upstream += delta;
655 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
656 name(), delta, _soloed_by_others_upstream, old_sbu,
657 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
659 /* push the inverse solo change to everything that feeds us.
661 This is important for solo-within-group. When we solo 1 track out of N that
662 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
663 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
664 tracks that feed it. This will silence them if they were audible because
665 of a bus solo, but the newly soloed track will still be audible (because
668 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
672 if ((_self_solo || _soloed_by_others_downstream) &&
673 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
674 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
676 if (delta > 0 || !Config->get_exclusive_solo()) {
677 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
678 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
679 boost::shared_ptr<Route> sr = i->r.lock();
681 sr->mod_solo_by_others_downstream (-delta);
687 set_mute_master_solo ();
688 solo_changed (false, this);
692 Route::mod_solo_by_others_downstream (int32_t delta)
699 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
700 _soloed_by_others_downstream += delta;
702 _soloed_by_others_downstream = 0;
705 _soloed_by_others_downstream += delta;
708 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
710 set_mute_master_solo ();
711 solo_changed (false, this);
715 Route::set_mute_master_solo ()
717 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
721 Route::set_solo_isolated (bool yn, void *src)
723 if (is_master() || is_monitor() || is_hidden()) {
727 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
728 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
732 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
734 boost::shared_ptr<RouteList> routes = _session.get_routes ();
735 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
737 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
742 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
744 if (does_feed && !sends_only) {
745 (*i)->set_solo_isolated (yn, (*i)->route_group());
749 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
751 bool changed = false;
754 if (_solo_isolated == 0) {
755 _mute_master->set_solo_ignore (true);
760 if (_solo_isolated > 0) {
762 if (_solo_isolated == 0) {
763 _mute_master->set_solo_ignore (false);
770 solo_isolated_changed (src);
775 Route::solo_isolated () const
777 return _solo_isolated > 0;
781 Route::set_mute_points (MuteMaster::MutePoint mp)
783 _mute_master->set_mute_points (mp);
784 mute_points_changed (); /* EMIT SIGNAL */
786 if (_mute_master->muted_by_self()) {
787 mute_changed (this); /* EMIT SIGNAL */
788 _mute_control->Changed (); /* EMIT SIGNAL */
793 Route::set_mute (bool yn, void *src)
795 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
796 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
801 _mute_master->set_muted_by_self (yn);
802 mute_changed (src); /* EMIT SIGNAL */
803 _mute_control->Changed (); /* EMIT SIGNAL */
808 Route::muted () const
810 return _mute_master->muted_by_self();
815 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
817 cerr << name << " {" << endl;
818 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
819 p != procs.end(); ++p) {
820 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
827 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
829 ProcessorList::iterator loc;
831 /* XXX this is not thread safe - we don't hold the lock across determining the iter
832 to add before and actually doing the insertion. dammit.
835 if (placement == PreFader) {
836 /* generic pre-fader: insert immediately before the amp */
837 loc = find (_processors.begin(), _processors.end(), _amp);
839 /* generic post-fader: insert right before the main outs */
840 loc = find (_processors.begin(), _processors.end(), _main_outs);
843 return add_processor (processor, loc, err);
847 /** Add a processor to the route.
848 * @a iter must point to an iterator in _processors and the new
849 * processor will be inserted immediately before this location. Otherwise,
850 * @a position is used.
853 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
855 ChanCount old_pms = processor_max_streams;
857 if (!_session.engine().connected() || !processor) {
862 Glib::RWLock::WriterLock lm (_processor_lock);
864 boost::shared_ptr<PluginInsert> pi;
865 boost::shared_ptr<PortInsert> porti;
867 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
869 if (processor == _amp || processor == _meter || processor == _main_outs) {
870 // Ensure only one of these are in the list at any time
871 if (loc != _processors.end()) {
872 if (iter == loc) { // Already in place, do nothing
874 } else { // New position given, relocate
875 _processors.erase (loc);
880 if (loc != _processors.end()) {
881 cerr << "ERROR: Processor added to route twice!" << endl;
888 _processors.insert (loc, processor);
890 // Set up processor list channels. This will set processor->[input|output]_streams(),
891 // configure redirect ports properly, etc.
894 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
896 if (configure_processors_unlocked (err)) {
897 ProcessorList::iterator ploc = loc;
899 _processors.erase(ploc);
900 configure_processors_unlocked (0); // it worked before we tried to add it ...
901 cerr << "configure failed\n";
906 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
908 if (pi->natural_input_streams() == ChanCount::ZERO) {
909 /* generator plugin */
910 _have_internal_generator = true;
915 /* is this the monitor send ? if so, make sure we keep track of it */
917 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
919 if (isend && _session.monitor_out() && (isend->target_id() == _session.monitor_out()->id())) {
920 _monitor_send = isend;
923 if (activation_allowed && (processor != _monitor_send)) {
924 processor->activate ();
927 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
929 _output->set_user_latency (0);
932 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
933 set_processor_positions ();
939 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
941 const XMLProperty *prop;
944 boost::shared_ptr<Processor> processor;
946 /* bit of a hack: get the `placement' property from the <Redirect> tag here
947 so that we can add the processor in the right place (pre/post-fader)
950 XMLNodeList const & children = node.children ();
951 XMLNodeList::const_iterator i = children.begin ();
953 while (i != children.end() && (*i)->name() != X_("Redirect")) {
957 Placement placement = PreFader;
959 if (i != children.end()) {
960 if ((prop = (*i)->property (X_("placement"))) != 0) {
961 placement = Placement (string_2_enum (prop->value(), placement));
965 if (node.name() == "Insert") {
967 if ((prop = node.property ("type")) != 0) {
969 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
970 prop->value() == "lv2" ||
971 prop->value() == "vst" ||
972 prop->value() == "audiounit") {
974 processor.reset (new PluginInsert (_session));
978 processor.reset (new PortInsert (_session, _mute_master));
983 } else if (node.name() == "Send") {
985 processor.reset (new Send (_session, _mute_master));
989 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
993 if (processor->set_state (node, version)) {
997 return (add_processor (processor, placement) == 0);
1000 catch (failed_constructor &err) {
1001 warning << _("processor could not be created. Ignored.") << endmsg;
1007 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1009 ProcessorList::iterator loc;
1012 loc = find(_processors.begin(), _processors.end(), before);
1014 /* nothing specified - at end but before main outs */
1015 loc = find (_processors.begin(), _processors.end(), _main_outs);
1018 return add_processors (others, loc, err);
1022 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
1024 /* NOTE: this is intended to be used ONLY when copying
1025 processors from another Route. Hence the subtle
1026 differences between this and ::add_processor()
1029 ChanCount old_pms = processor_max_streams;
1031 if (!_session.engine().connected()) {
1035 if (others.empty()) {
1040 Glib::RWLock::WriterLock lm (_processor_lock);
1042 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
1044 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1046 // Ensure meter only appears in the list once
1048 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
1049 if (m != _processors.end()) {
1050 _processors.erase(m);
1054 boost::shared_ptr<PluginInsert> pi;
1056 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1059 ChanCount m = max (pi->input_streams(), pi->output_streams());
1061 if (m > potential_max_streams) {
1062 potential_max_streams = m;
1066 ProcessorList::iterator inserted = _processors.insert (iter, *i);
1068 if ((*i)->active()) {
1073 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1074 if (configure_processors_unlocked (err)) {
1075 _processors.erase (inserted);
1076 configure_processors_unlocked (0); // it worked before we tried to add it ...
1081 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1084 _output->set_user_latency (0);
1087 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1088 set_processor_positions ();
1094 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1096 if (p == PreFader) {
1097 start = _processors.begin();
1098 end = find(_processors.begin(), _processors.end(), _amp);
1100 start = find(_processors.begin(), _processors.end(), _amp);
1102 end = _processors.end();
1106 /** Turn off all processors with a given placement
1107 * @param p Placement of processors to disable
1110 Route::disable_processors (Placement p)
1112 Glib::RWLock::ReaderLock lm (_processor_lock);
1114 ProcessorList::iterator start, end;
1115 placement_range(p, start, end);
1117 for (ProcessorList::iterator i = start; i != end; ++i) {
1118 (*i)->deactivate ();
1121 _session.set_dirty ();
1124 /** Turn off all redirects
1127 Route::disable_processors ()
1129 Glib::RWLock::ReaderLock lm (_processor_lock);
1131 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1132 (*i)->deactivate ();
1135 _session.set_dirty ();
1138 /** Turn off all redirects with a given placement
1139 * @param p Placement of redirects to disable
1142 Route::disable_plugins (Placement p)
1144 Glib::RWLock::ReaderLock lm (_processor_lock);
1146 ProcessorList::iterator start, end;
1147 placement_range(p, start, end);
1149 for (ProcessorList::iterator i = start; i != end; ++i) {
1150 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1151 (*i)->deactivate ();
1155 _session.set_dirty ();
1158 /** Turn off all plugins
1161 Route::disable_plugins ()
1163 Glib::RWLock::ReaderLock lm (_processor_lock);
1165 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1166 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1167 (*i)->deactivate ();
1171 _session.set_dirty ();
1176 Route::ab_plugins (bool forward)
1178 Glib::RWLock::ReaderLock lm (_processor_lock);
1182 /* forward = turn off all active redirects, and mark them so that the next time
1183 we go the other way, we will revert them
1186 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1187 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1191 if ((*i)->active()) {
1192 (*i)->deactivate ();
1193 (*i)->set_next_ab_is_active (true);
1195 (*i)->set_next_ab_is_active (false);
1201 /* backward = if the redirect was marked to go active on the next ab, do so */
1203 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1205 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1209 if ((*i)->get_next_ab_is_active()) {
1212 (*i)->deactivate ();
1217 _session.set_dirty ();
1221 /** Remove processors with a given placement.
1222 * @param p Placement of processors to remove.
1225 Route::clear_processors (Placement p)
1227 const ChanCount old_pms = processor_max_streams;
1229 if (!_session.engine().connected()) {
1233 bool already_deleting = _session.deletion_in_progress();
1234 if (!already_deleting) {
1235 _session.set_deletion_in_progress();
1239 Glib::RWLock::WriterLock lm (_processor_lock);
1240 ProcessorList new_list;
1241 ProcessorStreams err;
1242 bool seen_amp = false;
1244 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1250 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1252 /* you can't remove these */
1254 new_list.push_back (*i);
1261 new_list.push_back (*i);
1264 (*i)->drop_references ();
1272 (*i)->drop_references ();
1275 new_list.push_back (*i);
1282 _processors = new_list;
1285 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1286 configure_processors_unlocked (&err); // this can't fail
1290 processor_max_streams.reset();
1291 _have_internal_generator = false;
1292 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1293 set_processor_positions ();
1295 if (!already_deleting) {
1296 _session.clear_deletion_in_progress();
1301 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1303 /* these can never be removed */
1305 if (processor == _amp || processor == _meter || processor == _main_outs) {
1309 ChanCount old_pms = processor_max_streams;
1311 if (!_session.engine().connected()) {
1315 processor_max_streams.reset();
1318 Glib::RWLock::WriterLock lm (_processor_lock);
1319 ProcessorList::iterator i;
1320 bool removed = false;
1322 for (i = _processors.begin(); i != _processors.end(); ) {
1323 if (*i == processor) {
1325 /* move along, see failure case for configure_processors()
1326 where we may need to reconfigure the processor.
1329 /* stop redirects that send signals to JACK ports
1330 from causing noise as a result of no longer being
1334 boost::shared_ptr<IOProcessor> iop;
1336 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1338 iop->input()->disconnect (this);
1340 if (iop->output()) {
1341 iop->output()->disconnect (this);
1345 i = _processors.erase (i);
1353 _output->set_user_latency (0);
1362 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1364 if (configure_processors_unlocked (err)) {
1365 /* get back to where we where */
1366 _processors.insert (i, processor);
1367 /* we know this will work, because it worked before :) */
1368 configure_processors_unlocked (0);
1373 _have_internal_generator = false;
1375 for (i = _processors.begin(); i != _processors.end(); ++i) {
1376 boost::shared_ptr<PluginInsert> pi;
1378 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1379 if (pi->is_generator()) {
1380 _have_internal_generator = true;
1387 processor->drop_references ();
1388 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1389 set_processor_positions ();
1395 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1397 ProcessorList deleted;
1399 if (!_session.engine().connected()) {
1403 processor_max_streams.reset();
1406 Glib::RWLock::WriterLock lm (_processor_lock);
1407 ProcessorList::iterator i;
1408 boost::shared_ptr<Processor> processor;
1410 ProcessorList as_we_were = _processors;
1412 for (i = _processors.begin(); i != _processors.end(); ) {
1416 /* these can never be removed */
1418 if (processor == _amp || processor == _meter || processor == _main_outs) {
1423 /* see if its in the list of processors to delete */
1425 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1430 /* stop IOProcessors that send to JACK ports
1431 from causing noise as a result of no longer being
1435 boost::shared_ptr<IOProcessor> iop;
1437 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1441 deleted.push_back (processor);
1442 i = _processors.erase (i);
1445 if (deleted.empty()) {
1446 /* none of those in the requested list were found */
1450 _output->set_user_latency (0);
1453 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1455 if (configure_processors_unlocked (err)) {
1456 /* get back to where we where */
1457 _processors = as_we_were;
1458 /* we know this will work, because it worked before :) */
1459 configure_processors_unlocked (0);
1464 _have_internal_generator = false;
1466 for (i = _processors.begin(); i != _processors.end(); ++i) {
1467 boost::shared_ptr<PluginInsert> pi;
1469 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1470 if (pi->is_generator()) {
1471 _have_internal_generator = true;
1478 /* now try to do what we need to so that those that were removed will be deleted */
1480 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1481 (*i)->drop_references ();
1484 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1485 set_processor_positions ();
1490 /** Caller must hold process lock */
1492 Route::configure_processors (ProcessorStreams* err)
1494 assert (!AudioEngine::instance()->process_lock().trylock());
1496 if (!_in_configure_processors) {
1497 Glib::RWLock::WriterLock lm (_processor_lock);
1498 return configure_processors_unlocked (err);
1504 Route::input_streams () const
1506 return _input->n_ports ();
1509 list<pair<ChanCount, ChanCount> >
1510 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1512 Glib::RWLock::ReaderLock lm (_processor_lock);
1514 return try_configure_processors_unlocked (in, err);
1517 list<pair<ChanCount, ChanCount> >
1518 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1520 // Check each processor in order to see if we can configure as requested
1522 list<pair<ChanCount, ChanCount> > configuration;
1525 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1526 DEBUG_TRACE (DEBUG::Processors, "{\n");
1528 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1530 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1531 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1535 if ((*p)->can_support_io_configuration(in, out)) {
1536 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1537 configuration.push_back(make_pair(in, out));
1544 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1545 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1546 DEBUG_TRACE (DEBUG::Processors, "}\n");
1547 return list<pair<ChanCount, ChanCount> > ();
1551 DEBUG_TRACE (DEBUG::Processors, "}\n");
1553 return configuration;
1556 /** Set the input/output configuration of each processor in the processors list.
1557 * Caller must hold process lock.
1558 * Return 0 on success, otherwise configuration is impossible.
1561 Route::configure_processors_unlocked (ProcessorStreams* err)
1563 assert (!AudioEngine::instance()->process_lock().trylock());
1565 if (_in_configure_processors) {
1569 _in_configure_processors = true;
1571 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1573 if (configuration.empty ()) {
1574 _in_configure_processors = false;
1580 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1581 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1583 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1587 (*p)->configure_io(c->first, c->second);
1588 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1589 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1594 _meter->reset_max_channels (processor_max_streams);
1597 /* make sure we have sufficient scratch buffers to cope with the new processor
1599 _session.ensure_buffers (n_process_buffers ());
1601 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1603 _in_configure_processors = false;
1608 Route::all_processors_flip ()
1610 Glib::RWLock::ReaderLock lm (_processor_lock);
1612 if (_processors.empty()) {
1616 bool first_is_on = _processors.front()->active();
1618 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1620 (*i)->deactivate ();
1626 _session.set_dirty ();
1629 /** Set all processors with a given placement to a given active state.
1630 * @param p Placement of processors to change.
1631 * @param state New active state for those processors.
1634 Route::all_processors_active (Placement p, bool state)
1636 Glib::RWLock::ReaderLock lm (_processor_lock);
1638 if (_processors.empty()) {
1641 ProcessorList::iterator start, end;
1642 placement_range(p, start, end);
1644 bool before_amp = true;
1645 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1650 if (p == PreFader && before_amp) {
1654 (*i)->deactivate ();
1659 _session.set_dirty ();
1663 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1665 bool pre_fader = true;
1666 Glib::RWLock::ReaderLock lm (_processor_lock);
1668 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1670 /* semantic note: if p == amp, we want to return true, so test
1671 for equality before checking if this is the amp
1688 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1690 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1691 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1692 processors in the current actual processor list that are hidden. Any visible processors
1693 in the current list but not in "new_order" will be assumed to be deleted.
1697 Glib::RWLock::WriterLock lm (_processor_lock);
1698 ChanCount old_pms = processor_max_streams;
1699 ProcessorList::iterator oiter;
1700 ProcessorList::const_iterator niter;
1701 ProcessorList as_it_was_before = _processors;
1702 ProcessorList as_it_will_be;
1704 oiter = _processors.begin();
1705 niter = new_order.begin();
1707 while (niter != new_order.end()) {
1709 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1710 then append it to the temp list.
1712 Otherwise, see if the next processor in the old list is in the new list. if not,
1713 its been deleted. If its there, append it to the temp list.
1716 if (oiter == _processors.end()) {
1718 /* no more elements in the old list, so just stick the rest of
1719 the new order onto the temp list.
1722 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1723 while (niter != new_order.end()) {
1730 if (!(*oiter)->display_to_user()) {
1732 as_it_will_be.push_back (*oiter);
1736 /* visible processor: check that its in the new order */
1738 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1739 /* deleted: do nothing, shared_ptr<> will clean up */
1741 /* ignore this one, and add the next item from the new order instead */
1742 as_it_will_be.push_back (*niter);
1747 /* now remove from old order - its taken care of no matter what */
1748 oiter = _processors.erase (oiter);
1753 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1756 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1758 if (configure_processors_unlocked (err)) {
1759 _processors = as_it_was_before;
1760 processor_max_streams = old_pms;
1767 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1768 set_processor_positions ();
1781 Route::get_template()
1783 return state(false);
1787 Route::state(bool full_state)
1789 XMLNode *node = new XMLNode("Route");
1790 ProcessorList::iterator i;
1793 id().print (buf, sizeof (buf));
1794 node->add_property("id", buf);
1795 node->add_property ("name", _name);
1796 node->add_property("default-type", _default_type.to_string());
1799 node->add_property("flags", enum_2_string (_flags));
1802 node->add_property("active", _active?"yes":"no");
1804 boost::to_string (_phase_invert, p);
1805 node->add_property("phase-invert", p);
1806 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1807 node->add_property("meter-point", enum_2_string (_meter_point));
1810 node->add_property("route-group", _route_group->name());
1813 string order_string;
1814 OrderKeys::iterator x = order_keys.begin();
1816 while (x != order_keys.end()) {
1817 order_string += string ((*x).first);
1818 order_string += '=';
1819 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1820 order_string += buf;
1824 if (x == order_keys.end()) {
1828 order_string += ':';
1830 node->add_property ("order-keys", order_string);
1831 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1832 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1833 node->add_property ("soloed-by-upstream", buf);
1834 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1835 node->add_property ("soloed-by-downstream", buf);
1836 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1837 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1839 node->add_child_nocopy (_input->state (full_state));
1840 node->add_child_nocopy (_output->state (full_state));
1841 node->add_child_nocopy (_solo_control->get_state ());
1842 node->add_child_nocopy (_mute_control->get_state ());
1843 node->add_child_nocopy (_mute_master->get_state ());
1845 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1846 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1847 remote_control_node->add_property (X_("id"), buf);
1848 node->add_child_nocopy (*remote_control_node);
1850 if (_comment.length()) {
1851 XMLNode *cmt = node->add_child ("Comment");
1852 cmt->add_content (_comment);
1855 for (i = _processors.begin(); i != _processors.end(); ++i) {
1856 node->add_child_nocopy((*i)->state (full_state));
1860 node->add_child_copy (*_extra_xml);
1867 Route::set_state (const XMLNode& node, int version)
1869 return _set_state (node, version, true);
1873 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1875 if (version < 3000) {
1876 return _set_state_2X (node, version);
1880 XMLNodeConstIterator niter;
1882 const XMLProperty *prop;
1884 if (node.name() != "Route"){
1885 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1889 if ((prop = node.property (X_("name"))) != 0) {
1890 Route::set_name (prop->value());
1893 if ((prop = node.property ("id")) != 0) {
1894 _id = prop->value ();
1897 if ((prop = node.property (X_("flags"))) != 0) {
1898 _flags = Flag (string_2_enum (prop->value(), _flags));
1903 if (is_master() || is_monitor() || is_hidden()) {
1904 _mute_master->set_solo_ignore (true);
1907 /* add all processors (except amp, which is always present) */
1909 nlist = node.children();
1910 XMLNode processor_state (X_("processor_state"));
1912 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1916 if (child->name() == IO::state_node_name) {
1917 if ((prop = child->property (X_("direction"))) == 0) {
1921 if (prop->value() == "Input") {
1922 _input->set_state (*child, version);
1923 } else if (prop->value() == "Output") {
1924 _output->set_state (*child, version);
1928 if (child->name() == X_("Processor")) {
1929 processor_state.add_child_copy (*child);
1933 set_processor_state (processor_state);
1935 if ((prop = node.property ("self-solo")) != 0) {
1936 set_self_solo (string_is_affirmative (prop->value()));
1939 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1940 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1941 mod_solo_by_others_upstream (atoi (prop->value()));
1944 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1945 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1946 mod_solo_by_others_downstream (atoi (prop->value()));
1949 if ((prop = node.property ("solo-isolated")) != 0) {
1950 set_solo_isolated (string_is_affirmative (prop->value()), this);
1953 if ((prop = node.property ("solo-safe")) != 0) {
1954 set_solo_safe (string_is_affirmative (prop->value()), this);
1957 if ((prop = node.property (X_("phase-invert"))) != 0) {
1958 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
1961 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1962 set_denormal_protection (string_is_affirmative (prop->value()));
1965 if ((prop = node.property (X_("active"))) != 0) {
1966 bool yn = string_is_affirmative (prop->value());
1967 _active = !yn; // force switch
1968 set_active (yn, this);
1971 if ((prop = node.property (X_("meter-point"))) != 0) {
1972 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1973 set_meter_point (mp, true);
1975 _meter->set_display_to_user (_meter_point == MeterCustom);
1979 if ((prop = node.property (X_("order-keys"))) != 0) {
1983 string::size_type colon, equal;
1984 string remaining = prop->value();
1986 while (remaining.length()) {
1988 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1989 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1992 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
1993 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1996 set_order_key (remaining.substr (0, equal), n);
2000 colon = remaining.find_first_of (':');
2002 if (colon != string::npos) {
2003 remaining = remaining.substr (colon+1);
2010 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2013 if (child->name() == X_("Comment")) {
2015 /* XXX this is a terrible API design in libxml++ */
2017 XMLNode *cmt = *(child->children().begin());
2018 _comment = cmt->content();
2020 } else if (child->name() == X_("Extra")) {
2022 _extra_xml = new XMLNode (*child);
2024 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2025 if (prop->value() == "solo") {
2026 _solo_control->set_state (*child, version);
2029 } else if (child->name() == X_("RemoteControl")) {
2030 if ((prop = child->property (X_("id"))) != 0) {
2032 sscanf (prop->value().c_str(), "%d", &x);
2033 set_remote_control_id (x);
2036 } else if (child->name() == X_("MuteMaster")) {
2037 _mute_master->set_state (*child, version);
2045 Route::_set_state_2X (const XMLNode& node, int version)
2048 XMLNodeConstIterator niter;
2050 const XMLProperty *prop;
2052 /* 2X things which still remain to be handled:
2058 if (node.name() != "Route") {
2059 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2063 if ((prop = node.property (X_("flags"))) != 0) {
2064 _flags = Flag (string_2_enum (prop->value(), _flags));
2069 if ((prop = node.property (X_("phase-invert"))) != 0) {
2070 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2071 if (string_is_affirmative (prop->value ())) {
2074 set_phase_invert (p);
2077 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2078 set_denormal_protection (string_is_affirmative (prop->value()));
2081 if ((prop = node.property (X_("soloed"))) != 0) {
2082 bool yn = string_is_affirmative (prop->value());
2084 /* XXX force reset of solo status */
2086 set_solo (yn, this);
2089 if ((prop = node.property (X_("muted"))) != 0) {
2092 bool muted = string_is_affirmative (prop->value());
2098 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2100 if (string_is_affirmative (prop->value())){
2101 mute_point = mute_point + "PreFader";
2106 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2108 if (string_is_affirmative (prop->value())){
2111 mute_point = mute_point + ",";
2114 mute_point = mute_point + "PostFader";
2119 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2121 if (string_is_affirmative (prop->value())){
2124 mute_point = mute_point + ",";
2127 mute_point = mute_point + "Listen";
2132 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2134 if (string_is_affirmative (prop->value())){
2137 mute_point = mute_point + ",";
2140 mute_point = mute_point + "Main";
2144 _mute_master->set_mute_points (mute_point);
2148 if ((prop = node.property (X_("meter-point"))) != 0) {
2149 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2152 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2153 don't mean the same thing.
2156 if ((prop = node.property (X_("order-keys"))) != 0) {
2160 string::size_type colon, equal;
2161 string remaining = prop->value();
2163 while (remaining.length()) {
2165 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2166 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2169 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2170 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2173 set_order_key (remaining.substr (0, equal), n);
2177 colon = remaining.find_first_of (':');
2179 if (colon != string::npos) {
2180 remaining = remaining.substr (colon+1);
2189 nlist = node.children ();
2190 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2194 if (child->name() == IO::state_node_name) {
2196 /* there is a note in IO::set_state_2X() about why we have to call
2200 _input->set_state_2X (*child, version, true);
2201 _output->set_state_2X (*child, version, false);
2203 if ((prop = child->property (X_("name"))) != 0) {
2204 Route::set_name (prop->value ());
2207 if ((prop = child->property (X_("id"))) != 0) {
2208 _id = prop->value ();
2211 if ((prop = child->property (X_("active"))) != 0) {
2212 bool yn = string_is_affirmative (prop->value());
2213 _active = !yn; // force switch
2214 set_active (yn, this);
2217 if ((prop = child->property (X_("gain"))) != 0) {
2220 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2221 _amp->gain_control()->set_value (val);
2225 /* Set up Panners in the IO */
2226 XMLNodeList io_nlist = child->children ();
2228 XMLNodeConstIterator io_niter;
2231 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2233 io_child = *io_niter;
2235 if (io_child->name() == X_("Panner")) {
2236 _main_outs->panner()->set_state(*io_child, version);
2237 } else if (io_child->name() == X_("Automation")) {
2238 /* IO's automation is for the fader */
2239 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2245 XMLNodeList redirect_nodes;
2247 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2251 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2252 redirect_nodes.push_back(child);
2257 set_processor_state_2X (redirect_nodes, version);
2259 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2262 if (child->name() == X_("Comment")) {
2264 /* XXX this is a terrible API design in libxml++ */
2266 XMLNode *cmt = *(child->children().begin());
2267 _comment = cmt->content();
2269 } else if (child->name() == X_("extra")) {
2271 _extra_xml = new XMLNode (*child);
2273 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2274 if (prop->value() == X_("solo")) {
2275 _solo_control->set_state (*child, version);
2276 } else if (prop->value() == X_("mute")) {
2277 _mute_control->set_state (*child, version);
2280 } else if (child->name() == X_("RemoteControl")) {
2281 if ((prop = child->property (X_("id"))) != 0) {
2283 sscanf (prop->value().c_str(), "%d", &x);
2284 set_remote_control_id (x);
2294 Route::get_processor_state ()
2296 XMLNode* root = new XMLNode (X_("redirects"));
2297 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2298 root->add_child_nocopy ((*i)->state (true));
2305 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2307 /* We don't bother removing existing processors not in nList, as this
2308 method will only be called when creating a Route from scratch, not
2309 for undo purposes. Just put processors in at the appropriate place
2313 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2314 add_processor_from_xml_2X (**i, version);
2319 Route::set_processor_state (const XMLNode& node)
2321 const XMLNodeList &nlist = node.children();
2322 XMLNodeConstIterator niter;
2323 ProcessorList new_order;
2324 bool must_configure = false;
2326 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2328 XMLProperty* prop = (*niter)->property ("type");
2330 if (prop->value() == "amp") {
2331 _amp->set_state (**niter, Stateful::current_state_version);
2332 new_order.push_back (_amp);
2333 } else if (prop->value() == "meter") {
2334 _meter->set_state (**niter, Stateful::current_state_version);
2335 new_order.push_back (_meter);
2336 } else if (prop->value() == "main-outs") {
2337 _main_outs->set_state (**niter, Stateful::current_state_version);
2338 new_order.push_back (_main_outs);
2339 } else if (prop->value() == "intreturn") {
2341 _intreturn.reset (new InternalReturn (_session));
2342 must_configure = true;
2344 _intreturn->set_state (**niter, Stateful::current_state_version);
2345 new_order.push_back (_intreturn);
2346 } else if (is_monitor() && prop->value() == "monitor") {
2347 if (!_monitor_control) {
2348 _monitor_control.reset (new MonitorProcessor (_session));
2349 must_configure = true;
2351 _monitor_control->set_state (**niter, Stateful::current_state_version);
2352 new_order.push_back (_monitor_control);
2354 ProcessorList::iterator o;
2356 for (o = _processors.begin(); o != _processors.end(); ++o) {
2357 XMLProperty* id_prop = (*niter)->property(X_("id"));
2358 if (id_prop && (*o)->id() == id_prop->value()) {
2359 (*o)->set_state (**niter, Stateful::current_state_version);
2360 new_order.push_back (*o);
2365 // If the processor (*niter) is not on the route then create it
2367 if (o == _processors.end()) {
2369 boost::shared_ptr<Processor> processor;
2371 if (prop->value() == "intsend") {
2373 processor.reset (new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2375 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2376 prop->value() == "lv2" ||
2377 prop->value() == "vst" ||
2378 prop->value() == "audiounit") {
2380 processor.reset (new PluginInsert(_session));
2382 } else if (prop->value() == "port") {
2384 processor.reset (new PortInsert (_session, _mute_master));
2386 } else if (prop->value() == "send") {
2388 processor.reset (new Send (_session, _mute_master));
2391 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2395 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2396 /* This processor could not be configured. Turn it into a UnknownProcessor */
2397 processor.reset (new UnknownProcessor (_session, **niter));
2400 new_order.push_back (processor);
2401 must_configure = true;
2407 Glib::RWLock::WriterLock lm (_processor_lock);
2408 _processors = new_order;
2409 if (must_configure) {
2410 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2411 configure_processors_unlocked (0);
2415 processors_changed (RouteProcessorChange ());
2416 set_processor_positions ();
2420 Route::curve_reallocate ()
2422 // _gain_automation_curve.finish_resize ();
2423 // _pan_automation_curve.finish_resize ();
2427 Route::silence (framecnt_t nframes)
2429 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2434 silence_unlocked (nframes);
2438 Route::silence_unlocked (framecnt_t nframes)
2440 /* Must be called with the processor lock held */
2444 _output->silence (nframes);
2446 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2447 boost::shared_ptr<PluginInsert> pi;
2449 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2450 // skip plugins, they don't need anything when we're not active
2454 (*i)->silence (nframes);
2457 if (nframes == _session.get_block_size()) {
2464 Route::add_internal_return ()
2467 _intreturn.reset (new InternalReturn (_session));
2468 add_processor (_intreturn, PreFader);
2473 Route::get_return_buffer () const
2475 Glib::RWLock::ReaderLock rm (_processor_lock);
2477 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2478 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2481 BufferSet* bs = d->get_buffers ();
2490 Route::release_return_buffer () const
2492 Glib::RWLock::ReaderLock rm (_processor_lock);
2494 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2495 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2498 return d->release_buffers ();
2504 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
2506 vector<string> ports;
2507 vector<string>::const_iterator i;
2510 Glib::RWLock::ReaderLock rm (_processor_lock);
2512 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2514 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2516 if (d && d->target_route() == route) {
2518 /* if the target is the control outs, then make sure
2519 we take note of which i-send is doing that.
2522 if (route == _session.monitor_out()) {
2523 _monitor_send = boost::dynamic_pointer_cast<Delivery>(d);
2526 /* already listening via the specified IO: do nothing */
2533 boost::shared_ptr<InternalSend> listener;
2539 if (route == _session.monitor_out()) {
2540 /* master never sends to control outs */
2543 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2547 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2550 } catch (failed_constructor& err) {
2554 if (route == _session.monitor_out()) {
2555 _monitor_send = listener;
2561 add_processor (listener, placement);
2565 if (placement == PostFader) {
2566 /* put it *really* at the end, not just after the panner (main outs)
2568 add_processor (listener, _processors.end());
2570 add_processor (listener, PreFader);
2579 Route::drop_listen (boost::shared_ptr<Route> route)
2581 ProcessorStreams err;
2582 ProcessorList::iterator tmp;
2584 Glib::RWLock::ReaderLock rl(_processor_lock);
2588 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2590 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2592 if (d && d->target_route() == route) {
2594 remove_processor (*x, &err);
2597 /* list could have been demolished while we dropped the lock
2607 if (route == _session.monitor_out()) {
2608 _monitor_send.reset ();
2613 Route::set_comment (string cmt, void *src)
2616 comment_changed (src);
2617 _session.set_dirty ();
2621 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2623 FeedRecord fr (other, via_sends_only);
2625 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2627 if (!result.second) {
2629 /* already a record for "other" - make sure sends-only information is correct */
2630 if (!via_sends_only && result.first->sends_only) {
2631 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2632 frp->sends_only = false;
2636 return result.second;
2640 Route::clear_fed_by ()
2646 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2648 const FedBy& fed_by (other->fed_by());
2650 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2651 boost::shared_ptr<Route> sr = f->r.lock();
2653 if (sr && (sr.get() == this)) {
2655 if (via_sends_only) {
2656 *via_sends_only = f->sends_only;
2667 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2669 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2671 if (_output->connected_to (other->input())) {
2672 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2681 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2683 boost::shared_ptr<IOProcessor> iop;
2685 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2686 if (iop->feeds (other)) {
2687 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2693 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2696 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2701 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2705 /** Called from the (non-realtime) butler thread when the transport is stopped */
2707 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2709 framepos_t now = _session.transport_frame();
2712 Glib::RWLock::ReaderLock lm (_processor_lock);
2715 automation_snapshot (now, true);
2718 Automatable::transport_stopped (now);
2720 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2722 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2726 (*i)->transport_stopped (now);
2730 _roll_delay = _initial_delay;
2733 /** Called with the process lock held if change contains ConfigurationChanged */
2735 Route::input_change_handler (IOChange change, void * /*src*/)
2737 if ((change.type & IOChange::ConfigurationChanged)) {
2738 configure_processors (0);
2739 _phase_invert.resize (_input->n_ports().n_audio ());
2740 io_changed (); /* EMIT SIGNAL */
2744 /** Called with the process lock held if change contains ConfigurationChanged */
2746 Route::output_change_handler (IOChange change, void * /*src*/)
2748 if ((change.type & IOChange::ConfigurationChanged)) {
2750 /* XXX resize all listeners to match _main_outs? */
2752 /* Auto-connect newly-created outputs, unless we're auto-connecting to master
2753 and we are master (as an auto-connect in this situation would cause a
2756 AutoConnectOption ac = Config->get_output_auto_connect ();
2757 if (ac == AutoConnectPhysical || (ac == AutoConnectMaster && !is_master ())) {
2759 ChanCount start = change.before;
2761 for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
2762 if (change.before.get(*i) < change.after.get(*i)) {
2763 /* the existing ChanCounts don't matter for this call as they are only
2764 to do with matching input and output indices, and we are only changing
2769 /* only auto-connect the newly-created outputs, not the ones that were
2772 start.set (*i, start.get (*i) + 1);
2774 _session.auto_connect_route (this, dummy, dummy, false, ChanCount(), change.before);
2779 // configure_processors (0);
2784 Route::pans_required () const
2786 if (n_outputs().n_audio() < 2) {
2790 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2794 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
2795 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2797 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2802 if (n_outputs().n_total() == 0) {
2806 if (!_active || n_inputs() == ChanCount::ZERO) {
2807 silence_unlocked (nframes);
2810 if (session_state_changing) {
2811 if (_session.transport_speed() != 0.0f) {
2812 /* we're rolling but some state is changing (e.g. our diskstream contents)
2813 so we cannot use them. Be silent till this is over.
2815 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2817 silence_unlocked (nframes);
2820 /* we're really not rolling, so we're either delivery silence or actually
2821 monitoring, both of which are safe to do while session_state_changing is true.
2825 _amp->apply_gain_automation (false);
2826 passthru (start_frame, end_frame, nframes, 0);
2832 Route::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
2834 if (_roll_delay > nframes) {
2836 _roll_delay -= nframes;
2837 silence_unlocked (nframes);
2838 /* transport frame is not legal for caller to use */
2841 } else if (_roll_delay > 0) {
2843 nframes -= _roll_delay;
2844 silence_unlocked (_roll_delay);
2845 /* we've written _roll_delay of samples into the
2846 output ports, so make a note of that for
2849 _main_outs->increment_output_offset (_roll_delay);
2850 transport_frame += _roll_delay;
2859 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick,
2860 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2862 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2867 automation_snapshot (_session.transport_frame(), false);
2869 if (n_outputs().n_total() == 0) {
2873 if (!_active || n_inputs().n_total() == 0) {
2874 silence_unlocked (nframes);
2878 framecnt_t unused = 0;
2880 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2886 passthru (start_frame, end_frame, nframes, declick);
2892 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
2893 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2900 Route::toggle_monitor_input ()
2902 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2903 i->ensure_monitor_input( ! i->monitoring_input());
2908 Route::has_external_redirects () const
2910 // FIXME: what about sends? - they don't return a signal back to ardour?
2912 boost::shared_ptr<const PortInsert> pi;
2914 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2916 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2918 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2920 string port_name = port->name();
2921 string client_name = port_name.substr (0, port_name.find(':'));
2923 /* only say "yes" if the redirect is actually in use */
2925 if (client_name != "ardour" && pi->active()) {
2936 Route::flush_processors ()
2938 /* XXX shouldn't really try to take this lock, since
2939 this is called from the RT audio thread.
2942 Glib::RWLock::ReaderLock lm (_processor_lock);
2944 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2950 Route::set_meter_point (MeterPoint p, bool force)
2952 /* CAN BE CALLED FROM PROCESS CONTEXT */
2954 if (_meter_point == p && !force) {
2958 bool meter_was_visible_to_user = _meter->display_to_user ();
2961 Glib::RWLock::WriterLock lm (_processor_lock);
2963 if (p != MeterCustom) {
2964 // Move meter in the processors list to reflect the new position
2965 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2966 _processors.erase(loc);
2969 loc = _processors.begin();
2972 loc = find (_processors.begin(), _processors.end(), _amp);
2974 case MeterPostFader:
2975 loc = _processors.end();
2983 if (loc == _processors.begin()) {
2984 m_in = _input->n_ports();
2986 ProcessorList::iterator before = loc;
2988 m_in = (*before)->output_streams ();
2991 _meter->reflect_inputs (m_in);
2993 _processors.insert (loc, _meter);
2995 /* we do not need to reconfigure the processors, because the meter
2996 (a) is always ready to handle processor_max_streams
2997 (b) is always an N-in/N-out processor, and thus moving
2998 it doesn't require any changes to the other processors.
3001 _meter->set_display_to_user (false);
3005 // just make it visible and let the user move it
3007 _meter->set_display_to_user (true);
3012 meter_change (); /* EMIT SIGNAL */
3014 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3016 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3020 Route::put_monitor_send_at (Placement p)
3022 if (!_monitor_send) {
3027 Glib::RWLock::WriterLock lm (_processor_lock);
3028 ProcessorList as_it_was (_processors);
3029 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _monitor_send);
3030 _processors.erase(loc);
3034 loc = find(_processors.begin(), _processors.end(), _amp);
3035 if (loc != _processors.begin()) {
3040 loc = _processors.end();
3044 _processors.insert (loc, _monitor_send);
3047 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3049 if (configure_processors_unlocked (0)) {
3050 _processors = as_it_was;
3051 configure_processors_unlocked (0); // it worked before we tried to add it ...
3057 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3058 _session.set_dirty ();
3061 boost::shared_ptr<CapturingProcessor>
3062 Route::add_export_point()
3064 // Check if it exists already
3065 boost::shared_ptr<CapturingProcessor> processor;
3066 if ((processor = boost::dynamic_pointer_cast<CapturingProcessor> (*_processors.begin()))) {
3071 processor.reset (new CapturingProcessor (_session));
3072 add_processor (processor, _processors.begin());
3077 Route::update_total_latency ()
3079 framecnt_t old = _output->effective_latency();
3080 framecnt_t own_latency = _output->user_latency();
3082 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3083 if ((*i)->active ()) {
3084 own_latency += (*i)->signal_latency ();
3088 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
3090 _output->set_port_latency (own_latency);
3092 if (_output->user_latency() == 0) {
3094 /* this (virtual) function is used for pure Routes,
3095 not derived classes like AudioTrack. this means
3096 that the data processed here comes from an input
3097 port, not prerecorded material, and therefore we
3098 have to take into account any input latency.
3101 own_latency += _input->signal_latency ();
3104 if (old != own_latency) {
3105 _output->set_latency_delay (own_latency);
3106 signal_latency_changed (); /* EMIT SIGNAL */
3109 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
3111 return _output->effective_latency ();
3115 Route::set_user_latency (framecnt_t nframes)
3117 _output->set_user_latency (nframes);
3118 _session.update_latency_compensation (false, false);
3122 Route::set_latency_delay (framecnt_t longest_session_latency)
3124 framecnt_t old = _initial_delay;
3126 if (_output->effective_latency() < longest_session_latency) {
3127 _initial_delay = longest_session_latency - _output->effective_latency();
3132 if (_initial_delay != old) {
3133 initial_delay_changed (); /* EMIT SIGNAL */
3136 if (_session.transport_stopped()) {
3137 _roll_delay = _initial_delay;
3142 Route::automation_snapshot (framepos_t now, bool force)
3144 panner()->automation_snapshot (now, force);
3146 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3147 (*i)->automation_snapshot (now, force);
3151 Route::SoloControllable::SoloControllable (std::string name, Route& r)
3152 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
3153 boost::shared_ptr<AutomationList>(), name)
3156 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3161 Route::SoloControllable::set_value (double val)
3163 bool bval = ((val >= 0.5f) ? true: false);
3165 this is how it should be done
3167 boost::shared_ptr<RouteList> rl (new RouteList);
3168 rl->push_back (route);
3170 if (Config->get_solo_control_is_listen_control()) {
3171 _session.set_listen (rl, bval);
3173 _session.set_solo (rl, bval);
3176 route.set_solo (bval, this);
3181 Route::SoloControllable::get_value (void) const
3183 if (Config->get_solo_control_is_listen_control()) {
3184 return route.listening() ? 1.0f : 0.0f;
3186 return route.self_soloed() ? 1.0f : 0.0f;
3190 Route::MuteControllable::MuteControllable (std::string name, Route& r)
3191 : AutomationControl (r.session(), Evoral::Parameter (MuteAutomation),
3192 boost::shared_ptr<AutomationList>(), name)
3195 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3200 Route::MuteControllable::set_value (double val)
3202 bool bval = ((val >= 0.5f) ? true: false);
3204 this is how it should be done
3206 boost::shared_ptr<RouteList> rl (new RouteList);
3207 rl->push_back (route);
3208 _session.set_mute (rl, bval);
3210 route.set_mute (bval, this);
3215 Route::MuteControllable::get_value (void) const
3217 return route.muted() ? 1.0f : 0.0f;
3221 Route::set_block_size (pframes_t nframes)
3223 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3224 (*i)->set_block_size (nframes);
3227 _session.ensure_buffers (n_process_buffers ());
3231 Route::protect_automation ()
3233 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3234 (*i)->protect_automation();
3238 Route::set_pending_declick (int declick)
3241 /* this call is not allowed to turn off a pending declick unless "force" is true */
3243 _pending_declick = declick;
3245 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3247 _pending_declick = 0;
3252 /** Shift automation forwards from a particular place, thereby inserting time.
3253 * Adds undo commands for any shifts that are performed.
3255 * @param pos Position to start shifting from.
3256 * @param frames Amount to shift forwards by.
3260 Route::shift (framepos_t pos, framecnt_t frames)
3262 /* gain automation */
3264 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3266 XMLNode &before = gc->alist()->get_state ();
3267 gc->alist()->shift (pos, frames);
3268 XMLNode &after = gc->alist()->get_state ();
3269 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3272 /* pan automation */
3274 boost::shared_ptr<AutomationControl> pc;
3275 uint32_t npans = _main_outs->panner()->npanners();
3277 for (uint32_t p = 0; p < npans; ++p) {
3278 pc = _main_outs->panner()->pan_control (0, p);
3280 boost::shared_ptr<AutomationList> al = pc->alist();
3281 XMLNode& before = al->get_state ();
3282 al->shift (pos, frames);
3283 XMLNode& after = al->get_state ();
3284 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3289 /* redirect automation */
3291 Glib::RWLock::ReaderLock lm (_processor_lock);
3292 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3294 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3296 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3297 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3299 boost::shared_ptr<AutomationList> al = ac->alist();
3300 XMLNode &before = al->get_state ();
3301 al->shift (pos, frames);
3302 XMLNode &after = al->get_state ();
3303 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3312 Route::save_as_template (const string& path, const string& name)
3314 XMLNode& node (state (false));
3317 IO::set_name_in_state (*node.children().front(), name);
3319 tree.set_root (&node);
3320 return tree.write (path.c_str());
3325 Route::set_name (const string& str)
3331 name = Route::ensure_track_or_route_name (str, _session);
3332 SessionObject::set_name (name);
3334 ret = (_input->set_name(name) && _output->set_name(name));
3338 Glib::RWLock::ReaderLock lm (_processor_lock);
3340 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3342 /* rename all I/O processors that have inputs or outputs */
3344 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3346 if (iop && (iop->output() || iop->input())) {
3347 if (!iop->set_name (name)) {
3358 boost::shared_ptr<Send>
3359 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3361 Glib::RWLock::ReaderLock lm (_processor_lock);
3363 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3364 boost::shared_ptr<InternalSend> send;
3366 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3367 if (send->target_route() == target) {
3373 return boost::shared_ptr<Send>();
3376 /** @param c Audio channel index.
3377 * @param yn true to invert phase, otherwise false.
3380 Route::set_phase_invert (uint32_t c, bool yn)
3382 if (_phase_invert[c] != yn) {
3383 _phase_invert[c] = yn;
3384 phase_invert_changed (); /* EMIT SIGNAL */
3385 _session.set_dirty ();
3390 Route::set_phase_invert (boost::dynamic_bitset<> p)
3392 if (_phase_invert != p) {
3394 phase_invert_changed (); /* EMIT SIGNAL */
3395 _session.set_dirty ();
3400 Route::phase_invert (uint32_t c) const
3402 return _phase_invert[c];
3405 boost::dynamic_bitset<>
3406 Route::phase_invert () const
3408 return _phase_invert;
3412 Route::set_denormal_protection (bool yn)
3414 if (_denormal_protection != yn) {
3415 _denormal_protection = yn;
3416 denormal_protection_changed (); /* EMIT SIGNAL */
3421 Route::denormal_protection () const
3423 return _denormal_protection;
3427 Route::set_active (bool yn, void* src)
3429 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3430 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3434 if (_active != yn) {
3436 _input->set_active (yn);
3437 _output->set_active (yn);
3438 active_changed (); // EMIT SIGNAL
3445 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3451 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3453 boost::shared_ptr<Send> s;
3454 boost::shared_ptr<Return> r;
3456 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3457 s->meter()->meter();
3458 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3459 r->meter()->meter ();
3464 boost::shared_ptr<Panner>
3465 Route::panner() const
3467 return _main_outs->panner();
3470 boost::shared_ptr<AutomationControl>
3471 Route::gain_control() const
3473 return _amp->gain_control();
3476 boost::shared_ptr<AutomationControl>
3477 Route::get_control (const Evoral::Parameter& param)
3479 /* either we own the control or .... */
3481 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3485 /* maybe one of our processors does or ... */
3487 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3488 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3489 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3497 /* nobody does so we'll make a new one */
3499 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3506 boost::shared_ptr<Processor>
3507 Route::nth_plugin (uint32_t n)
3509 Glib::RWLock::ReaderLock lm (_processor_lock);
3510 ProcessorList::iterator i;
3512 for (i = _processors.begin(); i != _processors.end(); ++i) {
3513 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3520 return boost::shared_ptr<Processor> ();
3523 boost::shared_ptr<Processor>
3524 Route::nth_send (uint32_t n)
3526 Glib::RWLock::ReaderLock lm (_processor_lock);
3527 ProcessorList::iterator i;
3529 for (i = _processors.begin(); i != _processors.end(); ++i) {
3530 if (boost::dynamic_pointer_cast<Send> (*i)) {
3537 return boost::shared_ptr<Processor> ();
3541 Route::has_io_processor_named (const string& name)
3543 Glib::RWLock::ReaderLock lm (_processor_lock);
3544 ProcessorList::iterator i;
3546 for (i = _processors.begin(); i != _processors.end(); ++i) {
3547 if (boost::dynamic_pointer_cast<Send> (*i) ||
3548 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3549 if ((*i)->name() == name) {
3558 MuteMaster::MutePoint
3559 Route::mute_points () const
3561 return _mute_master->mute_points ();
3565 Route::set_processor_positions ()
3567 Glib::RWLock::ReaderLock lm (_processor_lock);
3569 bool had_amp = false;
3570 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3571 (*i)->set_pre_fader (!had_amp);
3572 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3578 /** Called when there is a proposed change to the input port count */
3580 Route::input_port_count_changing (ChanCount to)
3582 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3584 /* The processors cannot be configured with the new input arrangement, so
3590 /* The change is ok */
3595 Route::unknown_processors () const
3599 Glib::RWLock::ReaderLock lm (_processor_lock);
3600 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3601 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3602 p.push_back ((*i)->name ());