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.
21 #include "libardour-config.h"
29 #include "pbd/xml++.h"
30 #include "pbd/enumwriter.h"
31 #include "pbd/memento_command.h"
32 #include "pbd/stacktrace.h"
33 #include "pbd/convert.h"
34 #include "pbd/boost_debug.h"
36 #include "evoral/Curve.hpp"
38 #include "ardour/amp.h"
39 #include "ardour/audio_port.h"
40 #include "ardour/audioengine.h"
41 #include "ardour/buffer.h"
42 #include "ardour/buffer_set.h"
43 #include "ardour/configuration.h"
44 #include "ardour/cycle_timer.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/dB.h"
48 #include "ardour/internal_send.h"
49 #include "ardour/internal_return.h"
50 #include "ardour/ladspa_plugin.h"
51 #include "ardour/meter.h"
52 #include "ardour/mix.h"
53 #include "ardour/monitor_processor.h"
54 #include "ardour/pannable.h"
55 #include "ardour/panner.h"
56 #include "ardour/panner_shell.h"
57 #include "ardour/plugin_insert.h"
58 #include "ardour/port.h"
59 #include "ardour/port_insert.h"
60 #include "ardour/processor.h"
61 #include "ardour/profile.h"
62 #include "ardour/route.h"
63 #include "ardour/route_group.h"
64 #include "ardour/send.h"
65 #include "ardour/session.h"
66 #include "ardour/timestamps.h"
67 #include "ardour/utils.h"
68 #include "ardour/graph.h"
69 #include "ardour/unknown_processor.h"
70 #include "ardour/capturing_processor.h"
75 using namespace ARDOUR;
78 uint32_t Route::order_key_cnt = 0;
79 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
80 PBD::Signal0<void> Route::RemoteControlIDChange;
82 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
83 : SessionObject (sess, name)
85 , GraphNode( sess.route_graph )
90 , _pending_declick (true)
91 , _meter_point (MeterPostFader)
93 , _soloed_by_others_upstream (0)
94 , _soloed_by_others_downstream (0)
96 , _denormal_protection (false)
99 , _declickable (false)
100 , _mute_master (new MuteMaster (sess, name))
101 , _have_internal_generator (false)
103 , _default_type (default_type)
104 , _remote_control_id (0)
105 , _in_configure_processors (false)
107 processor_max_streams.reset();
108 order_keys[N_("signal")] = order_key_cnt++;
114 /* add standard controls */
116 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
117 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
119 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
120 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
122 add_control (_solo_control);
123 add_control (_mute_control);
127 Pannable* p = new Pannable (_session);
128 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
129 boost_debug_shared_ptr_mark_interesting (p, "Pannable");
133 /* input and output objects */
135 _input.reset (new IO (_session, _name, IO::Input, _default_type));
136 _output.reset (new IO (_session, _name, IO::Output, _default_type));
138 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
139 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
141 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
143 /* add amp processor */
145 _amp.reset (new Amp (_session));
146 add_processor (_amp, PostFader);
148 /* create standard processors: meter, main outs, monitor out;
149 they will be added to _processors by setup_invisible_processors ()
152 _meter.reset (new PeakMeter (_session));
153 _meter->set_display_to_user (false);
156 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
157 _main_outs->activate ();
160 /* where we listen to tracks */
161 _intreturn.reset (new InternalReturn (_session));
162 _intreturn->activate ();
164 /* the thing that provides proper control over a control/monitor/listen bus
165 (such as per-channel cut, dim, solo, invert, etc).
167 _monitor_control.reset (new MonitorProcessor (_session));
168 _monitor_control->activate ();
170 /* no panning on the monitor main outs */
173 _main_outs->panner()->set_bypassed (true);
177 if (is_master() || is_monitor() || is_hidden()) {
178 _mute_master->set_solo_ignore (true);
181 /* now that we have _meter, its safe to connect to this */
183 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
186 /* run a configure so that the invisible processors get set up */
187 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
188 configure_processors (0);
196 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
198 /* do this early so that we don't get incoming signals as we are going through destruction
203 /* don't use clear_processors here, as it depends on the session which may
204 be half-destroyed by now
207 Glib::RWLock::WriterLock lm (_processor_lock);
208 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
209 (*i)->drop_references ();
212 _processors.clear ();
216 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
218 if (id != _remote_control_id) {
219 _remote_control_id = id;
220 RemoteControlIDChanged ();
221 if (notify_class_listeners) {
222 RemoteControlIDChange ();
228 Route::remote_control_id() const
230 return _remote_control_id;
234 Route::order_key (std::string const & name) const
236 OrderKeys::const_iterator i = order_keys.find (name);
237 if (i == order_keys.end()) {
245 Route::set_order_key (std::string const & name, int32_t n)
247 bool changed = false;
249 /* This method looks more complicated than it should, but
250 it's important that we don't emit order_key_changed unless
251 it actually has, as expensive things happen on receipt of that
255 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
256 order_keys[name] = n;
260 if (Config->get_sync_all_route_ordering()) {
261 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
262 if (x->second != n) {
270 order_key_changed (); /* EMIT SIGNAL */
271 _session.set_dirty ();
275 /** Set all order keys to be the same as that for `base', if such a key
276 * exists in this route.
277 * @param base Base key.
280 Route::sync_order_keys (std::string const & base)
282 if (order_keys.empty()) {
286 OrderKeys::iterator i;
289 if ((i = order_keys.find (base)) == order_keys.end()) {
290 /* key doesn't exist, use the first existing key (during session initialization) */
291 i = order_keys.begin();
295 /* key exists - use it and reset all others (actually, itself included) */
297 i = order_keys.begin();
300 bool changed = false;
302 for (; i != order_keys.end(); ++i) {
303 if (i->second != key) {
310 order_key_changed (); /* EMIT SIGNAL */
315 Route::ensure_track_or_route_name(string name, Session &session)
317 string newname = name;
319 while (!session.io_name_is_legal (newname)) {
320 newname = bump_name_once (newname, '.');
328 Route::inc_gain (gain_t fraction, void *src)
330 _amp->inc_gain (fraction, src);
334 Route::set_gain (gain_t val, void *src)
336 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
338 if (_route_group->is_relative()) {
340 gain_t usable_gain = _amp->gain();
341 if (usable_gain < 0.000001f) {
342 usable_gain = 0.000001f;
346 if (delta < 0.000001f) {
350 delta -= usable_gain;
355 gain_t factor = delta / usable_gain;
358 factor = _route_group->get_max_factor(factor);
359 if (factor == 0.0f) {
360 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
364 factor = _route_group->get_min_factor(factor);
365 if (factor == 0.0f) {
366 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
371 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
375 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
381 if (val == _amp->gain()) {
385 _amp->set_gain (val, src);
388 /** Process this route for one (sub) cycle (process thread)
390 * @param bufs Scratch buffers to use for the signal path
391 * @param start_frame Initial transport frame
392 * @param end_frame Final transport frame
393 * @param nframes Number of frames to output (to ports)
395 * Note that (end_frame - start_frame) may not be equal to nframes when the
396 * transport speed isn't 1.0 (eg varispeed).
399 Route::process_output_buffers (BufferSet& bufs,
400 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
401 bool /*with_processors*/, int declick,
402 bool gain_automation_ok)
406 bufs.is_silent (false);
408 switch (Config->get_monitoring_model()) {
409 case HardwareMonitoring:
410 case ExternalMonitoring:
411 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
418 declick = _pending_declick;
421 /* figure out if we're going to use gain automation */
422 if (gain_automation_ok) {
423 _amp->setup_gain_automation (start_frame, end_frame, nframes);
425 _amp->apply_gain_automation (false);
428 /* tell main outs what to do about monitoring */
429 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
432 /* -------------------------------------------------------------------------------------------
433 GLOBAL DECLICK (for transport changes etc.)
434 ----------------------------------------------------------------------------------------- */
437 Amp::declick (bufs, nframes, 1);
438 } else if (declick < 0) {
439 Amp::declick (bufs, nframes, -1);
442 _pending_declick = 0;
444 /* -------------------------------------------------------------------------------------------
445 DENORMAL CONTROL/PHASE INVERT
446 ----------------------------------------------------------------------------------------- */
448 if (_phase_invert.any ()) {
452 if (_denormal_protection || Config->get_denormal_protection()) {
454 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
455 Sample* const sp = i->data();
457 if (_phase_invert[chn]) {
458 for (pframes_t nx = 0; nx < nframes; ++nx) {
463 for (pframes_t nx = 0; nx < nframes; ++nx) {
471 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
472 Sample* const sp = i->data();
474 if (_phase_invert[chn]) {
475 for (pframes_t nx = 0; nx < nframes; ++nx) {
484 if (_denormal_protection || Config->get_denormal_protection()) {
486 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
487 Sample* const sp = i->data();
488 for (pframes_t nx = 0; nx < nframes; ++nx) {
496 /* -------------------------------------------------------------------------------------------
498 ----------------------------------------------------------------------------------------- */
500 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
502 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i)) {
507 /* if it has any inputs, make sure they match */
508 if ((*i)->input_streams() != ChanCount::ZERO) {
509 if (bufs.count() != (*i)->input_streams()) {
510 cerr << _name << " bufs = " << bufs.count()
511 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
517 /* should we NOT run plugins here if the route is inactive?
518 do we catch route != active somewhere higher?
521 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
522 bufs.set_count ((*i)->output_streams());
527 Route::n_process_buffers ()
529 return max (_input->n_ports(), processor_max_streams);
533 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
535 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
539 assert (bufs.available() >= input_streams());
541 if (_input->n_ports() == ChanCount::ZERO) {
542 silence_unlocked (nframes);
545 bufs.set_count (input_streams());
547 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
549 /* control/monitor bus ignores input ports when something is
550 feeding the listen "stream". data will "arrive" into the
551 route from the intreturn processor element.
553 bufs.silence (nframes, 0);
557 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
559 BufferSet::iterator o = bufs.begin(*t);
560 PortSet& ports (_input->ports());
562 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
563 o->read_from (i->get_buffer(nframes), nframes);
568 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
569 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick, true);
573 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
575 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
576 bufs.set_count (_input->n_ports());
577 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
578 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick, false);
582 Route::set_listen (bool yn, void* src)
589 if (yn != _monitor_send->active()) {
591 _monitor_send->activate ();
592 _mute_master->set_soloed (true);
594 _monitor_send->deactivate ();
595 _mute_master->set_soloed (false);
598 listen_changed (src); /* EMIT SIGNAL */
604 Route::listening_via_monitor () const
607 return _monitor_send->active ();
614 Route::set_solo_safe (bool yn, void *src)
616 if (_solo_safe != yn) {
618 solo_safe_changed (src);
623 Route::solo_safe() const
629 Route::set_solo (bool yn, void *src)
635 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
636 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
640 if (self_soloed() != yn) {
642 set_mute_master_solo ();
643 solo_changed (true, src); /* EMIT SIGNAL */
644 _solo_control->Changed (); /* EMIT SIGNAL */
649 Route::set_self_solo (bool yn)
655 Route::mod_solo_by_others_upstream (int32_t delta)
661 uint32_t old_sbu = _soloed_by_others_upstream;
664 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
665 _soloed_by_others_upstream += delta;
667 _soloed_by_others_upstream = 0;
670 _soloed_by_others_upstream += delta;
673 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
674 name(), delta, _soloed_by_others_upstream, old_sbu,
675 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
677 /* push the inverse solo change to everything that feeds us.
679 This is important for solo-within-group. When we solo 1 track out of N that
680 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
681 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
682 tracks that feed it. This will silence them if they were audible because
683 of a bus solo, but the newly soloed track will still be audible (because
686 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
690 if ((_self_solo || _soloed_by_others_downstream) &&
691 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
692 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
694 if (delta > 0 || !Config->get_exclusive_solo()) {
695 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
696 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
697 boost::shared_ptr<Route> sr = i->r.lock();
699 sr->mod_solo_by_others_downstream (-delta);
705 set_mute_master_solo ();
706 solo_changed (false, this);
710 Route::mod_solo_by_others_downstream (int32_t delta)
717 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
718 _soloed_by_others_downstream += delta;
720 _soloed_by_others_downstream = 0;
723 _soloed_by_others_downstream += delta;
726 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
728 set_mute_master_solo ();
729 solo_changed (false, this);
733 Route::set_mute_master_solo ()
735 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
739 Route::set_solo_isolated (bool yn, void *src)
741 if (is_master() || is_monitor() || is_hidden()) {
745 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
746 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
750 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
752 boost::shared_ptr<RouteList> routes = _session.get_routes ();
753 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
755 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
760 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
762 if (does_feed && !sends_only) {
763 (*i)->set_solo_isolated (yn, (*i)->route_group());
767 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
769 bool changed = false;
772 if (_solo_isolated == 0) {
773 _mute_master->set_solo_ignore (true);
778 if (_solo_isolated > 0) {
780 if (_solo_isolated == 0) {
781 _mute_master->set_solo_ignore (false);
788 solo_isolated_changed (src);
793 Route::solo_isolated () const
795 return _solo_isolated > 0;
799 Route::set_mute_points (MuteMaster::MutePoint mp)
801 _mute_master->set_mute_points (mp);
802 mute_points_changed (); /* EMIT SIGNAL */
804 if (_mute_master->muted_by_self()) {
805 mute_changed (this); /* EMIT SIGNAL */
806 _mute_control->Changed (); /* EMIT SIGNAL */
811 Route::set_mute (bool yn, void *src)
813 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
814 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
819 _mute_master->set_muted_by_self (yn);
820 mute_changed (src); /* EMIT SIGNAL */
821 _mute_control->Changed (); /* EMIT SIGNAL */
826 Route::muted () const
828 return _mute_master->muted_by_self();
833 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
835 cerr << name << " {" << endl;
836 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
837 p != procs.end(); ++p) {
838 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
845 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
847 ProcessorList::iterator loc;
849 /* XXX this is not thread safe - we don't hold the lock across determining the iter
850 to add before and actually doing the insertion. dammit.
853 if (placement == PreFader) {
854 /* generic pre-fader: insert immediately before the amp */
855 loc = find (_processors.begin(), _processors.end(), _amp);
857 /* generic post-fader: insert right before the main outs */
858 loc = find (_processors.begin(), _processors.end(), _main_outs);
861 return add_processor (processor, loc, err);
865 /** Add a processor to the route.
866 * @param iter an iterator in _processors; the new processor will be inserted immediately before this location.
869 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
871 assert (processor != _meter);
872 assert (processor != _main_outs);
874 ChanCount old_pms = processor_max_streams;
876 if (!_session.engine().connected() || !processor) {
881 Glib::RWLock::WriterLock lm (_processor_lock);
882 ProcessorState pstate (this);
884 boost::shared_ptr<PluginInsert> pi;
885 boost::shared_ptr<PortInsert> porti;
887 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
889 if (processor == _amp) {
890 // Ensure only one amp is in the list at any time
891 if (loc != _processors.end()) {
892 if (iter == loc) { // Already in place, do nothing
894 } else { // New position given, relocate
895 _processors.erase (loc);
900 if (loc != _processors.end()) {
901 cerr << "ERROR: Processor added to route twice!" << endl;
908 _processors.insert (loc, processor);
910 // Set up processor list channels. This will set processor->[input|output]_streams(),
911 // configure redirect ports properly, etc.
914 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
916 if (configure_processors_unlocked (err)) {
918 configure_processors_unlocked (0); // it worked before we tried to add it ...
919 cerr << "configure failed\n";
924 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
926 if (pi->natural_input_streams() == ChanCount::ZERO) {
927 /* generator plugin */
928 _have_internal_generator = true;
933 if (activation_allowed) {
934 processor->activate ();
937 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
939 _output->set_user_latency (0);
942 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
943 set_processor_positions ();
949 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
951 const XMLProperty *prop;
954 boost::shared_ptr<Processor> processor;
956 /* bit of a hack: get the `placement' property from the <Redirect> tag here
957 so that we can add the processor in the right place (pre/post-fader)
960 XMLNodeList const & children = node.children ();
961 XMLNodeList::const_iterator i = children.begin ();
963 while (i != children.end() && (*i)->name() != X_("Redirect")) {
967 Placement placement = PreFader;
969 if (i != children.end()) {
970 if ((prop = (*i)->property (X_("placement"))) != 0) {
971 placement = Placement (string_2_enum (prop->value(), placement));
975 if (node.name() == "Insert") {
977 if ((prop = node.property ("type")) != 0) {
979 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
980 prop->value() == "lv2" ||
981 prop->value() == "vst" ||
982 prop->value() == "audiounit") {
984 processor.reset (new PluginInsert (_session));
988 processor.reset (new PortInsert (_session, _pannable, _mute_master));
993 } else if (node.name() == "Send") {
995 processor.reset (new Send (_session, _pannable, _mute_master));
999 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1003 if (processor->set_state (node, version)) {
1007 return (add_processor (processor, placement) == 0);
1010 catch (failed_constructor &err) {
1011 warning << _("processor could not be created. Ignored.") << endmsg;
1017 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1019 /* NOTE: this is intended to be used ONLY when copying
1020 processors from another Route. Hence the subtle
1021 differences between this and ::add_processor()
1024 ProcessorList::iterator loc;
1027 loc = find(_processors.begin(), _processors.end(), before);
1029 /* nothing specified - at end */
1030 loc = _processors.end ();
1033 ChanCount old_pms = processor_max_streams;
1035 if (!_session.engine().connected()) {
1039 if (others.empty()) {
1044 Glib::RWLock::WriterLock lm (_processor_lock);
1045 ProcessorState pstate (this);
1047 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1053 boost::shared_ptr<PluginInsert> pi;
1055 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1059 ProcessorList::iterator inserted = _processors.insert (loc, *i);
1061 if ((*i)->active()) {
1066 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1067 if (configure_processors_unlocked (err)) {
1069 configure_processors_unlocked (0); // it worked before we tried to add it ...
1074 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1077 _output->set_user_latency (0);
1080 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1081 set_processor_positions ();
1087 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1089 if (p == PreFader) {
1090 start = _processors.begin();
1091 end = find(_processors.begin(), _processors.end(), _amp);
1093 start = find(_processors.begin(), _processors.end(), _amp);
1095 end = _processors.end();
1099 /** Turn off all processors with a given placement
1100 * @param p Placement of processors to disable
1103 Route::disable_processors (Placement p)
1105 Glib::RWLock::ReaderLock lm (_processor_lock);
1107 ProcessorList::iterator start, end;
1108 placement_range(p, start, end);
1110 for (ProcessorList::iterator i = start; i != end; ++i) {
1111 (*i)->deactivate ();
1114 _session.set_dirty ();
1117 /** Turn off all redirects
1120 Route::disable_processors ()
1122 Glib::RWLock::ReaderLock lm (_processor_lock);
1124 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1125 (*i)->deactivate ();
1128 _session.set_dirty ();
1131 /** Turn off all redirects with a given placement
1132 * @param p Placement of redirects to disable
1135 Route::disable_plugins (Placement p)
1137 Glib::RWLock::ReaderLock lm (_processor_lock);
1139 ProcessorList::iterator start, end;
1140 placement_range(p, start, end);
1142 for (ProcessorList::iterator i = start; i != end; ++i) {
1143 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1144 (*i)->deactivate ();
1148 _session.set_dirty ();
1151 /** Turn off all plugins
1154 Route::disable_plugins ()
1156 Glib::RWLock::ReaderLock lm (_processor_lock);
1158 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1159 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1160 (*i)->deactivate ();
1164 _session.set_dirty ();
1169 Route::ab_plugins (bool forward)
1171 Glib::RWLock::ReaderLock lm (_processor_lock);
1175 /* forward = turn off all active redirects, and mark them so that the next time
1176 we go the other way, we will revert them
1179 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1180 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1184 if ((*i)->active()) {
1185 (*i)->deactivate ();
1186 (*i)->set_next_ab_is_active (true);
1188 (*i)->set_next_ab_is_active (false);
1194 /* backward = if the redirect was marked to go active on the next ab, do so */
1196 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1198 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1202 if ((*i)->get_next_ab_is_active()) {
1205 (*i)->deactivate ();
1210 _session.set_dirty ();
1214 /** Remove processors with a given placement.
1215 * @param p Placement of processors to remove.
1218 Route::clear_processors (Placement p)
1220 const ChanCount old_pms = processor_max_streams;
1222 if (!_session.engine().connected()) {
1226 bool already_deleting = _session.deletion_in_progress();
1227 if (!already_deleting) {
1228 _session.set_deletion_in_progress();
1232 Glib::RWLock::WriterLock lm (_processor_lock);
1233 ProcessorList new_list;
1234 ProcessorStreams err;
1235 bool seen_amp = false;
1237 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1243 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1245 /* you can't remove these */
1247 new_list.push_back (*i);
1254 new_list.push_back (*i);
1257 (*i)->drop_references ();
1265 (*i)->drop_references ();
1268 new_list.push_back (*i);
1275 _processors = new_list;
1278 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1279 configure_processors_unlocked (&err); // this can't fail
1283 processor_max_streams.reset();
1284 _have_internal_generator = false;
1285 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1286 set_processor_positions ();
1288 if (!already_deleting) {
1289 _session.clear_deletion_in_progress();
1294 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1296 /* these can never be removed */
1298 if (processor == _amp || processor == _meter || processor == _main_outs) {
1302 ChanCount old_pms = processor_max_streams;
1304 if (!_session.engine().connected()) {
1308 processor_max_streams.reset();
1311 Glib::RWLock::WriterLock lm (_processor_lock);
1312 ProcessorState pstate (this);
1314 ProcessorList::iterator i;
1315 bool removed = false;
1317 for (i = _processors.begin(); i != _processors.end(); ) {
1318 if (*i == processor) {
1320 /* move along, see failure case for configure_processors()
1321 where we may need to reconfigure the processor.
1324 /* stop redirects that send signals to JACK ports
1325 from causing noise as a result of no longer being
1329 boost::shared_ptr<IOProcessor> iop;
1331 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1333 iop->input()->disconnect (this);
1335 if (iop->output()) {
1336 iop->output()->disconnect (this);
1340 i = _processors.erase (i);
1348 _output->set_user_latency (0);
1357 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1359 if (configure_processors_unlocked (err)) {
1361 /* we know this will work, because it worked before :) */
1362 configure_processors_unlocked (0);
1367 _have_internal_generator = false;
1369 for (i = _processors.begin(); i != _processors.end(); ++i) {
1370 boost::shared_ptr<PluginInsert> pi;
1372 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1373 if (pi->is_generator()) {
1374 _have_internal_generator = true;
1381 processor->drop_references ();
1382 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1383 set_processor_positions ();
1389 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1391 ProcessorList deleted;
1393 if (!_session.engine().connected()) {
1397 processor_max_streams.reset();
1400 Glib::RWLock::WriterLock lm (_processor_lock);
1401 ProcessorState pstate (this);
1403 ProcessorList::iterator i;
1404 boost::shared_ptr<Processor> processor;
1406 for (i = _processors.begin(); i != _processors.end(); ) {
1410 /* these can never be removed */
1412 if (processor == _amp || processor == _meter || processor == _main_outs) {
1417 /* see if its in the list of processors to delete */
1419 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1424 /* stop IOProcessors that send to JACK ports
1425 from causing noise as a result of no longer being
1429 boost::shared_ptr<IOProcessor> iop;
1431 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1435 deleted.push_back (processor);
1436 i = _processors.erase (i);
1439 if (deleted.empty()) {
1440 /* none of those in the requested list were found */
1444 _output->set_user_latency (0);
1447 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1449 if (configure_processors_unlocked (err)) {
1451 /* we know this will work, because it worked before :) */
1452 configure_processors_unlocked (0);
1457 _have_internal_generator = false;
1459 for (i = _processors.begin(); i != _processors.end(); ++i) {
1460 boost::shared_ptr<PluginInsert> pi;
1462 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1463 if (pi->is_generator()) {
1464 _have_internal_generator = true;
1471 /* now try to do what we need to so that those that were removed will be deleted */
1473 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1474 (*i)->drop_references ();
1477 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1478 set_processor_positions ();
1483 /** Caller must hold process lock */
1485 Route::configure_processors (ProcessorStreams* err)
1487 assert (!AudioEngine::instance()->process_lock().trylock());
1489 if (!_in_configure_processors) {
1490 Glib::RWLock::WriterLock lm (_processor_lock);
1491 return configure_processors_unlocked (err);
1498 Route::input_streams () const
1500 return _input->n_ports ();
1503 list<pair<ChanCount, ChanCount> >
1504 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1506 Glib::RWLock::ReaderLock lm (_processor_lock);
1508 return try_configure_processors_unlocked (in, err);
1511 list<pair<ChanCount, ChanCount> >
1512 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1514 // Check each processor in order to see if we can configure as requested
1516 list<pair<ChanCount, ChanCount> > configuration;
1519 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1520 DEBUG_TRACE (DEBUG::Processors, "{\n");
1522 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1524 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1525 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1529 if ((*p)->can_support_io_configuration(in, out)) {
1530 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1531 configuration.push_back(make_pair(in, out));
1538 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1539 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1540 DEBUG_TRACE (DEBUG::Processors, "}\n");
1541 return list<pair<ChanCount, ChanCount> > ();
1545 DEBUG_TRACE (DEBUG::Processors, "}\n");
1547 return configuration;
1550 /** Set the input/output configuration of each processor in the processors list.
1551 * Caller must hold process lock.
1552 * Return 0 on success, otherwise configuration is impossible.
1555 Route::configure_processors_unlocked (ProcessorStreams* err)
1557 assert (!AudioEngine::instance()->process_lock().trylock());
1559 if (_in_configure_processors) {
1563 /* put invisible processors where they should be */
1564 setup_invisible_processors ();
1566 _in_configure_processors = true;
1568 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1570 if (configuration.empty ()) {
1571 _in_configure_processors = false;
1577 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1578 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1580 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1584 (*p)->configure_io(c->first, c->second);
1585 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1586 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1591 _meter->reset_max_channels (processor_max_streams);
1594 /* make sure we have sufficient scratch buffers to cope with the new processor
1596 _session.ensure_buffers (n_process_buffers ());
1598 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1600 _in_configure_processors = false;
1605 Route::all_processors_flip ()
1607 Glib::RWLock::ReaderLock lm (_processor_lock);
1609 if (_processors.empty()) {
1613 bool first_is_on = _processors.front()->active();
1615 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1617 (*i)->deactivate ();
1623 _session.set_dirty ();
1626 /** Set all processors with a given placement to a given active state.
1627 * @param p Placement of processors to change.
1628 * @param state New active state for those processors.
1631 Route::all_processors_active (Placement p, bool state)
1633 Glib::RWLock::ReaderLock lm (_processor_lock);
1635 if (_processors.empty()) {
1638 ProcessorList::iterator start, end;
1639 placement_range(p, start, end);
1641 bool before_amp = true;
1642 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1647 if (p == PreFader && before_amp) {
1651 (*i)->deactivate ();
1656 _session.set_dirty ();
1660 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1662 bool pre_fader = true;
1663 Glib::RWLock::ReaderLock lm (_processor_lock);
1665 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1667 /* semantic note: if p == amp, we want to return true, so test
1668 for equality before checking if this is the amp
1685 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1687 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1688 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1689 processors in the current actual processor list that are hidden. Any visible processors
1690 in the current list but not in "new_order" will be assumed to be deleted.
1694 Glib::RWLock::WriterLock lm (_processor_lock);
1695 ProcessorState pstate (this);
1697 ProcessorList::iterator oiter;
1698 ProcessorList::const_iterator niter;
1699 ProcessorList as_it_will_be;
1701 oiter = _processors.begin();
1702 niter = new_order.begin();
1704 while (niter != new_order.end()) {
1706 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1707 then append it to the temp list.
1709 Otherwise, see if the next processor in the old list is in the new list. if not,
1710 its been deleted. If its there, append it to the temp list.
1713 if (oiter == _processors.end()) {
1715 /* no more elements in the old list, so just stick the rest of
1716 the new order onto the temp list.
1719 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1720 while (niter != new_order.end()) {
1727 if (!(*oiter)->display_to_user()) {
1729 as_it_will_be.push_back (*oiter);
1733 /* visible processor: check that its in the new order */
1735 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1736 /* deleted: do nothing, shared_ptr<> will clean up */
1738 /* ignore this one, and add the next item from the new order instead */
1739 as_it_will_be.push_back (*niter);
1744 /* now remove from old order - its taken care of no matter what */
1745 oiter = _processors.erase (oiter);
1750 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1753 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1755 if (configure_processors_unlocked (err)) {
1762 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1763 set_processor_positions ();
1775 Route::get_template()
1777 return state(false);
1781 Route::state(bool full_state)
1783 XMLNode *node = new XMLNode("Route");
1784 ProcessorList::iterator i;
1787 id().print (buf, sizeof (buf));
1788 node->add_property("id", buf);
1789 node->add_property ("name", _name);
1790 node->add_property("default-type", _default_type.to_string());
1793 node->add_property("flags", enum_2_string (_flags));
1796 node->add_property("active", _active?"yes":"no");
1798 boost::to_string (_phase_invert, p);
1799 node->add_property("phase-invert", p);
1800 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1801 node->add_property("meter-point", enum_2_string (_meter_point));
1804 node->add_property("route-group", _route_group->name());
1807 string order_string;
1808 OrderKeys::iterator x = order_keys.begin();
1810 while (x != order_keys.end()) {
1811 order_string += string ((*x).first);
1812 order_string += '=';
1813 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1814 order_string += buf;
1818 if (x == order_keys.end()) {
1822 order_string += ':';
1824 node->add_property ("order-keys", order_string);
1825 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1826 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1827 node->add_property ("soloed-by-upstream", buf);
1828 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1829 node->add_property ("soloed-by-downstream", buf);
1830 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1831 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1833 node->add_child_nocopy (_input->state (full_state));
1834 node->add_child_nocopy (_output->state (full_state));
1835 node->add_child_nocopy (_solo_control->get_state ());
1836 node->add_child_nocopy (_mute_control->get_state ());
1837 node->add_child_nocopy (_mute_master->get_state ());
1839 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1840 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1841 remote_control_node->add_property (X_("id"), buf);
1842 node->add_child_nocopy (*remote_control_node);
1844 if (_comment.length()) {
1845 XMLNode *cmt = node->add_child ("Comment");
1846 cmt->add_content (_comment);
1849 node->add_child_nocopy (_pannable->state (full_state));
1851 for (i = _processors.begin(); i != _processors.end(); ++i) {
1852 node->add_child_nocopy((*i)->state (full_state));
1856 node->add_child_copy (*_extra_xml);
1863 Route::set_state (const XMLNode& node, int version)
1865 return _set_state (node, version, true);
1869 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1871 if (version < 3000) {
1872 return _set_state_2X (node, version);
1876 XMLNodeConstIterator niter;
1878 const XMLProperty *prop;
1880 if (node.name() != "Route"){
1881 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1885 if ((prop = node.property (X_("name"))) != 0) {
1886 Route::set_name (prop->value());
1889 if ((prop = node.property ("id")) != 0) {
1890 _id = prop->value ();
1893 if ((prop = node.property (X_("flags"))) != 0) {
1894 _flags = Flag (string_2_enum (prop->value(), _flags));
1899 if (is_master() || is_monitor() || is_hidden()) {
1900 _mute_master->set_solo_ignore (true);
1903 /* add all processors (except amp, which is always present) */
1905 nlist = node.children();
1906 XMLNode processor_state (X_("processor_state"));
1908 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1912 if (child->name() == IO::state_node_name) {
1913 if ((prop = child->property (X_("direction"))) == 0) {
1917 if (prop->value() == "Input") {
1918 _input->set_state (*child, version);
1919 } else if (prop->value() == "Output") {
1920 _output->set_state (*child, version);
1924 if (child->name() == X_("Processor")) {
1925 processor_state.add_child_copy (*child);
1929 if (child->name() == X_("Pannable")) {
1930 _pannable->set_state (*child, version);
1934 set_processor_state (processor_state);
1936 if ((prop = node.property ("self-solo")) != 0) {
1937 set_self_solo (string_is_affirmative (prop->value()));
1940 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1941 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1942 mod_solo_by_others_upstream (atoi (prop->value()));
1945 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1946 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1947 mod_solo_by_others_downstream (atoi (prop->value()));
1950 if ((prop = node.property ("solo-isolated")) != 0) {
1951 set_solo_isolated (string_is_affirmative (prop->value()), this);
1954 if ((prop = node.property ("solo-safe")) != 0) {
1955 set_solo_safe (string_is_affirmative (prop->value()), this);
1958 if ((prop = node.property (X_("phase-invert"))) != 0) {
1959 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
1962 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1963 set_denormal_protection (string_is_affirmative (prop->value()));
1966 if ((prop = node.property (X_("active"))) != 0) {
1967 bool yn = string_is_affirmative (prop->value());
1968 _active = !yn; // force switch
1969 set_active (yn, this);
1972 if ((prop = node.property (X_("meter-point"))) != 0) {
1973 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1974 set_meter_point (mp, true);
1976 _meter->set_display_to_user (_meter_point == MeterCustom);
1980 if ((prop = node.property (X_("order-keys"))) != 0) {
1984 string::size_type colon, equal;
1985 string remaining = prop->value();
1987 while (remaining.length()) {
1989 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1990 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1993 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
1994 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1997 set_order_key (remaining.substr (0, equal), n);
2001 colon = remaining.find_first_of (':');
2003 if (colon != string::npos) {
2004 remaining = remaining.substr (colon+1);
2011 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2014 if (child->name() == X_("Comment")) {
2016 /* XXX this is a terrible API design in libxml++ */
2018 XMLNode *cmt = *(child->children().begin());
2019 _comment = cmt->content();
2021 } else if (child->name() == X_("Extra")) {
2023 _extra_xml = new XMLNode (*child);
2025 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2026 if (prop->value() == "solo") {
2027 _solo_control->set_state (*child, version);
2030 } else if (child->name() == X_("RemoteControl")) {
2031 if ((prop = child->property (X_("id"))) != 0) {
2033 sscanf (prop->value().c_str(), "%d", &x);
2034 set_remote_control_id (x);
2037 } else if (child->name() == X_("MuteMaster")) {
2038 _mute_master->set_state (*child, version);
2046 Route::_set_state_2X (const XMLNode& node, int version)
2049 XMLNodeConstIterator niter;
2051 const XMLProperty *prop;
2053 /* 2X things which still remain to be handled:
2059 if (node.name() != "Route") {
2060 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2064 if ((prop = node.property (X_("flags"))) != 0) {
2065 _flags = Flag (string_2_enum (prop->value(), _flags));
2070 if ((prop = node.property (X_("phase-invert"))) != 0) {
2071 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2072 if (string_is_affirmative (prop->value ())) {
2075 set_phase_invert (p);
2078 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2079 set_denormal_protection (string_is_affirmative (prop->value()));
2082 if ((prop = node.property (X_("soloed"))) != 0) {
2083 bool yn = string_is_affirmative (prop->value());
2085 /* XXX force reset of solo status */
2087 set_solo (yn, this);
2090 if ((prop = node.property (X_("muted"))) != 0) {
2093 bool muted = string_is_affirmative (prop->value());
2099 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2101 if (string_is_affirmative (prop->value())){
2102 mute_point = mute_point + "PreFader";
2107 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2109 if (string_is_affirmative (prop->value())){
2112 mute_point = mute_point + ",";
2115 mute_point = mute_point + "PostFader";
2120 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2122 if (string_is_affirmative (prop->value())){
2125 mute_point = mute_point + ",";
2128 mute_point = mute_point + "Listen";
2133 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2135 if (string_is_affirmative (prop->value())){
2138 mute_point = mute_point + ",";
2141 mute_point = mute_point + "Main";
2145 _mute_master->set_mute_points (mute_point);
2149 if ((prop = node.property (X_("meter-point"))) != 0) {
2150 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2153 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2154 don't mean the same thing.
2157 if ((prop = node.property (X_("order-keys"))) != 0) {
2161 string::size_type colon, equal;
2162 string remaining = prop->value();
2164 while (remaining.length()) {
2166 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2167 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2170 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2171 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2174 set_order_key (remaining.substr (0, equal), n);
2178 colon = remaining.find_first_of (':');
2180 if (colon != string::npos) {
2181 remaining = remaining.substr (colon+1);
2190 nlist = node.children ();
2191 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2195 if (child->name() == IO::state_node_name) {
2197 /* there is a note in IO::set_state_2X() about why we have to call
2201 _input->set_state_2X (*child, version, true);
2202 _output->set_state_2X (*child, version, false);
2204 if ((prop = child->property (X_("name"))) != 0) {
2205 Route::set_name (prop->value ());
2208 if ((prop = child->property (X_("id"))) != 0) {
2209 _id = prop->value ();
2212 if ((prop = child->property (X_("active"))) != 0) {
2213 bool yn = string_is_affirmative (prop->value());
2214 _active = !yn; // force switch
2215 set_active (yn, this);
2218 if ((prop = child->property (X_("gain"))) != 0) {
2221 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2222 _amp->gain_control()->set_value (val);
2226 /* Set up Panners in the IO */
2227 XMLNodeList io_nlist = child->children ();
2229 XMLNodeConstIterator io_niter;
2232 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2234 io_child = *io_niter;
2236 if (io_child->name() == X_("Panner")) {
2237 _main_outs->panner_shell()->set_state(*io_child, version);
2238 } else if (io_child->name() == X_("Automation")) {
2239 /* IO's automation is for the fader */
2240 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2246 XMLNodeList redirect_nodes;
2248 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2252 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2253 redirect_nodes.push_back(child);
2258 set_processor_state_2X (redirect_nodes, version);
2260 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2263 if (child->name() == X_("Comment")) {
2265 /* XXX this is a terrible API design in libxml++ */
2267 XMLNode *cmt = *(child->children().begin());
2268 _comment = cmt->content();
2270 } else if (child->name() == X_("extra")) {
2272 _extra_xml = new XMLNode (*child);
2274 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2275 if (prop->value() == X_("solo")) {
2276 _solo_control->set_state (*child, version);
2277 } else if (prop->value() == X_("mute")) {
2278 _mute_control->set_state (*child, version);
2281 } else if (child->name() == X_("RemoteControl")) {
2282 if ((prop = child->property (X_("id"))) != 0) {
2284 sscanf (prop->value().c_str(), "%d", &x);
2285 set_remote_control_id (x);
2295 Route::get_processor_state ()
2297 XMLNode* root = new XMLNode (X_("redirects"));
2298 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2299 root->add_child_nocopy ((*i)->state (true));
2306 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2308 /* We don't bother removing existing processors not in nList, as this
2309 method will only be called when creating a Route from scratch, not
2310 for undo purposes. Just put processors in at the appropriate place
2314 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2315 add_processor_from_xml_2X (**i, version);
2320 Route::set_processor_state (const XMLNode& node)
2322 const XMLNodeList &nlist = node.children();
2323 XMLNodeConstIterator niter;
2324 ProcessorList new_order;
2325 bool must_configure = false;
2327 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2329 XMLProperty* prop = (*niter)->property ("type");
2331 if (prop->value() == "amp") {
2332 _amp->set_state (**niter, Stateful::current_state_version);
2333 new_order.push_back (_amp);
2334 } else if (prop->value() == "meter") {
2335 _meter->set_state (**niter, Stateful::current_state_version);
2336 } else if (prop->value() == "main-outs") {
2337 _main_outs->set_state (**niter, Stateful::current_state_version);
2338 } else if (prop->value() == "intreturn") {
2340 _intreturn.reset (new InternalReturn (_session));
2341 must_configure = true;
2343 _intreturn->set_state (**niter, Stateful::current_state_version);
2344 } else if (is_monitor() && prop->value() == "monitor") {
2345 if (!_monitor_control) {
2346 _monitor_control.reset (new MonitorProcessor (_session));
2347 must_configure = true;
2349 _monitor_control->set_state (**niter, Stateful::current_state_version);
2351 ProcessorList::iterator o;
2353 for (o = _processors.begin(); o != _processors.end(); ++o) {
2354 XMLProperty* id_prop = (*niter)->property(X_("id"));
2355 if (id_prop && (*o)->id() == id_prop->value()) {
2356 (*o)->set_state (**niter, Stateful::current_state_version);
2357 new_order.push_back (*o);
2362 // If the processor (*niter) is not on the route then create it
2364 if (o == _processors.end()) {
2366 boost::shared_ptr<Processor> processor;
2368 if (prop->value() == "intsend") {
2370 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2371 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2372 prop->value() == "lv2" ||
2373 prop->value() == "vst" ||
2374 prop->value() == "audiounit") {
2376 processor.reset (new PluginInsert(_session));
2378 } else if (prop->value() == "port") {
2380 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2382 } else if (prop->value() == "send") {
2384 processor.reset (new Send (_session, _pannable, _mute_master));
2387 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2391 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2392 /* This processor could not be configured. Turn it into a UnknownProcessor */
2393 processor.reset (new UnknownProcessor (_session, **niter));
2396 /* we have to note the monitor send here, otherwise a new one will be created
2397 and the state of this one will be lost.
2399 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2400 if (isend && isend->role() == Delivery::Listen) {
2401 _monitor_send = isend;
2404 /* it doesn't matter if invisible processors are added here, as they
2405 will be sorted out by setup_invisible_processors () shortly.
2408 new_order.push_back (processor);
2409 must_configure = true;
2415 Glib::RWLock::WriterLock lm (_processor_lock);
2416 _processors = new_order;
2417 if (must_configure) {
2418 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2419 configure_processors_unlocked (0);
2423 processors_changed (RouteProcessorChange ());
2424 set_processor_positions ();
2428 Route::curve_reallocate ()
2430 // _gain_automation_curve.finish_resize ();
2431 // _pan_automation_curve.finish_resize ();
2435 Route::silence (framecnt_t nframes)
2437 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2442 silence_unlocked (nframes);
2446 Route::silence_unlocked (framecnt_t nframes)
2448 /* Must be called with the processor lock held */
2452 _output->silence (nframes);
2454 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2455 boost::shared_ptr<PluginInsert> pi;
2457 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2458 // skip plugins, they don't need anything when we're not active
2462 (*i)->silence (nframes);
2465 if (nframes == _session.get_block_size()) {
2472 Route::add_internal_return ()
2475 _intreturn.reset (new InternalReturn (_session));
2476 add_processor (_intreturn, PreFader);
2481 Route::add_send_to_internal_return (InternalSend* send)
2483 Glib::RWLock::ReaderLock rm (_processor_lock);
2485 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2486 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2489 return d->add_send (send);
2495 Route::remove_send_from_internal_return (InternalSend* send)
2497 Glib::RWLock::ReaderLock rm (_processor_lock);
2499 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2500 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2503 return d->remove_send (send);
2508 /** Add a monitor send (if we don't already have one) but don't activate it */
2510 Route::listen_via_monitor ()
2512 /* master never sends to control outs */
2513 assert (!is_master ());
2515 /* make sure we have one */
2516 if (!_monitor_send) {
2517 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2518 _monitor_send->set_display_to_user (false);
2522 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2523 configure_processors (0);
2528 /** Add an internal send to a route.
2529 * @param route route to send to.
2530 * @param placement placement for the send.
2533 Route::listen_via (boost::shared_ptr<Route> route, Placement placement)
2535 assert (route != _session.monitor_out ());
2538 Glib::RWLock::ReaderLock rm (_processor_lock);
2540 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2542 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2544 if (d && d->target_route() == route) {
2545 /* already listening via the specified IO: do nothing */
2552 boost::shared_ptr<InternalSend> listener (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2553 add_processor (listener, placement);
2555 } catch (failed_constructor& err) {
2563 Route::drop_listen (boost::shared_ptr<Route> route)
2565 ProcessorStreams err;
2566 ProcessorList::iterator tmp;
2568 Glib::RWLock::ReaderLock rl(_processor_lock);
2572 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2574 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2576 if (d && d->target_route() == route) {
2578 remove_processor (*x, &err);
2581 /* list could have been demolished while we dropped the lock
2591 if (route == _session.monitor_out()) {
2592 _monitor_send.reset ();
2597 Route::set_comment (string cmt, void *src)
2600 comment_changed (src);
2601 _session.set_dirty ();
2605 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2607 FeedRecord fr (other, via_sends_only);
2609 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2611 if (!result.second) {
2613 /* already a record for "other" - make sure sends-only information is correct */
2614 if (!via_sends_only && result.first->sends_only) {
2615 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2616 frp->sends_only = false;
2620 return result.second;
2624 Route::clear_fed_by ()
2630 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2632 const FedBy& fed_by (other->fed_by());
2634 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2635 boost::shared_ptr<Route> sr = f->r.lock();
2637 if (sr && (sr.get() == this)) {
2639 if (via_sends_only) {
2640 *via_sends_only = f->sends_only;
2651 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2653 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2655 if (_output->connected_to (other->input())) {
2656 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2665 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2667 boost::shared_ptr<IOProcessor> iop;
2669 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2670 if (iop->feeds (other)) {
2671 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2677 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2680 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2685 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2689 /** Called from the (non-realtime) butler thread when the transport is stopped */
2691 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2693 framepos_t now = _session.transport_frame();
2696 Glib::RWLock::ReaderLock lm (_processor_lock);
2699 automation_snapshot (now, true);
2702 Automatable::transport_stopped (now);
2704 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2706 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2710 (*i)->transport_stopped (now);
2714 _roll_delay = _initial_delay;
2717 /** Called with the process lock held if change contains ConfigurationChanged */
2719 Route::input_change_handler (IOChange change, void * /*src*/)
2721 if ((change.type & IOChange::ConfigurationChanged)) {
2722 configure_processors (0);
2723 _phase_invert.resize (_input->n_ports().n_audio ());
2724 io_changed (); /* EMIT SIGNAL */
2728 /** Called with the process lock held if change contains ConfigurationChanged */
2730 Route::output_change_handler (IOChange change, void * /*src*/)
2732 if ((change.type & IOChange::ConfigurationChanged)) {
2734 /* XXX resize all listeners to match _main_outs? */
2736 /* Auto-connect newly-created outputs, unless we're auto-connecting to master
2737 and we are master (as an auto-connect in this situation would cause a
2740 AutoConnectOption ac = Config->get_output_auto_connect ();
2741 if (ac == AutoConnectPhysical || (ac == AutoConnectMaster && !is_master ())) {
2743 ChanCount start = change.before;
2745 for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
2746 if (change.before.get(*i) < change.after.get(*i)) {
2747 /* the existing ChanCounts don't matter for this call as they are only
2748 to do with matching input and output indices, and we are only changing
2753 /* only auto-connect the newly-created outputs, not the ones that were
2756 start.set (*i, start.get (*i) + 1);
2758 _session.auto_connect_route (this, dummy, dummy, false, ChanCount(), change.before);
2763 // configure_processors (0);
2768 Route::pans_required () const
2770 if (n_outputs().n_audio() < 2) {
2774 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2778 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
2779 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2781 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2786 if (n_outputs().n_total() == 0) {
2790 if (!_active || n_inputs() == ChanCount::ZERO) {
2791 silence_unlocked (nframes);
2794 if (session_state_changing) {
2795 if (_session.transport_speed() != 0.0f) {
2796 /* we're rolling but some state is changing (e.g. our diskstream contents)
2797 so we cannot use them. Be silent till this is over.
2799 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2801 silence_unlocked (nframes);
2804 /* we're really not rolling, so we're either delivery silence or actually
2805 monitoring, both of which are safe to do while session_state_changing is true.
2809 _amp->apply_gain_automation (false);
2810 passthru (start_frame, end_frame, nframes, 0);
2816 Route::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
2818 if (_roll_delay > nframes) {
2820 _roll_delay -= nframes;
2821 silence_unlocked (nframes);
2822 /* transport frame is not legal for caller to use */
2825 } else if (_roll_delay > 0) {
2827 nframes -= _roll_delay;
2828 silence_unlocked (_roll_delay);
2829 /* we've written _roll_delay of samples into the
2830 output ports, so make a note of that for
2833 _main_outs->increment_output_offset (_roll_delay);
2834 transport_frame += _roll_delay;
2843 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick,
2844 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2846 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2851 automation_snapshot (_session.transport_frame(), false);
2853 if (n_outputs().n_total() == 0) {
2857 if (!_active || n_inputs().n_total() == 0) {
2858 silence_unlocked (nframes);
2862 framecnt_t unused = 0;
2864 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2870 passthru (start_frame, end_frame, nframes, declick);
2876 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
2877 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2884 Route::toggle_monitor_input ()
2886 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2887 i->ensure_monitor_input( ! i->monitoring_input());
2892 Route::has_external_redirects () const
2894 // FIXME: what about sends? - they don't return a signal back to ardour?
2896 boost::shared_ptr<const PortInsert> pi;
2898 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2900 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2902 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2904 string port_name = port->name();
2905 string client_name = port_name.substr (0, port_name.find(':'));
2907 /* only say "yes" if the redirect is actually in use */
2909 if (client_name != "ardour" && pi->active()) {
2920 Route::flush_processors ()
2922 /* XXX shouldn't really try to take this lock, since
2923 this is called from the RT audio thread.
2926 Glib::RWLock::ReaderLock lm (_processor_lock);
2928 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2934 Route::set_meter_point (MeterPoint p, bool force)
2936 /* CAN BE CALLED FROM PROCESS CONTEXT */
2938 if (_meter_point == p && !force) {
2944 bool meter_was_visible_to_user = _meter->display_to_user ();
2947 Glib::RWLock::WriterLock lm (_processor_lock);
2949 if (_meter_point != MeterCustom) {
2951 _meter->set_display_to_user (false);
2953 setup_invisible_processors ();
2955 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2959 if (loc == _processors.begin()) {
2960 m_in = _input->n_ports();
2962 ProcessorList::iterator before = loc;
2964 m_in = (*before)->output_streams ();
2967 _meter->reflect_inputs (m_in);
2969 /* we do not need to reconfigure the processors, because the meter
2970 (a) is always ready to handle processor_max_streams
2971 (b) is always an N-in/N-out processor, and thus moving
2972 it doesn't require any changes to the other processors.
2977 // just make it visible and let the user move it
2979 _meter->set_display_to_user (true);
2983 meter_change (); /* EMIT SIGNAL */
2985 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2987 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2991 Route::listen_position_changed ()
2994 Glib::RWLock::WriterLock lm (_processor_lock);
2995 ProcessorState pstate (this);
2998 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3000 if (configure_processors_unlocked (0)) {
3002 configure_processors_unlocked (0); // it worked before we tried to add it ...
3008 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3009 _session.set_dirty ();
3012 boost::shared_ptr<CapturingProcessor>
3013 Route::add_export_point()
3015 if (!_capturing_processor) {
3017 _capturing_processor.reset (new CapturingProcessor (_session));
3018 _capturing_processor->activate ();
3021 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3022 configure_processors (0);
3027 return _capturing_processor;
3031 Route::update_total_latency ()
3033 framecnt_t old = _output->effective_latency();
3034 framecnt_t own_latency = _output->user_latency();
3036 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3037 if ((*i)->active ()) {
3038 own_latency += (*i)->signal_latency ();
3042 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
3044 _output->set_port_latency (own_latency);
3046 if (_output->user_latency() == 0) {
3048 /* this (virtual) function is used for pure Routes,
3049 not derived classes like AudioTrack. this means
3050 that the data processed here comes from an input
3051 port, not prerecorded material, and therefore we
3052 have to take into account any input latency.
3055 own_latency += _input->signal_latency ();
3058 if (old != own_latency) {
3059 _output->set_latency_delay (own_latency);
3060 signal_latency_changed (); /* EMIT SIGNAL */
3063 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
3065 return _output->effective_latency ();
3069 Route::set_user_latency (framecnt_t nframes)
3071 _output->set_user_latency (nframes);
3072 _session.update_latency_compensation (false, false);
3076 Route::set_latency_delay (framecnt_t longest_session_latency)
3078 framecnt_t old = _initial_delay;
3080 if (_output->effective_latency() < longest_session_latency) {
3081 _initial_delay = longest_session_latency - _output->effective_latency();
3086 if (_initial_delay != old) {
3087 initial_delay_changed (); /* EMIT SIGNAL */
3090 if (_session.transport_stopped()) {
3091 _roll_delay = _initial_delay;
3096 Route::automation_snapshot (framepos_t now, bool force)
3098 _pannable->automation_snapshot (now, force);
3099 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3100 (*i)->automation_snapshot (now, force);
3104 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3105 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3106 boost::shared_ptr<AutomationList>(), name)
3109 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3114 Route::SoloControllable::set_value (double val)
3116 bool bval = ((val >= 0.5f) ? true: false);
3118 boost::shared_ptr<RouteList> rl (new RouteList);
3120 boost::shared_ptr<Route> r = _route.lock ();
3127 if (Config->get_solo_control_is_listen_control()) {
3128 _session.set_listen (rl, bval);
3130 _session.set_solo (rl, bval);
3135 Route::SoloControllable::get_value () const
3137 boost::shared_ptr<Route> r = _route.lock ();
3142 if (Config->get_solo_control_is_listen_control()) {
3143 return r->listening_via_monitor() ? 1.0f : 0.0f;
3145 return r->self_soloed() ? 1.0f : 0.0f;
3149 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3150 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3151 boost::shared_ptr<AutomationList>(), name)
3154 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3159 Route::MuteControllable::set_value (double val)
3161 bool bval = ((val >= 0.5f) ? true: false);
3163 boost::shared_ptr<RouteList> rl (new RouteList);
3165 boost::shared_ptr<Route> r = _route.lock ();
3171 _session.set_mute (rl, bval);
3175 Route::MuteControllable::get_value () const
3177 boost::shared_ptr<Route> r = _route.lock ();
3182 return r->muted() ? 1.0f : 0.0f;
3186 Route::set_block_size (pframes_t nframes)
3188 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3189 (*i)->set_block_size (nframes);
3192 _session.ensure_buffers (n_process_buffers ());
3196 Route::protect_automation ()
3198 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3199 (*i)->protect_automation();
3203 Route::set_pending_declick (int declick)
3206 /* this call is not allowed to turn off a pending declick unless "force" is true */
3208 _pending_declick = declick;
3210 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3212 _pending_declick = 0;
3217 /** Shift automation forwards from a particular place, thereby inserting time.
3218 * Adds undo commands for any shifts that are performed.
3220 * @param pos Position to start shifting from.
3221 * @param frames Amount to shift forwards by.
3225 Route::shift (framepos_t pos, framecnt_t frames)
3227 /* gain automation */
3229 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3231 XMLNode &before = gc->alist()->get_state ();
3232 gc->alist()->shift (pos, frames);
3233 XMLNode &after = gc->alist()->get_state ();
3234 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3237 /* pan automation */
3239 ControlSet::Controls& c (_pannable->controls());
3241 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3242 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3244 boost::shared_ptr<AutomationList> al = pc->alist();
3245 XMLNode& before = al->get_state ();
3246 al->shift (pos, frames);
3247 XMLNode& after = al->get_state ();
3248 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3253 /* redirect automation */
3255 Glib::RWLock::ReaderLock lm (_processor_lock);
3256 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3258 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3260 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3261 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3263 boost::shared_ptr<AutomationList> al = ac->alist();
3264 XMLNode &before = al->get_state ();
3265 al->shift (pos, frames);
3266 XMLNode &after = al->get_state ();
3267 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3276 Route::save_as_template (const string& path, const string& name)
3278 XMLNode& node (state (false));
3281 IO::set_name_in_state (*node.children().front(), name);
3283 tree.set_root (&node);
3284 return tree.write (path.c_str());
3289 Route::set_name (const string& str)
3295 name = Route::ensure_track_or_route_name (str, _session);
3296 SessionObject::set_name (name);
3298 ret = (_input->set_name(name) && _output->set_name(name));
3302 Glib::RWLock::ReaderLock lm (_processor_lock);
3304 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3306 /* rename all I/O processors that have inputs or outputs */
3308 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3310 if (iop && (iop->output() || iop->input())) {
3311 if (!iop->set_name (name)) {
3322 boost::shared_ptr<Send>
3323 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3325 Glib::RWLock::ReaderLock lm (_processor_lock);
3327 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3328 boost::shared_ptr<InternalSend> send;
3330 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3331 if (send->target_route() == target) {
3337 return boost::shared_ptr<Send>();
3340 /** @param c Audio channel index.
3341 * @param yn true to invert phase, otherwise false.
3344 Route::set_phase_invert (uint32_t c, bool yn)
3346 if (_phase_invert[c] != yn) {
3347 _phase_invert[c] = yn;
3348 phase_invert_changed (); /* EMIT SIGNAL */
3349 _session.set_dirty ();
3354 Route::set_phase_invert (boost::dynamic_bitset<> p)
3356 if (_phase_invert != p) {
3358 phase_invert_changed (); /* EMIT SIGNAL */
3359 _session.set_dirty ();
3364 Route::phase_invert (uint32_t c) const
3366 return _phase_invert[c];
3369 boost::dynamic_bitset<>
3370 Route::phase_invert () const
3372 return _phase_invert;
3376 Route::set_denormal_protection (bool yn)
3378 if (_denormal_protection != yn) {
3379 _denormal_protection = yn;
3380 denormal_protection_changed (); /* EMIT SIGNAL */
3385 Route::denormal_protection () const
3387 return _denormal_protection;
3391 Route::set_active (bool yn, void* src)
3393 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3394 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3398 if (_active != yn) {
3400 _input->set_active (yn);
3401 _output->set_active (yn);
3402 active_changed (); // EMIT SIGNAL
3409 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3415 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3417 boost::shared_ptr<Send> s;
3418 boost::shared_ptr<Return> r;
3420 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3421 s->meter()->meter();
3422 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3423 r->meter()->meter ();
3428 boost::shared_ptr<Pannable>
3429 Route::pannable() const
3434 boost::shared_ptr<Panner>
3435 Route::panner() const
3438 return _main_outs->panner_shell()->panner();
3441 boost::shared_ptr<PannerShell>
3442 Route::panner_shell() const
3444 return _main_outs->panner_shell();
3447 boost::shared_ptr<AutomationControl>
3448 Route::gain_control() const
3450 return _amp->gain_control();
3453 boost::shared_ptr<AutomationControl>
3454 Route::get_control (const Evoral::Parameter& param)
3456 /* either we own the control or .... */
3458 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3462 /* maybe one of our processors does or ... */
3464 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3465 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3466 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3474 /* nobody does so we'll make a new one */
3476 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3483 boost::shared_ptr<Processor>
3484 Route::nth_plugin (uint32_t n)
3486 Glib::RWLock::ReaderLock lm (_processor_lock);
3487 ProcessorList::iterator i;
3489 for (i = _processors.begin(); i != _processors.end(); ++i) {
3490 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3497 return boost::shared_ptr<Processor> ();
3500 boost::shared_ptr<Processor>
3501 Route::nth_send (uint32_t n)
3503 Glib::RWLock::ReaderLock lm (_processor_lock);
3504 ProcessorList::iterator i;
3506 for (i = _processors.begin(); i != _processors.end(); ++i) {
3507 if (boost::dynamic_pointer_cast<Send> (*i)) {
3514 return boost::shared_ptr<Processor> ();
3518 Route::has_io_processor_named (const string& name)
3520 Glib::RWLock::ReaderLock lm (_processor_lock);
3521 ProcessorList::iterator i;
3523 for (i = _processors.begin(); i != _processors.end(); ++i) {
3524 if (boost::dynamic_pointer_cast<Send> (*i) ||
3525 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3526 if ((*i)->name() == name) {
3535 MuteMaster::MutePoint
3536 Route::mute_points () const
3538 return _mute_master->mute_points ();
3542 Route::set_processor_positions ()
3544 Glib::RWLock::ReaderLock lm (_processor_lock);
3546 bool had_amp = false;
3547 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3548 (*i)->set_pre_fader (!had_amp);
3549 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3555 /** Called when there is a proposed change to the input port count */
3557 Route::input_port_count_changing (ChanCount to)
3559 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3561 /* The processors cannot be configured with the new input arrangement, so
3567 /* The change is ok */
3572 Route::unknown_processors () const
3576 Glib::RWLock::ReaderLock lm (_processor_lock);
3577 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3578 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3579 p.push_back ((*i)->name ());
3587 Route::set_latency_ranges (bool playback) const
3589 framecnt_t own_latency = 0;
3591 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD OR
3595 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3596 if ((*i)->active ()) {
3597 own_latency += (*i)->signal_latency ();
3602 update_port_latencies (_input->ports (), _output->ports (), true, own_latency);
3604 update_port_latencies (_output->ports (), _input->ports (), false, own_latency);
3609 Route::update_port_latencies (const PortSet& operands, const PortSet& feeders, bool playback, framecnt_t our_latency) const
3611 #ifdef HAVE_JACK_NEW_LATENCY
3613 /* we assume that all our input ports feed all our output ports. its not
3614 universally true, but the alternative is way too corner-case to worry about.
3617 jack_latency_range_t all_connections;
3619 all_connections.min = ~((jack_nframes_t) 0);
3620 all_connections.max = 0;
3622 /* iterate over all feeder ports and determine their relevant latency, taking
3623 the maximum and minimum across all of them.
3626 for (PortSet::const_iterator p = feeders.begin(); p != feeders.end(); ++p) {
3628 jack_latency_range_t range;
3630 p->get_connected_latency_range (range, playback);
3632 all_connections.min = min (all_connections.min, range.min);
3633 all_connections.max = max (all_connections.max, range.max);
3636 all_connections.min += our_latency;
3637 all_connections.max += our_latency;
3639 for (PortSet::const_iterator p = operands.begin(); p != operands.end(); ++p) {
3641 p->set_latency_range (all_connections, playback);
3643 DEBUG_TRACE (DEBUG::Latency, string_compose ("Port %1 %5 latency range %2 .. %3 (including route latency of %4)\n",
3645 all_connections.min,
3646 all_connections.max,
3648 (playback ? "PLAYBACK" : "CAPTURE")));
3654 /** Put the invisible processors in the right place in _processors.
3655 * Must be called with a writer lock on _processor_lock held.
3658 Route::setup_invisible_processors ()
3661 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3662 assert (!lm.locked ());
3666 /* too early to be doing this stuff */
3670 /* we'll build this new list here and then use it */
3672 ProcessorList new_processors;
3674 /* find visible processors */
3676 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3677 if ((*i)->display_to_user ()) {
3678 new_processors.push_back (*i);
3684 ProcessorList::iterator amp = new_processors.begin ();
3685 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3689 assert (amp != _processors.end ());
3691 /* and the processor after the amp */
3693 ProcessorList::iterator after_amp = amp;
3699 switch (_meter_point) {
3701 assert (!_meter->display_to_user ());
3702 new_processors.push_front (_meter);
3705 assert (!_meter->display_to_user ());
3706 new_processors.insert (amp, _meter);
3708 case MeterPostFader:
3709 /* do nothing here */
3712 /* do nothing here */
3715 /* the meter is visible, so we don't touch it here */
3722 assert (_main_outs);
3723 assert (!_main_outs->display_to_user ());
3724 new_processors.push_back (_main_outs);
3726 /* iterator for the main outs */
3728 ProcessorList::iterator main = new_processors.end();
3731 /* OUTPUT METERING */
3733 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3734 assert (!_meter->display_to_user ());
3736 /* add the processor just before or just after the main outs */
3738 ProcessorList::iterator meter_point = main;
3740 if (_meter_point == MeterOutput) {
3743 new_processors.insert (meter_point, _meter);
3748 if (_monitor_send && !is_monitor ()) {
3749 assert (!_monitor_send->display_to_user ());
3750 if (Config->get_solo_control_is_listen_control()) {
3751 switch (Config->get_listen_position ()) {
3752 case PreFaderListen:
3753 switch (Config->get_pfl_position ()) {
3754 case PFLFromBeforeProcessors:
3755 new_processors.push_front (_monitor_send);
3757 case PFLFromAfterProcessors:
3758 new_processors.insert (amp, _monitor_send);
3762 case AfterFaderListen:
3763 switch (Config->get_afl_position ()) {
3764 case AFLFromBeforeProcessors:
3765 new_processors.insert (after_amp, _monitor_send);
3767 case AFLFromAfterProcessors:
3768 new_processors.insert (new_processors.end(), _monitor_send);
3774 new_processors.insert (new_processors.end(), _monitor_send);
3778 /* MONITOR CONTROL */
3780 if (_monitor_control && is_monitor ()) {
3781 assert (!_monitor_control->display_to_user ());
3782 new_processors.push_front (_monitor_control);
3785 /* INTERNAL RETURN */
3787 /* doing this here means that any monitor control will come just after
3792 assert (!_intreturn->display_to_user ());
3793 new_processors.push_front (_intreturn);
3796 /* EXPORT PROCESSOR */
3798 if (_capturing_processor) {
3799 assert (!_capturing_processor->display_to_user ());
3800 new_processors.push_front (_capturing_processor);
3803 _processors = new_processors;
3805 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3806 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3807 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));