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 bufs.set_is_silent (false);
405 /* figure out if we're going to use gain automation */
406 if (gain_automation_ok) {
407 _amp->setup_gain_automation (start_frame, end_frame, nframes);
409 _amp->apply_gain_automation (false);
412 /* Tell main outs what to do about monitoring. We do this so that
413 on a transition between monitoring states we get a de-clicking gain
414 change in the _main_outs delivery.
416 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
419 /* -------------------------------------------------------------------------------------------
420 GLOBAL DECLICK (for transport changes etc.)
421 ----------------------------------------------------------------------------------------- */
423 maybe_declick (bufs, nframes, declick);
424 _pending_declick = 0;
426 /* -------------------------------------------------------------------------------------------
427 DENORMAL CONTROL/PHASE INVERT
428 ----------------------------------------------------------------------------------------- */
430 if (_phase_invert.any ()) {
434 if (_denormal_protection || Config->get_denormal_protection()) {
436 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
437 Sample* const sp = i->data();
439 if (_phase_invert[chn]) {
440 for (pframes_t nx = 0; nx < nframes; ++nx) {
445 for (pframes_t nx = 0; nx < nframes; ++nx) {
453 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
454 Sample* const sp = i->data();
456 if (_phase_invert[chn]) {
457 for (pframes_t nx = 0; nx < nframes; ++nx) {
466 if (_denormal_protection || Config->get_denormal_protection()) {
468 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
469 Sample* const sp = i->data();
470 for (pframes_t nx = 0; nx < nframes; ++nx) {
478 /* -------------------------------------------------------------------------------------------
480 ----------------------------------------------------------------------------------------- */
482 /* set this to be true if the meter will already have been ::run() earlier */
483 bool const meter_already_run = metering_state() == MeteringInput;
485 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
487 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i)) {
491 if (boost::dynamic_pointer_cast<PeakMeter> (*i) && meter_already_run) {
492 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
497 /* if it has any inputs, make sure they match */
498 if ((*i)->input_streams() != ChanCount::ZERO) {
499 if (bufs.count() != (*i)->input_streams()) {
500 cerr << _name << " bufs = " << bufs.count()
501 << " input for " << (*i)->name() << " = " << (*i)->input_streams()
507 /* should we NOT run plugins here if the route is inactive?
508 do we catch route != active somewhere higher?
511 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
512 bufs.set_count ((*i)->output_streams());
517 Route::n_process_buffers ()
519 return max (_input->n_ports(), processor_max_streams);
523 Route::passthru (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
525 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
529 assert (bufs.available() >= input_streams());
531 if (_input->n_ports() == ChanCount::ZERO) {
532 silence_unlocked (nframes);
535 bufs.set_count (input_streams());
537 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
539 /* control/monitor bus ignores input ports when something is
540 feeding the listen "stream". data will "arrive" into the
541 route from the intreturn processor element.
543 bufs.silence (nframes, 0);
547 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
549 BufferSet::iterator o = bufs.begin(*t);
550 PortSet& ports (_input->ports());
552 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
553 o->read_from (i->get_buffer(nframes), nframes);
558 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
559 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
563 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
565 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
567 bufs.set_count (_input->n_ports());
568 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
569 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
573 Route::set_listen (bool yn, void* src)
579 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
580 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
585 if (yn != _monitor_send->active()) {
587 _monitor_send->activate ();
588 _mute_master->set_soloed (true);
590 _monitor_send->deactivate ();
591 _mute_master->set_soloed (false);
594 listen_changed (src); /* EMIT SIGNAL */
600 Route::listening_via_monitor () const
603 return _monitor_send->active ();
610 Route::set_solo_safe (bool yn, void *src)
612 if (_solo_safe != yn) {
614 solo_safe_changed (src);
619 Route::solo_safe() const
625 Route::set_solo (bool yn, void *src)
631 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
632 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
636 if (self_soloed() != yn) {
638 set_mute_master_solo ();
639 solo_changed (true, src); /* EMIT SIGNAL */
640 _solo_control->Changed (); /* EMIT SIGNAL */
645 Route::set_self_solo (bool yn)
651 Route::mod_solo_by_others_upstream (int32_t delta)
657 uint32_t old_sbu = _soloed_by_others_upstream;
660 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
661 _soloed_by_others_upstream += delta;
663 _soloed_by_others_upstream = 0;
666 _soloed_by_others_upstream += delta;
669 DEBUG_TRACE (DEBUG::Solo, string_compose (
670 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
671 name(), delta, _soloed_by_others_upstream, old_sbu,
672 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
674 /* push the inverse solo change to everything that feeds us.
676 This is important for solo-within-group. When we solo 1 track out of N that
677 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
678 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
679 tracks that feed it. This will silence them if they were audible because
680 of a bus solo, but the newly soloed track will still be audible (because
683 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
687 if ((_self_solo || _soloed_by_others_downstream) &&
688 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
689 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
691 if (delta > 0 || !Config->get_exclusive_solo()) {
692 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
693 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
694 boost::shared_ptr<Route> sr = i->r.lock();
696 sr->mod_solo_by_others_downstream (-delta);
702 set_mute_master_solo ();
703 solo_changed (false, this);
707 Route::mod_solo_by_others_downstream (int32_t delta)
714 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
715 _soloed_by_others_downstream += delta;
717 _soloed_by_others_downstream = 0;
720 _soloed_by_others_downstream += delta;
723 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
725 set_mute_master_solo ();
726 solo_changed (false, this);
730 Route::set_mute_master_solo ()
732 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
736 Route::set_solo_isolated (bool yn, void *src)
738 if (is_master() || is_monitor() || is_hidden()) {
742 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
743 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
747 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
749 boost::shared_ptr<RouteList> routes = _session.get_routes ();
750 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
752 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
757 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
759 if (does_feed && !sends_only) {
760 (*i)->set_solo_isolated (yn, (*i)->route_group());
764 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
766 bool changed = false;
769 if (_solo_isolated == 0) {
770 _mute_master->set_solo_ignore (true);
775 if (_solo_isolated > 0) {
777 if (_solo_isolated == 0) {
778 _mute_master->set_solo_ignore (false);
785 solo_isolated_changed (src);
790 Route::solo_isolated () const
792 return _solo_isolated > 0;
796 Route::set_mute_points (MuteMaster::MutePoint mp)
798 _mute_master->set_mute_points (mp);
799 mute_points_changed (); /* EMIT SIGNAL */
801 if (_mute_master->muted_by_self()) {
802 mute_changed (this); /* EMIT SIGNAL */
803 _mute_control->Changed (); /* EMIT SIGNAL */
808 Route::set_mute (bool yn, void *src)
810 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
811 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
816 _mute_master->set_muted_by_self (yn);
817 /* allow any derived classes to respond to the mute change
818 before anybody else knows about it.
821 /* tell everyone else */
822 mute_changed (src); /* EMIT SIGNAL */
823 _mute_control->Changed (); /* EMIT SIGNAL */
828 Route::muted () const
830 return _mute_master->muted_by_self();
835 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
837 cerr << name << " {" << endl;
838 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
839 p != procs.end(); ++p) {
840 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
847 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
849 ProcessorList::iterator loc;
851 /* XXX this is not thread safe - we don't hold the lock across determining the iter
852 to add before and actually doing the insertion. dammit.
855 if (placement == PreFader) {
856 /* generic pre-fader: insert immediately before the amp */
857 loc = find (_processors.begin(), _processors.end(), _amp);
859 /* generic post-fader: insert right before the main outs */
860 loc = find (_processors.begin(), _processors.end(), _main_outs);
863 return add_processor (processor, loc, err, activation_allowed);
867 /** Add a processor to a route such that it ends up with a given index into the visible processors.
868 * @param index Index to add the processor at, or -1 to add at the end of the list.
872 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
874 /* XXX this is not thread safe - we don't hold the lock across determining the iter
875 to add before and actually doing the insertion. dammit.
879 return add_processor (processor, _processors.end(), err, activation_allowed);
882 ProcessorList::iterator i = _processors.begin ();
884 while (i != _processors.end() && j < index) {
885 if ((*i)->display_to_user()) {
892 return add_processor (processor, i, err, activation_allowed);
895 /** Add a processor to the route.
896 * @param iter an iterator in _processors; the new processor will be inserted immediately before this location.
899 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err, bool activation_allowed)
901 assert (processor != _meter);
902 assert (processor != _main_outs);
904 DEBUG_TRACE (DEBUG::Processors, string_compose (
905 "%1 adding processor %2\n", name(), processor->name()));
907 if (!_session.engine().connected() || !processor) {
912 Glib::RWLock::WriterLock lm (_processor_lock);
913 ProcessorState pstate (this);
915 boost::shared_ptr<PluginInsert> pi;
916 boost::shared_ptr<PortInsert> porti;
918 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
920 if (processor == _amp) {
921 // Ensure only one amp is in the list at any time
922 if (loc != _processors.end()) {
923 if (iter == loc) { // Already in place, do nothing
925 } else { // New position given, relocate
926 _processors.erase (loc);
931 if (loc != _processors.end()) {
932 cerr << "ERROR: Processor added to route twice!" << endl;
939 _processors.insert (loc, processor);
941 // Set up processor list channels. This will set processor->[input|output]_streams(),
942 // configure redirect ports properly, etc.
945 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
947 if (configure_processors_unlocked (err)) {
949 configure_processors_unlocked (0); // it worked before we tried to add it ...
954 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
956 if (pi->has_no_inputs ()) {
957 /* generator plugin */
958 _have_internal_generator = true;
963 if (activation_allowed) {
964 processor->activate ();
967 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
969 _output->set_user_latency (0);
972 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
973 set_processor_positions ();
979 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
981 const XMLProperty *prop;
984 boost::shared_ptr<Processor> processor;
986 /* bit of a hack: get the `placement' property from the <Redirect> tag here
987 so that we can add the processor in the right place (pre/post-fader)
990 XMLNodeList const & children = node.children ();
991 XMLNodeList::const_iterator i = children.begin ();
993 while (i != children.end() && (*i)->name() != X_("Redirect")) {
997 Placement placement = PreFader;
999 if (i != children.end()) {
1000 if ((prop = (*i)->property (X_("placement"))) != 0) {
1001 placement = Placement (string_2_enum (prop->value(), placement));
1005 if (node.name() == "Insert") {
1007 if ((prop = node.property ("type")) != 0) {
1009 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1010 prop->value() == "lv2" ||
1011 prop->value() == "vst" ||
1012 prop->value() == "lxvst" ||
1013 prop->value() == "audiounit") {
1015 processor.reset (new PluginInsert (_session));
1019 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1024 } else if (node.name() == "Send") {
1026 processor.reset (new Send (_session, _pannable, _mute_master));
1030 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1034 if (processor->set_state (node, version)) {
1038 return (add_processor (processor, placement) == 0);
1041 catch (failed_constructor &err) {
1042 warning << _("processor could not be created. Ignored.") << endmsg;
1048 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1050 /* NOTE: this is intended to be used ONLY when copying
1051 processors from another Route. Hence the subtle
1052 differences between this and ::add_processor()
1055 ProcessorList::iterator loc;
1058 loc = find(_processors.begin(), _processors.end(), before);
1060 /* nothing specified - at end */
1061 loc = _processors.end ();
1064 if (!_session.engine().connected()) {
1068 if (others.empty()) {
1073 Glib::RWLock::WriterLock lm (_processor_lock);
1074 ProcessorState pstate (this);
1076 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1082 boost::shared_ptr<PluginInsert> pi;
1084 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1088 _processors.insert (loc, *i);
1090 if ((*i)->active()) {
1095 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1096 if (configure_processors_unlocked (err)) {
1098 configure_processors_unlocked (0); // it worked before we tried to add it ...
1103 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1106 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1107 boost::shared_ptr<PluginInsert> pi;
1109 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1110 if (pi->has_no_inputs ()) {
1111 _have_internal_generator = true;
1117 _output->set_user_latency (0);
1120 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1121 set_processor_positions ();
1127 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1129 if (p == PreFader) {
1130 start = _processors.begin();
1131 end = find(_processors.begin(), _processors.end(), _amp);
1133 start = find(_processors.begin(), _processors.end(), _amp);
1135 end = _processors.end();
1139 /** Turn off all processors with a given placement
1140 * @param p Placement of processors to disable
1143 Route::disable_processors (Placement p)
1145 Glib::RWLock::ReaderLock lm (_processor_lock);
1147 ProcessorList::iterator start, end;
1148 placement_range(p, start, end);
1150 for (ProcessorList::iterator i = start; i != end; ++i) {
1151 (*i)->deactivate ();
1154 _session.set_dirty ();
1157 /** Turn off all redirects
1160 Route::disable_processors ()
1162 Glib::RWLock::ReaderLock lm (_processor_lock);
1164 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1165 (*i)->deactivate ();
1168 _session.set_dirty ();
1171 /** Turn off all redirects with a given placement
1172 * @param p Placement of redirects to disable
1175 Route::disable_plugins (Placement p)
1177 Glib::RWLock::ReaderLock lm (_processor_lock);
1179 ProcessorList::iterator start, end;
1180 placement_range(p, start, end);
1182 for (ProcessorList::iterator i = start; i != end; ++i) {
1183 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1184 (*i)->deactivate ();
1188 _session.set_dirty ();
1191 /** Turn off all plugins
1194 Route::disable_plugins ()
1196 Glib::RWLock::ReaderLock lm (_processor_lock);
1198 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1199 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1200 (*i)->deactivate ();
1204 _session.set_dirty ();
1209 Route::ab_plugins (bool forward)
1211 Glib::RWLock::ReaderLock lm (_processor_lock);
1215 /* forward = turn off all active redirects, and mark them so that the next time
1216 we go the other way, we will revert them
1219 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1220 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1224 if ((*i)->active()) {
1225 (*i)->deactivate ();
1226 (*i)->set_next_ab_is_active (true);
1228 (*i)->set_next_ab_is_active (false);
1234 /* backward = if the redirect was marked to go active on the next ab, do so */
1236 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1238 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1242 if ((*i)->get_next_ab_is_active()) {
1245 (*i)->deactivate ();
1250 _session.set_dirty ();
1254 /** Remove processors with a given placement.
1255 * @param p Placement of processors to remove.
1258 Route::clear_processors (Placement p)
1260 if (!_session.engine().connected()) {
1264 bool already_deleting = _session.deletion_in_progress();
1265 if (!already_deleting) {
1266 _session.set_deletion_in_progress();
1270 Glib::RWLock::WriterLock lm (_processor_lock);
1271 ProcessorList new_list;
1272 ProcessorStreams err;
1273 bool seen_amp = false;
1275 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1281 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1283 /* you can't remove these */
1285 new_list.push_back (*i);
1292 new_list.push_back (*i);
1295 (*i)->drop_references ();
1303 (*i)->drop_references ();
1306 new_list.push_back (*i);
1313 _processors = new_list;
1316 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1317 configure_processors_unlocked (&err); // this can't fail
1321 processor_max_streams.reset();
1322 _have_internal_generator = false;
1323 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1324 set_processor_positions ();
1326 if (!already_deleting) {
1327 _session.clear_deletion_in_progress();
1332 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1334 /* these can never be removed */
1336 if (processor == _amp || processor == _meter || processor == _main_outs) {
1340 if (!_session.engine().connected()) {
1344 processor_max_streams.reset();
1347 Glib::RWLock::WriterLock lm (_processor_lock);
1348 ProcessorState pstate (this);
1350 ProcessorList::iterator i;
1351 bool removed = false;
1353 for (i = _processors.begin(); i != _processors.end(); ) {
1354 if (*i == processor) {
1356 /* move along, see failure case for configure_processors()
1357 where we may need to reconfigure the processor.
1360 /* stop redirects that send signals to JACK ports
1361 from causing noise as a result of no longer being
1365 boost::shared_ptr<IOProcessor> iop;
1367 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1369 iop->input()->disconnect (this);
1371 if (iop->output()) {
1372 iop->output()->disconnect (this);
1376 i = _processors.erase (i);
1384 _output->set_user_latency (0);
1393 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1395 if (configure_processors_unlocked (err)) {
1397 /* we know this will work, because it worked before :) */
1398 configure_processors_unlocked (0);
1403 _have_internal_generator = false;
1405 for (i = _processors.begin(); i != _processors.end(); ++i) {
1406 boost::shared_ptr<PluginInsert> pi;
1408 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1409 if (pi->has_no_inputs ()) {
1410 _have_internal_generator = true;
1417 processor->drop_references ();
1418 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1419 set_processor_positions ();
1425 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1427 ProcessorList deleted;
1429 if (!_session.engine().connected()) {
1433 processor_max_streams.reset();
1436 Glib::RWLock::WriterLock lm (_processor_lock);
1437 ProcessorState pstate (this);
1439 ProcessorList::iterator i;
1440 boost::shared_ptr<Processor> processor;
1442 for (i = _processors.begin(); i != _processors.end(); ) {
1446 /* these can never be removed */
1448 if (processor == _amp || processor == _meter || processor == _main_outs) {
1453 /* see if its in the list of processors to delete */
1455 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1460 /* stop IOProcessors that send to JACK ports
1461 from causing noise as a result of no longer being
1465 boost::shared_ptr<IOProcessor> iop;
1467 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1471 deleted.push_back (processor);
1472 i = _processors.erase (i);
1475 if (deleted.empty()) {
1476 /* none of those in the requested list were found */
1480 _output->set_user_latency (0);
1483 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1485 if (configure_processors_unlocked (err)) {
1487 /* we know this will work, because it worked before :) */
1488 configure_processors_unlocked (0);
1493 _have_internal_generator = false;
1495 for (i = _processors.begin(); i != _processors.end(); ++i) {
1496 boost::shared_ptr<PluginInsert> pi;
1498 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1499 if (pi->has_no_inputs ()) {
1500 _have_internal_generator = true;
1507 /* now try to do what we need to so that those that were removed will be deleted */
1509 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1510 (*i)->drop_references ();
1513 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1514 set_processor_positions ();
1519 /** Caller must hold process lock */
1521 Route::configure_processors (ProcessorStreams* err)
1523 assert (!AudioEngine::instance()->process_lock().trylock());
1525 if (!_in_configure_processors) {
1526 Glib::RWLock::WriterLock lm (_processor_lock);
1527 return configure_processors_unlocked (err);
1534 Route::input_streams () const
1536 return _input->n_ports ();
1539 list<pair<ChanCount, ChanCount> >
1540 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1542 Glib::RWLock::ReaderLock lm (_processor_lock);
1544 return try_configure_processors_unlocked (in, err);
1547 list<pair<ChanCount, ChanCount> >
1548 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1550 // Check each processor in order to see if we can configure as requested
1552 list<pair<ChanCount, ChanCount> > configuration;
1555 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1556 DEBUG_TRACE (DEBUG::Processors, "{\n");
1558 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1560 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1561 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1565 if ((*p)->can_support_io_configuration(in, out)) {
1566 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1567 configuration.push_back(make_pair(in, out));
1574 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1575 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1576 DEBUG_TRACE (DEBUG::Processors, "}\n");
1577 return list<pair<ChanCount, ChanCount> > ();
1581 DEBUG_TRACE (DEBUG::Processors, "}\n");
1583 return configuration;
1586 /** Set the input/output configuration of each processor in the processors list.
1587 * Caller must hold process lock.
1588 * Return 0 on success, otherwise configuration is impossible.
1591 Route::configure_processors_unlocked (ProcessorStreams* err)
1593 assert (!AudioEngine::instance()->process_lock().trylock());
1595 if (_in_configure_processors) {
1599 /* put invisible processors where they should be */
1600 setup_invisible_processors ();
1602 _in_configure_processors = true;
1604 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1606 if (configuration.empty ()) {
1607 _in_configure_processors = false;
1613 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1614 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1616 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1620 (*p)->configure_io(c->first, c->second);
1621 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1622 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1627 _meter->reset_max_channels (processor_max_streams);
1630 /* make sure we have sufficient scratch buffers to cope with the new processor
1633 _session.ensure_buffers (n_process_buffers ());
1635 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1637 _in_configure_processors = false;
1641 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1642 * @param state New active state for those processors.
1645 Route::all_visible_processors_active (bool state)
1647 Glib::RWLock::ReaderLock lm (_processor_lock);
1649 if (_processors.empty()) {
1653 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1654 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1661 (*i)->deactivate ();
1665 _session.set_dirty ();
1669 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1671 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1672 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1673 processors in the current actual processor list that are hidden. Any visible processors
1674 in the current list but not in "new_order" will be assumed to be deleted.
1678 Glib::RWLock::WriterLock lm (_processor_lock);
1679 ProcessorState pstate (this);
1681 ProcessorList::iterator oiter;
1682 ProcessorList::const_iterator niter;
1683 ProcessorList as_it_will_be;
1685 oiter = _processors.begin();
1686 niter = new_order.begin();
1688 while (niter != new_order.end()) {
1690 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1691 then append it to the temp list.
1693 Otherwise, see if the next processor in the old list is in the new list. if not,
1694 its been deleted. If its there, append it to the temp list.
1697 if (oiter == _processors.end()) {
1699 /* no more elements in the old list, so just stick the rest of
1700 the new order onto the temp list.
1703 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1704 while (niter != new_order.end()) {
1711 if (!(*oiter)->display_to_user()) {
1713 as_it_will_be.push_back (*oiter);
1717 /* visible processor: check that its in the new order */
1719 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1720 /* deleted: do nothing, shared_ptr<> will clean up */
1722 /* ignore this one, and add the next item from the new order instead */
1723 as_it_will_be.push_back (*niter);
1728 /* now remove from old order - its taken care of no matter what */
1729 oiter = _processors.erase (oiter);
1734 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1736 /* If the meter is in a custom position, find it and make a rough note of its position */
1737 maybe_note_meter_position ();
1740 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1742 if (configure_processors_unlocked (err)) {
1749 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1750 set_processor_positions ();
1762 Route::get_template()
1764 return state(false);
1768 Route::state(bool full_state)
1770 XMLNode *node = new XMLNode("Route");
1771 ProcessorList::iterator i;
1774 id().print (buf, sizeof (buf));
1775 node->add_property("id", buf);
1776 node->add_property ("name", _name);
1777 node->add_property("default-type", _default_type.to_string());
1780 node->add_property("flags", enum_2_string (_flags));
1783 node->add_property("active", _active?"yes":"no");
1785 boost::to_string (_phase_invert, p);
1786 node->add_property("phase-invert", p);
1787 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1788 node->add_property("meter-point", enum_2_string (_meter_point));
1791 node->add_property("route-group", _route_group->name());
1794 string order_string;
1795 OrderKeys::iterator x = order_keys.begin();
1797 while (x != order_keys.end()) {
1798 order_string += string ((*x).first);
1799 order_string += '=';
1800 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1801 order_string += buf;
1805 if (x == order_keys.end()) {
1809 order_string += ':';
1811 node->add_property ("order-keys", order_string);
1812 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1813 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1814 node->add_property ("soloed-by-upstream", buf);
1815 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1816 node->add_property ("soloed-by-downstream", buf);
1817 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1818 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1820 node->add_child_nocopy (_input->state (full_state));
1821 node->add_child_nocopy (_output->state (full_state));
1822 node->add_child_nocopy (_solo_control->get_state ());
1823 node->add_child_nocopy (_mute_control->get_state ());
1824 node->add_child_nocopy (_mute_master->get_state ());
1826 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1827 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1828 remote_control_node->add_property (X_("id"), buf);
1829 node->add_child_nocopy (*remote_control_node);
1831 if (_comment.length()) {
1832 XMLNode *cmt = node->add_child ("Comment");
1833 cmt->add_content (_comment);
1837 node->add_child_nocopy (_pannable->state (full_state));
1840 for (i = _processors.begin(); i != _processors.end(); ++i) {
1841 node->add_child_nocopy((*i)->state (full_state));
1845 node->add_child_copy (*_extra_xml);
1848 if (_custom_meter_position_noted) {
1849 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1851 after->id().print (buf, sizeof (buf));
1852 node->add_property (X_("processor-after-last-custom-meter"), buf);
1855 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1862 Route::set_state (const XMLNode& node, int version)
1864 if (version < 3000) {
1865 return set_state_2X (node, version);
1869 XMLNodeConstIterator niter;
1871 const XMLProperty *prop;
1873 if (node.name() != "Route"){
1874 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1878 if ((prop = node.property (X_("name"))) != 0) {
1879 Route::set_name (prop->value());
1884 if ((prop = node.property (X_("flags"))) != 0) {
1885 _flags = Flag (string_2_enum (prop->value(), _flags));
1890 if (is_master() || is_monitor() || is_hidden()) {
1891 _mute_master->set_solo_ignore (true);
1895 /* monitor bus does not get a panner, but if (re)created
1896 via XML, it will already have one by the time we
1897 call ::set_state(). so ... remove it.
1902 /* add all processors (except amp, which is always present) */
1904 nlist = node.children();
1905 XMLNode processor_state (X_("processor_state"));
1907 Stateful::save_extra_xml (node);
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")) {
1932 _pannable->set_state (*child, version);
1934 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
1939 if ((prop = node.property (X_("meter-point"))) != 0) {
1940 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
1941 set_meter_point (mp, true);
1943 _meter->set_display_to_user (_meter_point == MeterCustom);
1947 set_processor_state (processor_state);
1949 if ((prop = node.property ("self-solo")) != 0) {
1950 set_self_solo (string_is_affirmative (prop->value()));
1953 if ((prop = node.property ("soloed-by-upstream")) != 0) {
1954 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
1955 mod_solo_by_others_upstream (atoi (prop->value()));
1958 if ((prop = node.property ("soloed-by-downstream")) != 0) {
1959 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
1960 mod_solo_by_others_downstream (atoi (prop->value()));
1963 if ((prop = node.property ("solo-isolated")) != 0) {
1964 set_solo_isolated (string_is_affirmative (prop->value()), this);
1967 if ((prop = node.property ("solo-safe")) != 0) {
1968 set_solo_safe (string_is_affirmative (prop->value()), this);
1971 if ((prop = node.property (X_("phase-invert"))) != 0) {
1972 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
1975 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1976 set_denormal_protection (string_is_affirmative (prop->value()));
1979 if ((prop = node.property (X_("active"))) != 0) {
1980 bool yn = string_is_affirmative (prop->value());
1981 _active = !yn; // force switch
1982 set_active (yn, this);
1985 if ((prop = node.property (X_("order-keys"))) != 0) {
1989 string::size_type colon, equal;
1990 string remaining = prop->value();
1992 while (remaining.length()) {
1994 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1995 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1998 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
1999 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2002 set_order_key (remaining.substr (0, equal), n);
2006 colon = remaining.find_first_of (':');
2008 if (colon != string::npos) {
2009 remaining = remaining.substr (colon+1);
2016 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2017 PBD::ID id (prop->value ());
2018 Glib::RWLock::ReaderLock lm (_processor_lock);
2019 ProcessorList::const_iterator i = _processors.begin ();
2020 while (i != _processors.end() && (*i)->id() != id) {
2024 if (i != _processors.end ()) {
2025 _processor_after_last_custom_meter = *i;
2026 _custom_meter_position_noted = true;
2030 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2031 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2034 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2037 if (child->name() == X_("Comment")) {
2039 /* XXX this is a terrible API design in libxml++ */
2041 XMLNode *cmt = *(child->children().begin());
2042 _comment = cmt->content();
2044 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2045 if (prop->value() == "solo") {
2046 _solo_control->set_state (*child, version);
2049 } else if (child->name() == X_("RemoteControl")) {
2050 if ((prop = child->property (X_("id"))) != 0) {
2052 sscanf (prop->value().c_str(), "%d", &x);
2053 set_remote_control_id (x);
2056 } else if (child->name() == X_("MuteMaster")) {
2057 _mute_master->set_state (*child, version);
2065 Route::set_state_2X (const XMLNode& node, int version)
2068 XMLNodeConstIterator niter;
2070 const XMLProperty *prop;
2072 /* 2X things which still remain to be handled:
2078 if (node.name() != "Route") {
2079 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2083 if ((prop = node.property (X_("flags"))) != 0) {
2084 _flags = Flag (string_2_enum (prop->value(), _flags));
2089 if ((prop = node.property (X_("phase-invert"))) != 0) {
2090 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2091 if (string_is_affirmative (prop->value ())) {
2094 set_phase_invert (p);
2097 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2098 set_denormal_protection (string_is_affirmative (prop->value()));
2101 if ((prop = node.property (X_("soloed"))) != 0) {
2102 bool yn = string_is_affirmative (prop->value());
2104 /* XXX force reset of solo status */
2106 set_solo (yn, this);
2109 if ((prop = node.property (X_("muted"))) != 0) {
2112 bool muted = string_is_affirmative (prop->value());
2118 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2120 if (string_is_affirmative (prop->value())){
2121 mute_point = mute_point + "PreFader";
2126 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2128 if (string_is_affirmative (prop->value())){
2131 mute_point = mute_point + ",";
2134 mute_point = mute_point + "PostFader";
2139 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2141 if (string_is_affirmative (prop->value())){
2144 mute_point = mute_point + ",";
2147 mute_point = mute_point + "Listen";
2152 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2154 if (string_is_affirmative (prop->value())){
2157 mute_point = mute_point + ",";
2160 mute_point = mute_point + "Main";
2164 _mute_master->set_mute_points (mute_point);
2165 _mute_master->set_muted_by_self (true);
2169 if ((prop = node.property (X_("meter-point"))) != 0) {
2170 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2173 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2174 don't mean the same thing.
2177 if ((prop = node.property (X_("order-keys"))) != 0) {
2181 string::size_type colon, equal;
2182 string remaining = prop->value();
2184 while (remaining.length()) {
2186 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2187 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2190 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2191 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2194 set_order_key (remaining.substr (0, equal), n);
2198 colon = remaining.find_first_of (':');
2200 if (colon != string::npos) {
2201 remaining = remaining.substr (colon+1);
2210 nlist = node.children ();
2211 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2215 if (child->name() == IO::state_node_name) {
2217 /* there is a note in IO::set_state_2X() about why we have to call
2221 _input->set_state_2X (*child, version, true);
2222 _output->set_state_2X (*child, version, false);
2224 if ((prop = child->property (X_("name"))) != 0) {
2225 Route::set_name (prop->value ());
2230 if ((prop = child->property (X_("active"))) != 0) {
2231 bool yn = string_is_affirmative (prop->value());
2232 _active = !yn; // force switch
2233 set_active (yn, this);
2236 if ((prop = child->property (X_("gain"))) != 0) {
2239 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2240 _amp->gain_control()->set_value (val);
2244 /* Set up Panners in the IO */
2245 XMLNodeList io_nlist = child->children ();
2247 XMLNodeConstIterator io_niter;
2250 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2252 io_child = *io_niter;
2254 if (io_child->name() == X_("Panner")) {
2255 _main_outs->panner_shell()->set_state(*io_child, version);
2256 } else if (io_child->name() == X_("Automation")) {
2257 /* IO's automation is for the fader */
2258 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2264 XMLNodeList redirect_nodes;
2266 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2270 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2271 redirect_nodes.push_back(child);
2276 set_processor_state_2X (redirect_nodes, version);
2278 Stateful::save_extra_xml (node);
2280 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2283 if (child->name() == X_("Comment")) {
2285 /* XXX this is a terrible API design in libxml++ */
2287 XMLNode *cmt = *(child->children().begin());
2288 _comment = cmt->content();
2290 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2291 if (prop->value() == X_("solo")) {
2292 _solo_control->set_state (*child, version);
2293 } else if (prop->value() == X_("mute")) {
2294 _mute_control->set_state (*child, version);
2297 } else if (child->name() == X_("RemoteControl")) {
2298 if ((prop = child->property (X_("id"))) != 0) {
2300 sscanf (prop->value().c_str(), "%d", &x);
2301 set_remote_control_id (x);
2311 Route::get_processor_state ()
2313 XMLNode* root = new XMLNode (X_("redirects"));
2314 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2315 root->add_child_nocopy ((*i)->state (true));
2322 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2324 /* We don't bother removing existing processors not in nList, as this
2325 method will only be called when creating a Route from scratch, not
2326 for undo purposes. Just put processors in at the appropriate place
2330 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2331 add_processor_from_xml_2X (**i, version);
2336 Route::set_processor_state (const XMLNode& node)
2338 const XMLNodeList &nlist = node.children();
2339 XMLNodeConstIterator niter;
2340 ProcessorList new_order;
2341 bool must_configure = false;
2343 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2345 XMLProperty* prop = (*niter)->property ("type");
2347 if (prop->value() == "amp") {
2348 _amp->set_state (**niter, Stateful::current_state_version);
2349 new_order.push_back (_amp);
2350 } else if (prop->value() == "meter") {
2351 _meter->set_state (**niter, Stateful::current_state_version);
2352 new_order.push_back (_meter);
2353 } else if (prop->value() == "main-outs") {
2354 _main_outs->set_state (**niter, Stateful::current_state_version);
2355 } else if (prop->value() == "intreturn") {
2357 _intreturn.reset (new InternalReturn (_session));
2358 must_configure = true;
2360 _intreturn->set_state (**niter, Stateful::current_state_version);
2361 } else if (is_monitor() && prop->value() == "monitor") {
2362 if (!_monitor_control) {
2363 _monitor_control.reset (new MonitorProcessor (_session));
2364 must_configure = true;
2366 _monitor_control->set_state (**niter, Stateful::current_state_version);
2367 } else if (prop->value() == "capture") {
2368 _capturing_processor.reset (new CapturingProcessor (_session));
2370 ProcessorList::iterator o;
2372 for (o = _processors.begin(); o != _processors.end(); ++o) {
2373 XMLProperty* id_prop = (*niter)->property(X_("id"));
2374 if (id_prop && (*o)->id() == id_prop->value()) {
2375 (*o)->set_state (**niter, Stateful::current_state_version);
2376 new_order.push_back (*o);
2381 // If the processor (*niter) is not on the route then create it
2383 if (o == _processors.end()) {
2385 boost::shared_ptr<Processor> processor;
2387 if (prop->value() == "intsend") {
2389 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2391 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2392 prop->value() == "lv2" ||
2393 prop->value() == "vst" ||
2394 prop->value() == "lxvst" ||
2395 prop->value() == "audiounit") {
2397 processor.reset (new PluginInsert(_session));
2399 } else if (prop->value() == "port") {
2401 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2403 } else if (prop->value() == "send") {
2405 processor.reset (new Send (_session, _pannable, _mute_master));
2408 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2412 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2413 /* This processor could not be configured. Turn it into a UnknownProcessor */
2414 processor.reset (new UnknownProcessor (_session, **niter));
2417 /* we have to note the monitor send here, otherwise a new one will be created
2418 and the state of this one will be lost.
2420 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2421 if (isend && isend->role() == Delivery::Listen) {
2422 _monitor_send = isend;
2425 /* it doesn't matter if invisible processors are added here, as they
2426 will be sorted out by setup_invisible_processors () shortly.
2429 new_order.push_back (processor);
2430 must_configure = true;
2436 Glib::RWLock::WriterLock lm (_processor_lock);
2437 _processors = new_order;
2439 if (must_configure) {
2440 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2441 configure_processors_unlocked (0);
2444 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2446 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2448 boost::shared_ptr<PluginInsert> pi;
2450 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2451 if (pi->has_no_inputs ()) {
2452 _have_internal_generator = true;
2459 processors_changed (RouteProcessorChange ());
2460 set_processor_positions ();
2464 Route::curve_reallocate ()
2466 // _gain_automation_curve.finish_resize ();
2467 // _pan_automation_curve.finish_resize ();
2471 Route::silence (framecnt_t nframes)
2473 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2478 silence_unlocked (nframes);
2482 Route::silence_unlocked (framecnt_t nframes)
2484 /* Must be called with the processor lock held */
2488 _output->silence (nframes);
2490 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2491 boost::shared_ptr<PluginInsert> pi;
2493 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2494 // skip plugins, they don't need anything when we're not active
2498 (*i)->silence (nframes);
2501 if (nframes == _session.get_block_size()) {
2508 Route::add_internal_return ()
2511 _intreturn.reset (new InternalReturn (_session));
2512 add_processor (_intreturn, PreFader);
2517 Route::add_send_to_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->add_send (send);
2531 Route::remove_send_from_internal_return (InternalSend* send)
2533 Glib::RWLock::ReaderLock rm (_processor_lock);
2535 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2536 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2539 return d->remove_send (send);
2544 /** Add a monitor send (if we don't already have one) but don't activate it */
2546 Route::listen_via_monitor ()
2548 /* master never sends to control outs */
2549 assert (!is_master ());
2551 /* make sure we have one */
2552 if (!_monitor_send) {
2553 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2554 _monitor_send->set_display_to_user (false);
2558 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2559 configure_processors (0);
2564 /** Add an internal send to a route.
2565 * @param route route to send to.
2566 * @param placement placement for the send.
2569 Route::listen_via (boost::shared_ptr<Route> route, Placement placement)
2571 assert (route != _session.monitor_out ());
2574 Glib::RWLock::ReaderLock rm (_processor_lock);
2576 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2578 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2580 if (d && d->target_route() == route) {
2581 /* already listening via the specified IO: do nothing */
2588 boost::shared_ptr<InternalSend> listener (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2589 add_processor (listener, placement);
2591 } catch (failed_constructor& err) {
2599 Route::drop_listen (boost::shared_ptr<Route> route)
2601 ProcessorStreams err;
2602 ProcessorList::iterator tmp;
2604 Glib::RWLock::ReaderLock rl(_processor_lock);
2608 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2610 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2612 if (d && d->target_route() == route) {
2614 remove_processor (*x, &err);
2617 /* list could have been demolished while we dropped the lock
2627 if (route == _session.monitor_out()) {
2628 _monitor_send.reset ();
2633 Route::set_comment (string cmt, void *src)
2636 comment_changed (src);
2637 _session.set_dirty ();
2641 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2643 FeedRecord fr (other, via_sends_only);
2645 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2647 if (!result.second) {
2649 /* already a record for "other" - make sure sends-only information is correct */
2650 if (!via_sends_only && result.first->sends_only) {
2651 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2652 frp->sends_only = false;
2656 return result.second;
2660 Route::clear_fed_by ()
2666 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2668 const FedBy& fed_by (other->fed_by());
2670 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2671 boost::shared_ptr<Route> sr = f->r.lock();
2673 if (sr && (sr.get() == this)) {
2675 if (via_sends_only) {
2676 *via_sends_only = f->sends_only;
2687 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2689 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2691 if (_output->connected_to (other->input())) {
2692 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2693 if (via_send_only) {
2694 *via_send_only = false;
2701 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2703 boost::shared_ptr<IOProcessor> iop;
2705 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2706 if (iop->feeds (other)) {
2707 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2708 if (via_send_only) {
2709 *via_send_only = true;
2713 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2716 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2721 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2726 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2728 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2731 /** Called from the (non-realtime) butler thread when the transport is stopped */
2733 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2735 framepos_t now = _session.transport_frame();
2738 Glib::RWLock::ReaderLock lm (_processor_lock);
2741 automation_snapshot (now, true);
2744 Automatable::transport_stopped (now);
2746 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2748 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2752 (*i)->transport_stopped (now);
2756 _roll_delay = _initial_delay;
2759 /** Called with the process lock held if change contains ConfigurationChanged */
2761 Route::input_change_handler (IOChange change, void * /*src*/)
2763 if ((change.type & IOChange::ConfigurationChanged)) {
2764 configure_processors (0);
2765 _phase_invert.resize (_input->n_ports().n_audio ());
2766 io_changed (); /* EMIT SIGNAL */
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, bool session_state_changing)
2783 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2788 if (n_outputs().n_total() == 0) {
2792 if (!_active || n_inputs() == ChanCount::ZERO) {
2793 silence_unlocked (nframes);
2796 if (session_state_changing) {
2797 if (_session.transport_speed() != 0.0f) {
2798 /* we're rolling but some state is changing (e.g. our diskstream contents)
2799 so we cannot use them. Be silent till this is over.
2801 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2803 silence_unlocked (nframes);
2806 /* we're really not rolling, so we're either delivery silence or actually
2807 monitoring, both of which are safe to do while session_state_changing is true.
2811 _amp->apply_gain_automation (false);
2812 passthru (start_frame, end_frame, nframes, 0);
2818 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
2820 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2825 automation_snapshot (_session.transport_frame(), false);
2827 if (n_outputs().n_total() == 0) {
2831 if (!_active || n_inputs().n_total() == 0) {
2832 silence_unlocked (nframes);
2836 framecnt_t unused = 0;
2838 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2844 passthru (start_frame, end_frame, nframes, declick);
2850 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
2857 Route::has_external_redirects () const
2859 // FIXME: what about sends? - they don't return a signal back to ardour?
2861 boost::shared_ptr<const PortInsert> pi;
2863 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2865 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2867 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2869 string port_name = port->name();
2870 string client_name = port_name.substr (0, port_name.find(':'));
2872 /* only say "yes" if the redirect is actually in use */
2874 if (client_name != "ardour" && pi->active()) {
2885 Route::flush_processors ()
2887 /* XXX shouldn't really try to take this lock, since
2888 this is called from the RT audio thread.
2891 Glib::RWLock::ReaderLock lm (_processor_lock);
2893 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2899 Route::set_meter_point (MeterPoint p, bool force)
2901 /* CAN BE CALLED FROM PROCESS CONTEXT */
2903 if (_meter_point == p && !force) {
2907 bool meter_was_visible_to_user = _meter->display_to_user ();
2910 Glib::RWLock::WriterLock lm (_processor_lock);
2912 maybe_note_meter_position ();
2916 if (_meter_point != MeterCustom) {
2918 _meter->set_display_to_user (false);
2920 setup_invisible_processors ();
2924 _meter->set_display_to_user (true);
2926 /* If we have a previous position for the custom meter, try to put it there */
2927 if (_custom_meter_position_noted) {
2928 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2931 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
2932 if (i != _processors.end ()) {
2933 _processors.remove (_meter);
2934 _processors.insert (i, _meter);
2936 } else if (_last_custom_meter_was_at_end) {
2937 _processors.remove (_meter);
2938 _processors.push_back (_meter);
2943 /* Set up the meter for its new position */
2945 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
2949 if (loc == _processors.begin()) {
2950 m_in = _input->n_ports();
2952 ProcessorList::iterator before = loc;
2954 m_in = (*before)->output_streams ();
2957 _meter->reflect_inputs (m_in);
2959 /* we do not need to reconfigure the processors, because the meter
2960 (a) is always ready to handle processor_max_streams
2961 (b) is always an N-in/N-out processor, and thus moving
2962 it doesn't require any changes to the other processors.
2966 meter_change (); /* EMIT SIGNAL */
2968 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
2970 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
2974 Route::listen_position_changed ()
2977 Glib::RWLock::WriterLock lm (_processor_lock);
2978 ProcessorState pstate (this);
2981 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2983 if (configure_processors_unlocked (0)) {
2985 configure_processors_unlocked (0); // it worked before we tried to add it ...
2991 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2992 _session.set_dirty ();
2995 boost::shared_ptr<CapturingProcessor>
2996 Route::add_export_point()
2998 if (!_capturing_processor) {
3000 _capturing_processor.reset (new CapturingProcessor (_session));
3001 _capturing_processor->activate ();
3004 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3005 configure_processors (0);
3010 return _capturing_processor;
3014 Route::update_signal_latency ()
3016 framecnt_t l = _output->user_latency();
3018 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3019 if ((*i)->active ()) {
3020 l += (*i)->signal_latency ();
3024 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3026 if (_signal_latency != l) {
3027 _signal_latency = l;
3028 signal_latency_changed (); /* EMIT SIGNAL */
3031 return _signal_latency;
3035 Route::set_user_latency (framecnt_t nframes)
3037 _output->set_user_latency (nframes);
3038 _session.update_latency_compensation ();
3042 Route::set_latency_compensation (framecnt_t longest_session_latency)
3044 framecnt_t old = _initial_delay;
3046 if (_signal_latency < longest_session_latency) {
3047 _initial_delay = longest_session_latency - _signal_latency;
3052 DEBUG_TRACE (DEBUG::Latency, string_compose (
3053 "%1: compensate for maximum latency of %2,"
3054 "given own latency of %3, using initial delay of %4\n",
3055 name(), longest_session_latency, _signal_latency, _initial_delay));
3057 if (_initial_delay != old) {
3058 initial_delay_changed (); /* EMIT SIGNAL */
3061 if (_session.transport_stopped()) {
3062 _roll_delay = _initial_delay;
3067 Route::automation_snapshot (framepos_t now, bool force)
3070 _pannable->automation_snapshot (now, force);
3073 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3074 (*i)->automation_snapshot (now, force);
3078 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3079 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3080 boost::shared_ptr<AutomationList>(), name)
3083 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3088 Route::SoloControllable::set_value (double val)
3090 bool bval = ((val >= 0.5f) ? true: false);
3092 boost::shared_ptr<RouteList> rl (new RouteList);
3094 boost::shared_ptr<Route> r = _route.lock ();
3101 if (Config->get_solo_control_is_listen_control()) {
3102 _session.set_listen (rl, bval);
3104 _session.set_solo (rl, bval);
3109 Route::SoloControllable::get_value () const
3111 boost::shared_ptr<Route> r = _route.lock ();
3116 if (Config->get_solo_control_is_listen_control()) {
3117 return r->listening_via_monitor() ? 1.0f : 0.0f;
3119 return r->self_soloed() ? 1.0f : 0.0f;
3123 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3124 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3125 boost::shared_ptr<AutomationList>(), name)
3128 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3133 Route::MuteControllable::set_value (double val)
3135 bool bval = ((val >= 0.5f) ? true: false);
3137 boost::shared_ptr<RouteList> rl (new RouteList);
3139 boost::shared_ptr<Route> r = _route.lock ();
3145 _session.set_mute (rl, bval);
3149 Route::MuteControllable::get_value () const
3151 boost::shared_ptr<Route> r = _route.lock ();
3156 return r->muted() ? 1.0f : 0.0f;
3160 Route::set_block_size (pframes_t nframes)
3162 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3163 (*i)->set_block_size (nframes);
3166 _session.ensure_buffers (n_process_buffers ());
3170 Route::protect_automation ()
3172 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3173 (*i)->protect_automation();
3177 Route::set_pending_declick (int declick)
3180 /* this call is not allowed to turn off a pending declick unless "force" is true */
3182 _pending_declick = declick;
3184 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3186 _pending_declick = 0;
3191 /** Shift automation forwards from a particular place, thereby inserting time.
3192 * Adds undo commands for any shifts that are performed.
3194 * @param pos Position to start shifting from.
3195 * @param frames Amount to shift forwards by.
3199 Route::shift (framepos_t pos, framecnt_t frames)
3201 /* gain automation */
3203 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3205 XMLNode &before = gc->alist()->get_state ();
3206 gc->alist()->shift (pos, frames);
3207 XMLNode &after = gc->alist()->get_state ();
3208 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3211 /* pan automation */
3213 ControlSet::Controls& c (_pannable->controls());
3215 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3216 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3218 boost::shared_ptr<AutomationList> al = pc->alist();
3219 XMLNode& before = al->get_state ();
3220 al->shift (pos, frames);
3221 XMLNode& after = al->get_state ();
3222 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3227 /* redirect automation */
3229 Glib::RWLock::ReaderLock lm (_processor_lock);
3230 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3232 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3234 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3235 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3237 boost::shared_ptr<AutomationList> al = ac->alist();
3238 XMLNode &before = al->get_state ();
3239 al->shift (pos, frames);
3240 XMLNode &after = al->get_state ();
3241 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3250 Route::save_as_template (const string& path, const string& name)
3252 XMLNode& node (state (false));
3255 IO::set_name_in_state (*node.children().front(), name);
3257 tree.set_root (&node);
3258 return tree.write (path.c_str());
3263 Route::set_name (const string& str)
3269 name = Route::ensure_track_or_route_name (str, _session);
3270 SessionObject::set_name (name);
3272 ret = (_input->set_name(name) && _output->set_name(name));
3275 /* rename the main outs. Leave other IO processors
3276 * with whatever name they already have, because its
3277 * just fine as it is (it will not contain the route
3278 * name if its a port insert, port send or port return).
3282 if (_main_outs->set_name (name)) {
3283 /* XXX returning false here is stupid because
3284 we already changed the route name.
3294 /** Set the name of a route in an XML description.
3295 * @param node XML <Route> node to set the name in.
3296 * @param name New name.
3299 Route::set_name_in_state (XMLNode& node, string const & name)
3301 node.add_property (X_("name"), name);
3303 XMLNodeList children = node.children();
3304 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3306 if ((*i)->name() == X_("IO")) {
3308 IO::set_name_in_state (**i, name);
3310 } else if ((*i)->name() == X_("Processor")) {
3312 XMLProperty* role = (*i)->property (X_("role"));
3313 if (role && role->value() == X_("Main")) {
3314 (*i)->add_property (X_("name"), name);
3317 } else if ((*i)->name() == X_("Diskstream")) {
3319 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3320 (*i)->add_property (X_("name"), name);
3326 boost::shared_ptr<Send>
3327 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3329 Glib::RWLock::ReaderLock lm (_processor_lock);
3331 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3332 boost::shared_ptr<InternalSend> send;
3334 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3335 if (send->target_route() == target) {
3341 return boost::shared_ptr<Send>();
3344 /** @param c Audio channel index.
3345 * @param yn true to invert phase, otherwise false.
3348 Route::set_phase_invert (uint32_t c, bool yn)
3350 if (_phase_invert[c] != yn) {
3351 _phase_invert[c] = yn;
3352 phase_invert_changed (); /* EMIT SIGNAL */
3353 _session.set_dirty ();
3358 Route::set_phase_invert (boost::dynamic_bitset<> p)
3360 if (_phase_invert != p) {
3362 phase_invert_changed (); /* EMIT SIGNAL */
3363 _session.set_dirty ();
3368 Route::phase_invert (uint32_t c) const
3370 return _phase_invert[c];
3373 boost::dynamic_bitset<>
3374 Route::phase_invert () const
3376 return _phase_invert;
3380 Route::set_denormal_protection (bool yn)
3382 if (_denormal_protection != yn) {
3383 _denormal_protection = yn;
3384 denormal_protection_changed (); /* EMIT SIGNAL */
3389 Route::denormal_protection () const
3391 return _denormal_protection;
3395 Route::set_active (bool yn, void* src)
3397 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3398 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3402 if (_active != yn) {
3404 _input->set_active (yn);
3405 _output->set_active (yn);
3406 active_changed (); // EMIT SIGNAL
3413 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3419 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3421 boost::shared_ptr<Send> s;
3422 boost::shared_ptr<Return> r;
3424 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3425 s->meter()->meter();
3426 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3427 r->meter()->meter ();
3432 boost::shared_ptr<Pannable>
3433 Route::pannable() const
3438 boost::shared_ptr<Panner>
3439 Route::panner() const
3442 return _main_outs->panner_shell()->panner();
3445 boost::shared_ptr<PannerShell>
3446 Route::panner_shell() const
3448 return _main_outs->panner_shell();
3451 boost::shared_ptr<AutomationControl>
3452 Route::gain_control() const
3454 return _amp->gain_control();
3457 boost::shared_ptr<AutomationControl>
3458 Route::get_control (const Evoral::Parameter& param)
3460 /* either we own the control or .... */
3462 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3466 /* maybe one of our processors does or ... */
3468 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
3469 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3470 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3478 /* nobody does so we'll make a new one */
3480 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3487 boost::shared_ptr<Processor>
3488 Route::nth_plugin (uint32_t n)
3490 Glib::RWLock::ReaderLock lm (_processor_lock);
3491 ProcessorList::iterator i;
3493 for (i = _processors.begin(); i != _processors.end(); ++i) {
3494 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3501 return boost::shared_ptr<Processor> ();
3504 boost::shared_ptr<Processor>
3505 Route::nth_send (uint32_t n)
3507 Glib::RWLock::ReaderLock lm (_processor_lock);
3508 ProcessorList::iterator i;
3510 for (i = _processors.begin(); i != _processors.end(); ++i) {
3511 if (boost::dynamic_pointer_cast<Send> (*i)) {
3518 return boost::shared_ptr<Processor> ();
3522 Route::has_io_processor_named (const string& name)
3524 Glib::RWLock::ReaderLock lm (_processor_lock);
3525 ProcessorList::iterator i;
3527 for (i = _processors.begin(); i != _processors.end(); ++i) {
3528 if (boost::dynamic_pointer_cast<Send> (*i) ||
3529 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3530 if ((*i)->name() == name) {
3539 MuteMaster::MutePoint
3540 Route::mute_points () const
3542 return _mute_master->mute_points ();
3546 Route::set_processor_positions ()
3548 Glib::RWLock::ReaderLock lm (_processor_lock);
3550 bool had_amp = false;
3551 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3552 (*i)->set_pre_fader (!had_amp);
3553 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3559 /** Called when there is a proposed change to the input port count */
3561 Route::input_port_count_changing (ChanCount to)
3563 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3565 /* The processors cannot be configured with the new input arrangement, so
3571 /* The change is ok */
3576 Route::unknown_processors () const
3580 Glib::RWLock::ReaderLock lm (_processor_lock);
3581 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3582 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3583 p.push_back ((*i)->name ());
3592 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3594 /* we assume that all our input ports feed all our output ports. its not
3595 universally true, but the alternative is way too corner-case to worry about.
3598 jack_latency_range_t all_connections;
3601 all_connections.min = 0;
3602 all_connections.max = 0;
3604 all_connections.min = ~((jack_nframes_t) 0);
3605 all_connections.max = 0;
3607 /* iterate over all "from" ports and determine the latency range for all of their
3608 connections to the "outside" (outside of this Route).
3611 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3613 jack_latency_range_t range;
3615 p->get_connected_latency_range (range, playback);
3617 all_connections.min = min (all_connections.min, range.min);
3618 all_connections.max = max (all_connections.max, range.max);
3622 /* set the "from" port latencies to the max/min range of all their connections */
3624 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3625 p->set_private_latency_range (all_connections, playback);
3628 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3630 all_connections.min += our_latency;
3631 all_connections.max += our_latency;
3633 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3634 p->set_private_latency_range (all_connections, playback);
3637 return all_connections.max;
3641 Route::set_private_port_latencies (bool playback) const
3643 framecnt_t own_latency = 0;
3645 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3646 OR LATENCY CALLBACK.
3648 This is called (early) from the latency callback. It computes the REAL
3649 latency associated with each port and stores the result as the "private"
3650 latency of the port. A later call to Route::set_public_port_latencies()
3651 sets all ports to the same value to reflect the fact that we do latency
3652 compensation and so all signals are delayed by the same amount as they
3653 flow through ardour.
3656 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3657 if ((*i)->active ()) {
3658 own_latency += (*i)->signal_latency ();
3663 /* playback: propagate latency from "outside the route" to outputs to inputs */
3664 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3666 /* capture: propagate latency from "outside the route" to inputs to outputs */
3667 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3672 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3674 /* this is called to set the JACK-visible port latencies, which take
3675 latency compensation into account.
3678 jack_latency_range_t range;
3684 const PortSet& ports (_input->ports());
3685 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3686 p->set_public_latency_range (range, playback);
3691 const PortSet& ports (_output->ports());
3692 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3693 p->set_public_latency_range (range, playback);
3698 /** Put the invisible processors in the right place in _processors.
3699 * Must be called with a writer lock on _processor_lock held.
3702 Route::setup_invisible_processors ()
3705 Glib::RWLock::WriterLock lm (_processor_lock, Glib::TRY_LOCK);
3706 assert (!lm.locked ());
3710 /* too early to be doing this stuff */
3714 /* we'll build this new list here and then use it */
3716 ProcessorList new_processors;
3718 /* find visible processors */
3720 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3721 if ((*i)->display_to_user ()) {
3722 new_processors.push_back (*i);
3728 ProcessorList::iterator amp = new_processors.begin ();
3729 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3733 assert (amp != _processors.end ());
3735 /* and the processor after the amp */
3737 ProcessorList::iterator after_amp = amp;
3743 switch (_meter_point) {
3745 assert (!_meter->display_to_user ());
3746 new_processors.push_front (_meter);
3749 assert (!_meter->display_to_user ());
3750 new_processors.insert (amp, _meter);
3752 case MeterPostFader:
3753 /* do nothing here */
3756 /* do nothing here */
3759 /* the meter is visible, so we don't touch it here */
3766 assert (_main_outs);
3767 assert (!_main_outs->display_to_user ());
3768 new_processors.push_back (_main_outs);
3770 /* iterator for the main outs */
3772 ProcessorList::iterator main = new_processors.end();
3775 /* OUTPUT METERING */
3777 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3778 assert (!_meter->display_to_user ());
3780 /* add the processor just before or just after the main outs */
3782 ProcessorList::iterator meter_point = main;
3784 if (_meter_point == MeterOutput) {
3787 new_processors.insert (meter_point, _meter);
3792 if (_monitor_send && !is_monitor ()) {
3793 assert (!_monitor_send->display_to_user ());
3794 if (Config->get_solo_control_is_listen_control()) {
3795 switch (Config->get_listen_position ()) {
3796 case PreFaderListen:
3797 switch (Config->get_pfl_position ()) {
3798 case PFLFromBeforeProcessors:
3799 new_processors.push_front (_monitor_send);
3801 case PFLFromAfterProcessors:
3802 new_processors.insert (amp, _monitor_send);
3805 _monitor_send->set_can_pan (false);
3807 case AfterFaderListen:
3808 switch (Config->get_afl_position ()) {
3809 case AFLFromBeforeProcessors:
3810 new_processors.insert (after_amp, _monitor_send);
3812 case AFLFromAfterProcessors:
3813 new_processors.insert (new_processors.end(), _monitor_send);
3816 _monitor_send->set_can_pan (true);
3820 new_processors.insert (new_processors.end(), _monitor_send);
3821 _monitor_send->set_can_pan (false);
3825 /* MONITOR CONTROL */
3827 if (_monitor_control && is_monitor ()) {
3828 assert (!_monitor_control->display_to_user ());
3829 new_processors.push_front (_monitor_control);
3832 /* INTERNAL RETURN */
3834 /* doing this here means that any monitor control will come just after
3839 assert (!_intreturn->display_to_user ());
3840 new_processors.push_front (_intreturn);
3843 /* EXPORT PROCESSOR */
3845 if (_capturing_processor) {
3846 assert (!_capturing_processor->display_to_user ());
3847 new_processors.push_front (_capturing_processor);
3850 _processors = new_processors;
3852 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
3853 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3854 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
3861 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3862 Glib::RWLock::ReaderLock lp (_processor_lock);
3866 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3867 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
3874 /** If the meter point is `Custom', make a note of where the meter is.
3875 * This is so that if the meter point is subsequently set to something else,
3876 * and then back to custom, we can put the meter back where it was last time
3877 * custom was enabled.
3879 * Must be called with the _processor_lock held.
3882 Route::maybe_note_meter_position ()
3884 if (_meter_point != MeterCustom) {
3888 _custom_meter_position_noted = true;
3889 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3890 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
3891 ProcessorList::iterator j = i;
3893 if (j != _processors.end ()) {
3894 _processor_after_last_custom_meter = *j;
3895 _last_custom_meter_was_at_end = false;
3897 _last_custom_meter_was_at_end = true;
3903 boost::shared_ptr<Processor>
3904 Route::processor_by_id (PBD::ID id) const
3906 Glib::RWLock::ReaderLock lm (_processor_lock);
3907 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3908 if ((*i)->id() == id) {
3913 return boost::shared_ptr<Processor> ();
3916 /** @return the monitoring state, or in other words what data we are pushing
3917 * into the route (data from the inputs, data from disk or silence)
3920 Route::monitoring_state () const
3922 return MonitoringInput;
3925 /** @return what we should be metering; either the data coming from the input
3926 * IO or the data that is flowing through the route.
3929 Route::metering_state () const
3931 return MeteringRoute;