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 )
91 , _pending_declick (true)
92 , _meter_point (MeterPostFader)
94 , _soloed_by_others_upstream (0)
95 , _soloed_by_others_downstream (0)
97 , _denormal_protection (false)
100 , _declickable (false)
101 , _mute_master (new MuteMaster (sess, name))
102 , _have_internal_generator (false)
104 , _default_type (default_type)
105 , _remote_control_id (0)
106 , _in_configure_processors (false)
108 processor_max_streams.reset();
109 order_keys[N_("signal")] = order_key_cnt++;
115 /* add standard controls */
117 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
118 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
120 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
121 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
123 add_control (_solo_control);
124 add_control (_mute_control);
128 Pannable* p = new Pannable (_session);
129 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
130 boost_debug_shared_ptr_mark_interesting (p, "Pannable");
134 /* input and output objects */
136 _input.reset (new IO (_session, _name, IO::Input, _default_type));
137 _output.reset (new IO (_session, _name, IO::Output, _default_type));
139 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
140 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
142 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
144 /* add amp processor */
146 _amp.reset (new Amp (_session));
147 add_processor (_amp, PostFader);
149 /* create standard processors: meter, main outs, monitor out;
150 they will be added to _processors by setup_invisible_processors ()
153 _meter.reset (new PeakMeter (_session));
154 _meter->set_display_to_user (false);
157 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
158 _main_outs->activate ();
161 /* where we listen to tracks */
162 _intreturn.reset (new InternalReturn (_session));
163 _intreturn->activate ();
165 /* the thing that provides proper control over a control/monitor/listen bus
166 (such as per-channel cut, dim, solo, invert, etc).
168 _monitor_control.reset (new MonitorProcessor (_session));
169 _monitor_control->activate ();
172 if (is_master() || is_monitor() || is_hidden()) {
173 _mute_master->set_solo_ignore (true);
176 /* now that we have _meter, its safe to connect to this */
178 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
181 /* run a configure so that the invisible processors get set up */
182 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
183 configure_processors (0);
191 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
193 /* do this early so that we don't get incoming signals as we are going through destruction
198 /* don't use clear_processors here, as it depends on the session which may
199 be half-destroyed by now
202 Glib::RWLock::WriterLock lm (_processor_lock);
203 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
204 (*i)->drop_references ();
207 _processors.clear ();
211 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
213 if (id != _remote_control_id) {
214 _remote_control_id = id;
215 RemoteControlIDChanged ();
216 if (notify_class_listeners) {
217 RemoteControlIDChange ();
223 Route::remote_control_id() const
225 return _remote_control_id;
229 Route::order_key (std::string const & name) const
231 OrderKeys::const_iterator i = order_keys.find (name);
232 if (i == order_keys.end()) {
240 Route::set_order_key (std::string const & name, int32_t n)
242 bool changed = false;
244 /* This method looks more complicated than it should, but
245 it's important that we don't emit order_key_changed unless
246 it actually has, as expensive things happen on receipt of that
250 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
251 order_keys[name] = n;
255 if (Config->get_sync_all_route_ordering()) {
256 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
257 if (x->second != n) {
265 order_key_changed (); /* EMIT SIGNAL */
266 _session.set_dirty ();
270 /** Set all order keys to be the same as that for `base', if such a key
271 * exists in this route.
272 * @param base Base key.
275 Route::sync_order_keys (std::string const & base)
277 if (order_keys.empty()) {
281 OrderKeys::iterator i;
284 if ((i = order_keys.find (base)) == order_keys.end()) {
285 /* key doesn't exist, use the first existing key (during session initialization) */
286 i = order_keys.begin();
290 /* key exists - use it and reset all others (actually, itself included) */
292 i = order_keys.begin();
295 bool changed = false;
297 for (; i != order_keys.end(); ++i) {
298 if (i->second != key) {
305 order_key_changed (); /* EMIT SIGNAL */
310 Route::ensure_track_or_route_name(string name, Session &session)
312 string newname = name;
314 while (!session.io_name_is_legal (newname)) {
315 newname = bump_name_once (newname, '.');
323 Route::inc_gain (gain_t fraction, void *src)
325 _amp->inc_gain (fraction, src);
329 Route::set_gain (gain_t val, void *src)
331 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
333 if (_route_group->is_relative()) {
335 gain_t usable_gain = _amp->gain();
336 if (usable_gain < 0.000001f) {
337 usable_gain = 0.000001f;
341 if (delta < 0.000001f) {
345 delta -= usable_gain;
350 gain_t factor = delta / usable_gain;
353 factor = _route_group->get_max_factor(factor);
354 if (factor == 0.0f) {
355 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
359 factor = _route_group->get_min_factor(factor);
360 if (factor == 0.0f) {
361 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
366 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
370 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
376 if (val == _amp->gain()) {
380 _amp->set_gain (val, src);
384 Route::maybe_declick (BufferSet&, framecnt_t, int)
386 /* this is the "bus" implementation and they never declick.
391 /** Process this route for one (sub) cycle (process thread)
393 * @param bufs Scratch buffers to use for the signal path
394 * @param start_frame Initial transport frame
395 * @param end_frame Final transport frame
396 * @param nframes Number of frames to output (to ports)
398 * Note that (end_frame - start_frame) may not be equal to nframes when the
399 * transport speed isn't 1.0 (eg varispeed).
402 Route::process_output_buffers (BufferSet& bufs,
403 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
404 bool /*with_processors*/, int declick,
405 bool gain_automation_ok)
407 bool monitor = should_monitor ();
409 bufs.is_silent (false);
411 /* figure out if we're going to use gain automation */
412 if (gain_automation_ok) {
413 _amp->setup_gain_automation (start_frame, end_frame, nframes);
415 _amp->apply_gain_automation (false);
418 /* tell main outs what to do about monitoring */
419 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
422 /* -------------------------------------------------------------------------------------------
423 GLOBAL DECLICK (for transport changes etc.)
424 ----------------------------------------------------------------------------------------- */
426 maybe_declick (bufs, nframes, declick);
427 _pending_declick = 0;
429 /* -------------------------------------------------------------------------------------------
430 DENORMAL CONTROL/PHASE INVERT
431 ----------------------------------------------------------------------------------------- */
433 if (_phase_invert.any ()) {
437 if (_denormal_protection || Config->get_denormal_protection()) {
439 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
440 Sample* const sp = i->data();
442 if (_phase_invert[chn]) {
443 for (pframes_t nx = 0; nx < nframes; ++nx) {
448 for (pframes_t nx = 0; nx < nframes; ++nx) {
456 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
457 Sample* const sp = i->data();
459 if (_phase_invert[chn]) {
460 for (pframes_t nx = 0; nx < nframes; ++nx) {
469 if (_denormal_protection || Config->get_denormal_protection()) {
471 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
472 Sample* const sp = i->data();
473 for (pframes_t nx = 0; nx < nframes; ++nx) {
481 /* -------------------------------------------------------------------------------------------
483 ----------------------------------------------------------------------------------------- */
485 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
487 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i)) {
492 /* if it has any inputs, make sure they match */
493 if ((*i)->input_streams() != ChanCount::ZERO) {
494 if (bufs.count() != (*i)->input_streams()) {
495 cerr << _name << " bufs = " << bufs.count()
496 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
502 /* should we NOT run plugins here if the route is inactive?
503 do we catch route != active somewhere higher?
506 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
507 bufs.set_count ((*i)->output_streams());
512 Route::n_process_buffers ()
514 return max (_input->n_ports(), processor_max_streams);
518 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
520 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
524 assert (bufs.available() >= input_streams());
526 if (_input->n_ports() == ChanCount::ZERO) {
527 silence_unlocked (nframes);
530 bufs.set_count (input_streams());
532 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
534 /* control/monitor bus ignores input ports when something is
535 feeding the listen "stream". data will "arrive" into the
536 route from the intreturn processor element.
538 bufs.silence (nframes, 0);
542 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
544 BufferSet::iterator o = bufs.begin(*t);
545 PortSet& ports (_input->ports());
547 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
548 o->read_from (i->get_buffer(nframes), nframes);
553 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
554 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick, true);
558 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
560 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
561 bufs.set_count (_input->n_ports());
562 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
563 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick, false);
567 Route::set_listen (bool yn, void* src)
574 if (yn != _monitor_send->active()) {
576 _monitor_send->activate ();
577 _mute_master->set_soloed (true);
579 _monitor_send->deactivate ();
580 _mute_master->set_soloed (false);
583 listen_changed (src); /* EMIT SIGNAL */
589 Route::listening_via_monitor () const
592 return _monitor_send->active ();
599 Route::set_solo_safe (bool yn, void *src)
601 if (_solo_safe != yn) {
603 solo_safe_changed (src);
608 Route::solo_safe() const
614 Route::set_solo (bool yn, void *src)
620 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
621 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
625 if (self_soloed() != yn) {
627 set_mute_master_solo ();
628 solo_changed (true, src); /* EMIT SIGNAL */
629 _solo_control->Changed (); /* EMIT SIGNAL */
634 Route::set_self_solo (bool yn)
640 Route::mod_solo_by_others_upstream (int32_t delta)
646 uint32_t old_sbu = _soloed_by_others_upstream;
649 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
650 _soloed_by_others_upstream += delta;
652 _soloed_by_others_upstream = 0;
655 _soloed_by_others_upstream += delta;
658 DEBUG_TRACE (DEBUG::Solo, string_compose (
659 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
660 name(), delta, _soloed_by_others_upstream, old_sbu,
661 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
663 /* push the inverse solo change to everything that feeds us.
665 This is important for solo-within-group. When we solo 1 track out of N that
666 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
667 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
668 tracks that feed it. This will silence them if they were audible because
669 of a bus solo, but the newly soloed track will still be audible (because
672 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
676 if ((_self_solo || _soloed_by_others_downstream) &&
677 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
678 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
680 if (delta > 0 || !Config->get_exclusive_solo()) {
681 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
682 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
683 boost::shared_ptr<Route> sr = i->r.lock();
685 sr->mod_solo_by_others_downstream (-delta);
691 set_mute_master_solo ();
692 solo_changed (false, this);
696 Route::mod_solo_by_others_downstream (int32_t delta)
703 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
704 _soloed_by_others_downstream += delta;
706 _soloed_by_others_downstream = 0;
709 _soloed_by_others_downstream += delta;
712 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
714 set_mute_master_solo ();
715 solo_changed (false, this);
719 Route::set_mute_master_solo ()
721 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
725 Route::set_solo_isolated (bool yn, void *src)
727 if (is_master() || is_monitor() || is_hidden()) {
731 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
732 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
736 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
738 boost::shared_ptr<RouteList> routes = _session.get_routes ();
739 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
741 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
746 bool does_feed = direct_feeds (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
748 if (does_feed && !sends_only) {
749 (*i)->set_solo_isolated (yn, (*i)->route_group());
753 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
755 bool changed = false;
758 if (_solo_isolated == 0) {
759 _mute_master->set_solo_ignore (true);
764 if (_solo_isolated > 0) {
766 if (_solo_isolated == 0) {
767 _mute_master->set_solo_ignore (false);
774 solo_isolated_changed (src);
779 Route::solo_isolated () const
781 return _solo_isolated > 0;
785 Route::set_mute_points (MuteMaster::MutePoint mp)
787 _mute_master->set_mute_points (mp);
788 mute_points_changed (); /* EMIT SIGNAL */
790 if (_mute_master->muted_by_self()) {
791 mute_changed (this); /* EMIT SIGNAL */
792 _mute_control->Changed (); /* EMIT SIGNAL */
797 Route::set_mute (bool yn, void *src)
799 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
800 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
805 _mute_master->set_muted_by_self (yn);
806 mute_changed (src); /* EMIT SIGNAL */
807 _mute_control->Changed (); /* EMIT SIGNAL */
812 Route::muted () const
814 return _mute_master->muted_by_self();
819 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
821 cerr << name << " {" << endl;
822 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
823 p != procs.end(); ++p) {
824 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
831 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
833 ProcessorList::iterator loc;
835 /* XXX this is not thread safe - we don't hold the lock across determining the iter
836 to add before and actually doing the insertion. dammit.
839 if (placement == PreFader) {
840 /* generic pre-fader: insert immediately before the amp */
841 loc = find (_processors.begin(), _processors.end(), _amp);
843 /* generic post-fader: insert right before the main outs */
844 loc = find (_processors.begin(), _processors.end(), _main_outs);
847 return add_processor (processor, loc, err);
851 /** Add a processor to the route.
852 * @param iter an iterator in _processors; the new processor will be inserted immediately before this location.
855 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
857 assert (processor != _meter);
858 assert (processor != _main_outs);
860 DEBUG_TRACE (DEBUG::Processors, string_compose (
861 "%1 adding processor %2\n", name(), processor->name()));
863 ChanCount old_pms = processor_max_streams;
865 if (!_session.engine().connected() || !processor) {
870 Glib::RWLock::WriterLock lm (_processor_lock);
871 ProcessorState pstate (this);
873 boost::shared_ptr<PluginInsert> pi;
874 boost::shared_ptr<PortInsert> porti;
876 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
878 if (processor == _amp) {
879 // Ensure only one amp is in the list at any time
880 if (loc != _processors.end()) {
881 if (iter == loc) { // Already in place, do nothing
883 } else { // New position given, relocate
884 _processors.erase (loc);
889 if (loc != _processors.end()) {
890 cerr << "ERROR: Processor added to route twice!" << endl;
897 _processors.insert (loc, processor);
899 // Set up processor list channels. This will set processor->[input|output]_streams(),
900 // configure redirect ports properly, etc.
903 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
905 if (configure_processors_unlocked (err)) {
907 configure_processors_unlocked (0); // it worked before we tried to add it ...
912 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
914 if (pi->natural_input_streams() == ChanCount::ZERO) {
915 /* generator plugin */
916 _have_internal_generator = true;
921 if (activation_allowed) {
922 processor->activate ();
925 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
927 _output->set_user_latency (0);
930 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
931 set_processor_positions ();
937 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
939 const XMLProperty *prop;
942 boost::shared_ptr<Processor> processor;
944 /* bit of a hack: get the `placement' property from the <Redirect> tag here
945 so that we can add the processor in the right place (pre/post-fader)
948 XMLNodeList const & children = node.children ();
949 XMLNodeList::const_iterator i = children.begin ();
951 while (i != children.end() && (*i)->name() != X_("Redirect")) {
955 Placement placement = PreFader;
957 if (i != children.end()) {
958 if ((prop = (*i)->property (X_("placement"))) != 0) {
959 placement = Placement (string_2_enum (prop->value(), placement));
963 if (node.name() == "Insert") {
965 if ((prop = node.property ("type")) != 0) {
967 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
968 prop->value() == "lv2" ||
969 prop->value() == "vst" ||
970 prop->value() == "audiounit") {
972 processor.reset (new PluginInsert (_session));
976 processor.reset (new PortInsert (_session, _pannable, _mute_master));
981 } else if (node.name() == "Send") {
983 processor.reset (new Send (_session, _pannable, _mute_master));
987 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
991 if (processor->set_state (node, version)) {
995 return (add_processor (processor, placement) == 0);
998 catch (failed_constructor &err) {
999 warning << _("processor could not be created. Ignored.") << endmsg;
1005 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1007 /* NOTE: this is intended to be used ONLY when copying
1008 processors from another Route. Hence the subtle
1009 differences between this and ::add_processor()
1012 ProcessorList::iterator loc;
1015 loc = find(_processors.begin(), _processors.end(), before);
1017 /* nothing specified - at end */
1018 loc = _processors.end ();
1021 ChanCount old_pms = processor_max_streams;
1023 if (!_session.engine().connected()) {
1027 if (others.empty()) {
1032 Glib::RWLock::WriterLock lm (_processor_lock);
1033 ProcessorState pstate (this);
1035 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1041 boost::shared_ptr<PluginInsert> pi;
1043 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1047 ProcessorList::iterator inserted = _processors.insert (loc, *i);
1049 if ((*i)->active()) {
1054 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1055 if (configure_processors_unlocked (err)) {
1057 configure_processors_unlocked (0); // it worked before we tried to add it ...
1062 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1065 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1066 boost::shared_ptr<PluginInsert> pi;
1068 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1069 if (pi->is_generator()) {
1070 _have_internal_generator = true;
1076 _output->set_user_latency (0);
1079 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1080 set_processor_positions ();
1086 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1088 if (p == PreFader) {
1089 start = _processors.begin();
1090 end = find(_processors.begin(), _processors.end(), _amp);
1092 start = find(_processors.begin(), _processors.end(), _amp);
1094 end = _processors.end();
1098 /** Turn off all processors with a given placement
1099 * @param p Placement of processors to disable
1102 Route::disable_processors (Placement p)
1104 Glib::RWLock::ReaderLock lm (_processor_lock);
1106 ProcessorList::iterator start, end;
1107 placement_range(p, start, end);
1109 for (ProcessorList::iterator i = start; i != end; ++i) {
1110 (*i)->deactivate ();
1113 _session.set_dirty ();
1116 /** Turn off all redirects
1119 Route::disable_processors ()
1121 Glib::RWLock::ReaderLock lm (_processor_lock);
1123 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1124 (*i)->deactivate ();
1127 _session.set_dirty ();
1130 /** Turn off all redirects with a given placement
1131 * @param p Placement of redirects to disable
1134 Route::disable_plugins (Placement p)
1136 Glib::RWLock::ReaderLock lm (_processor_lock);
1138 ProcessorList::iterator start, end;
1139 placement_range(p, start, end);
1141 for (ProcessorList::iterator i = start; i != end; ++i) {
1142 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1143 (*i)->deactivate ();
1147 _session.set_dirty ();
1150 /** Turn off all plugins
1153 Route::disable_plugins ()
1155 Glib::RWLock::ReaderLock lm (_processor_lock);
1157 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1158 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1159 (*i)->deactivate ();
1163 _session.set_dirty ();
1168 Route::ab_plugins (bool forward)
1170 Glib::RWLock::ReaderLock lm (_processor_lock);
1174 /* forward = turn off all active redirects, and mark them so that the next time
1175 we go the other way, we will revert them
1178 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1179 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1183 if ((*i)->active()) {
1184 (*i)->deactivate ();
1185 (*i)->set_next_ab_is_active (true);
1187 (*i)->set_next_ab_is_active (false);
1193 /* backward = if the redirect was marked to go active on the next ab, do so */
1195 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1197 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1201 if ((*i)->get_next_ab_is_active()) {
1204 (*i)->deactivate ();
1209 _session.set_dirty ();
1213 /** Remove processors with a given placement.
1214 * @param p Placement of processors to remove.
1217 Route::clear_processors (Placement p)
1219 const ChanCount old_pms = processor_max_streams;
1221 if (!_session.engine().connected()) {
1225 bool already_deleting = _session.deletion_in_progress();
1226 if (!already_deleting) {
1227 _session.set_deletion_in_progress();
1231 Glib::RWLock::WriterLock lm (_processor_lock);
1232 ProcessorList new_list;
1233 ProcessorStreams err;
1234 bool seen_amp = false;
1236 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1242 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1244 /* you can't remove these */
1246 new_list.push_back (*i);
1253 new_list.push_back (*i);
1256 (*i)->drop_references ();
1264 (*i)->drop_references ();
1267 new_list.push_back (*i);
1274 _processors = new_list;
1277 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1278 configure_processors_unlocked (&err); // this can't fail
1282 processor_max_streams.reset();
1283 _have_internal_generator = false;
1284 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1285 set_processor_positions ();
1287 if (!already_deleting) {
1288 _session.clear_deletion_in_progress();
1293 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1295 /* these can never be removed */
1297 if (processor == _amp || processor == _meter || processor == _main_outs) {
1301 ChanCount old_pms = processor_max_streams;
1303 if (!_session.engine().connected()) {
1307 processor_max_streams.reset();
1310 Glib::RWLock::WriterLock lm (_processor_lock);
1311 ProcessorState pstate (this);
1313 ProcessorList::iterator i;
1314 bool removed = false;
1316 for (i = _processors.begin(); i != _processors.end(); ) {
1317 if (*i == processor) {
1319 /* move along, see failure case for configure_processors()
1320 where we may need to reconfigure the processor.
1323 /* stop redirects that send signals to JACK ports
1324 from causing noise as a result of no longer being
1328 boost::shared_ptr<IOProcessor> iop;
1330 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1332 iop->input()->disconnect (this);
1334 if (iop->output()) {
1335 iop->output()->disconnect (this);
1339 i = _processors.erase (i);
1347 _output->set_user_latency (0);
1356 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1358 if (configure_processors_unlocked (err)) {
1360 /* we know this will work, because it worked before :) */
1361 configure_processors_unlocked (0);
1366 _have_internal_generator = false;
1368 for (i = _processors.begin(); i != _processors.end(); ++i) {
1369 boost::shared_ptr<PluginInsert> pi;
1371 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1372 if (pi->is_generator()) {
1373 _have_internal_generator = true;
1380 processor->drop_references ();
1381 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1382 set_processor_positions ();
1388 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1390 ProcessorList deleted;
1392 if (!_session.engine().connected()) {
1396 processor_max_streams.reset();
1399 Glib::RWLock::WriterLock lm (_processor_lock);
1400 ProcessorState pstate (this);
1402 ProcessorList::iterator i;
1403 boost::shared_ptr<Processor> processor;
1405 for (i = _processors.begin(); i != _processors.end(); ) {
1409 /* these can never be removed */
1411 if (processor == _amp || processor == _meter || processor == _main_outs) {
1416 /* see if its in the list of processors to delete */
1418 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1423 /* stop IOProcessors that send to JACK ports
1424 from causing noise as a result of no longer being
1428 boost::shared_ptr<IOProcessor> iop;
1430 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1434 deleted.push_back (processor);
1435 i = _processors.erase (i);
1438 if (deleted.empty()) {
1439 /* none of those in the requested list were found */
1443 _output->set_user_latency (0);
1446 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1448 if (configure_processors_unlocked (err)) {
1450 /* we know this will work, because it worked before :) */
1451 configure_processors_unlocked (0);
1456 _have_internal_generator = false;
1458 for (i = _processors.begin(); i != _processors.end(); ++i) {
1459 boost::shared_ptr<PluginInsert> pi;
1461 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1462 if (pi->is_generator()) {
1463 _have_internal_generator = true;
1470 /* now try to do what we need to so that those that were removed will be deleted */
1472 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1473 (*i)->drop_references ();
1476 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1477 set_processor_positions ();
1482 /** Caller must hold process lock */
1484 Route::configure_processors (ProcessorStreams* err)
1486 assert (!AudioEngine::instance()->process_lock().trylock());
1488 if (!_in_configure_processors) {
1489 Glib::RWLock::WriterLock lm (_processor_lock);
1490 return configure_processors_unlocked (err);
1497 Route::input_streams () const
1499 return _input->n_ports ();
1502 list<pair<ChanCount, ChanCount> >
1503 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1505 Glib::RWLock::ReaderLock lm (_processor_lock);
1507 return try_configure_processors_unlocked (in, err);
1510 list<pair<ChanCount, ChanCount> >
1511 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1513 // Check each processor in order to see if we can configure as requested
1515 list<pair<ChanCount, ChanCount> > configuration;
1518 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1519 DEBUG_TRACE (DEBUG::Processors, "{\n");
1521 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1523 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1524 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1528 if ((*p)->can_support_io_configuration(in, out)) {
1529 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1530 configuration.push_back(make_pair(in, out));
1537 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1538 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1539 DEBUG_TRACE (DEBUG::Processors, "}\n");
1540 return list<pair<ChanCount, ChanCount> > ();
1544 DEBUG_TRACE (DEBUG::Processors, "}\n");
1546 return configuration;
1549 /** Set the input/output configuration of each processor in the processors list.
1550 * Caller must hold process lock.
1551 * Return 0 on success, otherwise configuration is impossible.
1554 Route::configure_processors_unlocked (ProcessorStreams* err)
1556 assert (!AudioEngine::instance()->process_lock().trylock());
1558 if (_in_configure_processors) {
1562 /* put invisible processors where they should be */
1563 setup_invisible_processors ();
1565 _in_configure_processors = true;
1567 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1569 if (configuration.empty ()) {
1570 _in_configure_processors = false;
1576 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1577 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1579 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1583 (*p)->configure_io(c->first, c->second);
1584 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1585 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1590 _meter->reset_max_channels (processor_max_streams);
1593 /* make sure we have sufficient scratch buffers to cope with the new processor
1595 _session.ensure_buffers (n_process_buffers ());
1597 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1599 _in_configure_processors = false;
1604 Route::all_processors_flip ()
1606 Glib::RWLock::ReaderLock lm (_processor_lock);
1608 if (_processors.empty()) {
1612 bool first_is_on = _processors.front()->active();
1614 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1616 (*i)->deactivate ();
1622 _session.set_dirty ();
1625 /** Set all processors with a given placement to a given active state.
1626 * @param p Placement of processors to change.
1627 * @param state New active state for those processors.
1630 Route::all_processors_active (Placement p, bool state)
1632 Glib::RWLock::ReaderLock lm (_processor_lock);
1634 if (_processors.empty()) {
1637 ProcessorList::iterator start, end;
1638 placement_range(p, start, end);
1640 bool before_amp = true;
1641 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1646 if (p == PreFader && before_amp) {
1650 (*i)->deactivate ();
1655 _session.set_dirty ();
1659 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1661 bool pre_fader = true;
1662 Glib::RWLock::ReaderLock lm (_processor_lock);
1664 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1666 /* semantic note: if p == amp, we want to return true, so test
1667 for equality before checking if this is the amp
1684 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1686 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1687 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1688 processors in the current actual processor list that are hidden. Any visible processors
1689 in the current list but not in "new_order" will be assumed to be deleted.
1693 Glib::RWLock::WriterLock lm (_processor_lock);
1694 ProcessorState pstate (this);
1696 ProcessorList::iterator oiter;
1697 ProcessorList::const_iterator niter;
1698 ProcessorList as_it_will_be;
1700 oiter = _processors.begin();
1701 niter = new_order.begin();
1703 while (niter != new_order.end()) {
1705 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1706 then append it to the temp list.
1708 Otherwise, see if the next processor in the old list is in the new list. if not,
1709 its been deleted. If its there, append it to the temp list.
1712 if (oiter == _processors.end()) {
1714 /* no more elements in the old list, so just stick the rest of
1715 the new order onto the temp list.
1718 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1719 while (niter != new_order.end()) {
1726 if (!(*oiter)->display_to_user()) {
1728 as_it_will_be.push_back (*oiter);
1732 /* visible processor: check that its in the new order */
1734 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1735 /* deleted: do nothing, shared_ptr<> will clean up */
1737 /* ignore this one, and add the next item from the new order instead */
1738 as_it_will_be.push_back (*niter);
1743 /* now remove from old order - its taken care of no matter what */
1744 oiter = _processors.erase (oiter);
1749 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1752 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1754 if (configure_processors_unlocked (err)) {
1761 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1762 set_processor_positions ();
1774 Route::get_template()
1776 return state(false);
1780 Route::state(bool full_state)
1782 XMLNode *node = new XMLNode("Route");
1783 ProcessorList::iterator i;
1786 id().print (buf, sizeof (buf));
1787 node->add_property("id", buf);
1788 node->add_property ("name", _name);
1789 node->add_property("default-type", _default_type.to_string());
1792 node->add_property("flags", enum_2_string (_flags));
1795 node->add_property("active", _active?"yes":"no");
1797 boost::to_string (_phase_invert, p);
1798 node->add_property("phase-invert", p);
1799 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1800 node->add_property("meter-point", enum_2_string (_meter_point));
1803 node->add_property("route-group", _route_group->name());
1806 string order_string;
1807 OrderKeys::iterator x = order_keys.begin();
1809 while (x != order_keys.end()) {
1810 order_string += string ((*x).first);
1811 order_string += '=';
1812 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1813 order_string += buf;
1817 if (x == order_keys.end()) {
1821 order_string += ':';
1823 node->add_property ("order-keys", order_string);
1824 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1825 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1826 node->add_property ("soloed-by-upstream", buf);
1827 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1828 node->add_property ("soloed-by-downstream", buf);
1829 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1830 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1832 node->add_child_nocopy (_input->state (full_state));
1833 node->add_child_nocopy (_output->state (full_state));
1834 node->add_child_nocopy (_solo_control->get_state ());
1835 node->add_child_nocopy (_mute_control->get_state ());
1836 node->add_child_nocopy (_mute_master->get_state ());
1838 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1839 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1840 remote_control_node->add_property (X_("id"), buf);
1841 node->add_child_nocopy (*remote_control_node);
1843 if (_comment.length()) {
1844 XMLNode *cmt = node->add_child ("Comment");
1845 cmt->add_content (_comment);
1848 node->add_child_nocopy (_pannable->state (full_state));
1850 for (i = _processors.begin(); i != _processors.end(); ++i) {
1851 node->add_child_nocopy((*i)->state (full_state));
1855 node->add_child_copy (*_extra_xml);
1862 Route::set_state (const XMLNode& node, int version)
1864 return _set_state (node, version, true);
1868 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1870 if (version < 3000) {
1871 return _set_state_2X (node, version);
1875 XMLNodeConstIterator niter;
1877 const XMLProperty *prop;
1879 if (node.name() != "Route"){
1880 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1884 if ((prop = node.property (X_("name"))) != 0) {
1885 Route::set_name (prop->value());
1888 if ((prop = node.property ("id")) != 0) {
1889 _id = prop->value ();
1892 if ((prop = node.property (X_("flags"))) != 0) {
1893 _flags = Flag (string_2_enum (prop->value(), _flags));
1898 if (is_master() || is_monitor() || is_hidden()) {
1899 _mute_master->set_solo_ignore (true);
1902 /* add all processors (except amp, which is always present) */
1904 nlist = node.children();
1905 XMLNode processor_state (X_("processor_state"));
1907 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1911 if (child->name() == IO::state_node_name) {
1912 if ((prop = child->property (X_("direction"))) == 0) {
1916 if (prop->value() == "Input") {
1917 _input->set_state (*child, version);
1918 } else if (prop->value() == "Output") {
1919 _output->set_state (*child, version);
1923 if (child->name() == X_("Processor")) {
1924 processor_state.add_child_copy (*child);
1928 if (child->name() == X_("Pannable")) {
1929 _pannable->set_state (*child, version);
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);
2145 _mute_master->set_muted_by_self (true);
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);
2350 } else if (prop->value() == "capture") {
2351 _capturing_processor.reset (new CapturingProcessor (_session));
2353 ProcessorList::iterator o;
2355 for (o = _processors.begin(); o != _processors.end(); ++o) {
2356 XMLProperty* id_prop = (*niter)->property(X_("id"));
2357 if (id_prop && (*o)->id() == id_prop->value()) {
2358 (*o)->set_state (**niter, Stateful::current_state_version);
2359 new_order.push_back (*o);
2364 // If the processor (*niter) is not on the route then create it
2366 if (o == _processors.end()) {
2368 boost::shared_ptr<Processor> processor;
2370 if (prop->value() == "intsend") {
2372 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2373 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2374 prop->value() == "lv2" ||
2375 prop->value() == "vst" ||
2376 prop->value() == "audiounit") {
2378 processor.reset (new PluginInsert(_session));
2380 } else if (prop->value() == "port") {
2382 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2384 } else if (prop->value() == "send") {
2386 processor.reset (new Send (_session, _pannable, _mute_master));
2389 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2393 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2394 /* This processor could not be configured. Turn it into a UnknownProcessor */
2395 processor.reset (new UnknownProcessor (_session, **niter));
2398 /* we have to note the monitor send here, otherwise a new one will be created
2399 and the state of this one will be lost.
2401 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2402 if (isend && isend->role() == Delivery::Listen) {
2403 _monitor_send = isend;
2406 /* it doesn't matter if invisible processors are added here, as they
2407 will be sorted out by setup_invisible_processors () shortly.
2410 new_order.push_back (processor);
2411 must_configure = true;
2417 Glib::RWLock::WriterLock lm (_processor_lock);
2418 _processors = new_order;
2420 if (must_configure) {
2421 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2422 configure_processors_unlocked (0);
2425 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2427 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2429 boost::shared_ptr<PluginInsert> pi;
2431 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2432 if (pi->is_generator()) {
2433 _have_internal_generator = true;
2440 processors_changed (RouteProcessorChange ());
2441 set_processor_positions ();
2445 Route::curve_reallocate ()
2447 // _gain_automation_curve.finish_resize ();
2448 // _pan_automation_curve.finish_resize ();
2452 Route::silence (framecnt_t nframes)
2454 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2459 silence_unlocked (nframes);
2463 Route::silence_unlocked (framecnt_t nframes)
2465 /* Must be called with the processor lock held */
2469 _output->silence (nframes);
2471 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2472 boost::shared_ptr<PluginInsert> pi;
2474 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2475 // skip plugins, they don't need anything when we're not active
2479 (*i)->silence (nframes);
2482 if (nframes == _session.get_block_size()) {
2489 Route::add_internal_return ()
2492 _intreturn.reset (new InternalReturn (_session));
2493 add_processor (_intreturn, PreFader);
2498 Route::add_send_to_internal_return (InternalSend* send)
2500 Glib::RWLock::ReaderLock rm (_processor_lock);
2502 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2503 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2506 return d->add_send (send);
2512 Route::remove_send_from_internal_return (InternalSend* send)
2514 Glib::RWLock::ReaderLock rm (_processor_lock);
2516 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2517 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2520 return d->remove_send (send);
2525 /** Add a monitor send (if we don't already have one) but don't activate it */
2527 Route::listen_via_monitor ()
2529 /* master never sends to control outs */
2530 assert (!is_master ());
2532 /* make sure we have one */
2533 if (!_monitor_send) {
2534 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2535 _monitor_send->set_display_to_user (false);
2539 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2540 configure_processors (0);
2545 /** Add an internal send to a route.
2546 * @param route route to send to.
2547 * @param placement placement for the send.
2550 Route::listen_via (boost::shared_ptr<Route> route, Placement placement)
2552 assert (route != _session.monitor_out ());
2555 Glib::RWLock::ReaderLock rm (_processor_lock);
2557 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2559 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2561 if (d && d->target_route() == route) {
2562 /* already listening via the specified IO: do nothing */
2569 boost::shared_ptr<InternalSend> listener (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2570 add_processor (listener, placement);
2572 } catch (failed_constructor& err) {
2580 Route::drop_listen (boost::shared_ptr<Route> route)
2582 ProcessorStreams err;
2583 ProcessorList::iterator tmp;
2585 Glib::RWLock::ReaderLock rl(_processor_lock);
2589 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2591 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2593 if (d && d->target_route() == route) {
2595 remove_processor (*x, &err);
2598 /* list could have been demolished while we dropped the lock
2608 if (route == _session.monitor_out()) {
2609 _monitor_send.reset ();
2614 Route::set_comment (string cmt, void *src)
2617 comment_changed (src);
2618 _session.set_dirty ();
2622 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2624 FeedRecord fr (other, via_sends_only);
2626 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2628 if (!result.second) {
2630 /* already a record for "other" - make sure sends-only information is correct */
2631 if (!via_sends_only && result.first->sends_only) {
2632 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2633 frp->sends_only = false;
2637 return result.second;
2641 Route::clear_fed_by ()
2647 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2649 const FedBy& fed_by (other->fed_by());
2651 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2652 boost::shared_ptr<Route> sr = f->r.lock();
2654 if (sr && (sr.get() == this)) {
2656 if (via_sends_only) {
2657 *via_sends_only = f->sends_only;
2668 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2670 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2672 if (_output->connected_to (other->input())) {
2673 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2682 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2684 boost::shared_ptr<IOProcessor> iop;
2686 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2687 if (iop->feeds (other)) {
2688 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2694 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2697 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2702 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2706 /** Called from the (non-realtime) butler thread when the transport is stopped */
2708 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2710 framepos_t now = _session.transport_frame();
2713 Glib::RWLock::ReaderLock lm (_processor_lock);
2716 automation_snapshot (now, true);
2719 Automatable::transport_stopped (now);
2721 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2723 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2727 (*i)->transport_stopped (now);
2731 _roll_delay = _initial_delay;
2734 /** Called with the process lock held if change contains ConfigurationChanged */
2736 Route::input_change_handler (IOChange change, void * /*src*/)
2738 if ((change.type & IOChange::ConfigurationChanged)) {
2739 configure_processors (0);
2740 _phase_invert.resize (_input->n_ports().n_audio ());
2741 io_changed (); /* EMIT SIGNAL */
2745 /** Called with the process lock held if change contains ConfigurationChanged */
2747 Route::output_change_handler (IOChange change, void * /*src*/)
2749 if ((change.type & IOChange::ConfigurationChanged)) {
2751 /* XXX resize all listeners to match _main_outs? */
2753 /* Auto-connect newly-created outputs, unless we're auto-connecting to master
2754 and we are master (as an auto-connect in this situation would cause a
2758 AutoConnectOption ac = Config->get_output_auto_connect ();
2760 if (ac == AutoConnectPhysical || (ac == AutoConnectMaster && !is_master ())) {
2762 ChanCount start = change.before;
2764 for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
2765 if (change.before.get(*i) < change.after.get(*i)) {
2766 /* the existing ChanCounts don't matter for this call as they are only
2767 to do with matching input and output indices, and we are only changing
2772 /* only auto-connect the newly-created outputs, not the ones that were
2775 start.set (*i, start.get (*i) + 1);
2777 _session.auto_connect_route (this, dummy, dummy, false, false, ChanCount(), change.before);
2782 // configure_processors (0);
2787 Route::pans_required () const
2789 if (n_outputs().n_audio() < 2) {
2793 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2797 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
2798 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2800 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2805 if (n_outputs().n_total() == 0) {
2809 if (!_active || n_inputs() == ChanCount::ZERO) {
2810 silence_unlocked (nframes);
2813 if (session_state_changing) {
2814 if (_session.transport_speed() != 0.0f) {
2815 /* we're rolling but some state is changing (e.g. our diskstream contents)
2816 so we cannot use them. Be silent till this is over.
2818 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2820 silence_unlocked (nframes);
2823 /* we're really not rolling, so we're either delivery silence or actually
2824 monitoring, both of which are safe to do while session_state_changing is true.
2828 _amp->apply_gain_automation (false);
2829 passthru (start_frame, end_frame, nframes, 0);
2835 Route::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
2837 if (_roll_delay > nframes) {
2839 _roll_delay -= nframes;
2840 silence_unlocked (nframes);
2841 /* transport frame is not legal for caller to use */
2844 } else if (_roll_delay > 0) {
2846 nframes -= _roll_delay;
2847 silence_unlocked (_roll_delay);
2848 transport_frame += _roll_delay;
2850 /* shuffle all the port buffers for things that lead "out" of this Route
2851 to reflect that we just wrote _roll_delay frames of silence.
2854 Glib::RWLock::ReaderLock lm (_processor_lock);
2855 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2856 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2858 iop->increment_port_buffer_offset (_roll_delay);
2861 _output->increment_port_buffer_offset (_roll_delay);
2871 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick,
2872 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2874 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2879 automation_snapshot (_session.transport_frame(), false);
2881 if (n_outputs().n_total() == 0) {
2885 if (!_active || n_inputs().n_total() == 0) {
2886 silence_unlocked (nframes);
2890 framecnt_t unused = 0;
2892 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2898 passthru (start_frame, end_frame, nframes, declick);
2904 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
2905 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2912 Route::toggle_monitor_input ()
2914 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2915 i->ensure_monitor_input( ! i->monitoring_input());
2920 Route::has_external_redirects () const
2922 // FIXME: what about sends? - they don't return a signal back to ardour?
2924 boost::shared_ptr<const PortInsert> pi;
2926 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2928 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2930 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2932 string port_name = port->name();
2933 string client_name = port_name.substr (0, port_name.find(':'));
2935 /* only say "yes" if the redirect is actually in use */
2937 if (client_name != "ardour" && pi->active()) {
2948 Route::flush_processors ()
2950 /* XXX shouldn't really try to take this lock, since
2951 this is called from the RT audio thread.
2954 Glib::RWLock::ReaderLock lm (_processor_lock);
2956 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2962 Route::set_meter_point (MeterPoint p, bool force)
2964 /* CAN BE CALLED FROM PROCESS CONTEXT */
2966 if (_meter_point == p && !force) {
2972 bool meter_was_visible_to_user = _meter->display_to_user ();
2975 Glib::RWLock::WriterLock lm (_processor_lock);
2977 if (_meter_point != MeterCustom) {
2979 _meter->set_display_to_user (false);
2981 setup_invisible_processors ();
2983 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2987 if (loc == _processors.begin()) {
2988 m_in = _input->n_ports();
2990 ProcessorList::iterator before = loc;
2992 m_in = (*before)->output_streams ();
2995 _meter->reflect_inputs (m_in);
2997 /* we do not need to reconfigure the processors, because the meter
2998 (a) is always ready to handle processor_max_streams
2999 (b) is always an N-in/N-out processor, and thus moving
3000 it doesn't require any changes to the other processors.
3005 // just make it visible and let the user move it
3007 _meter->set_display_to_user (true);
3011 meter_change (); /* EMIT SIGNAL */
3013 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3015 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3019 Route::listen_position_changed ()
3022 Glib::RWLock::WriterLock lm (_processor_lock);
3023 ProcessorState pstate (this);
3026 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3028 if (configure_processors_unlocked (0)) {
3030 configure_processors_unlocked (0); // it worked before we tried to add it ...
3036 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3037 _session.set_dirty ();
3040 boost::shared_ptr<CapturingProcessor>
3041 Route::add_export_point()
3043 if (!_capturing_processor) {
3045 _capturing_processor.reset (new CapturingProcessor (_session));
3046 _capturing_processor->activate ();
3049 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3050 configure_processors (0);
3055 return _capturing_processor;
3059 Route::update_signal_latency ()
3061 framecnt_t l = _output->user_latency();
3063 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3064 if ((*i)->active ()) {
3065 l += (*i)->signal_latency ();
3069 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3071 if (_signal_latency != l) {
3072 _signal_latency = l;
3073 signal_latency_changed (); /* EMIT SIGNAL */
3076 return _signal_latency;
3080 Route::set_user_latency (framecnt_t nframes)
3082 _output->set_user_latency (nframes);
3083 _session.update_latency_compensation ();
3087 Route::set_latency_compensation (framecnt_t longest_session_latency)
3089 framecnt_t old = _initial_delay;
3091 if (_signal_latency < longest_session_latency) {
3092 _initial_delay = longest_session_latency - _signal_latency;
3097 DEBUG_TRACE (DEBUG::Latency, string_compose (
3098 "%1: compensate for maximum latency of %2,"
3099 "given own latency of %3, using initial delay of %4\n",
3100 name(), longest_session_latency, _signal_latency, _initial_delay));
3102 if (_initial_delay != old) {
3103 initial_delay_changed (); /* EMIT SIGNAL */
3106 if (_session.transport_stopped()) {
3107 _roll_delay = _initial_delay;
3112 Route::automation_snapshot (framepos_t now, bool force)
3114 _pannable->automation_snapshot (now, force);
3115 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3116 (*i)->automation_snapshot (now, force);
3120 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3121 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3122 boost::shared_ptr<AutomationList>(), name)
3125 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3130 Route::SoloControllable::set_value (double val)
3132 bool bval = ((val >= 0.5f) ? true: false);
3134 boost::shared_ptr<RouteList> rl (new RouteList);
3136 boost::shared_ptr<Route> r = _route.lock ();
3143 if (Config->get_solo_control_is_listen_control()) {
3144 _session.set_listen (rl, bval);
3146 _session.set_solo (rl, bval);
3151 Route::SoloControllable::get_value () const
3153 boost::shared_ptr<Route> r = _route.lock ();
3158 if (Config->get_solo_control_is_listen_control()) {
3159 return r->listening_via_monitor() ? 1.0f : 0.0f;
3161 return r->self_soloed() ? 1.0f : 0.0f;
3165 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3166 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3167 boost::shared_ptr<AutomationList>(), name)
3170 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3175 Route::MuteControllable::set_value (double val)
3177 bool bval = ((val >= 0.5f) ? true: false);
3179 boost::shared_ptr<RouteList> rl (new RouteList);
3181 boost::shared_ptr<Route> r = _route.lock ();
3187 _session.set_mute (rl, bval);
3191 Route::MuteControllable::get_value () const
3193 boost::shared_ptr<Route> r = _route.lock ();
3198 return r->muted() ? 1.0f : 0.0f;
3202 Route::set_block_size (pframes_t nframes)
3204 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3205 (*i)->set_block_size (nframes);
3208 _session.ensure_buffers (n_process_buffers ());
3212 Route::protect_automation ()
3214 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3215 (*i)->protect_automation();
3219 Route::set_pending_declick (int declick)
3222 /* this call is not allowed to turn off a pending declick unless "force" is true */
3224 _pending_declick = declick;
3226 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3228 _pending_declick = 0;
3233 /** Shift automation forwards from a particular place, thereby inserting time.
3234 * Adds undo commands for any shifts that are performed.
3236 * @param pos Position to start shifting from.
3237 * @param frames Amount to shift forwards by.
3241 Route::shift (framepos_t pos, framecnt_t frames)
3243 /* gain automation */
3245 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3247 XMLNode &before = gc->alist()->get_state ();
3248 gc->alist()->shift (pos, frames);
3249 XMLNode &after = gc->alist()->get_state ();
3250 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3253 /* pan automation */
3255 ControlSet::Controls& c (_pannable->controls());
3257 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3258 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3260 boost::shared_ptr<AutomationList> al = pc->alist();
3261 XMLNode& before = al->get_state ();
3262 al->shift (pos, frames);
3263 XMLNode& after = al->get_state ();
3264 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3269 /* redirect automation */
3271 Glib::RWLock::ReaderLock lm (_processor_lock);
3272 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3274 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3276 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3277 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3279 boost::shared_ptr<AutomationList> al = ac->alist();
3280 XMLNode &before = al->get_state ();
3281 al->shift (pos, frames);
3282 XMLNode &after = al->get_state ();
3283 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3292 Route::save_as_template (const string& path, const string& name)
3294 XMLNode& node (state (false));
3297 IO::set_name_in_state (*node.children().front(), name);
3299 tree.set_root (&node);
3300 return tree.write (path.c_str());
3305 Route::set_name (const string& str)
3311 name = Route::ensure_track_or_route_name (str, _session);
3312 SessionObject::set_name (name);
3314 ret = (_input->set_name(name) && _output->set_name(name));
3318 Glib::RWLock::ReaderLock lm (_processor_lock);
3320 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3322 /* rename all I/O processors that have inputs or outputs */
3324 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3326 if (iop && (iop->output() || iop->input())) {
3327 if (!iop->set_name (name)) {
3338 boost::shared_ptr<Send>
3339 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3341 Glib::RWLock::ReaderLock lm (_processor_lock);
3343 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3344 boost::shared_ptr<InternalSend> send;
3346 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3347 if (send->target_route() == target) {
3353 return boost::shared_ptr<Send>();
3356 /** @param c Audio channel index.
3357 * @param yn true to invert phase, otherwise false.
3360 Route::set_phase_invert (uint32_t c, bool yn)
3362 if (_phase_invert[c] != yn) {
3363 _phase_invert[c] = yn;
3364 phase_invert_changed (); /* EMIT SIGNAL */
3365 _session.set_dirty ();
3370 Route::set_phase_invert (boost::dynamic_bitset<> p)
3372 if (_phase_invert != p) {
3374 phase_invert_changed (); /* EMIT SIGNAL */
3375 _session.set_dirty ();
3380 Route::phase_invert (uint32_t c) const
3382 return _phase_invert[c];
3385 boost::dynamic_bitset<>
3386 Route::phase_invert () const
3388 return _phase_invert;
3392 Route::set_denormal_protection (bool yn)
3394 if (_denormal_protection != yn) {
3395 _denormal_protection = yn;
3396 denormal_protection_changed (); /* EMIT SIGNAL */
3401 Route::denormal_protection () const
3403 return _denormal_protection;
3407 Route::set_active (bool yn, void* src)
3409 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3410 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3414 if (_active != yn) {
3416 _input->set_active (yn);
3417 _output->set_active (yn);
3418 active_changed (); // EMIT SIGNAL
3425 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3431 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3433 boost::shared_ptr<Send> s;
3434 boost::shared_ptr<Return> r;
3436 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3437 s->meter()->meter();
3438 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3439 r->meter()->meter ();
3444 boost::shared_ptr<Pannable>
3445 Route::pannable() const
3450 boost::shared_ptr<Panner>
3451 Route::panner() const
3454 return _main_outs->panner_shell()->panner();
3457 boost::shared_ptr<PannerShell>
3458 Route::panner_shell() const
3460 return _main_outs->panner_shell();
3463 boost::shared_ptr<AutomationControl>
3464 Route::gain_control() const
3466 return _amp->gain_control();
3469 boost::shared_ptr<AutomationControl>
3470 Route::get_control (const Evoral::Parameter& param)
3472 /* either we own the control or .... */
3474 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3478 /* maybe one of our processors does or ... */
3480 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3481 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3482 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3490 /* nobody does so we'll make a new one */
3492 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3499 boost::shared_ptr<Processor>
3500 Route::nth_plugin (uint32_t n)
3502 Glib::RWLock::ReaderLock lm (_processor_lock);
3503 ProcessorList::iterator i;
3505 for (i = _processors.begin(); i != _processors.end(); ++i) {
3506 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3513 return boost::shared_ptr<Processor> ();
3516 boost::shared_ptr<Processor>
3517 Route::nth_send (uint32_t n)
3519 Glib::RWLock::ReaderLock lm (_processor_lock);
3520 ProcessorList::iterator i;
3522 for (i = _processors.begin(); i != _processors.end(); ++i) {
3523 if (boost::dynamic_pointer_cast<Send> (*i)) {
3530 return boost::shared_ptr<Processor> ();
3534 Route::has_io_processor_named (const string& name)
3536 Glib::RWLock::ReaderLock lm (_processor_lock);
3537 ProcessorList::iterator i;
3539 for (i = _processors.begin(); i != _processors.end(); ++i) {
3540 if (boost::dynamic_pointer_cast<Send> (*i) ||
3541 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3542 if ((*i)->name() == name) {
3551 MuteMaster::MutePoint
3552 Route::mute_points () const
3554 return _mute_master->mute_points ();
3558 Route::set_processor_positions ()
3560 Glib::RWLock::ReaderLock lm (_processor_lock);
3562 bool had_amp = false;
3563 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3564 (*i)->set_pre_fader (!had_amp);
3565 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3571 /** Called when there is a proposed change to the input port count */
3573 Route::input_port_count_changing (ChanCount to)
3575 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3577 /* The processors cannot be configured with the new input arrangement, so
3583 /* The change is ok */
3588 Route::unknown_processors () const
3592 Glib::RWLock::ReaderLock lm (_processor_lock);
3593 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3594 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3595 p.push_back ((*i)->name ());
3604 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3606 /* we assume that all our input ports feed all our output ports. its not
3607 universally true, but the alternative is way too corner-case to worry about.
3610 jack_latency_range_t all_connections;
3612 all_connections.min = ~((jack_nframes_t) 0);
3613 all_connections.max = 0;
3615 /* iterate over all "from" ports and determine the latency range for all of their
3616 connections to the "outside" (outside of this Route).
3619 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3621 jack_latency_range_t range;
3623 p->get_connected_latency_range (range, playback);
3625 all_connections.min = min (all_connections.min, range.min);
3626 all_connections.max = max (all_connections.max, range.max);
3629 /* set the "from" port latencies to the max/min range of all their connections */
3631 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3632 p->set_private_latency_range (all_connections, playback);
3635 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3637 all_connections.min += our_latency;
3638 all_connections.max += our_latency;
3640 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3641 p->set_private_latency_range (all_connections, playback);
3644 return all_connections.max;
3648 Route::set_private_port_latencies (bool playback) const
3650 framecnt_t own_latency = 0;
3652 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3653 OR LATENCY CALLBACK.
3655 This is called (early) from the latency callback. It computes the REAL
3656 latency associated with each port and stores the result as the "private"
3657 latency of the port. A later call to Route::set_public_port_latencies()
3658 sets all ports to the same value to reflect the fact that we do latency
3659 compensation and so all signals are delayed by the same amount as they
3660 flow through ardour.
3663 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3664 if ((*i)->active ()) {
3665 own_latency += (*i)->signal_latency ();
3670 /* playback: propagate latency from "outside the route" to outputs to inputs */
3671 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3673 /* capture: propagate latency from "outside the route" to inputs to outputs */
3674 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3679 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3681 /* this is called to set the JACK-visible port latencies, which take
3682 latency compensation into account.
3685 jack_latency_range_t range;
3691 const PortSet& ports (_input->ports());
3692 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3693 p->set_public_latency_range (range, playback);
3698 const PortSet& ports (_output->ports());
3699 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3700 p->set_public_latency_range (range, playback);
3705 /** Put the invisible processors in the right place in _processors.
3706 * Must be called with a writer lock on _processor_lock held.
3709 Route::setup_invisible_processors ()
3712 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3713 assert (!lm.locked ());
3717 /* too early to be doing this stuff */
3721 /* we'll build this new list here and then use it */
3723 ProcessorList new_processors;
3725 /* find visible processors */
3727 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3728 if ((*i)->display_to_user ()) {
3729 new_processors.push_back (*i);
3735 ProcessorList::iterator amp = new_processors.begin ();
3736 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3740 assert (amp != _processors.end ());
3742 /* and the processor after the amp */
3744 ProcessorList::iterator after_amp = amp;
3750 switch (_meter_point) {
3752 assert (!_meter->display_to_user ());
3753 new_processors.push_front (_meter);
3756 assert (!_meter->display_to_user ());
3757 new_processors.insert (amp, _meter);
3759 case MeterPostFader:
3760 /* do nothing here */
3763 /* do nothing here */
3766 /* the meter is visible, so we don't touch it here */
3773 assert (_main_outs);
3774 assert (!_main_outs->display_to_user ());
3775 new_processors.push_back (_main_outs);
3777 /* iterator for the main outs */
3779 ProcessorList::iterator main = new_processors.end();
3782 /* OUTPUT METERING */
3784 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3785 assert (!_meter->display_to_user ());
3787 /* add the processor just before or just after the main outs */
3789 ProcessorList::iterator meter_point = main;
3791 if (_meter_point == MeterOutput) {
3794 new_processors.insert (meter_point, _meter);
3799 if (_monitor_send && !is_monitor ()) {
3800 assert (!_monitor_send->display_to_user ());
3801 if (Config->get_solo_control_is_listen_control()) {
3802 switch (Config->get_listen_position ()) {
3803 case PreFaderListen:
3804 switch (Config->get_pfl_position ()) {
3805 case PFLFromBeforeProcessors:
3806 new_processors.push_front (_monitor_send);
3808 case PFLFromAfterProcessors:
3809 new_processors.insert (amp, _monitor_send);
3813 case AfterFaderListen:
3814 switch (Config->get_afl_position ()) {
3815 case AFLFromBeforeProcessors:
3816 new_processors.insert (after_amp, _monitor_send);
3818 case AFLFromAfterProcessors:
3819 new_processors.insert (new_processors.end(), _monitor_send);
3825 new_processors.insert (new_processors.end(), _monitor_send);
3829 /* MONITOR CONTROL */
3831 if (_monitor_control && is_monitor ()) {
3832 assert (!_monitor_control->display_to_user ());
3833 new_processors.push_front (_monitor_control);
3836 /* INTERNAL RETURN */
3838 /* doing this here means that any monitor control will come just after
3843 assert (!_intreturn->display_to_user ());
3844 new_processors.push_front (_intreturn);
3847 /* EXPORT PROCESSOR */
3849 if (_capturing_processor) {
3850 assert (!_capturing_processor->display_to_user ());
3851 new_processors.push_front (_capturing_processor);
3854 _processors = new_processors;
3856 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3857 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3858 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3863 Route::should_monitor () const
3865 switch (Config->get_monitoring_model()) {
3866 case HardwareMonitoring:
3867 case ExternalMonitoring:
3868 return !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());