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/unknown_processor.h"
69 #include "ardour/capturing_processor.h"
74 using namespace ARDOUR;
77 uint32_t Route::order_key_cnt = 0;
78 PBD::Signal1<void,string const&> Route::SyncOrderKeys;
79 PBD::Signal0<void> Route::RemoteControlIDChange;
81 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
82 : SessionObject (sess, name)
84 , GraphNode (sess._process_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)
106 , _custom_meter_position_noted (false)
107 , _last_custom_meter_was_at_end (false)
109 processor_max_streams.reset();
110 order_keys[N_("signal")] = order_key_cnt++;
116 /* add standard controls */
118 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
119 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
121 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
122 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
124 add_control (_solo_control);
125 add_control (_mute_control);
129 if (!(_flags & Route::MonitorOut)) {
130 _pannable.reset (new Pannable (_session));
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 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
141 /* add amp processor */
143 _amp.reset (new Amp (_session));
144 add_processor (_amp, PostFader);
146 /* create standard processors: meter, main outs, monitor out;
147 they will be added to _processors by setup_invisible_processors ()
150 _meter.reset (new PeakMeter (_session));
151 _meter->set_display_to_user (false);
154 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
155 _main_outs->activate ();
158 /* where we listen to tracks */
159 _intreturn.reset (new InternalReturn (_session));
160 _intreturn->activate ();
162 /* the thing that provides proper control over a control/monitor/listen bus
163 (such as per-channel cut, dim, solo, invert, etc).
165 _monitor_control.reset (new MonitorProcessor (_session));
166 _monitor_control->activate ();
169 if (is_master() || is_monitor() || is_hidden()) {
170 _mute_master->set_solo_ignore (true);
173 /* now that we have _meter, its safe to connect to this */
175 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
178 /* run a configure so that the invisible processors get set up */
179 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
180 configure_processors (0);
188 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
190 /* do this early so that we don't get incoming signals as we are going through destruction
195 /* don't use clear_processors here, as it depends on the session which may
196 be half-destroyed by now
199 Glib::RWLock::WriterLock lm (_processor_lock);
200 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
201 (*i)->drop_references ();
204 _processors.clear ();
208 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
210 if (id != _remote_control_id) {
211 _remote_control_id = id;
212 RemoteControlIDChanged ();
213 if (notify_class_listeners) {
214 RemoteControlIDChange ();
220 Route::remote_control_id() const
222 return _remote_control_id;
226 Route::order_key (std::string const & name) const
228 OrderKeys::const_iterator i = order_keys.find (name);
229 if (i == order_keys.end()) {
237 Route::set_order_key (std::string const & name, int32_t n)
239 bool changed = false;
241 /* This method looks more complicated than it should, but
242 it's important that we don't emit order_key_changed unless
243 it actually has, as expensive things happen on receipt of that
247 if (order_keys.find(name) == order_keys.end() || order_keys[name] != n) {
248 order_keys[name] = n;
252 if (Config->get_sync_all_route_ordering()) {
253 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
254 if (x->second != n) {
262 order_key_changed (); /* EMIT SIGNAL */
263 _session.set_dirty ();
267 /** Set all order keys to be the same as that for `base', if such a key
268 * exists in this route.
269 * @param base Base key.
272 Route::sync_order_keys (std::string const & base)
274 if (order_keys.empty()) {
278 OrderKeys::iterator i;
281 if ((i = order_keys.find (base)) == order_keys.end()) {
282 /* key doesn't exist, use the first existing key (during session initialization) */
283 i = order_keys.begin();
287 /* key exists - use it and reset all others (actually, itself included) */
289 i = order_keys.begin();
292 bool changed = false;
294 for (; i != order_keys.end(); ++i) {
295 if (i->second != key) {
302 order_key_changed (); /* EMIT SIGNAL */
307 Route::ensure_track_or_route_name(string name, Session &session)
309 string newname = name;
311 while (!session.io_name_is_legal (newname)) {
312 newname = bump_name_once (newname, '.');
320 Route::inc_gain (gain_t fraction, void *src)
322 _amp->inc_gain (fraction, src);
326 Route::set_gain (gain_t val, void *src)
328 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
330 if (_route_group->is_relative()) {
332 gain_t usable_gain = _amp->gain();
333 if (usable_gain < 0.000001f) {
334 usable_gain = 0.000001f;
338 if (delta < 0.000001f) {
342 delta -= usable_gain;
347 gain_t factor = delta / usable_gain;
350 factor = _route_group->get_max_factor(factor);
351 if (factor == 0.0f) {
352 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
356 factor = _route_group->get_min_factor(factor);
357 if (factor == 0.0f) {
358 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
363 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
367 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
373 if (val == _amp->gain()) {
377 _amp->set_gain (val, src);
381 Route::maybe_declick (BufferSet&, framecnt_t, int)
383 /* this is the "bus" implementation and they never declick.
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 int declick, bool gain_automation_ok)
403 bool monitor = should_monitor ();
405 bufs.is_silent (false);
407 /* figure out if we're going to use gain automation */
408 if (gain_automation_ok) {
409 _amp->setup_gain_automation (start_frame, end_frame, nframes);
411 _amp->apply_gain_automation (false);
414 /* tell main outs what to do about monitoring */
415 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
418 /* -------------------------------------------------------------------------------------------
419 GLOBAL DECLICK (for transport changes etc.)
420 ----------------------------------------------------------------------------------------- */
422 maybe_declick (bufs, nframes, declick);
423 _pending_declick = 0;
425 /* -------------------------------------------------------------------------------------------
426 DENORMAL CONTROL/PHASE INVERT
427 ----------------------------------------------------------------------------------------- */
429 if (_phase_invert.any ()) {
433 if (_denormal_protection || Config->get_denormal_protection()) {
435 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
436 Sample* const sp = i->data();
438 if (_phase_invert[chn]) {
439 for (pframes_t nx = 0; nx < nframes; ++nx) {
444 for (pframes_t nx = 0; nx < nframes; ++nx) {
452 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
453 Sample* const sp = i->data();
455 if (_phase_invert[chn]) {
456 for (pframes_t nx = 0; nx < nframes; ++nx) {
465 if (_denormal_protection || Config->get_denormal_protection()) {
467 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
468 Sample* const sp = i->data();
469 for (pframes_t nx = 0; nx < nframes; ++nx) {
477 /* -------------------------------------------------------------------------------------------
479 ----------------------------------------------------------------------------------------- */
481 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
483 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i)) {
488 /* if it has any inputs, make sure they match */
489 if ((*i)->input_streams() != ChanCount::ZERO) {
490 if (bufs.count() != (*i)->input_streams()) {
491 cerr << _name << " bufs = " << bufs.count()
492 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
498 /* should we NOT run plugins here if the route is inactive?
499 do we catch route != active somewhere higher?
502 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
503 bufs.set_count ((*i)->output_streams());
508 Route::n_process_buffers ()
510 return max (_input->n_ports(), processor_max_streams);
514 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
516 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
520 assert (bufs.available() >= input_streams());
522 if (_input->n_ports() == ChanCount::ZERO) {
523 silence_unlocked (nframes);
526 bufs.set_count (input_streams());
528 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
530 /* control/monitor bus ignores input ports when something is
531 feeding the listen "stream". data will "arrive" into the
532 route from the intreturn processor element.
534 bufs.silence (nframes, 0);
538 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
540 BufferSet::iterator o = bufs.begin(*t);
541 PortSet& ports (_input->ports());
543 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
544 o->read_from (i->get_buffer(nframes), nframes);
549 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
550 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
554 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
556 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
558 bufs.set_count (_input->n_ports());
559 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
560 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
564 Route::set_listen (bool yn, void* src)
570 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
571 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
576 if (yn != _monitor_send->active()) {
578 _monitor_send->activate ();
579 _mute_master->set_soloed (true);
581 _monitor_send->deactivate ();
582 _mute_master->set_soloed (false);
585 listen_changed (src); /* EMIT SIGNAL */
591 Route::listening_via_monitor () const
594 return _monitor_send->active ();
601 Route::set_solo_safe (bool yn, void *src)
603 if (_solo_safe != yn) {
605 solo_safe_changed (src);
610 Route::solo_safe() const
616 Route::set_solo (bool yn, void *src)
622 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
623 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
627 if (self_soloed() != yn) {
629 set_mute_master_solo ();
630 solo_changed (true, src); /* EMIT SIGNAL */
631 _solo_control->Changed (); /* EMIT SIGNAL */
636 Route::set_self_solo (bool yn)
642 Route::mod_solo_by_others_upstream (int32_t delta)
648 uint32_t old_sbu = _soloed_by_others_upstream;
651 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
652 _soloed_by_others_upstream += delta;
654 _soloed_by_others_upstream = 0;
657 _soloed_by_others_upstream += delta;
660 DEBUG_TRACE (DEBUG::Solo, string_compose (
661 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
662 name(), delta, _soloed_by_others_upstream, old_sbu,
663 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
665 /* push the inverse solo change to everything that feeds us.
667 This is important for solo-within-group. When we solo 1 track out of N that
668 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
669 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
670 tracks that feed it. This will silence them if they were audible because
671 of a bus solo, but the newly soloed track will still be audible (because
674 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
678 if ((_self_solo || _soloed_by_others_downstream) &&
679 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
680 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
682 if (delta > 0 || !Config->get_exclusive_solo()) {
683 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
684 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
685 boost::shared_ptr<Route> sr = i->r.lock();
687 sr->mod_solo_by_others_downstream (-delta);
693 set_mute_master_solo ();
694 solo_changed (false, this);
698 Route::mod_solo_by_others_downstream (int32_t delta)
705 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
706 _soloed_by_others_downstream += delta;
708 _soloed_by_others_downstream = 0;
711 _soloed_by_others_downstream += delta;
714 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
716 set_mute_master_solo ();
717 solo_changed (false, this);
721 Route::set_mute_master_solo ()
723 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
727 Route::set_solo_isolated (bool yn, void *src)
729 if (is_master() || is_monitor() || is_hidden()) {
733 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
734 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
738 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
740 boost::shared_ptr<RouteList> routes = _session.get_routes ();
741 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
743 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
748 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
750 if (does_feed && !sends_only) {
751 (*i)->set_solo_isolated (yn, (*i)->route_group());
755 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
757 bool changed = false;
760 if (_solo_isolated == 0) {
761 _mute_master->set_solo_ignore (true);
766 if (_solo_isolated > 0) {
768 if (_solo_isolated == 0) {
769 _mute_master->set_solo_ignore (false);
776 solo_isolated_changed (src);
781 Route::solo_isolated () const
783 return _solo_isolated > 0;
787 Route::set_mute_points (MuteMaster::MutePoint mp)
789 _mute_master->set_mute_points (mp);
790 mute_points_changed (); /* EMIT SIGNAL */
792 if (_mute_master->muted_by_self()) {
793 mute_changed (this); /* EMIT SIGNAL */
794 _mute_control->Changed (); /* EMIT SIGNAL */
799 Route::set_mute (bool yn, void *src)
801 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
802 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
807 _mute_master->set_muted_by_self (yn);
808 mute_changed (src); /* EMIT SIGNAL */
809 _mute_control->Changed (); /* EMIT SIGNAL */
814 Route::muted () const
816 return _mute_master->muted_by_self();
821 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
823 cerr << name << " {" << endl;
824 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
825 p != procs.end(); ++p) {
826 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
833 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
835 ProcessorList::iterator loc;
837 /* XXX this is not thread safe - we don't hold the lock across determining the iter
838 to add before and actually doing the insertion. dammit.
841 if (placement == PreFader) {
842 /* generic pre-fader: insert immediately before the amp */
843 loc = find (_processors.begin(), _processors.end(), _amp);
845 /* generic post-fader: insert right before the main outs */
846 loc = find (_processors.begin(), _processors.end(), _main_outs);
849 return add_processor (processor, loc, err, activation_allowed);
853 /** Add a processor to a route such that it ends up with a given index into the visible processors.
854 * @param index Index to add the processor at, or -1 to add at the end of the list.
858 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
860 /* XXX this is not thread safe - we don't hold the lock across determining the iter
861 to add before and actually doing the insertion. dammit.
865 return add_processor (processor, _processors.end(), err, activation_allowed);
868 ProcessorList::iterator i = _processors.begin ();
870 while (i != _processors.end() && j < index) {
871 if ((*i)->display_to_user()) {
878 return add_processor (processor, i, err, activation_allowed);
881 /** Add a processor to the route.
882 * @param iter an iterator in _processors; the new processor will be inserted immediately before this location.
885 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
887 assert (processor != _meter);
888 assert (processor != _main_outs);
890 DEBUG_TRACE (DEBUG::Processors, string_compose (
891 "%1 adding processor %2\n", name(), processor->name()));
893 if (!_session.engine().connected() || !processor) {
898 Glib::RWLock::WriterLock lm (_processor_lock);
899 ProcessorState pstate (this);
901 boost::shared_ptr<PluginInsert> pi;
902 boost::shared_ptr<PortInsert> porti;
904 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
906 if (processor == _amp) {
907 // Ensure only one amp is in the list at any time
908 if (loc != _processors.end()) {
909 if (iter == loc) { // Already in place, do nothing
911 } else { // New position given, relocate
912 _processors.erase (loc);
917 if (loc != _processors.end()) {
918 cerr << "ERROR: Processor added to route twice!" << endl;
925 _processors.insert (loc, processor);
927 // Set up processor list channels. This will set processor->[input|output]_streams(),
928 // configure redirect ports properly, etc.
931 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
933 if (configure_processors_unlocked (err)) {
935 configure_processors_unlocked (0); // it worked before we tried to add it ...
940 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
942 if (pi->has_no_inputs ()) {
943 /* generator plugin */
944 _have_internal_generator = true;
949 if (activation_allowed) {
950 processor->activate ();
953 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
955 _output->set_user_latency (0);
958 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
959 set_processor_positions ();
965 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
967 const XMLProperty *prop;
970 boost::shared_ptr<Processor> processor;
972 /* bit of a hack: get the `placement' property from the <Redirect> tag here
973 so that we can add the processor in the right place (pre/post-fader)
976 XMLNodeList const & children = node.children ();
977 XMLNodeList::const_iterator i = children.begin ();
979 while (i != children.end() && (*i)->name() != X_("Redirect")) {
983 Placement placement = PreFader;
985 if (i != children.end()) {
986 if ((prop = (*i)->property (X_("placement"))) != 0) {
987 placement = Placement (string_2_enum (prop->value(), placement));
991 if (node.name() == "Insert") {
993 if ((prop = node.property ("type")) != 0) {
995 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
996 prop->value() == "lv2" ||
997 prop->value() == "vst" ||
998 prop->value() == "lxvst" ||
999 prop->value() == "audiounit") {
1001 processor.reset (new PluginInsert (_session));
1005 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1010 } else if (node.name() == "Send") {
1012 processor.reset (new Send (_session, _pannable, _mute_master));
1016 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1020 if (processor->set_state (node, version)) {
1024 return (add_processor (processor, placement) == 0);
1027 catch (failed_constructor &err) {
1028 warning << _("processor could not be created. Ignored.") << endmsg;
1034 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1036 /* NOTE: this is intended to be used ONLY when copying
1037 processors from another Route. Hence the subtle
1038 differences between this and ::add_processor()
1041 ProcessorList::iterator loc;
1044 loc = find(_processors.begin(), _processors.end(), before);
1046 /* nothing specified - at end */
1047 loc = _processors.end ();
1050 if (!_session.engine().connected()) {
1054 if (others.empty()) {
1059 Glib::RWLock::WriterLock lm (_processor_lock);
1060 ProcessorState pstate (this);
1062 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1068 boost::shared_ptr<PluginInsert> pi;
1070 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1074 _processors.insert (loc, *i);
1076 if ((*i)->active()) {
1081 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1082 if (configure_processors_unlocked (err)) {
1084 configure_processors_unlocked (0); // it worked before we tried to add it ...
1089 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1092 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1093 boost::shared_ptr<PluginInsert> pi;
1095 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1096 if (pi->has_no_inputs ()) {
1097 _have_internal_generator = true;
1103 _output->set_user_latency (0);
1106 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1107 set_processor_positions ();
1113 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1115 if (p == PreFader) {
1116 start = _processors.begin();
1117 end = find(_processors.begin(), _processors.end(), _amp);
1119 start = find(_processors.begin(), _processors.end(), _amp);
1121 end = _processors.end();
1125 /** Turn off all processors with a given placement
1126 * @param p Placement of processors to disable
1129 Route::disable_processors (Placement p)
1131 Glib::RWLock::ReaderLock lm (_processor_lock);
1133 ProcessorList::iterator start, end;
1134 placement_range(p, start, end);
1136 for (ProcessorList::iterator i = start; i != end; ++i) {
1137 (*i)->deactivate ();
1140 _session.set_dirty ();
1143 /** Turn off all redirects
1146 Route::disable_processors ()
1148 Glib::RWLock::ReaderLock lm (_processor_lock);
1150 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1151 (*i)->deactivate ();
1154 _session.set_dirty ();
1157 /** Turn off all redirects with a given placement
1158 * @param p Placement of redirects to disable
1161 Route::disable_plugins (Placement p)
1163 Glib::RWLock::ReaderLock lm (_processor_lock);
1165 ProcessorList::iterator start, end;
1166 placement_range(p, start, end);
1168 for (ProcessorList::iterator i = start; i != end; ++i) {
1169 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1170 (*i)->deactivate ();
1174 _session.set_dirty ();
1177 /** Turn off all plugins
1180 Route::disable_plugins ()
1182 Glib::RWLock::ReaderLock lm (_processor_lock);
1184 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1185 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1186 (*i)->deactivate ();
1190 _session.set_dirty ();
1195 Route::ab_plugins (bool forward)
1197 Glib::RWLock::ReaderLock lm (_processor_lock);
1201 /* forward = turn off all active redirects, and mark them so that the next time
1202 we go the other way, we will revert them
1205 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1206 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1210 if ((*i)->active()) {
1211 (*i)->deactivate ();
1212 (*i)->set_next_ab_is_active (true);
1214 (*i)->set_next_ab_is_active (false);
1220 /* backward = if the redirect was marked to go active on the next ab, do so */
1222 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1224 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1228 if ((*i)->get_next_ab_is_active()) {
1231 (*i)->deactivate ();
1236 _session.set_dirty ();
1240 /** Remove processors with a given placement.
1241 * @param p Placement of processors to remove.
1244 Route::clear_processors (Placement p)
1246 if (!_session.engine().connected()) {
1250 bool already_deleting = _session.deletion_in_progress();
1251 if (!already_deleting) {
1252 _session.set_deletion_in_progress();
1256 Glib::RWLock::WriterLock lm (_processor_lock);
1257 ProcessorList new_list;
1258 ProcessorStreams err;
1259 bool seen_amp = false;
1261 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1267 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1269 /* you can't remove these */
1271 new_list.push_back (*i);
1278 new_list.push_back (*i);
1281 (*i)->drop_references ();
1289 (*i)->drop_references ();
1292 new_list.push_back (*i);
1299 _processors = new_list;
1302 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1303 configure_processors_unlocked (&err); // this can't fail
1307 processor_max_streams.reset();
1308 _have_internal_generator = false;
1309 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1310 set_processor_positions ();
1312 if (!already_deleting) {
1313 _session.clear_deletion_in_progress();
1318 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1320 /* these can never be removed */
1322 if (processor == _amp || processor == _meter || processor == _main_outs) {
1326 if (!_session.engine().connected()) {
1330 processor_max_streams.reset();
1333 Glib::RWLock::WriterLock lm (_processor_lock);
1334 ProcessorState pstate (this);
1336 ProcessorList::iterator i;
1337 bool removed = false;
1339 for (i = _processors.begin(); i != _processors.end(); ) {
1340 if (*i == processor) {
1342 /* move along, see failure case for configure_processors()
1343 where we may need to reconfigure the processor.
1346 /* stop redirects that send signals to JACK ports
1347 from causing noise as a result of no longer being
1351 boost::shared_ptr<IOProcessor> iop;
1353 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1355 iop->input()->disconnect (this);
1357 if (iop->output()) {
1358 iop->output()->disconnect (this);
1362 i = _processors.erase (i);
1370 _output->set_user_latency (0);
1379 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1381 if (configure_processors_unlocked (err)) {
1383 /* we know this will work, because it worked before :) */
1384 configure_processors_unlocked (0);
1389 _have_internal_generator = false;
1391 for (i = _processors.begin(); i != _processors.end(); ++i) {
1392 boost::shared_ptr<PluginInsert> pi;
1394 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1395 if (pi->has_no_inputs ()) {
1396 _have_internal_generator = true;
1403 processor->drop_references ();
1404 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1405 set_processor_positions ();
1411 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1413 ProcessorList deleted;
1415 if (!_session.engine().connected()) {
1419 processor_max_streams.reset();
1422 Glib::RWLock::WriterLock lm (_processor_lock);
1423 ProcessorState pstate (this);
1425 ProcessorList::iterator i;
1426 boost::shared_ptr<Processor> processor;
1428 for (i = _processors.begin(); i != _processors.end(); ) {
1432 /* these can never be removed */
1434 if (processor == _amp || processor == _meter || processor == _main_outs) {
1439 /* see if its in the list of processors to delete */
1441 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1446 /* stop IOProcessors that send to JACK ports
1447 from causing noise as a result of no longer being
1451 boost::shared_ptr<IOProcessor> iop;
1453 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1457 deleted.push_back (processor);
1458 i = _processors.erase (i);
1461 if (deleted.empty()) {
1462 /* none of those in the requested list were found */
1466 _output->set_user_latency (0);
1469 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1471 if (configure_processors_unlocked (err)) {
1473 /* we know this will work, because it worked before :) */
1474 configure_processors_unlocked (0);
1479 _have_internal_generator = false;
1481 for (i = _processors.begin(); i != _processors.end(); ++i) {
1482 boost::shared_ptr<PluginInsert> pi;
1484 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1485 if (pi->has_no_inputs ()) {
1486 _have_internal_generator = true;
1493 /* now try to do what we need to so that those that were removed will be deleted */
1495 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1496 (*i)->drop_references ();
1499 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1500 set_processor_positions ();
1505 /** Caller must hold process lock */
1507 Route::configure_processors (ProcessorStreams* err)
1509 assert (!AudioEngine::instance()->process_lock().trylock());
1511 if (!_in_configure_processors) {
1512 Glib::RWLock::WriterLock lm (_processor_lock);
1513 return configure_processors_unlocked (err);
1520 Route::input_streams () const
1522 return _input->n_ports ();
1525 list<pair<ChanCount, ChanCount> >
1526 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1528 Glib::RWLock::ReaderLock lm (_processor_lock);
1530 return try_configure_processors_unlocked (in, err);
1533 list<pair<ChanCount, ChanCount> >
1534 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1536 // Check each processor in order to see if we can configure as requested
1538 list<pair<ChanCount, ChanCount> > configuration;
1541 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1542 DEBUG_TRACE (DEBUG::Processors, "{\n");
1544 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1546 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1547 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1551 if ((*p)->can_support_io_configuration(in, out)) {
1552 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1553 configuration.push_back(make_pair(in, out));
1560 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1561 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1562 DEBUG_TRACE (DEBUG::Processors, "}\n");
1563 return list<pair<ChanCount, ChanCount> > ();
1567 DEBUG_TRACE (DEBUG::Processors, "}\n");
1569 return configuration;
1572 /** Set the input/output configuration of each processor in the processors list.
1573 * Caller must hold process lock.
1574 * Return 0 on success, otherwise configuration is impossible.
1577 Route::configure_processors_unlocked (ProcessorStreams* err)
1579 assert (!AudioEngine::instance()->process_lock().trylock());
1581 if (_in_configure_processors) {
1585 /* put invisible processors where they should be */
1586 setup_invisible_processors ();
1588 _in_configure_processors = true;
1590 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1592 if (configuration.empty ()) {
1593 _in_configure_processors = false;
1599 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1600 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1602 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1606 (*p)->configure_io(c->first, c->second);
1607 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1608 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1613 _meter->reset_max_channels (processor_max_streams);
1616 /* make sure we have sufficient scratch buffers to cope with the new processor
1619 _session.ensure_buffers (n_process_buffers ());
1621 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1623 _in_configure_processors = false;
1627 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1628 * @param state New active state for those processors.
1631 Route::all_visible_processors_active (bool state)
1633 Glib::RWLock::ReaderLock lm (_processor_lock);
1635 if (_processors.empty()) {
1639 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1640 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1647 (*i)->deactivate ();
1651 _session.set_dirty ();
1655 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1657 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1658 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1659 processors in the current actual processor list that are hidden. Any visible processors
1660 in the current list but not in "new_order" will be assumed to be deleted.
1664 Glib::RWLock::WriterLock lm (_processor_lock);
1665 ProcessorState pstate (this);
1667 ProcessorList::iterator oiter;
1668 ProcessorList::const_iterator niter;
1669 ProcessorList as_it_will_be;
1671 oiter = _processors.begin();
1672 niter = new_order.begin();
1674 while (niter != new_order.end()) {
1676 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1677 then append it to the temp list.
1679 Otherwise, see if the next processor in the old list is in the new list. if not,
1680 its been deleted. If its there, append it to the temp list.
1683 if (oiter == _processors.end()) {
1685 /* no more elements in the old list, so just stick the rest of
1686 the new order onto the temp list.
1689 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1690 while (niter != new_order.end()) {
1697 if (!(*oiter)->display_to_user()) {
1699 as_it_will_be.push_back (*oiter);
1703 /* visible processor: check that its in the new order */
1705 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1706 /* deleted: do nothing, shared_ptr<> will clean up */
1708 /* ignore this one, and add the next item from the new order instead */
1709 as_it_will_be.push_back (*niter);
1714 /* now remove from old order - its taken care of no matter what */
1715 oiter = _processors.erase (oiter);
1720 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1722 /* If the meter is in a custom position, find it and make a rough note of its position */
1723 maybe_note_meter_position ();
1726 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1728 if (configure_processors_unlocked (err)) {
1735 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1736 set_processor_positions ();
1748 Route::get_template()
1750 return state(false);
1754 Route::state(bool full_state)
1756 XMLNode *node = new XMLNode("Route");
1757 ProcessorList::iterator i;
1760 id().print (buf, sizeof (buf));
1761 node->add_property("id", buf);
1762 node->add_property ("name", _name);
1763 node->add_property("default-type", _default_type.to_string());
1766 node->add_property("flags", enum_2_string (_flags));
1769 node->add_property("active", _active?"yes":"no");
1771 boost::to_string (_phase_invert, p);
1772 node->add_property("phase-invert", p);
1773 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1774 node->add_property("meter-point", enum_2_string (_meter_point));
1777 node->add_property("route-group", _route_group->name());
1780 string order_string;
1781 OrderKeys::iterator x = order_keys.begin();
1783 while (x != order_keys.end()) {
1784 order_string += string ((*x).first);
1785 order_string += '=';
1786 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1787 order_string += buf;
1791 if (x == order_keys.end()) {
1795 order_string += ':';
1797 node->add_property ("order-keys", order_string);
1798 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1799 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1800 node->add_property ("soloed-by-upstream", buf);
1801 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1802 node->add_property ("soloed-by-downstream", buf);
1803 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1804 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1806 node->add_child_nocopy (_input->state (full_state));
1807 node->add_child_nocopy (_output->state (full_state));
1808 node->add_child_nocopy (_solo_control->get_state ());
1809 node->add_child_nocopy (_mute_control->get_state ());
1810 node->add_child_nocopy (_mute_master->get_state ());
1812 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1813 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1814 remote_control_node->add_property (X_("id"), buf);
1815 node->add_child_nocopy (*remote_control_node);
1817 if (_comment.length()) {
1818 XMLNode *cmt = node->add_child ("Comment");
1819 cmt->add_content (_comment);
1823 node->add_child_nocopy (_pannable->state (full_state));
1826 for (i = _processors.begin(); i != _processors.end(); ++i) {
1827 node->add_child_nocopy((*i)->state (full_state));
1831 node->add_child_copy (*_extra_xml);
1834 if (_custom_meter_position_noted) {
1835 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1837 after->id().print (buf, sizeof (buf));
1838 node->add_property (X_("processor-after-last-custom-meter"), buf);
1841 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1848 Route::set_state (const XMLNode& node, int version)
1850 if (version < 3000) {
1851 return set_state_2X (node, version);
1855 XMLNodeConstIterator niter;
1857 const XMLProperty *prop;
1859 if (node.name() != "Route"){
1860 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1864 if ((prop = node.property (X_("name"))) != 0) {
1865 Route::set_name (prop->value());
1870 if ((prop = node.property (X_("flags"))) != 0) {
1871 _flags = Flag (string_2_enum (prop->value(), _flags));
1876 if (is_master() || is_monitor() || is_hidden()) {
1877 _mute_master->set_solo_ignore (true);
1881 /* monitor bus does not get a panner, but if (re)created
1882 via XML, it will already have one by the time we
1883 call ::set_state(). so ... remove it.
1888 /* add all processors (except amp, which is always present) */
1890 nlist = node.children();
1891 XMLNode processor_state (X_("processor_state"));
1893 Stateful::save_extra_xml (node);
1895 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1899 if (child->name() == IO::state_node_name) {
1900 if ((prop = child->property (X_("direction"))) == 0) {
1904 if (prop->value() == "Input") {
1905 _input->set_state (*child, version);
1906 } else if (prop->value() == "Output") {
1907 _output->set_state (*child, version);
1911 if (child->name() == X_("Processor")) {
1912 processor_state.add_child_copy (*child);
1916 if (child->name() == X_("Pannable")) {
1918 _pannable->set_state (*child, version);
1920 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
1925 if ((prop = node.property (X_("meter-point"))) != 0) {
1926 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1927 set_meter_point (mp, true);
1929 _meter->set_display_to_user (_meter_point == MeterCustom);
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_("order-keys"))) != 0) {
1975 string::size_type colon, equal;
1976 string remaining = prop->value();
1978 while (remaining.length()) {
1980 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1981 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1984 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
1985 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1988 set_order_key (remaining.substr (0, equal), n);
1992 colon = remaining.find_first_of (':');
1994 if (colon != string::npos) {
1995 remaining = remaining.substr (colon+1);
2002 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2003 PBD::ID id (prop->value ());
2004 Glib::RWLock::ReaderLock lm (_processor_lock);
2005 ProcessorList::const_iterator i = _processors.begin ();
2006 while (i != _processors.end() && (*i)->id() != id) {
2010 if (i != _processors.end ()) {
2011 _processor_after_last_custom_meter = *i;
2012 _custom_meter_position_noted = true;
2016 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2017 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2020 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2023 if (child->name() == X_("Comment")) {
2025 /* XXX this is a terrible API design in libxml++ */
2027 XMLNode *cmt = *(child->children().begin());
2028 _comment = cmt->content();
2030 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2031 if (prop->value() == "solo") {
2032 _solo_control->set_state (*child, version);
2035 } else if (child->name() == X_("RemoteControl")) {
2036 if ((prop = child->property (X_("id"))) != 0) {
2038 sscanf (prop->value().c_str(), "%d", &x);
2039 set_remote_control_id (x);
2042 } else if (child->name() == X_("MuteMaster")) {
2043 _mute_master->set_state (*child, version);
2051 Route::set_state_2X (const XMLNode& node, int version)
2054 XMLNodeConstIterator niter;
2056 const XMLProperty *prop;
2058 /* 2X things which still remain to be handled:
2064 if (node.name() != "Route") {
2065 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2069 if ((prop = node.property (X_("flags"))) != 0) {
2070 _flags = Flag (string_2_enum (prop->value(), _flags));
2075 if ((prop = node.property (X_("phase-invert"))) != 0) {
2076 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2077 if (string_is_affirmative (prop->value ())) {
2080 set_phase_invert (p);
2083 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2084 set_denormal_protection (string_is_affirmative (prop->value()));
2087 if ((prop = node.property (X_("soloed"))) != 0) {
2088 bool yn = string_is_affirmative (prop->value());
2090 /* XXX force reset of solo status */
2092 set_solo (yn, this);
2095 if ((prop = node.property (X_("muted"))) != 0) {
2098 bool muted = string_is_affirmative (prop->value());
2104 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2106 if (string_is_affirmative (prop->value())){
2107 mute_point = mute_point + "PreFader";
2112 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2114 if (string_is_affirmative (prop->value())){
2117 mute_point = mute_point + ",";
2120 mute_point = mute_point + "PostFader";
2125 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2127 if (string_is_affirmative (prop->value())){
2130 mute_point = mute_point + ",";
2133 mute_point = mute_point + "Listen";
2138 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2140 if (string_is_affirmative (prop->value())){
2143 mute_point = mute_point + ",";
2146 mute_point = mute_point + "Main";
2150 _mute_master->set_mute_points (mute_point);
2151 _mute_master->set_muted_by_self (true);
2155 if ((prop = node.property (X_("meter-point"))) != 0) {
2156 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2159 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2160 don't mean the same thing.
2163 if ((prop = node.property (X_("order-keys"))) != 0) {
2167 string::size_type colon, equal;
2168 string remaining = prop->value();
2170 while (remaining.length()) {
2172 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2173 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2176 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2177 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2180 set_order_key (remaining.substr (0, equal), n);
2184 colon = remaining.find_first_of (':');
2186 if (colon != string::npos) {
2187 remaining = remaining.substr (colon+1);
2196 nlist = node.children ();
2197 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2201 if (child->name() == IO::state_node_name) {
2203 /* there is a note in IO::set_state_2X() about why we have to call
2207 _input->set_state_2X (*child, version, true);
2208 _output->set_state_2X (*child, version, false);
2210 if ((prop = child->property (X_("name"))) != 0) {
2211 Route::set_name (prop->value ());
2216 if ((prop = child->property (X_("active"))) != 0) {
2217 bool yn = string_is_affirmative (prop->value());
2218 _active = !yn; // force switch
2219 set_active (yn, this);
2222 if ((prop = child->property (X_("gain"))) != 0) {
2225 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2226 _amp->gain_control()->set_value (val);
2230 /* Set up Panners in the IO */
2231 XMLNodeList io_nlist = child->children ();
2233 XMLNodeConstIterator io_niter;
2236 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2238 io_child = *io_niter;
2240 if (io_child->name() == X_("Panner")) {
2241 _main_outs->panner_shell()->set_state(*io_child, version);
2242 } else if (io_child->name() == X_("Automation")) {
2243 /* IO's automation is for the fader */
2244 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2250 XMLNodeList redirect_nodes;
2252 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2256 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2257 redirect_nodes.push_back(child);
2262 set_processor_state_2X (redirect_nodes, version);
2264 Stateful::save_extra_xml (node);
2266 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2269 if (child->name() == X_("Comment")) {
2271 /* XXX this is a terrible API design in libxml++ */
2273 XMLNode *cmt = *(child->children().begin());
2274 _comment = cmt->content();
2276 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2277 if (prop->value() == X_("solo")) {
2278 _solo_control->set_state (*child, version);
2279 } else if (prop->value() == X_("mute")) {
2280 _mute_control->set_state (*child, version);
2283 } else if (child->name() == X_("RemoteControl")) {
2284 if ((prop = child->property (X_("id"))) != 0) {
2286 sscanf (prop->value().c_str(), "%d", &x);
2287 set_remote_control_id (x);
2297 Route::get_processor_state ()
2299 XMLNode* root = new XMLNode (X_("redirects"));
2300 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2301 root->add_child_nocopy ((*i)->state (true));
2308 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2310 /* We don't bother removing existing processors not in nList, as this
2311 method will only be called when creating a Route from scratch, not
2312 for undo purposes. Just put processors in at the appropriate place
2316 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2317 add_processor_from_xml_2X (**i, version);
2322 Route::set_processor_state (const XMLNode& node)
2324 const XMLNodeList &nlist = node.children();
2325 XMLNodeConstIterator niter;
2326 ProcessorList new_order;
2327 bool must_configure = false;
2329 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2331 XMLProperty* prop = (*niter)->property ("type");
2333 if (prop->value() == "amp") {
2334 _amp->set_state (**niter, Stateful::current_state_version);
2335 new_order.push_back (_amp);
2336 } else if (prop->value() == "meter") {
2337 _meter->set_state (**niter, Stateful::current_state_version);
2338 new_order.push_back (_meter);
2339 } else if (prop->value() == "main-outs") {
2340 _main_outs->set_state (**niter, Stateful::current_state_version);
2341 } else if (prop->value() == "intreturn") {
2343 _intreturn.reset (new InternalReturn (_session));
2344 must_configure = true;
2346 _intreturn->set_state (**niter, Stateful::current_state_version);
2347 } else if (is_monitor() && prop->value() == "monitor") {
2348 if (!_monitor_control) {
2349 _monitor_control.reset (new MonitorProcessor (_session));
2350 must_configure = true;
2352 _monitor_control->set_state (**niter, Stateful::current_state_version);
2353 } else if (prop->value() == "capture") {
2354 _capturing_processor.reset (new CapturingProcessor (_session));
2356 ProcessorList::iterator o;
2358 for (o = _processors.begin(); o != _processors.end(); ++o) {
2359 XMLProperty* id_prop = (*niter)->property(X_("id"));
2360 if (id_prop && (*o)->id() == id_prop->value()) {
2361 (*o)->set_state (**niter, Stateful::current_state_version);
2362 new_order.push_back (*o);
2367 // If the processor (*niter) is not on the route then create it
2369 if (o == _processors.end()) {
2371 boost::shared_ptr<Processor> processor;
2373 if (prop->value() == "intsend") {
2375 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2377 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2378 prop->value() == "lv2" ||
2379 prop->value() == "vst" ||
2380 prop->value() == "lxvst" ||
2381 prop->value() == "audiounit") {
2383 processor.reset (new PluginInsert(_session));
2385 } else if (prop->value() == "port") {
2387 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2389 } else if (prop->value() == "send") {
2391 processor.reset (new Send (_session, _pannable, _mute_master));
2394 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2398 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2399 /* This processor could not be configured. Turn it into a UnknownProcessor */
2400 processor.reset (new UnknownProcessor (_session, **niter));
2403 /* we have to note the monitor send here, otherwise a new one will be created
2404 and the state of this one will be lost.
2406 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2407 if (isend && isend->role() == Delivery::Listen) {
2408 _monitor_send = isend;
2411 /* it doesn't matter if invisible processors are added here, as they
2412 will be sorted out by setup_invisible_processors () shortly.
2415 new_order.push_back (processor);
2416 must_configure = true;
2422 Glib::RWLock::WriterLock lm (_processor_lock);
2423 _processors = new_order;
2425 if (must_configure) {
2426 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2427 configure_processors_unlocked (0);
2430 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2432 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2434 boost::shared_ptr<PluginInsert> pi;
2436 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2437 if (pi->has_no_inputs ()) {
2438 _have_internal_generator = true;
2445 processors_changed (RouteProcessorChange ());
2446 set_processor_positions ();
2450 Route::curve_reallocate ()
2452 // _gain_automation_curve.finish_resize ();
2453 // _pan_automation_curve.finish_resize ();
2457 Route::silence (framecnt_t nframes)
2459 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2464 silence_unlocked (nframes);
2468 Route::silence_unlocked (framecnt_t nframes)
2470 /* Must be called with the processor lock held */
2474 _output->silence (nframes);
2476 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2477 boost::shared_ptr<PluginInsert> pi;
2479 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2480 // skip plugins, they don't need anything when we're not active
2484 (*i)->silence (nframes);
2487 if (nframes == _session.get_block_size()) {
2494 Route::add_internal_return ()
2497 _intreturn.reset (new InternalReturn (_session));
2498 add_processor (_intreturn, PreFader);
2503 Route::add_send_to_internal_return (InternalSend* send)
2505 Glib::RWLock::ReaderLock rm (_processor_lock);
2507 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2508 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2511 return d->add_send (send);
2517 Route::remove_send_from_internal_return (InternalSend* send)
2519 Glib::RWLock::ReaderLock rm (_processor_lock);
2521 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2522 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2525 return d->remove_send (send);
2530 /** Add a monitor send (if we don't already have one) but don't activate it */
2532 Route::listen_via_monitor ()
2534 /* master never sends to control outs */
2535 assert (!is_master ());
2537 /* make sure we have one */
2538 if (!_monitor_send) {
2539 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2540 _monitor_send->set_display_to_user (false);
2544 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2545 configure_processors (0);
2550 /** Add an internal send to a route.
2551 * @param route route to send to.
2552 * @param placement placement for the send.
2555 Route::listen_via (boost::shared_ptr<Route> route, Placement placement)
2557 assert (route != _session.monitor_out ());
2560 Glib::RWLock::ReaderLock rm (_processor_lock);
2562 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2564 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2566 if (d && d->target_route() == route) {
2567 /* already listening via the specified IO: do nothing */
2574 boost::shared_ptr<InternalSend> listener (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2575 add_processor (listener, placement);
2577 } catch (failed_constructor& err) {
2585 Route::drop_listen (boost::shared_ptr<Route> route)
2587 ProcessorStreams err;
2588 ProcessorList::iterator tmp;
2590 Glib::RWLock::ReaderLock rl(_processor_lock);
2594 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2596 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2598 if (d && d->target_route() == route) {
2600 remove_processor (*x, &err);
2603 /* list could have been demolished while we dropped the lock
2613 if (route == _session.monitor_out()) {
2614 _monitor_send.reset ();
2619 Route::set_comment (string cmt, void *src)
2622 comment_changed (src);
2623 _session.set_dirty ();
2627 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2629 FeedRecord fr (other, via_sends_only);
2631 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2633 if (!result.second) {
2635 /* already a record for "other" - make sure sends-only information is correct */
2636 if (!via_sends_only && result.first->sends_only) {
2637 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2638 frp->sends_only = false;
2642 return result.second;
2646 Route::clear_fed_by ()
2652 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2654 const FedBy& fed_by (other->fed_by());
2656 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2657 boost::shared_ptr<Route> sr = f->r.lock();
2659 if (sr && (sr.get() == this)) {
2661 if (via_sends_only) {
2662 *via_sends_only = f->sends_only;
2673 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2675 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2677 if (_output->connected_to (other->input())) {
2678 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2679 if (via_send_only) {
2680 *via_send_only = false;
2687 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2689 boost::shared_ptr<IOProcessor> iop;
2691 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2692 if (iop->feeds (other)) {
2693 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2694 if (via_send_only) {
2695 *via_send_only = true;
2699 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2702 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2707 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2712 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2714 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2717 /** Called from the (non-realtime) butler thread when the transport is stopped */
2719 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2721 framepos_t now = _session.transport_frame();
2724 Glib::RWLock::ReaderLock lm (_processor_lock);
2727 automation_snapshot (now, true);
2730 Automatable::transport_stopped (now);
2732 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2734 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2738 (*i)->transport_stopped (now);
2742 _roll_delay = _initial_delay;
2745 /** Called with the process lock held if change contains ConfigurationChanged */
2747 Route::input_change_handler (IOChange change, void * /*src*/)
2749 if ((change.type & IOChange::ConfigurationChanged)) {
2750 configure_processors (0);
2751 _phase_invert.resize (_input->n_ports().n_audio ());
2752 io_changed (); /* EMIT SIGNAL */
2757 Route::pans_required () const
2759 if (n_outputs().n_audio() < 2) {
2763 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2767 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2769 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2774 if (n_outputs().n_total() == 0) {
2778 if (!_active || n_inputs() == ChanCount::ZERO) {
2779 silence_unlocked (nframes);
2782 if (session_state_changing) {
2783 if (_session.transport_speed() != 0.0f) {
2784 /* we're rolling but some state is changing (e.g. our diskstream contents)
2785 so we cannot use them. Be silent till this is over.
2787 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2789 silence_unlocked (nframes);
2792 /* we're really not rolling, so we're either delivery silence or actually
2793 monitoring, both of which are safe to do while session_state_changing is true.
2797 _amp->apply_gain_automation (false);
2798 passthru (start_frame, end_frame, nframes, 0);
2804 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
2806 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2811 automation_snapshot (_session.transport_frame(), false);
2813 if (n_outputs().n_total() == 0) {
2817 if (!_active || n_inputs().n_total() == 0) {
2818 silence_unlocked (nframes);
2822 framecnt_t unused = 0;
2824 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2830 passthru (start_frame, end_frame, nframes, declick);
2836 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
2843 Route::toggle_monitor_input ()
2845 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2846 i->ensure_monitor_input( ! i->monitoring_input());
2851 Route::has_external_redirects () const
2853 // FIXME: what about sends? - they don't return a signal back to ardour?
2855 boost::shared_ptr<const PortInsert> pi;
2857 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2859 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2861 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2863 string port_name = port->name();
2864 string client_name = port_name.substr (0, port_name.find(':'));
2866 /* only say "yes" if the redirect is actually in use */
2868 if (client_name != "ardour" && pi->active()) {
2879 Route::flush_processors ()
2881 /* XXX shouldn't really try to take this lock, since
2882 this is called from the RT audio thread.
2885 Glib::RWLock::ReaderLock lm (_processor_lock);
2887 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2893 Route::set_meter_point (MeterPoint p, bool force)
2895 /* CAN BE CALLED FROM PROCESS CONTEXT */
2897 if (_meter_point == p && !force) {
2901 bool meter_was_visible_to_user = _meter->display_to_user ();
2904 Glib::RWLock::WriterLock lm (_processor_lock);
2906 maybe_note_meter_position ();
2910 if (_meter_point != MeterCustom) {
2912 _meter->set_display_to_user (false);
2914 setup_invisible_processors ();
2918 _meter->set_display_to_user (true);
2920 /* If we have a previous position for the custom meter, try to put it there */
2921 if (_custom_meter_position_noted) {
2922 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2925 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
2926 if (i != _processors.end ()) {
2927 _processors.remove (_meter);
2928 _processors.insert (i, _meter);
2930 } else if (_last_custom_meter_was_at_end) {
2931 _processors.remove (_meter);
2932 _processors.push_back (_meter);
2937 /* Set up the meter for its new position */
2939 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2943 if (loc == _processors.begin()) {
2944 m_in = _input->n_ports();
2946 ProcessorList::iterator before = loc;
2948 m_in = (*before)->output_streams ();
2951 _meter->reflect_inputs (m_in);
2953 /* we do not need to reconfigure the processors, because the meter
2954 (a) is always ready to handle processor_max_streams
2955 (b) is always an N-in/N-out processor, and thus moving
2956 it doesn't require any changes to the other processors.
2960 meter_change (); /* EMIT SIGNAL */
2962 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2964 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2968 Route::listen_position_changed ()
2971 Glib::RWLock::WriterLock lm (_processor_lock);
2972 ProcessorState pstate (this);
2975 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2977 if (configure_processors_unlocked (0)) {
2979 configure_processors_unlocked (0); // it worked before we tried to add it ...
2985 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2986 _session.set_dirty ();
2989 boost::shared_ptr<CapturingProcessor>
2990 Route::add_export_point()
2992 if (!_capturing_processor) {
2994 _capturing_processor.reset (new CapturingProcessor (_session));
2995 _capturing_processor->activate ();
2998 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2999 configure_processors (0);
3004 return _capturing_processor;
3008 Route::update_signal_latency ()
3010 framecnt_t l = _output->user_latency();
3012 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3013 if ((*i)->active ()) {
3014 l += (*i)->signal_latency ();
3018 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3020 if (_signal_latency != l) {
3021 _signal_latency = l;
3022 signal_latency_changed (); /* EMIT SIGNAL */
3025 return _signal_latency;
3029 Route::set_user_latency (framecnt_t nframes)
3031 _output->set_user_latency (nframes);
3032 _session.update_latency_compensation ();
3036 Route::set_latency_compensation (framecnt_t longest_session_latency)
3038 framecnt_t old = _initial_delay;
3040 if (_signal_latency < longest_session_latency) {
3041 _initial_delay = longest_session_latency - _signal_latency;
3046 DEBUG_TRACE (DEBUG::Latency, string_compose (
3047 "%1: compensate for maximum latency of %2,"
3048 "given own latency of %3, using initial delay of %4\n",
3049 name(), longest_session_latency, _signal_latency, _initial_delay));
3051 if (_initial_delay != old) {
3052 initial_delay_changed (); /* EMIT SIGNAL */
3055 if (_session.transport_stopped()) {
3056 _roll_delay = _initial_delay;
3061 Route::automation_snapshot (framepos_t now, bool force)
3064 _pannable->automation_snapshot (now, force);
3067 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3068 (*i)->automation_snapshot (now, force);
3072 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3073 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3074 boost::shared_ptr<AutomationList>(), name)
3077 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3082 Route::SoloControllable::set_value (double val)
3084 bool bval = ((val >= 0.5f) ? true: false);
3086 boost::shared_ptr<RouteList> rl (new RouteList);
3088 boost::shared_ptr<Route> r = _route.lock ();
3095 if (Config->get_solo_control_is_listen_control()) {
3096 _session.set_listen (rl, bval);
3098 _session.set_solo (rl, bval);
3103 Route::SoloControllable::get_value () const
3105 boost::shared_ptr<Route> r = _route.lock ();
3110 if (Config->get_solo_control_is_listen_control()) {
3111 return r->listening_via_monitor() ? 1.0f : 0.0f;
3113 return r->self_soloed() ? 1.0f : 0.0f;
3117 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3118 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3119 boost::shared_ptr<AutomationList>(), name)
3122 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3127 Route::MuteControllable::set_value (double val)
3129 bool bval = ((val >= 0.5f) ? true: false);
3131 boost::shared_ptr<RouteList> rl (new RouteList);
3133 boost::shared_ptr<Route> r = _route.lock ();
3139 _session.set_mute (rl, bval);
3143 Route::MuteControllable::get_value () const
3145 boost::shared_ptr<Route> r = _route.lock ();
3150 return r->muted() ? 1.0f : 0.0f;
3154 Route::set_block_size (pframes_t nframes)
3156 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3157 (*i)->set_block_size (nframes);
3160 _session.ensure_buffers (n_process_buffers ());
3164 Route::protect_automation ()
3166 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3167 (*i)->protect_automation();
3171 Route::set_pending_declick (int declick)
3174 /* this call is not allowed to turn off a pending declick unless "force" is true */
3176 _pending_declick = declick;
3178 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3180 _pending_declick = 0;
3185 /** Shift automation forwards from a particular place, thereby inserting time.
3186 * Adds undo commands for any shifts that are performed.
3188 * @param pos Position to start shifting from.
3189 * @param frames Amount to shift forwards by.
3193 Route::shift (framepos_t pos, framecnt_t frames)
3195 /* gain automation */
3197 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3199 XMLNode &before = gc->alist()->get_state ();
3200 gc->alist()->shift (pos, frames);
3201 XMLNode &after = gc->alist()->get_state ();
3202 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3205 /* pan automation */
3207 ControlSet::Controls& c (_pannable->controls());
3209 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3210 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3212 boost::shared_ptr<AutomationList> al = pc->alist();
3213 XMLNode& before = al->get_state ();
3214 al->shift (pos, frames);
3215 XMLNode& after = al->get_state ();
3216 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3221 /* redirect automation */
3223 Glib::RWLock::ReaderLock lm (_processor_lock);
3224 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3226 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3228 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3229 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3231 boost::shared_ptr<AutomationList> al = ac->alist();
3232 XMLNode &before = al->get_state ();
3233 al->shift (pos, frames);
3234 XMLNode &after = al->get_state ();
3235 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3244 Route::save_as_template (const string& path, const string& name)
3246 XMLNode& node (state (false));
3249 IO::set_name_in_state (*node.children().front(), name);
3251 tree.set_root (&node);
3252 return tree.write (path.c_str());
3257 Route::set_name (const string& str)
3263 name = Route::ensure_track_or_route_name (str, _session);
3264 SessionObject::set_name (name);
3266 ret = (_input->set_name(name) && _output->set_name(name));
3269 /* rename the main outs. Leave other IO processors
3270 * with whatever name they already have, because its
3271 * just fine as it is (it will not contain the route
3272 * name if its a port insert, port send or port return).
3276 if (_main_outs->set_name (name)) {
3277 /* XXX returning false here is stupid because
3278 we already changed the route name.
3288 /** Set the name of a route in an XML description.
3289 * @param node XML <Route> node to set the name in.
3290 * @param name New name.
3293 Route::set_name_in_state (XMLNode& node, string const & name)
3295 node.add_property (X_("name"), name);
3297 XMLNodeList children = node.children();
3298 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3300 if ((*i)->name() == X_("IO")) {
3302 IO::set_name_in_state (**i, name);
3304 } else if ((*i)->name() == X_("Processor")) {
3306 XMLProperty* role = (*i)->property (X_("role"));
3307 if (role && role->value() == X_("Main")) {
3308 (*i)->add_property (X_("name"), name);
3311 } else if ((*i)->name() == X_("Diskstream")) {
3313 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3314 (*i)->add_property (X_("name"), name);
3320 boost::shared_ptr<Send>
3321 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3323 Glib::RWLock::ReaderLock lm (_processor_lock);
3325 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3326 boost::shared_ptr<InternalSend> send;
3328 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3329 if (send->target_route() == target) {
3335 return boost::shared_ptr<Send>();
3338 /** @param c Audio channel index.
3339 * @param yn true to invert phase, otherwise false.
3342 Route::set_phase_invert (uint32_t c, bool yn)
3344 if (_phase_invert[c] != yn) {
3345 _phase_invert[c] = yn;
3346 phase_invert_changed (); /* EMIT SIGNAL */
3347 _session.set_dirty ();
3352 Route::set_phase_invert (boost::dynamic_bitset<> p)
3354 if (_phase_invert != p) {
3356 phase_invert_changed (); /* EMIT SIGNAL */
3357 _session.set_dirty ();
3362 Route::phase_invert (uint32_t c) const
3364 return _phase_invert[c];
3367 boost::dynamic_bitset<>
3368 Route::phase_invert () const
3370 return _phase_invert;
3374 Route::set_denormal_protection (bool yn)
3376 if (_denormal_protection != yn) {
3377 _denormal_protection = yn;
3378 denormal_protection_changed (); /* EMIT SIGNAL */
3383 Route::denormal_protection () const
3385 return _denormal_protection;
3389 Route::set_active (bool yn, void* src)
3391 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3392 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3396 if (_active != yn) {
3398 _input->set_active (yn);
3399 _output->set_active (yn);
3400 active_changed (); // EMIT SIGNAL
3407 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3413 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3415 boost::shared_ptr<Send> s;
3416 boost::shared_ptr<Return> r;
3418 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3419 s->meter()->meter();
3420 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3421 r->meter()->meter ();
3426 boost::shared_ptr<Pannable>
3427 Route::pannable() const
3432 boost::shared_ptr<Panner>
3433 Route::panner() const
3436 return _main_outs->panner_shell()->panner();
3439 boost::shared_ptr<PannerShell>
3440 Route::panner_shell() const
3442 return _main_outs->panner_shell();
3445 boost::shared_ptr<AutomationControl>
3446 Route::gain_control() const
3448 return _amp->gain_control();
3451 boost::shared_ptr<AutomationControl>
3452 Route::get_control (const Evoral::Parameter& param)
3454 /* either we own the control or .... */
3456 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3460 /* maybe one of our processors does or ... */
3462 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3463 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3464 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3472 /* nobody does so we'll make a new one */
3474 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3481 boost::shared_ptr<Processor>
3482 Route::nth_plugin (uint32_t n)
3484 Glib::RWLock::ReaderLock lm (_processor_lock);
3485 ProcessorList::iterator i;
3487 for (i = _processors.begin(); i != _processors.end(); ++i) {
3488 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3495 return boost::shared_ptr<Processor> ();
3498 boost::shared_ptr<Processor>
3499 Route::nth_send (uint32_t n)
3501 Glib::RWLock::ReaderLock lm (_processor_lock);
3502 ProcessorList::iterator i;
3504 for (i = _processors.begin(); i != _processors.end(); ++i) {
3505 if (boost::dynamic_pointer_cast<Send> (*i)) {
3512 return boost::shared_ptr<Processor> ();
3516 Route::has_io_processor_named (const string& name)
3518 Glib::RWLock::ReaderLock lm (_processor_lock);
3519 ProcessorList::iterator i;
3521 for (i = _processors.begin(); i != _processors.end(); ++i) {
3522 if (boost::dynamic_pointer_cast<Send> (*i) ||
3523 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3524 if ((*i)->name() == name) {
3533 MuteMaster::MutePoint
3534 Route::mute_points () const
3536 return _mute_master->mute_points ();
3540 Route::set_processor_positions ()
3542 Glib::RWLock::ReaderLock lm (_processor_lock);
3544 bool had_amp = false;
3545 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3546 (*i)->set_pre_fader (!had_amp);
3547 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3553 /** Called when there is a proposed change to the input port count */
3555 Route::input_port_count_changing (ChanCount to)
3557 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3559 /* The processors cannot be configured with the new input arrangement, so
3565 /* The change is ok */
3570 Route::unknown_processors () const
3574 Glib::RWLock::ReaderLock lm (_processor_lock);
3575 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3576 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3577 p.push_back ((*i)->name ());
3586 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3588 /* we assume that all our input ports feed all our output ports. its not
3589 universally true, but the alternative is way too corner-case to worry about.
3592 jack_latency_range_t all_connections;
3595 all_connections.min = 0;
3596 all_connections.max = 0;
3598 all_connections.min = ~((jack_nframes_t) 0);
3599 all_connections.max = 0;
3601 /* iterate over all "from" ports and determine the latency range for all of their
3602 connections to the "outside" (outside of this Route).
3605 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3607 jack_latency_range_t range;
3609 p->get_connected_latency_range (range, playback);
3611 all_connections.min = min (all_connections.min, range.min);
3612 all_connections.max = max (all_connections.max, range.max);
3616 /* set the "from" port latencies to the max/min range of all their connections */
3618 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3619 p->set_private_latency_range (all_connections, playback);
3622 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3624 all_connections.min += our_latency;
3625 all_connections.max += our_latency;
3627 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3628 p->set_private_latency_range (all_connections, playback);
3631 return all_connections.max;
3635 Route::set_private_port_latencies (bool playback) const
3637 framecnt_t own_latency = 0;
3639 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3640 OR LATENCY CALLBACK.
3642 This is called (early) from the latency callback. It computes the REAL
3643 latency associated with each port and stores the result as the "private"
3644 latency of the port. A later call to Route::set_public_port_latencies()
3645 sets all ports to the same value to reflect the fact that we do latency
3646 compensation and so all signals are delayed by the same amount as they
3647 flow through ardour.
3650 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3651 if ((*i)->active ()) {
3652 own_latency += (*i)->signal_latency ();
3657 /* playback: propagate latency from "outside the route" to outputs to inputs */
3658 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3660 /* capture: propagate latency from "outside the route" to inputs to outputs */
3661 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3666 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3668 /* this is called to set the JACK-visible port latencies, which take
3669 latency compensation into account.
3672 jack_latency_range_t range;
3678 const PortSet& ports (_input->ports());
3679 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3680 p->set_public_latency_range (range, playback);
3685 const PortSet& ports (_output->ports());
3686 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3687 p->set_public_latency_range (range, playback);
3692 /** Put the invisible processors in the right place in _processors.
3693 * Must be called with a writer lock on _processor_lock held.
3696 Route::setup_invisible_processors ()
3699 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3700 assert (!lm.locked ());
3704 /* too early to be doing this stuff */
3708 /* we'll build this new list here and then use it */
3710 ProcessorList new_processors;
3712 /* find visible processors */
3714 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3715 if ((*i)->display_to_user ()) {
3716 new_processors.push_back (*i);
3722 ProcessorList::iterator amp = new_processors.begin ();
3723 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3727 assert (amp != _processors.end ());
3729 /* and the processor after the amp */
3731 ProcessorList::iterator after_amp = amp;
3737 switch (_meter_point) {
3739 assert (!_meter->display_to_user ());
3740 new_processors.push_front (_meter);
3743 assert (!_meter->display_to_user ());
3744 new_processors.insert (amp, _meter);
3746 case MeterPostFader:
3747 /* do nothing here */
3750 /* do nothing here */
3753 /* the meter is visible, so we don't touch it here */
3760 assert (_main_outs);
3761 assert (!_main_outs->display_to_user ());
3762 new_processors.push_back (_main_outs);
3764 /* iterator for the main outs */
3766 ProcessorList::iterator main = new_processors.end();
3769 /* OUTPUT METERING */
3771 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3772 assert (!_meter->display_to_user ());
3774 /* add the processor just before or just after the main outs */
3776 ProcessorList::iterator meter_point = main;
3778 if (_meter_point == MeterOutput) {
3781 new_processors.insert (meter_point, _meter);
3786 if (_monitor_send && !is_monitor ()) {
3787 assert (!_monitor_send->display_to_user ());
3788 if (Config->get_solo_control_is_listen_control()) {
3789 switch (Config->get_listen_position ()) {
3790 case PreFaderListen:
3791 switch (Config->get_pfl_position ()) {
3792 case PFLFromBeforeProcessors:
3793 new_processors.push_front (_monitor_send);
3795 case PFLFromAfterProcessors:
3796 new_processors.insert (amp, _monitor_send);
3799 _monitor_send->set_can_pan (false);
3801 case AfterFaderListen:
3802 switch (Config->get_afl_position ()) {
3803 case AFLFromBeforeProcessors:
3804 new_processors.insert (after_amp, _monitor_send);
3806 case AFLFromAfterProcessors:
3807 new_processors.insert (new_processors.end(), _monitor_send);
3810 _monitor_send->set_can_pan (true);
3814 new_processors.insert (new_processors.end(), _monitor_send);
3815 _monitor_send->set_can_pan (false);
3819 /* MONITOR CONTROL */
3821 if (_monitor_control && is_monitor ()) {
3822 assert (!_monitor_control->display_to_user ());
3823 new_processors.push_front (_monitor_control);
3826 /* INTERNAL RETURN */
3828 /* doing this here means that any monitor control will come just after
3833 assert (!_intreturn->display_to_user ());
3834 new_processors.push_front (_intreturn);
3837 /* EXPORT PROCESSOR */
3839 if (_capturing_processor) {
3840 assert (!_capturing_processor->display_to_user ());
3841 new_processors.push_front (_capturing_processor);
3844 _processors = new_processors;
3846 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3847 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3848 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3853 Route::should_monitor () const
3855 switch (Config->get_monitoring_model()) {
3856 case HardwareMonitoring:
3857 case ExternalMonitoring:
3858 return !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
3870 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3871 Glib::RWLock::ReaderLock lp (_processor_lock);
3875 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3876 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
3883 /** If the meter point is `Custom', make a note of where the meter is.
3884 * This is so that if the meter point is subsequently set to something else,
3885 * and then back to custom, we can put the meter back where it was last time
3886 * custom was enabled.
3888 * Must be called with the _processor_lock held.
3891 Route::maybe_note_meter_position ()
3893 if (_meter_point != MeterCustom) {
3897 _custom_meter_position_noted = true;
3898 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3899 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
3900 ProcessorList::iterator j = i;
3902 if (j != _processors.end ()) {
3903 _processor_after_last_custom_meter = *j;
3904 _last_custom_meter_was_at_end = false;
3906 _last_custom_meter_was_at_end = true;