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 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1 adding processor %2\n", name(), processor->name()));
876 ChanCount old_pms = processor_max_streams;
878 if (!_session.engine().connected() || !processor) {
883 Glib::RWLock::WriterLock lm (_processor_lock);
884 ProcessorState pstate (this);
886 boost::shared_ptr<PluginInsert> pi;
887 boost::shared_ptr<PortInsert> porti;
889 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
891 if (processor == _amp) {
892 // Ensure only one amp is in the list at any time
893 if (loc != _processors.end()) {
894 if (iter == loc) { // Already in place, do nothing
896 } else { // New position given, relocate
897 _processors.erase (loc);
902 if (loc != _processors.end()) {
903 cerr << "ERROR: Processor added to route twice!" << endl;
910 _processors.insert (loc, processor);
912 // Set up processor list channels. This will set processor->[input|output]_streams(),
913 // configure redirect ports properly, etc.
916 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
918 if (configure_processors_unlocked (err)) {
920 configure_processors_unlocked (0); // it worked before we tried to add it ...
925 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
927 if (pi->natural_input_streams() == ChanCount::ZERO) {
928 /* generator plugin */
929 _have_internal_generator = true;
934 if (activation_allowed) {
935 processor->activate ();
938 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
940 _output->set_user_latency (0);
943 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
944 set_processor_positions ();
950 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
952 const XMLProperty *prop;
955 boost::shared_ptr<Processor> processor;
957 /* bit of a hack: get the `placement' property from the <Redirect> tag here
958 so that we can add the processor in the right place (pre/post-fader)
961 XMLNodeList const & children = node.children ();
962 XMLNodeList::const_iterator i = children.begin ();
964 while (i != children.end() && (*i)->name() != X_("Redirect")) {
968 Placement placement = PreFader;
970 if (i != children.end()) {
971 if ((prop = (*i)->property (X_("placement"))) != 0) {
972 placement = Placement (string_2_enum (prop->value(), placement));
976 if (node.name() == "Insert") {
978 if ((prop = node.property ("type")) != 0) {
980 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
981 prop->value() == "lv2" ||
982 prop->value() == "vst" ||
983 prop->value() == "audiounit") {
985 processor.reset (new PluginInsert (_session));
989 processor.reset (new PortInsert (_session, _pannable, _mute_master));
994 } else if (node.name() == "Send") {
996 processor.reset (new Send (_session, _pannable, _mute_master));
1000 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1004 if (processor->set_state (node, version)) {
1008 return (add_processor (processor, placement) == 0);
1011 catch (failed_constructor &err) {
1012 warning << _("processor could not be created. Ignored.") << endmsg;
1018 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1020 /* NOTE: this is intended to be used ONLY when copying
1021 processors from another Route. Hence the subtle
1022 differences between this and ::add_processor()
1025 ProcessorList::iterator loc;
1028 loc = find(_processors.begin(), _processors.end(), before);
1030 /* nothing specified - at end */
1031 loc = _processors.end ();
1034 ChanCount old_pms = processor_max_streams;
1036 if (!_session.engine().connected()) {
1040 if (others.empty()) {
1045 Glib::RWLock::WriterLock lm (_processor_lock);
1046 ProcessorState pstate (this);
1048 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1054 boost::shared_ptr<PluginInsert> pi;
1056 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1060 ProcessorList::iterator inserted = _processors.insert (loc, *i);
1062 if ((*i)->active()) {
1067 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1068 if (configure_processors_unlocked (err)) {
1070 configure_processors_unlocked (0); // it worked before we tried to add it ...
1075 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false, false));
1078 _output->set_user_latency (0);
1081 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1082 set_processor_positions ();
1088 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1090 if (p == PreFader) {
1091 start = _processors.begin();
1092 end = find(_processors.begin(), _processors.end(), _amp);
1094 start = find(_processors.begin(), _processors.end(), _amp);
1096 end = _processors.end();
1100 /** Turn off all processors with a given placement
1101 * @param p Placement of processors to disable
1104 Route::disable_processors (Placement p)
1106 Glib::RWLock::ReaderLock lm (_processor_lock);
1108 ProcessorList::iterator start, end;
1109 placement_range(p, start, end);
1111 for (ProcessorList::iterator i = start; i != end; ++i) {
1112 (*i)->deactivate ();
1115 _session.set_dirty ();
1118 /** Turn off all redirects
1121 Route::disable_processors ()
1123 Glib::RWLock::ReaderLock lm (_processor_lock);
1125 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1126 (*i)->deactivate ();
1129 _session.set_dirty ();
1132 /** Turn off all redirects with a given placement
1133 * @param p Placement of redirects to disable
1136 Route::disable_plugins (Placement p)
1138 Glib::RWLock::ReaderLock lm (_processor_lock);
1140 ProcessorList::iterator start, end;
1141 placement_range(p, start, end);
1143 for (ProcessorList::iterator i = start; i != end; ++i) {
1144 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1145 (*i)->deactivate ();
1149 _session.set_dirty ();
1152 /** Turn off all plugins
1155 Route::disable_plugins ()
1157 Glib::RWLock::ReaderLock lm (_processor_lock);
1159 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1160 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1161 (*i)->deactivate ();
1165 _session.set_dirty ();
1170 Route::ab_plugins (bool forward)
1172 Glib::RWLock::ReaderLock lm (_processor_lock);
1176 /* forward = turn off all active redirects, and mark them so that the next time
1177 we go the other way, we will revert them
1180 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1181 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1185 if ((*i)->active()) {
1186 (*i)->deactivate ();
1187 (*i)->set_next_ab_is_active (true);
1189 (*i)->set_next_ab_is_active (false);
1195 /* backward = if the redirect was marked to go active on the next ab, do so */
1197 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1199 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1203 if ((*i)->get_next_ab_is_active()) {
1206 (*i)->deactivate ();
1211 _session.set_dirty ();
1215 /** Remove processors with a given placement.
1216 * @param p Placement of processors to remove.
1219 Route::clear_processors (Placement p)
1221 const ChanCount old_pms = processor_max_streams;
1223 if (!_session.engine().connected()) {
1227 bool already_deleting = _session.deletion_in_progress();
1228 if (!already_deleting) {
1229 _session.set_deletion_in_progress();
1233 Glib::RWLock::WriterLock lm (_processor_lock);
1234 ProcessorList new_list;
1235 ProcessorStreams err;
1236 bool seen_amp = false;
1238 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1244 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1246 /* you can't remove these */
1248 new_list.push_back (*i);
1255 new_list.push_back (*i);
1258 (*i)->drop_references ();
1266 (*i)->drop_references ();
1269 new_list.push_back (*i);
1276 _processors = new_list;
1279 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1280 configure_processors_unlocked (&err); // this can't fail
1284 processor_max_streams.reset();
1285 _have_internal_generator = false;
1286 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1287 set_processor_positions ();
1289 if (!already_deleting) {
1290 _session.clear_deletion_in_progress();
1295 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1297 /* these can never be removed */
1299 if (processor == _amp || processor == _meter || processor == _main_outs) {
1303 ChanCount old_pms = processor_max_streams;
1305 if (!_session.engine().connected()) {
1309 processor_max_streams.reset();
1312 Glib::RWLock::WriterLock lm (_processor_lock);
1313 ProcessorState pstate (this);
1315 ProcessorList::iterator i;
1316 bool removed = false;
1318 for (i = _processors.begin(); i != _processors.end(); ) {
1319 if (*i == processor) {
1321 /* move along, see failure case for configure_processors()
1322 where we may need to reconfigure the processor.
1325 /* stop redirects that send signals to JACK ports
1326 from causing noise as a result of no longer being
1330 boost::shared_ptr<IOProcessor> iop;
1332 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1334 iop->input()->disconnect (this);
1336 if (iop->output()) {
1337 iop->output()->disconnect (this);
1341 i = _processors.erase (i);
1349 _output->set_user_latency (0);
1358 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1360 if (configure_processors_unlocked (err)) {
1362 /* we know this will work, because it worked before :) */
1363 configure_processors_unlocked (0);
1368 _have_internal_generator = false;
1370 for (i = _processors.begin(); i != _processors.end(); ++i) {
1371 boost::shared_ptr<PluginInsert> pi;
1373 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1374 if (pi->is_generator()) {
1375 _have_internal_generator = true;
1382 processor->drop_references ();
1383 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1384 set_processor_positions ();
1390 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1392 ProcessorList deleted;
1394 if (!_session.engine().connected()) {
1398 processor_max_streams.reset();
1401 Glib::RWLock::WriterLock lm (_processor_lock);
1402 ProcessorState pstate (this);
1404 ProcessorList::iterator i;
1405 boost::shared_ptr<Processor> processor;
1407 for (i = _processors.begin(); i != _processors.end(); ) {
1411 /* these can never be removed */
1413 if (processor == _amp || processor == _meter || processor == _main_outs) {
1418 /* see if its in the list of processors to delete */
1420 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1425 /* stop IOProcessors that send to JACK ports
1426 from causing noise as a result of no longer being
1430 boost::shared_ptr<IOProcessor> iop;
1432 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1436 deleted.push_back (processor);
1437 i = _processors.erase (i);
1440 if (deleted.empty()) {
1441 /* none of those in the requested list were found */
1445 _output->set_user_latency (0);
1448 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1450 if (configure_processors_unlocked (err)) {
1452 /* we know this will work, because it worked before :) */
1453 configure_processors_unlocked (0);
1458 _have_internal_generator = false;
1460 for (i = _processors.begin(); i != _processors.end(); ++i) {
1461 boost::shared_ptr<PluginInsert> pi;
1463 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1464 if (pi->is_generator()) {
1465 _have_internal_generator = true;
1472 /* now try to do what we need to so that those that were removed will be deleted */
1474 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1475 (*i)->drop_references ();
1478 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1479 set_processor_positions ();
1484 /** Caller must hold process lock */
1486 Route::configure_processors (ProcessorStreams* err)
1488 assert (!AudioEngine::instance()->process_lock().trylock());
1490 if (!_in_configure_processors) {
1491 Glib::RWLock::WriterLock lm (_processor_lock);
1492 return configure_processors_unlocked (err);
1499 Route::input_streams () const
1501 return _input->n_ports ();
1504 list<pair<ChanCount, ChanCount> >
1505 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1507 Glib::RWLock::ReaderLock lm (_processor_lock);
1509 return try_configure_processors_unlocked (in, err);
1512 list<pair<ChanCount, ChanCount> >
1513 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1515 // Check each processor in order to see if we can configure as requested
1517 list<pair<ChanCount, ChanCount> > configuration;
1520 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1521 DEBUG_TRACE (DEBUG::Processors, "{\n");
1523 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1525 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1526 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1530 if ((*p)->can_support_io_configuration(in, out)) {
1531 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1532 configuration.push_back(make_pair(in, out));
1539 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1540 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1541 DEBUG_TRACE (DEBUG::Processors, "}\n");
1542 return list<pair<ChanCount, ChanCount> > ();
1546 DEBUG_TRACE (DEBUG::Processors, "}\n");
1548 return configuration;
1551 /** Set the input/output configuration of each processor in the processors list.
1552 * Caller must hold process lock.
1553 * Return 0 on success, otherwise configuration is impossible.
1556 Route::configure_processors_unlocked (ProcessorStreams* err)
1558 assert (!AudioEngine::instance()->process_lock().trylock());
1560 if (_in_configure_processors) {
1564 /* put invisible processors where they should be */
1565 setup_invisible_processors ();
1567 _in_configure_processors = true;
1569 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1571 if (configuration.empty ()) {
1572 _in_configure_processors = false;
1578 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1579 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1581 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1585 (*p)->configure_io(c->first, c->second);
1586 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1587 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1592 _meter->reset_max_channels (processor_max_streams);
1595 /* make sure we have sufficient scratch buffers to cope with the new processor
1597 _session.ensure_buffers (n_process_buffers ());
1599 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1601 _in_configure_processors = false;
1606 Route::all_processors_flip ()
1608 Glib::RWLock::ReaderLock lm (_processor_lock);
1610 if (_processors.empty()) {
1614 bool first_is_on = _processors.front()->active();
1616 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1618 (*i)->deactivate ();
1624 _session.set_dirty ();
1627 /** Set all processors with a given placement to a given active state.
1628 * @param p Placement of processors to change.
1629 * @param state New active state for those processors.
1632 Route::all_processors_active (Placement p, bool state)
1634 Glib::RWLock::ReaderLock lm (_processor_lock);
1636 if (_processors.empty()) {
1639 ProcessorList::iterator start, end;
1640 placement_range(p, start, end);
1642 bool before_amp = true;
1643 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1648 if (p == PreFader && before_amp) {
1652 (*i)->deactivate ();
1657 _session.set_dirty ();
1661 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1663 bool pre_fader = true;
1664 Glib::RWLock::ReaderLock lm (_processor_lock);
1666 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1668 /* semantic note: if p == amp, we want to return true, so test
1669 for equality before checking if this is the amp
1686 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1688 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1689 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1690 processors in the current actual processor list that are hidden. Any visible processors
1691 in the current list but not in "new_order" will be assumed to be deleted.
1695 Glib::RWLock::WriterLock lm (_processor_lock);
1696 ProcessorState pstate (this);
1698 ProcessorList::iterator oiter;
1699 ProcessorList::const_iterator niter;
1700 ProcessorList as_it_will_be;
1702 oiter = _processors.begin();
1703 niter = new_order.begin();
1705 while (niter != new_order.end()) {
1707 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1708 then append it to the temp list.
1710 Otherwise, see if the next processor in the old list is in the new list. if not,
1711 its been deleted. If its there, append it to the temp list.
1714 if (oiter == _processors.end()) {
1716 /* no more elements in the old list, so just stick the rest of
1717 the new order onto the temp list.
1720 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1721 while (niter != new_order.end()) {
1728 if (!(*oiter)->display_to_user()) {
1730 as_it_will_be.push_back (*oiter);
1734 /* visible processor: check that its in the new order */
1736 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1737 /* deleted: do nothing, shared_ptr<> will clean up */
1739 /* ignore this one, and add the next item from the new order instead */
1740 as_it_will_be.push_back (*niter);
1745 /* now remove from old order - its taken care of no matter what */
1746 oiter = _processors.erase (oiter);
1751 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1754 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1756 if (configure_processors_unlocked (err)) {
1763 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1764 set_processor_positions ();
1776 Route::get_template()
1778 return state(false);
1782 Route::state(bool full_state)
1784 XMLNode *node = new XMLNode("Route");
1785 ProcessorList::iterator i;
1788 id().print (buf, sizeof (buf));
1789 node->add_property("id", buf);
1790 node->add_property ("name", _name);
1791 node->add_property("default-type", _default_type.to_string());
1794 node->add_property("flags", enum_2_string (_flags));
1797 node->add_property("active", _active?"yes":"no");
1799 boost::to_string (_phase_invert, p);
1800 node->add_property("phase-invert", p);
1801 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1802 node->add_property("meter-point", enum_2_string (_meter_point));
1805 node->add_property("route-group", _route_group->name());
1808 string order_string;
1809 OrderKeys::iterator x = order_keys.begin();
1811 while (x != order_keys.end()) {
1812 order_string += string ((*x).first);
1813 order_string += '=';
1814 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1815 order_string += buf;
1819 if (x == order_keys.end()) {
1823 order_string += ':';
1825 node->add_property ("order-keys", order_string);
1826 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1827 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1828 node->add_property ("soloed-by-upstream", buf);
1829 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1830 node->add_property ("soloed-by-downstream", buf);
1831 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1832 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1834 node->add_child_nocopy (_input->state (full_state));
1835 node->add_child_nocopy (_output->state (full_state));
1836 node->add_child_nocopy (_solo_control->get_state ());
1837 node->add_child_nocopy (_mute_control->get_state ());
1838 node->add_child_nocopy (_mute_master->get_state ());
1840 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1841 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1842 remote_control_node->add_property (X_("id"), buf);
1843 node->add_child_nocopy (*remote_control_node);
1845 if (_comment.length()) {
1846 XMLNode *cmt = node->add_child ("Comment");
1847 cmt->add_content (_comment);
1850 node->add_child_nocopy (_pannable->state (full_state));
1852 for (i = _processors.begin(); i != _processors.end(); ++i) {
1853 node->add_child_nocopy((*i)->state (full_state));
1857 node->add_child_copy (*_extra_xml);
1864 Route::set_state (const XMLNode& node, int version)
1866 return _set_state (node, version, true);
1870 Route::_set_state (const XMLNode& node, int version, bool /*call_base*/)
1872 if (version < 3000) {
1873 return _set_state_2X (node, version);
1877 XMLNodeConstIterator niter;
1879 const XMLProperty *prop;
1881 if (node.name() != "Route"){
1882 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1886 if ((prop = node.property (X_("name"))) != 0) {
1887 Route::set_name (prop->value());
1890 if ((prop = node.property ("id")) != 0) {
1891 _id = prop->value ();
1894 if ((prop = node.property (X_("flags"))) != 0) {
1895 _flags = Flag (string_2_enum (prop->value(), _flags));
1900 if (is_master() || is_monitor() || is_hidden()) {
1901 _mute_master->set_solo_ignore (true);
1904 /* add all processors (except amp, which is always present) */
1906 nlist = node.children();
1907 XMLNode processor_state (X_("processor_state"));
1909 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1913 if (child->name() == IO::state_node_name) {
1914 if ((prop = child->property (X_("direction"))) == 0) {
1918 if (prop->value() == "Input") {
1919 _input->set_state (*child, version);
1920 } else if (prop->value() == "Output") {
1921 _output->set_state (*child, version);
1925 if (child->name() == X_("Processor")) {
1926 processor_state.add_child_copy (*child);
1930 if (child->name() == X_("Pannable")) {
1931 _pannable->set_state (*child, version);
1935 set_processor_state (processor_state);
1937 if ((prop = node.property ("self-solo")) != 0) {
1938 set_self_solo (string_is_affirmative (prop->value()));
1941 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1942 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1943 mod_solo_by_others_upstream (atoi (prop->value()));
1946 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1947 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1948 mod_solo_by_others_downstream (atoi (prop->value()));
1951 if ((prop = node.property ("solo-isolated")) != 0) {
1952 set_solo_isolated (string_is_affirmative (prop->value()), this);
1955 if ((prop = node.property ("solo-safe")) != 0) {
1956 set_solo_safe (string_is_affirmative (prop->value()), this);
1959 if ((prop = node.property (X_("phase-invert"))) != 0) {
1960 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
1963 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1964 set_denormal_protection (string_is_affirmative (prop->value()));
1967 if ((prop = node.property (X_("active"))) != 0) {
1968 bool yn = string_is_affirmative (prop->value());
1969 _active = !yn; // force switch
1970 set_active (yn, this);
1973 if ((prop = node.property (X_("meter-point"))) != 0) {
1974 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1975 set_meter_point (mp, true);
1977 _meter->set_display_to_user (_meter_point == MeterCustom);
1981 if ((prop = node.property (X_("order-keys"))) != 0) {
1985 string::size_type colon, equal;
1986 string remaining = prop->value();
1988 while (remaining.length()) {
1990 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1991 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1994 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
1995 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1998 set_order_key (remaining.substr (0, equal), n);
2002 colon = remaining.find_first_of (':');
2004 if (colon != string::npos) {
2005 remaining = remaining.substr (colon+1);
2012 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2015 if (child->name() == X_("Comment")) {
2017 /* XXX this is a terrible API design in libxml++ */
2019 XMLNode *cmt = *(child->children().begin());
2020 _comment = cmt->content();
2022 } else if (child->name() == X_("Extra")) {
2024 _extra_xml = new XMLNode (*child);
2026 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2027 if (prop->value() == "solo") {
2028 _solo_control->set_state (*child, version);
2031 } else if (child->name() == X_("RemoteControl")) {
2032 if ((prop = child->property (X_("id"))) != 0) {
2034 sscanf (prop->value().c_str(), "%d", &x);
2035 set_remote_control_id (x);
2038 } else if (child->name() == X_("MuteMaster")) {
2039 _mute_master->set_state (*child, version);
2047 Route::_set_state_2X (const XMLNode& node, int version)
2050 XMLNodeConstIterator niter;
2052 const XMLProperty *prop;
2054 /* 2X things which still remain to be handled:
2060 if (node.name() != "Route") {
2061 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2065 if ((prop = node.property (X_("flags"))) != 0) {
2066 _flags = Flag (string_2_enum (prop->value(), _flags));
2071 if ((prop = node.property (X_("phase-invert"))) != 0) {
2072 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2073 if (string_is_affirmative (prop->value ())) {
2076 set_phase_invert (p);
2079 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2080 set_denormal_protection (string_is_affirmative (prop->value()));
2083 if ((prop = node.property (X_("soloed"))) != 0) {
2084 bool yn = string_is_affirmative (prop->value());
2086 /* XXX force reset of solo status */
2088 set_solo (yn, this);
2091 if ((prop = node.property (X_("muted"))) != 0) {
2094 bool muted = string_is_affirmative (prop->value());
2100 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2102 if (string_is_affirmative (prop->value())){
2103 mute_point = mute_point + "PreFader";
2108 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2110 if (string_is_affirmative (prop->value())){
2113 mute_point = mute_point + ",";
2116 mute_point = mute_point + "PostFader";
2121 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2123 if (string_is_affirmative (prop->value())){
2126 mute_point = mute_point + ",";
2129 mute_point = mute_point + "Listen";
2134 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2136 if (string_is_affirmative (prop->value())){
2139 mute_point = mute_point + ",";
2142 mute_point = mute_point + "Main";
2146 _mute_master->set_mute_points (mute_point);
2150 if ((prop = node.property (X_("meter-point"))) != 0) {
2151 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2154 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2155 don't mean the same thing.
2158 if ((prop = node.property (X_("order-keys"))) != 0) {
2162 string::size_type colon, equal;
2163 string remaining = prop->value();
2165 while (remaining.length()) {
2167 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2168 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2171 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2172 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2175 set_order_key (remaining.substr (0, equal), n);
2179 colon = remaining.find_first_of (':');
2181 if (colon != string::npos) {
2182 remaining = remaining.substr (colon+1);
2191 nlist = node.children ();
2192 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2196 if (child->name() == IO::state_node_name) {
2198 /* there is a note in IO::set_state_2X() about why we have to call
2202 _input->set_state_2X (*child, version, true);
2203 _output->set_state_2X (*child, version, false);
2205 if ((prop = child->property (X_("name"))) != 0) {
2206 Route::set_name (prop->value ());
2209 if ((prop = child->property (X_("id"))) != 0) {
2210 _id = prop->value ();
2213 if ((prop = child->property (X_("active"))) != 0) {
2214 bool yn = string_is_affirmative (prop->value());
2215 _active = !yn; // force switch
2216 set_active (yn, this);
2219 if ((prop = child->property (X_("gain"))) != 0) {
2222 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2223 _amp->gain_control()->set_value (val);
2227 /* Set up Panners in the IO */
2228 XMLNodeList io_nlist = child->children ();
2230 XMLNodeConstIterator io_niter;
2233 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2235 io_child = *io_niter;
2237 if (io_child->name() == X_("Panner")) {
2238 _main_outs->panner_shell()->set_state(*io_child, version);
2239 } else if (io_child->name() == X_("Automation")) {
2240 /* IO's automation is for the fader */
2241 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2247 XMLNodeList redirect_nodes;
2249 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2253 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2254 redirect_nodes.push_back(child);
2259 set_processor_state_2X (redirect_nodes, version);
2261 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2264 if (child->name() == X_("Comment")) {
2266 /* XXX this is a terrible API design in libxml++ */
2268 XMLNode *cmt = *(child->children().begin());
2269 _comment = cmt->content();
2271 } else if (child->name() == X_("extra")) {
2273 _extra_xml = new XMLNode (*child);
2275 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2276 if (prop->value() == X_("solo")) {
2277 _solo_control->set_state (*child, version);
2278 } else if (prop->value() == X_("mute")) {
2279 _mute_control->set_state (*child, version);
2282 } else if (child->name() == X_("RemoteControl")) {
2283 if ((prop = child->property (X_("id"))) != 0) {
2285 sscanf (prop->value().c_str(), "%d", &x);
2286 set_remote_control_id (x);
2296 Route::get_processor_state ()
2298 XMLNode* root = new XMLNode (X_("redirects"));
2299 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2300 root->add_child_nocopy ((*i)->state (true));
2307 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2309 /* We don't bother removing existing processors not in nList, as this
2310 method will only be called when creating a Route from scratch, not
2311 for undo purposes. Just put processors in at the appropriate place
2315 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2316 add_processor_from_xml_2X (**i, version);
2321 Route::set_processor_state (const XMLNode& node)
2323 const XMLNodeList &nlist = node.children();
2324 XMLNodeConstIterator niter;
2325 ProcessorList new_order;
2326 bool must_configure = false;
2328 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2330 XMLProperty* prop = (*niter)->property ("type");
2332 if (prop->value() == "amp") {
2333 _amp->set_state (**niter, Stateful::current_state_version);
2334 new_order.push_back (_amp);
2335 } else if (prop->value() == "meter") {
2336 _meter->set_state (**niter, Stateful::current_state_version);
2337 } else if (prop->value() == "main-outs") {
2338 _main_outs->set_state (**niter, Stateful::current_state_version);
2339 } else if (prop->value() == "intreturn") {
2341 _intreturn.reset (new InternalReturn (_session));
2342 must_configure = true;
2344 _intreturn->set_state (**niter, Stateful::current_state_version);
2345 } else if (is_monitor() && prop->value() == "monitor") {
2346 if (!_monitor_control) {
2347 _monitor_control.reset (new MonitorProcessor (_session));
2348 must_configure = true;
2350 _monitor_control->set_state (**niter, Stateful::current_state_version);
2351 } else if (prop->value() == "capture") {
2352 _capturing_processor.reset (new CapturingProcessor (_session));
2354 ProcessorList::iterator o;
2356 for (o = _processors.begin(); o != _processors.end(); ++o) {
2357 XMLProperty* id_prop = (*niter)->property(X_("id"));
2358 if (id_prop && (*o)->id() == id_prop->value()) {
2359 (*o)->set_state (**niter, Stateful::current_state_version);
2360 new_order.push_back (*o);
2365 // If the processor (*niter) is not on the route then create it
2367 if (o == _processors.end()) {
2369 boost::shared_ptr<Processor> processor;
2371 if (prop->value() == "intsend") {
2373 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2374 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2375 prop->value() == "lv2" ||
2376 prop->value() == "vst" ||
2377 prop->value() == "audiounit") {
2379 processor.reset (new PluginInsert(_session));
2381 } else if (prop->value() == "port") {
2383 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2385 } else if (prop->value() == "send") {
2387 processor.reset (new Send (_session, _pannable, _mute_master));
2390 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2394 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2395 /* This processor could not be configured. Turn it into a UnknownProcessor */
2396 processor.reset (new UnknownProcessor (_session, **niter));
2399 /* we have to note the monitor send here, otherwise a new one will be created
2400 and the state of this one will be lost.
2402 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2403 if (isend && isend->role() == Delivery::Listen) {
2404 _monitor_send = isend;
2407 /* it doesn't matter if invisible processors are added here, as they
2408 will be sorted out by setup_invisible_processors () shortly.
2411 new_order.push_back (processor);
2412 must_configure = true;
2418 Glib::RWLock::WriterLock lm (_processor_lock);
2419 _processors = new_order;
2420 if (must_configure) {
2421 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2422 configure_processors_unlocked (0);
2426 processors_changed (RouteProcessorChange ());
2427 set_processor_positions ();
2431 Route::curve_reallocate ()
2433 // _gain_automation_curve.finish_resize ();
2434 // _pan_automation_curve.finish_resize ();
2438 Route::silence (framecnt_t nframes)
2440 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2445 silence_unlocked (nframes);
2449 Route::silence_unlocked (framecnt_t nframes)
2451 /* Must be called with the processor lock held */
2455 _output->silence (nframes);
2457 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2458 boost::shared_ptr<PluginInsert> pi;
2460 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2461 // skip plugins, they don't need anything when we're not active
2465 (*i)->silence (nframes);
2468 if (nframes == _session.get_block_size()) {
2475 Route::add_internal_return ()
2478 _intreturn.reset (new InternalReturn (_session));
2479 add_processor (_intreturn, PreFader);
2484 Route::add_send_to_internal_return (InternalSend* send)
2486 Glib::RWLock::ReaderLock rm (_processor_lock);
2488 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2489 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2492 return d->add_send (send);
2498 Route::remove_send_from_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->remove_send (send);
2511 /** Add a monitor send (if we don't already have one) but don't activate it */
2513 Route::listen_via_monitor ()
2515 /* master never sends to control outs */
2516 assert (!is_master ());
2518 /* make sure we have one */
2519 if (!_monitor_send) {
2520 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2521 _monitor_send->set_display_to_user (false);
2525 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2526 configure_processors (0);
2531 /** Add an internal send to a route.
2532 * @param route route to send to.
2533 * @param placement placement for the send.
2536 Route::listen_via (boost::shared_ptr<Route> route, Placement placement)
2538 assert (route != _session.monitor_out ());
2541 Glib::RWLock::ReaderLock rm (_processor_lock);
2543 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2545 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2547 if (d && d->target_route() == route) {
2548 /* already listening via the specified IO: do nothing */
2555 boost::shared_ptr<InternalSend> listener (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2556 add_processor (listener, placement);
2558 } catch (failed_constructor& err) {
2566 Route::drop_listen (boost::shared_ptr<Route> route)
2568 ProcessorStreams err;
2569 ProcessorList::iterator tmp;
2571 Glib::RWLock::ReaderLock rl(_processor_lock);
2575 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2577 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2579 if (d && d->target_route() == route) {
2581 remove_processor (*x, &err);
2584 /* list could have been demolished while we dropped the lock
2594 if (route == _session.monitor_out()) {
2595 _monitor_send.reset ();
2600 Route::set_comment (string cmt, void *src)
2603 comment_changed (src);
2604 _session.set_dirty ();
2608 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2610 FeedRecord fr (other, via_sends_only);
2612 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2614 if (!result.second) {
2616 /* already a record for "other" - make sure sends-only information is correct */
2617 if (!via_sends_only && result.first->sends_only) {
2618 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2619 frp->sends_only = false;
2623 return result.second;
2627 Route::clear_fed_by ()
2633 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2635 const FedBy& fed_by (other->fed_by());
2637 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2638 boost::shared_ptr<Route> sr = f->r.lock();
2640 if (sr && (sr.get() == this)) {
2642 if (via_sends_only) {
2643 *via_sends_only = f->sends_only;
2654 Route::direct_feeds (boost::shared_ptr<Route> other, bool* only_send)
2656 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2658 if (_output->connected_to (other->input())) {
2659 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2668 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2670 boost::shared_ptr<IOProcessor> iop;
2672 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2673 if (iop->feeds (other)) {
2674 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2680 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2683 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2688 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2692 /** Called from the (non-realtime) butler thread when the transport is stopped */
2694 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2696 framepos_t now = _session.transport_frame();
2699 Glib::RWLock::ReaderLock lm (_processor_lock);
2702 automation_snapshot (now, true);
2705 Automatable::transport_stopped (now);
2707 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2709 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2713 (*i)->transport_stopped (now);
2717 _roll_delay = _initial_delay;
2720 /** Called with the process lock held if change contains ConfigurationChanged */
2722 Route::input_change_handler (IOChange change, void * /*src*/)
2724 if ((change.type & IOChange::ConfigurationChanged)) {
2725 configure_processors (0);
2726 _phase_invert.resize (_input->n_ports().n_audio ());
2727 io_changed (); /* EMIT SIGNAL */
2731 /** Called with the process lock held if change contains ConfigurationChanged */
2733 Route::output_change_handler (IOChange change, void * /*src*/)
2735 if ((change.type & IOChange::ConfigurationChanged)) {
2737 /* XXX resize all listeners to match _main_outs? */
2739 /* Auto-connect newly-created outputs, unless we're auto-connecting to master
2740 and we are master (as an auto-connect in this situation would cause a
2743 AutoConnectOption ac = Config->get_output_auto_connect ();
2744 if (ac == AutoConnectPhysical || (ac == AutoConnectMaster && !is_master ())) {
2746 ChanCount start = change.before;
2748 for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
2749 if (change.before.get(*i) < change.after.get(*i)) {
2750 /* the existing ChanCounts don't matter for this call as they are only
2751 to do with matching input and output indices, and we are only changing
2756 /* only auto-connect the newly-created outputs, not the ones that were
2759 start.set (*i, start.get (*i) + 1);
2761 _session.auto_connect_route (this, dummy, dummy, false, ChanCount(), change.before);
2766 // configure_processors (0);
2771 Route::pans_required () const
2773 if (n_outputs().n_audio() < 2) {
2777 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2781 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
2782 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2784 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2789 if (n_outputs().n_total() == 0) {
2793 if (!_active || n_inputs() == ChanCount::ZERO) {
2794 silence_unlocked (nframes);
2797 if (session_state_changing) {
2798 if (_session.transport_speed() != 0.0f) {
2799 /* we're rolling but some state is changing (e.g. our diskstream contents)
2800 so we cannot use them. Be silent till this is over.
2802 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2804 silence_unlocked (nframes);
2807 /* we're really not rolling, so we're either delivery silence or actually
2808 monitoring, both of which are safe to do while session_state_changing is true.
2812 _amp->apply_gain_automation (false);
2813 passthru (start_frame, end_frame, nframes, 0);
2819 Route::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
2821 if (_roll_delay > nframes) {
2823 _roll_delay -= nframes;
2824 silence_unlocked (nframes);
2825 /* transport frame is not legal for caller to use */
2828 } else if (_roll_delay > 0) {
2830 nframes -= _roll_delay;
2831 silence_unlocked (_roll_delay);
2832 /* we've written _roll_delay of samples into the
2833 output ports, so make a note of that for
2836 _main_outs->increment_output_offset (_roll_delay);
2837 transport_frame += _roll_delay;
2846 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick,
2847 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2849 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2854 automation_snapshot (_session.transport_frame(), false);
2856 if (n_outputs().n_total() == 0) {
2860 if (!_active || n_inputs().n_total() == 0) {
2861 silence_unlocked (nframes);
2865 framecnt_t unused = 0;
2867 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2873 passthru (start_frame, end_frame, nframes, declick);
2879 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
2880 bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
2887 Route::toggle_monitor_input ()
2889 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2890 i->ensure_monitor_input( ! i->monitoring_input());
2895 Route::has_external_redirects () const
2897 // FIXME: what about sends? - they don't return a signal back to ardour?
2899 boost::shared_ptr<const PortInsert> pi;
2901 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2903 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2905 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2907 string port_name = port->name();
2908 string client_name = port_name.substr (0, port_name.find(':'));
2910 /* only say "yes" if the redirect is actually in use */
2912 if (client_name != "ardour" && pi->active()) {
2923 Route::flush_processors ()
2925 /* XXX shouldn't really try to take this lock, since
2926 this is called from the RT audio thread.
2929 Glib::RWLock::ReaderLock lm (_processor_lock);
2931 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2937 Route::set_meter_point (MeterPoint p, bool force)
2939 /* CAN BE CALLED FROM PROCESS CONTEXT */
2941 if (_meter_point == p && !force) {
2947 bool meter_was_visible_to_user = _meter->display_to_user ();
2950 Glib::RWLock::WriterLock lm (_processor_lock);
2952 if (_meter_point != MeterCustom) {
2954 _meter->set_display_to_user (false);
2956 setup_invisible_processors ();
2958 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2962 if (loc == _processors.begin()) {
2963 m_in = _input->n_ports();
2965 ProcessorList::iterator before = loc;
2967 m_in = (*before)->output_streams ();
2970 _meter->reflect_inputs (m_in);
2972 /* we do not need to reconfigure the processors, because the meter
2973 (a) is always ready to handle processor_max_streams
2974 (b) is always an N-in/N-out processor, and thus moving
2975 it doesn't require any changes to the other processors.
2980 // just make it visible and let the user move it
2982 _meter->set_display_to_user (true);
2986 meter_change (); /* EMIT SIGNAL */
2988 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2990 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2994 Route::listen_position_changed ()
2997 Glib::RWLock::WriterLock lm (_processor_lock);
2998 ProcessorState pstate (this);
3001 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3003 if (configure_processors_unlocked (0)) {
3005 configure_processors_unlocked (0); // it worked before we tried to add it ...
3011 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3012 _session.set_dirty ();
3015 boost::shared_ptr<CapturingProcessor>
3016 Route::add_export_point()
3018 if (!_capturing_processor) {
3020 _capturing_processor.reset (new CapturingProcessor (_session));
3021 _capturing_processor->activate ();
3024 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3025 configure_processors (0);
3030 return _capturing_processor;
3034 Route::update_total_latency ()
3036 framecnt_t old = _output->effective_latency();
3037 framecnt_t own_latency = _output->user_latency();
3039 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3040 if ((*i)->active ()) {
3041 own_latency += (*i)->signal_latency ();
3045 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal redirect latency = %2\n", _name, own_latency));
3047 _output->set_port_latency (own_latency);
3049 if (_output->user_latency() == 0) {
3051 /* this (virtual) function is used for pure Routes,
3052 not derived classes like AudioTrack. this means
3053 that the data processed here comes from an input
3054 port, not prerecorded material, and therefore we
3055 have to take into account any input latency.
3058 own_latency += _input->signal_latency ();
3061 if (old != own_latency) {
3062 _output->set_latency_delay (own_latency);
3063 signal_latency_changed (); /* EMIT SIGNAL */
3066 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: input latency = %2 total = %3\n", _name, _input->signal_latency(), own_latency));
3068 return _output->effective_latency ();
3072 Route::set_user_latency (framecnt_t nframes)
3074 _output->set_user_latency (nframes);
3075 _session.update_latency_compensation (false, false);
3079 Route::set_latency_delay (framecnt_t longest_session_latency)
3081 framecnt_t old = _initial_delay;
3083 if (_output->effective_latency() < longest_session_latency) {
3084 _initial_delay = longest_session_latency - _output->effective_latency();
3089 if (_initial_delay != old) {
3090 initial_delay_changed (); /* EMIT SIGNAL */
3093 if (_session.transport_stopped()) {
3094 _roll_delay = _initial_delay;
3099 Route::automation_snapshot (framepos_t now, bool force)
3101 _pannable->automation_snapshot (now, force);
3102 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3103 (*i)->automation_snapshot (now, force);
3107 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3108 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3109 boost::shared_ptr<AutomationList>(), name)
3112 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3117 Route::SoloControllable::set_value (double val)
3119 bool bval = ((val >= 0.5f) ? true: false);
3121 boost::shared_ptr<RouteList> rl (new RouteList);
3123 boost::shared_ptr<Route> r = _route.lock ();
3130 if (Config->get_solo_control_is_listen_control()) {
3131 _session.set_listen (rl, bval);
3133 _session.set_solo (rl, bval);
3138 Route::SoloControllable::get_value () const
3140 boost::shared_ptr<Route> r = _route.lock ();
3145 if (Config->get_solo_control_is_listen_control()) {
3146 return r->listening_via_monitor() ? 1.0f : 0.0f;
3148 return r->self_soloed() ? 1.0f : 0.0f;
3152 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3153 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3154 boost::shared_ptr<AutomationList>(), name)
3157 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3162 Route::MuteControllable::set_value (double val)
3164 bool bval = ((val >= 0.5f) ? true: false);
3166 boost::shared_ptr<RouteList> rl (new RouteList);
3168 boost::shared_ptr<Route> r = _route.lock ();
3174 _session.set_mute (rl, bval);
3178 Route::MuteControllable::get_value () const
3180 boost::shared_ptr<Route> r = _route.lock ();
3185 return r->muted() ? 1.0f : 0.0f;
3189 Route::set_block_size (pframes_t nframes)
3191 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3192 (*i)->set_block_size (nframes);
3195 _session.ensure_buffers (n_process_buffers ());
3199 Route::protect_automation ()
3201 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3202 (*i)->protect_automation();
3206 Route::set_pending_declick (int declick)
3209 /* this call is not allowed to turn off a pending declick unless "force" is true */
3211 _pending_declick = declick;
3213 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3215 _pending_declick = 0;
3220 /** Shift automation forwards from a particular place, thereby inserting time.
3221 * Adds undo commands for any shifts that are performed.
3223 * @param pos Position to start shifting from.
3224 * @param frames Amount to shift forwards by.
3228 Route::shift (framepos_t pos, framecnt_t frames)
3230 /* gain automation */
3232 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3234 XMLNode &before = gc->alist()->get_state ();
3235 gc->alist()->shift (pos, frames);
3236 XMLNode &after = gc->alist()->get_state ();
3237 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3240 /* pan automation */
3242 ControlSet::Controls& c (_pannable->controls());
3244 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3245 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3247 boost::shared_ptr<AutomationList> al = pc->alist();
3248 XMLNode& before = al->get_state ();
3249 al->shift (pos, frames);
3250 XMLNode& after = al->get_state ();
3251 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3256 /* redirect automation */
3258 Glib::RWLock::ReaderLock lm (_processor_lock);
3259 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3261 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3263 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3264 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3266 boost::shared_ptr<AutomationList> al = ac->alist();
3267 XMLNode &before = al->get_state ();
3268 al->shift (pos, frames);
3269 XMLNode &after = al->get_state ();
3270 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3279 Route::save_as_template (const string& path, const string& name)
3281 XMLNode& node (state (false));
3284 IO::set_name_in_state (*node.children().front(), name);
3286 tree.set_root (&node);
3287 return tree.write (path.c_str());
3292 Route::set_name (const string& str)
3298 name = Route::ensure_track_or_route_name (str, _session);
3299 SessionObject::set_name (name);
3301 ret = (_input->set_name(name) && _output->set_name(name));
3305 Glib::RWLock::ReaderLock lm (_processor_lock);
3307 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3309 /* rename all I/O processors that have inputs or outputs */
3311 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
3313 if (iop && (iop->output() || iop->input())) {
3314 if (!iop->set_name (name)) {
3325 boost::shared_ptr<Send>
3326 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3328 Glib::RWLock::ReaderLock lm (_processor_lock);
3330 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3331 boost::shared_ptr<InternalSend> send;
3333 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3334 if (send->target_route() == target) {
3340 return boost::shared_ptr<Send>();
3343 /** @param c Audio channel index.
3344 * @param yn true to invert phase, otherwise false.
3347 Route::set_phase_invert (uint32_t c, bool yn)
3349 if (_phase_invert[c] != yn) {
3350 _phase_invert[c] = yn;
3351 phase_invert_changed (); /* EMIT SIGNAL */
3352 _session.set_dirty ();
3357 Route::set_phase_invert (boost::dynamic_bitset<> p)
3359 if (_phase_invert != p) {
3361 phase_invert_changed (); /* EMIT SIGNAL */
3362 _session.set_dirty ();
3367 Route::phase_invert (uint32_t c) const
3369 return _phase_invert[c];
3372 boost::dynamic_bitset<>
3373 Route::phase_invert () const
3375 return _phase_invert;
3379 Route::set_denormal_protection (bool yn)
3381 if (_denormal_protection != yn) {
3382 _denormal_protection = yn;
3383 denormal_protection_changed (); /* EMIT SIGNAL */
3388 Route::denormal_protection () const
3390 return _denormal_protection;
3394 Route::set_active (bool yn, void* src)
3396 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3397 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3401 if (_active != yn) {
3403 _input->set_active (yn);
3404 _output->set_active (yn);
3405 active_changed (); // EMIT SIGNAL
3412 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3418 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3420 boost::shared_ptr<Send> s;
3421 boost::shared_ptr<Return> r;
3423 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3424 s->meter()->meter();
3425 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3426 r->meter()->meter ();
3431 boost::shared_ptr<Pannable>
3432 Route::pannable() const
3437 boost::shared_ptr<Panner>
3438 Route::panner() const
3441 return _main_outs->panner_shell()->panner();
3444 boost::shared_ptr<PannerShell>
3445 Route::panner_shell() const
3447 return _main_outs->panner_shell();
3450 boost::shared_ptr<AutomationControl>
3451 Route::gain_control() const
3453 return _amp->gain_control();
3456 boost::shared_ptr<AutomationControl>
3457 Route::get_control (const Evoral::Parameter& param)
3459 /* either we own the control or .... */
3461 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3465 /* maybe one of our processors does or ... */
3467 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3468 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3469 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3477 /* nobody does so we'll make a new one */
3479 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3486 boost::shared_ptr<Processor>
3487 Route::nth_plugin (uint32_t n)
3489 Glib::RWLock::ReaderLock lm (_processor_lock);
3490 ProcessorList::iterator i;
3492 for (i = _processors.begin(); i != _processors.end(); ++i) {
3493 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3500 return boost::shared_ptr<Processor> ();
3503 boost::shared_ptr<Processor>
3504 Route::nth_send (uint32_t n)
3506 Glib::RWLock::ReaderLock lm (_processor_lock);
3507 ProcessorList::iterator i;
3509 for (i = _processors.begin(); i != _processors.end(); ++i) {
3510 if (boost::dynamic_pointer_cast<Send> (*i)) {
3517 return boost::shared_ptr<Processor> ();
3521 Route::has_io_processor_named (const string& name)
3523 Glib::RWLock::ReaderLock lm (_processor_lock);
3524 ProcessorList::iterator i;
3526 for (i = _processors.begin(); i != _processors.end(); ++i) {
3527 if (boost::dynamic_pointer_cast<Send> (*i) ||
3528 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3529 if ((*i)->name() == name) {
3538 MuteMaster::MutePoint
3539 Route::mute_points () const
3541 return _mute_master->mute_points ();
3545 Route::set_processor_positions ()
3547 Glib::RWLock::ReaderLock lm (_processor_lock);
3549 bool had_amp = false;
3550 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3551 (*i)->set_pre_fader (!had_amp);
3552 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3558 /** Called when there is a proposed change to the input port count */
3560 Route::input_port_count_changing (ChanCount to)
3562 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3564 /* The processors cannot be configured with the new input arrangement, so
3570 /* The change is ok */
3575 Route::unknown_processors () const
3579 Glib::RWLock::ReaderLock lm (_processor_lock);
3580 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3581 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3582 p.push_back ((*i)->name ());
3590 Route::set_latency_ranges (bool playback) const
3592 framecnt_t own_latency = 0;
3594 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD OR
3598 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3599 if ((*i)->active ()) {
3600 own_latency += (*i)->signal_latency ();
3605 update_port_latencies (_input->ports (), _output->ports (), true, own_latency);
3607 update_port_latencies (_output->ports (), _input->ports (), false, own_latency);
3612 Route::update_port_latencies (const PortSet& operands, const PortSet& feeders, bool playback, framecnt_t our_latency) const
3614 #ifdef HAVE_JACK_NEW_LATENCY
3616 /* we assume that all our input ports feed all our output ports. its not
3617 universally true, but the alternative is way too corner-case to worry about.
3620 jack_latency_range_t all_connections;
3622 all_connections.min = ~((jack_nframes_t) 0);
3623 all_connections.max = 0;
3625 /* iterate over all feeder ports and determine their relevant latency, taking
3626 the maximum and minimum across all of them.
3629 for (PortSet::const_iterator p = feeders.begin(); p != feeders.end(); ++p) {
3631 jack_latency_range_t range;
3633 p->get_connected_latency_range (range, playback);
3635 all_connections.min = min (all_connections.min, range.min);
3636 all_connections.max = max (all_connections.max, range.max);
3639 all_connections.min += our_latency;
3640 all_connections.max += our_latency;
3642 for (PortSet::const_iterator p = operands.begin(); p != operands.end(); ++p) {
3644 p->set_latency_range (all_connections, playback);
3646 DEBUG_TRACE (DEBUG::Latency, string_compose ("Port %1 %5 latency range %2 .. %3 (including route latency of %4)\n",
3648 all_connections.min,
3649 all_connections.max,
3651 (playback ? "PLAYBACK" : "CAPTURE")));
3657 /** Put the invisible processors in the right place in _processors.
3658 * Must be called with a writer lock on _processor_lock held.
3661 Route::setup_invisible_processors ()
3664 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3665 assert (!lm.locked ());
3669 /* too early to be doing this stuff */
3673 /* we'll build this new list here and then use it */
3675 ProcessorList new_processors;
3677 /* find visible processors */
3679 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3680 if ((*i)->display_to_user ()) {
3681 new_processors.push_back (*i);
3687 ProcessorList::iterator amp = new_processors.begin ();
3688 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3692 assert (amp != _processors.end ());
3694 /* and the processor after the amp */
3696 ProcessorList::iterator after_amp = amp;
3702 switch (_meter_point) {
3704 assert (!_meter->display_to_user ());
3705 new_processors.push_front (_meter);
3708 assert (!_meter->display_to_user ());
3709 new_processors.insert (amp, _meter);
3711 case MeterPostFader:
3712 /* do nothing here */
3715 /* do nothing here */
3718 /* the meter is visible, so we don't touch it here */
3725 assert (_main_outs);
3726 assert (!_main_outs->display_to_user ());
3727 new_processors.push_back (_main_outs);
3729 /* iterator for the main outs */
3731 ProcessorList::iterator main = new_processors.end();
3734 /* OUTPUT METERING */
3736 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3737 assert (!_meter->display_to_user ());
3739 /* add the processor just before or just after the main outs */
3741 ProcessorList::iterator meter_point = main;
3743 if (_meter_point == MeterOutput) {
3746 new_processors.insert (meter_point, _meter);
3751 if (_monitor_send && !is_monitor ()) {
3752 assert (!_monitor_send->display_to_user ());
3753 if (Config->get_solo_control_is_listen_control()) {
3754 switch (Config->get_listen_position ()) {
3755 case PreFaderListen:
3756 switch (Config->get_pfl_position ()) {
3757 case PFLFromBeforeProcessors:
3758 new_processors.push_front (_monitor_send);
3760 case PFLFromAfterProcessors:
3761 new_processors.insert (amp, _monitor_send);
3765 case AfterFaderListen:
3766 switch (Config->get_afl_position ()) {
3767 case AFLFromBeforeProcessors:
3768 new_processors.insert (after_amp, _monitor_send);
3770 case AFLFromAfterProcessors:
3771 new_processors.insert (new_processors.end(), _monitor_send);
3777 new_processors.insert (new_processors.end(), _monitor_send);
3781 /* MONITOR CONTROL */
3783 if (_monitor_control && is_monitor ()) {
3784 assert (!_monitor_control->display_to_user ());
3785 new_processors.push_front (_monitor_control);
3788 /* INTERNAL RETURN */
3790 /* doing this here means that any monitor control will come just after
3795 assert (!_intreturn->display_to_user ());
3796 new_processors.push_front (_intreturn);
3799 /* EXPORT PROCESSOR */
3801 if (_capturing_processor) {
3802 assert (!_capturing_processor->display_to_user ());
3803 new_processors.push_front (_capturing_processor);
3806 _processors = new_processors;
3808 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3809 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3810 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));