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 <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/boost_debug.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_port.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/buffer.h"
43 #include "ardour/buffer_set.h"
44 #include "ardour/capturing_processor.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/internal_return.h"
48 #include "ardour/internal_send.h"
49 #include "ardour/meter.h"
50 #include "ardour/midi_buffer.h"
51 #include "ardour/midi_port.h"
52 #include "ardour/monitor_processor.h"
53 #include "ardour/pannable.h"
54 #include "ardour/panner_shell.h"
55 #include "ardour/plugin_insert.h"
56 #include "ardour/port.h"
57 #include "ardour/port_insert.h"
58 #include "ardour/processor.h"
59 #include "ardour/route.h"
60 #include "ardour/route_group.h"
61 #include "ardour/send.h"
62 #include "ardour/session.h"
63 #include "ardour/unknown_processor.h"
64 #include "ardour/utils.h"
69 using namespace ARDOUR;
72 PBD::Signal0<void> Route::SyncOrderKeys;
73 PBD::Signal0<void> Route::RemoteControlIDChange;
75 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
76 : SessionObject (sess, name)
78 , GraphNode (sess._process_graph)
84 , _pending_declick (true)
85 , _meter_point (MeterPostFader)
86 , _meter_type (MeterPeak)
88 , _soloed_by_others_upstream (0)
89 , _soloed_by_others_downstream (0)
91 , _denormal_protection (false)
94 , _declickable (false)
95 , _mute_master (new MuteMaster (sess, name))
96 , _have_internal_generator (false)
98 , _default_type (default_type)
99 , _has_order_key (false)
100 , _remote_control_id (0)
101 , _in_configure_processors (false)
102 , _initial_io_setup (false)
103 , _custom_meter_position_noted (false)
104 , _last_custom_meter_was_at_end (false)
107 _meter_type = MeterK20;
109 processor_max_streams.reset();
115 /* add standard controls */
117 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
118 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
120 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
121 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
123 add_control (_solo_control);
124 add_control (_mute_control);
128 if (!(_flags & Route::MonitorOut)) {
129 _pannable.reset (new Pannable (_session));
132 /* input and output objects */
134 _input.reset (new IO (_session, _name, IO::Input, _default_type));
135 _output.reset (new IO (_session, _name, IO::Output, _default_type));
137 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
138 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
140 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
141 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
143 /* add amp processor */
145 _amp.reset (new Amp (_session));
146 add_processor (_amp, PostFader);
148 /* create standard processors: meter, main outs, monitor out;
149 they will be added to _processors by setup_invisible_processors ()
152 _meter.reset (new PeakMeter (_session, _name));
153 _meter->set_owner (this);
154 _meter->set_display_to_user (false);
157 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
158 _main_outs->activate ();
161 /* where we listen to tracks */
162 _intreturn.reset (new InternalReturn (_session));
163 _intreturn->activate ();
165 /* the thing that provides proper control over a control/monitor/listen bus
166 (such as per-channel cut, dim, solo, invert, etc).
168 _monitor_control.reset (new MonitorProcessor (_session));
169 _monitor_control->activate ();
172 if (is_master() || is_monitor() || is_auditioner()) {
173 _mute_master->set_solo_ignore (true);
176 /* now that we have _meter, its safe to connect to this */
178 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
181 /* run a configure so that the invisible processors get set up */
182 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
183 configure_processors (0);
191 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
193 /* do this early so that we don't get incoming signals as we are going through destruction
198 /* don't use clear_processors here, as it depends on the session which may
199 be half-destroyed by now
202 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
203 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
204 (*i)->drop_references ();
207 _processors.clear ();
211 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
213 if (Config->get_remote_model() != UserOrdered) {
217 set_remote_control_id_internal (id, notify_class_listeners);
221 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
223 /* force IDs for master/monitor busses and prevent
224 any other route from accidentally getting these IDs
225 (i.e. legacy sessions)
228 if (is_master() && id != MasterBusRemoteControlID) {
229 id = MasterBusRemoteControlID;
232 if (is_monitor() && id != MonitorBusRemoteControlID) {
233 id = MonitorBusRemoteControlID;
240 /* don't allow it to collide */
242 if (!is_master () && !is_monitor() &&
243 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
244 id += MonitorBusRemoteControlID;
247 if (id != remote_control_id()) {
248 _remote_control_id = id;
249 RemoteControlIDChanged ();
251 if (notify_class_listeners) {
252 RemoteControlIDChange ();
258 Route::remote_control_id() const
261 return MasterBusRemoteControlID;
265 return MonitorBusRemoteControlID;
268 return _remote_control_id;
272 Route::has_order_key () const
274 return _has_order_key;
278 Route::order_key () const
284 Route::set_remote_control_id_explicit (uint32_t rid)
286 if (is_master() || is_monitor() || is_auditioner()) {
287 /* hard-coded remote IDs, or no remote ID */
291 if (_remote_control_id != rid) {
292 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
293 _remote_control_id = rid;
294 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
297 /* don't emit the class-level RID signal RemoteControlIDChange here,
298 leave that to the entity that changed the order key, so that we
299 don't get lots of emissions for no good reasons (e.g. when changing
300 all route order keys).
302 See Session::sync_remote_id_from_order_keys() for the (primary|only)
303 spot where that is emitted.
308 Route::set_order_key (uint32_t n)
310 _has_order_key = true;
312 if (_order_key == n) {
318 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
319 name(), order_key ()));
321 _session.set_dirty ();
325 Route::ensure_track_or_route_name(string name, Session &session)
327 string newname = name;
329 while (!session.io_name_is_legal (newname)) {
330 newname = bump_name_once (newname, '.');
338 Route::inc_gain (gain_t fraction, void *src)
340 _amp->inc_gain (fraction, src);
344 Route::set_gain (gain_t val, void *src)
346 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
348 if (_route_group->is_relative()) {
350 gain_t usable_gain = _amp->gain();
351 if (usable_gain < 0.000001f) {
352 usable_gain = 0.000001f;
356 if (delta < 0.000001f) {
360 delta -= usable_gain;
365 gain_t factor = delta / usable_gain;
368 factor = _route_group->get_max_factor(factor);
369 if (factor == 0.0f) {
370 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
374 factor = _route_group->get_min_factor(factor);
375 if (factor == 0.0f) {
376 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
381 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
385 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
391 if (val == _amp->gain()) {
395 _amp->set_gain (val, src);
399 Route::maybe_declick (BufferSet&, framecnt_t, int)
401 /* this is the "bus" implementation and they never declick.
406 /** Process this route for one (sub) cycle (process thread)
408 * @param bufs Scratch buffers to use for the signal path
409 * @param start_frame Initial transport frame
410 * @param end_frame Final transport frame
411 * @param nframes Number of frames to output (to ports)
413 * Note that (end_frame - start_frame) may not be equal to nframes when the
414 * transport speed isn't 1.0 (eg varispeed).
417 Route::process_output_buffers (BufferSet& bufs,
418 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
419 int declick, bool gain_automation_ok)
421 bufs.set_is_silent (false);
423 /* figure out if we're going to use gain automation */
424 if (gain_automation_ok) {
425 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
426 _amp->setup_gain_automation (start_frame, end_frame, nframes);
428 _amp->apply_gain_automation (false);
431 /* Tell main outs what to do about monitoring. We do this so that
432 on a transition between monitoring states we get a de-clicking gain
433 change in the _main_outs delivery.
436 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
438 /* -------------------------------------------------------------------------------------------
439 GLOBAL DECLICK (for transport changes etc.)
440 ----------------------------------------------------------------------------------------- */
442 maybe_declick (bufs, nframes, declick);
443 _pending_declick = 0;
445 /* -------------------------------------------------------------------------------------------
446 DENORMAL CONTROL/PHASE INVERT
447 ----------------------------------------------------------------------------------------- */
449 if (_phase_invert.any ()) {
453 if (_denormal_protection || Config->get_denormal_protection()) {
455 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
456 Sample* const sp = i->data();
458 if (_phase_invert[chn]) {
459 for (pframes_t nx = 0; nx < nframes; ++nx) {
464 for (pframes_t nx = 0; nx < nframes; ++nx) {
472 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
473 Sample* const sp = i->data();
475 if (_phase_invert[chn]) {
476 for (pframes_t nx = 0; nx < nframes; ++nx) {
485 if (_denormal_protection || Config->get_denormal_protection()) {
487 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
488 Sample* const sp = i->data();
489 for (pframes_t nx = 0; nx < nframes; ++nx) {
497 /* -------------------------------------------------------------------------------------------
499 ----------------------------------------------------------------------------------------- */
501 /* set this to be true if the meter will already have been ::run() earlier */
502 bool const meter_already_run = metering_state() == MeteringInput;
504 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
506 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
507 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
512 /* if it has any inputs, make sure they match */
513 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
514 if (bufs.count() != (*i)->input_streams()) {
516 DEBUG::Processors, string_compose (
517 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
518 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
525 /* should we NOT run plugins here if the route is inactive?
526 do we catch route != active somewhere higher?
529 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
530 bufs.set_count ((*i)->output_streams());
535 Route::n_process_buffers ()
537 return max (_input->n_ports(), processor_max_streams);
541 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
543 assert (is_monitor());
544 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
545 passthru (bufs, start_frame, end_frame, nframes, declick);
549 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
553 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
555 /* control/monitor bus ignores input ports when something is
556 feeding the listen "stream". data will "arrive" into the
557 route from the intreturn processor element.
560 bufs.silence (nframes, 0);
563 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
564 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
568 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
570 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
572 bufs.set_count (_input->n_ports());
573 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
574 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
578 Route::set_listen (bool yn, void* src)
584 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
585 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
590 if (yn != _monitor_send->active()) {
592 _monitor_send->activate ();
593 _mute_master->set_soloed (true);
595 _monitor_send->deactivate ();
596 _mute_master->set_soloed (false);
599 listen_changed (src); /* EMIT SIGNAL */
605 Route::listening_via_monitor () const
608 return _monitor_send->active ();
615 Route::set_solo_safe (bool yn, void *src)
617 if (_solo_safe != yn) {
619 solo_safe_changed (src);
624 Route::solo_safe() const
630 Route::set_solo (bool yn, void *src)
633 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
637 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
638 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
642 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
643 name(), yn, src, (src == _route_group), self_soloed()));
645 if (self_soloed() != yn) {
647 set_mute_master_solo ();
648 solo_changed (true, src); /* EMIT SIGNAL */
649 _solo_control->Changed (); /* EMIT SIGNAL */
654 Route::set_self_solo (bool yn)
656 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
661 Route::mod_solo_by_others_upstream (int32_t delta)
664 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
668 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
669 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
671 uint32_t old_sbu = _soloed_by_others_upstream;
674 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
675 _soloed_by_others_upstream += delta;
677 _soloed_by_others_upstream = 0;
680 _soloed_by_others_upstream += delta;
683 DEBUG_TRACE (DEBUG::Solo, string_compose (
684 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
685 name(), delta, _soloed_by_others_upstream, old_sbu,
686 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
688 /* push the inverse solo change to everything that feeds us.
690 This is important for solo-within-group. When we solo 1 track out of N that
691 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
692 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
693 tracks that feed it. This will silence them if they were audible because
694 of a bus solo, but the newly soloed track will still be audible (because
697 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
701 if ((_self_solo || _soloed_by_others_downstream) &&
702 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
703 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
705 if (delta > 0 || !Config->get_exclusive_solo()) {
706 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
707 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
708 boost::shared_ptr<Route> sr = i->r.lock();
710 sr->mod_solo_by_others_downstream (-delta);
716 set_mute_master_solo ();
717 solo_changed (false, this);
721 Route::mod_solo_by_others_downstream (int32_t delta)
724 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
728 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
729 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
732 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
733 _soloed_by_others_downstream += delta;
735 _soloed_by_others_downstream = 0;
738 _soloed_by_others_downstream += delta;
741 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
743 set_mute_master_solo ();
744 solo_changed (false, this);
748 Route::set_mute_master_solo ()
750 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
754 Route::set_solo_isolated (bool yn, void *src)
756 if (is_master() || is_monitor() || is_auditioner()) {
760 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
761 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
765 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
767 boost::shared_ptr<RouteList> routes = _session.get_routes ();
768 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
770 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
775 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
777 if (does_feed && !sends_only) {
778 (*i)->set_solo_isolated (yn, (*i)->route_group());
782 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
784 bool changed = false;
787 if (_solo_isolated == 0) {
788 _mute_master->set_solo_ignore (true);
793 if (_solo_isolated > 0) {
795 if (_solo_isolated == 0) {
796 _mute_master->set_solo_ignore (false);
803 solo_isolated_changed (src);
808 Route::solo_isolated () const
810 return _solo_isolated > 0;
814 Route::set_mute_points (MuteMaster::MutePoint mp)
816 _mute_master->set_mute_points (mp);
817 mute_points_changed (); /* EMIT SIGNAL */
819 if (_mute_master->muted_by_self()) {
820 mute_changed (this); /* EMIT SIGNAL */
821 _mute_control->Changed (); /* EMIT SIGNAL */
826 Route::set_mute (bool yn, void *src)
828 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
829 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
834 _mute_master->set_muted_by_self (yn);
835 /* allow any derived classes to respond to the mute change
836 before anybody else knows about it.
839 /* tell everyone else */
840 mute_changed (src); /* EMIT SIGNAL */
841 _mute_control->Changed (); /* EMIT SIGNAL */
846 Route::muted () const
848 return _mute_master->muted_by_self();
853 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
855 cerr << name << " {" << endl;
856 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
857 p != procs.end(); ++p) {
858 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
864 /** Supposing that we want to insert a Processor at a given Placement, return
865 * the processor to add the new one before (or 0 to add at the end).
867 boost::shared_ptr<Processor>
868 Route::before_processor_for_placement (Placement p)
870 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
872 ProcessorList::iterator loc;
875 /* generic pre-fader: insert immediately before the amp */
876 loc = find (_processors.begin(), _processors.end(), _amp);
878 /* generic post-fader: insert right before the main outs */
879 loc = find (_processors.begin(), _processors.end(), _main_outs);
882 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
885 /** Supposing that we want to insert a Processor at a given index, return
886 * the processor to add the new one before (or 0 to add at the end).
888 boost::shared_ptr<Processor>
889 Route::before_processor_for_index (int index)
892 return boost::shared_ptr<Processor> ();
895 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
897 ProcessorList::iterator i = _processors.begin ();
899 while (i != _processors.end() && j < index) {
900 if ((*i)->display_to_user()) {
907 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
910 /** Add a processor either pre- or post-fader
911 * @return 0 on success, non-0 on failure.
914 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
916 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
920 /** Add a processor to a route such that it ends up with a given index into the visible processors.
921 * @param index Index to add the processor at, or -1 to add at the end of the list.
922 * @return 0 on success, non-0 on failure.
925 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
927 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
930 /** Add a processor to the route.
931 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
932 * @return 0 on success, non-0 on failure.
935 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
937 assert (processor != _meter);
938 assert (processor != _main_outs);
940 DEBUG_TRACE (DEBUG::Processors, string_compose (
941 "%1 adding processor %2\n", name(), processor->name()));
943 if (!AudioEngine::instance()->connected() || !processor) {
948 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
949 ProcessorState pstate (this);
951 boost::shared_ptr<PluginInsert> pi;
952 boost::shared_ptr<PortInsert> porti;
954 if (processor == _amp) {
955 /* Ensure that only one amp is in the list at any time */
956 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
957 if (check != _processors.end()) {
958 if (before == _amp) {
959 /* Already in position; all is well */
962 _processors.erase (check);
967 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
969 ProcessorList::iterator loc;
971 /* inserting before a processor; find it */
972 loc = find (_processors.begin(), _processors.end(), before);
973 if (loc == _processors.end ()) {
978 /* inserting at end */
979 loc = _processors.end ();
982 _processors.insert (loc, processor);
983 processor->set_owner (this);
985 // Set up processor list channels. This will set processor->[input|output]_streams(),
986 // configure redirect ports properly, etc.
989 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
991 if (configure_processors_unlocked (err)) {
993 configure_processors_unlocked (0); // it worked before we tried to add it ...
998 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1000 if (pi->has_no_inputs ()) {
1001 /* generator plugin */
1002 _have_internal_generator = true;
1007 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1008 processor->activate ();
1011 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1013 _output->set_user_latency (0);
1016 reset_instrument_info ();
1017 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1018 set_processor_positions ();
1024 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1026 const XMLProperty *prop;
1029 boost::shared_ptr<Processor> processor;
1031 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1032 so that we can add the processor in the right place (pre/post-fader)
1035 XMLNodeList const & children = node.children ();
1036 XMLNodeList::const_iterator i = children.begin ();
1038 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1042 Placement placement = PreFader;
1044 if (i != children.end()) {
1045 if ((prop = (*i)->property (X_("placement"))) != 0) {
1046 placement = Placement (string_2_enum (prop->value(), placement));
1050 if (node.name() == "Insert") {
1052 if ((prop = node.property ("type")) != 0) {
1054 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1055 prop->value() == "lv2" ||
1056 prop->value() == "windows-vst" ||
1057 prop->value() == "lxvst" ||
1058 prop->value() == "audiounit") {
1060 processor.reset (new PluginInsert (_session));
1064 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1069 } else if (node.name() == "Send") {
1071 processor.reset (new Send (_session, _pannable, _mute_master));
1075 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1079 if (processor->set_state (node, version)) {
1083 return (add_processor (processor, placement) == 0);
1086 catch (failed_constructor &err) {
1087 warning << _("processor could not be created. Ignored.") << endmsg;
1093 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1095 /* NOTE: this is intended to be used ONLY when copying
1096 processors from another Route. Hence the subtle
1097 differences between this and ::add_processor()
1100 ProcessorList::iterator loc;
1103 loc = find(_processors.begin(), _processors.end(), before);
1105 /* nothing specified - at end */
1106 loc = _processors.end ();
1109 if (!_session.engine().connected()) {
1113 if (others.empty()) {
1118 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1119 ProcessorState pstate (this);
1121 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1127 boost::shared_ptr<PluginInsert> pi;
1129 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1133 _processors.insert (loc, *i);
1134 (*i)->set_owner (this);
1136 if ((*i)->active()) {
1141 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1142 if (configure_processors_unlocked (err)) {
1144 configure_processors_unlocked (0); // it worked before we tried to add it ...
1149 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1152 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1153 boost::shared_ptr<PluginInsert> pi;
1155 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1156 if (pi->has_no_inputs ()) {
1157 _have_internal_generator = true;
1163 _output->set_user_latency (0);
1166 reset_instrument_info ();
1167 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1168 set_processor_positions ();
1174 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1176 if (p == PreFader) {
1177 start = _processors.begin();
1178 end = find(_processors.begin(), _processors.end(), _amp);
1180 start = find(_processors.begin(), _processors.end(), _amp);
1182 end = _processors.end();
1186 /** Turn off all processors with a given placement
1187 * @param p Placement of processors to disable
1190 Route::disable_processors (Placement p)
1192 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1194 ProcessorList::iterator start, end;
1195 placement_range(p, start, end);
1197 for (ProcessorList::iterator i = start; i != end; ++i) {
1198 (*i)->deactivate ();
1201 _session.set_dirty ();
1204 /** Turn off all redirects
1207 Route::disable_processors ()
1209 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1211 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1212 (*i)->deactivate ();
1215 _session.set_dirty ();
1218 /** Turn off all redirects with a given placement
1219 * @param p Placement of redirects to disable
1222 Route::disable_plugins (Placement p)
1224 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1226 ProcessorList::iterator start, end;
1227 placement_range(p, start, end);
1229 for (ProcessorList::iterator i = start; i != end; ++i) {
1230 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1231 (*i)->deactivate ();
1235 _session.set_dirty ();
1238 /** Turn off all plugins
1241 Route::disable_plugins ()
1243 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1245 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1246 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1247 (*i)->deactivate ();
1251 _session.set_dirty ();
1256 Route::ab_plugins (bool forward)
1258 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1262 /* forward = turn off all active redirects, and mark them so that the next time
1263 we go the other way, we will revert them
1266 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1267 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1271 if ((*i)->active()) {
1272 (*i)->deactivate ();
1273 (*i)->set_next_ab_is_active (true);
1275 (*i)->set_next_ab_is_active (false);
1281 /* backward = if the redirect was marked to go active on the next ab, do so */
1283 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1285 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1289 if ((*i)->get_next_ab_is_active()) {
1292 (*i)->deactivate ();
1297 _session.set_dirty ();
1301 /** Remove processors with a given placement.
1302 * @param p Placement of processors to remove.
1305 Route::clear_processors (Placement p)
1307 if (!_session.engine().connected()) {
1311 bool already_deleting = _session.deletion_in_progress();
1312 if (!already_deleting) {
1313 _session.set_deletion_in_progress();
1317 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1318 ProcessorList new_list;
1319 ProcessorStreams err;
1320 bool seen_amp = false;
1322 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1328 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1330 /* you can't remove these */
1332 new_list.push_back (*i);
1339 new_list.push_back (*i);
1342 (*i)->drop_references ();
1350 (*i)->drop_references ();
1353 new_list.push_back (*i);
1360 _processors = new_list;
1363 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1364 configure_processors_unlocked (&err); // this can't fail
1368 processor_max_streams.reset();
1369 _have_internal_generator = false;
1370 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1371 set_processor_positions ();
1373 reset_instrument_info ();
1375 if (!already_deleting) {
1376 _session.clear_deletion_in_progress();
1381 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1383 // TODO once the export point can be configured properly, do something smarter here
1384 if (processor == _capturing_processor) {
1385 _capturing_processor.reset();
1388 /* these can never be removed */
1390 if (processor == _amp || processor == _meter || processor == _main_outs) {
1394 if (!_session.engine().connected()) {
1398 processor_max_streams.reset();
1401 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1402 ProcessorState pstate (this);
1404 ProcessorList::iterator i;
1405 bool removed = false;
1407 for (i = _processors.begin(); i != _processors.end(); ) {
1408 if (*i == processor) {
1410 /* move along, see failure case for configure_processors()
1411 where we may need to reconfigure the processor.
1414 /* stop redirects that send signals to JACK ports
1415 from causing noise as a result of no longer being
1419 boost::shared_ptr<IOProcessor> iop;
1421 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1425 i = _processors.erase (i);
1433 _output->set_user_latency (0);
1441 if (need_process_lock) {
1442 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1444 if (configure_processors_unlocked (err)) {
1446 /* we know this will work, because it worked before :) */
1447 configure_processors_unlocked (0);
1451 if (configure_processors_unlocked (err)) {
1453 /* we know this will work, because it worked before :) */
1454 configure_processors_unlocked (0);
1459 _have_internal_generator = false;
1461 for (i = _processors.begin(); i != _processors.end(); ++i) {
1462 boost::shared_ptr<PluginInsert> pi;
1464 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1465 if (pi->has_no_inputs ()) {
1466 _have_internal_generator = true;
1473 reset_instrument_info ();
1474 processor->drop_references ();
1475 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1476 set_processor_positions ();
1482 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1484 ProcessorList deleted;
1486 if (!_session.engine().connected()) {
1490 processor_max_streams.reset();
1493 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1494 ProcessorState pstate (this);
1496 ProcessorList::iterator i;
1497 boost::shared_ptr<Processor> processor;
1499 for (i = _processors.begin(); i != _processors.end(); ) {
1503 /* these can never be removed */
1505 if (processor == _amp || processor == _meter || processor == _main_outs) {
1510 /* see if its in the list of processors to delete */
1512 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1517 /* stop IOProcessors that send to JACK ports
1518 from causing noise as a result of no longer being
1522 boost::shared_ptr<IOProcessor> iop;
1524 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1528 deleted.push_back (processor);
1529 i = _processors.erase (i);
1532 if (deleted.empty()) {
1533 /* none of those in the requested list were found */
1537 _output->set_user_latency (0);
1540 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1542 if (configure_processors_unlocked (err)) {
1544 /* we know this will work, because it worked before :) */
1545 configure_processors_unlocked (0);
1550 _have_internal_generator = false;
1552 for (i = _processors.begin(); i != _processors.end(); ++i) {
1553 boost::shared_ptr<PluginInsert> pi;
1555 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1556 if (pi->has_no_inputs ()) {
1557 _have_internal_generator = true;
1564 /* now try to do what we need to so that those that were removed will be deleted */
1566 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1567 (*i)->drop_references ();
1570 reset_instrument_info ();
1571 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1572 set_processor_positions ();
1578 Route::reset_instrument_info ()
1580 boost::shared_ptr<Processor> instr = the_instrument();
1582 _instrument_info.set_internal_instrument (instr);
1586 /** Caller must hold process lock */
1588 Route::configure_processors (ProcessorStreams* err)
1590 #ifndef PLATFORM_WINDOWS
1591 assert (!AudioEngine::instance()->process_lock().trylock());
1594 if (!_in_configure_processors) {
1595 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1596 return configure_processors_unlocked (err);
1603 Route::input_streams () const
1605 return _input->n_ports ();
1608 list<pair<ChanCount, ChanCount> >
1609 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1611 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1613 return try_configure_processors_unlocked (in, err);
1616 list<pair<ChanCount, ChanCount> >
1617 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1619 // Check each processor in order to see if we can configure as requested
1621 list<pair<ChanCount, ChanCount> > configuration;
1624 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1625 DEBUG_TRACE (DEBUG::Processors, "{\n");
1627 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1629 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1630 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1631 DEBUG_TRACE (DEBUG::Processors, "}\n");
1632 return list<pair<ChanCount, ChanCount> > ();
1635 if ((*p)->can_support_io_configuration(in, out)) {
1636 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1637 configuration.push_back(make_pair(in, out));
1644 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1645 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1646 DEBUG_TRACE (DEBUG::Processors, "}\n");
1647 return list<pair<ChanCount, ChanCount> > ();
1651 DEBUG_TRACE (DEBUG::Processors, "}\n");
1653 return configuration;
1656 /** Set the input/output configuration of each processor in the processors list.
1657 * Caller must hold process lock.
1658 * Return 0 on success, otherwise configuration is impossible.
1661 Route::configure_processors_unlocked (ProcessorStreams* err)
1663 #ifndef PLATFORM_WINDOWS
1664 assert (!AudioEngine::instance()->process_lock().trylock());
1667 if (_in_configure_processors) {
1671 /* put invisible processors where they should be */
1672 setup_invisible_processors ();
1674 _in_configure_processors = true;
1676 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1678 if (configuration.empty ()) {
1679 _in_configure_processors = false;
1684 bool seen_mains_out = false;
1685 processor_out_streams = _input->n_ports();
1686 processor_max_streams.reset();
1688 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1689 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1691 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1695 (*p)->configure_io(c->first, c->second);
1696 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1697 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1700 if (boost::dynamic_pointer_cast<Delivery> (*p)
1701 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1702 /* main delivery will increase port count to match input.
1703 * the Delivery::Main is usually the last processor - followed only by
1706 seen_mains_out = true;
1708 if (!seen_mains_out) {
1709 processor_out_streams = out;
1715 _meter->reset_max_channels (processor_max_streams);
1718 /* make sure we have sufficient scratch buffers to cope with the new processor
1721 _session.ensure_buffers (n_process_buffers ());
1723 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1725 _in_configure_processors = false;
1729 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1730 * @param state New active state for those processors.
1733 Route::all_visible_processors_active (bool state)
1735 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1737 if (_processors.empty()) {
1741 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1742 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1749 (*i)->deactivate ();
1753 _session.set_dirty ();
1757 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1759 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1760 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1761 processors in the current actual processor list that are hidden. Any visible processors
1762 in the current list but not in "new_order" will be assumed to be deleted.
1766 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1767 ProcessorState pstate (this);
1769 ProcessorList::iterator oiter;
1770 ProcessorList::const_iterator niter;
1771 ProcessorList as_it_will_be;
1773 oiter = _processors.begin();
1774 niter = new_order.begin();
1776 while (niter != new_order.end()) {
1778 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1779 then append it to the temp list.
1781 Otherwise, see if the next processor in the old list is in the new list. if not,
1782 its been deleted. If its there, append it to the temp list.
1785 if (oiter == _processors.end()) {
1787 /* no more elements in the old list, so just stick the rest of
1788 the new order onto the temp list.
1791 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1792 while (niter != new_order.end()) {
1799 if (!(*oiter)->display_to_user()) {
1801 as_it_will_be.push_back (*oiter);
1805 /* visible processor: check that its in the new order */
1807 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1808 /* deleted: do nothing, shared_ptr<> will clean up */
1810 /* ignore this one, and add the next item from the new order instead */
1811 as_it_will_be.push_back (*niter);
1816 /* now remove from old order - its taken care of no matter what */
1817 oiter = _processors.erase (oiter);
1822 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1824 /* If the meter is in a custom position, find it and make a rough note of its position */
1825 maybe_note_meter_position ();
1828 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1830 if (configure_processors_unlocked (err)) {
1837 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1838 set_processor_positions ();
1850 Route::get_template()
1852 return state(false);
1856 Route::state(bool full_state)
1858 XMLNode *node = new XMLNode("Route");
1859 ProcessorList::iterator i;
1862 id().print (buf, sizeof (buf));
1863 node->add_property("id", buf);
1864 node->add_property ("name", _name);
1865 node->add_property("default-type", _default_type.to_string());
1868 node->add_property("flags", enum_2_string (_flags));
1871 node->add_property("active", _active?"yes":"no");
1873 boost::to_string (_phase_invert, p);
1874 node->add_property("phase-invert", p);
1875 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1876 node->add_property("meter-point", enum_2_string (_meter_point));
1878 node->add_property("meter-type", enum_2_string (_meter_type));
1881 node->add_property("route-group", _route_group->name());
1884 snprintf (buf, sizeof (buf), "%d", _order_key);
1885 node->add_property ("order-key", buf);
1886 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1887 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1888 node->add_property ("soloed-by-upstream", buf);
1889 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1890 node->add_property ("soloed-by-downstream", buf);
1891 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1892 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1894 node->add_child_nocopy (_input->state (full_state));
1895 node->add_child_nocopy (_output->state (full_state));
1896 node->add_child_nocopy (_solo_control->get_state ());
1897 node->add_child_nocopy (_mute_control->get_state ());
1898 node->add_child_nocopy (_mute_master->get_state ());
1900 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1901 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1902 remote_control_node->add_property (X_("id"), buf);
1903 node->add_child_nocopy (*remote_control_node);
1905 if (_comment.length()) {
1906 XMLNode *cmt = node->add_child ("Comment");
1907 cmt->add_content (_comment);
1911 node->add_child_nocopy (_pannable->state (full_state));
1914 for (i = _processors.begin(); i != _processors.end(); ++i) {
1916 /* template save: do not include internal sends functioning as
1917 aux sends because the chance of the target ID
1918 in the session where this template is used
1921 similarly, do not save listen sends which connect to
1922 the monitor section, because these will always be
1925 boost::shared_ptr<InternalSend> is;
1927 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1928 if (is->role() == Delivery::Listen) {
1933 node->add_child_nocopy((*i)->state (full_state));
1937 node->add_child_copy (*_extra_xml);
1940 if (_custom_meter_position_noted) {
1941 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1943 after->id().print (buf, sizeof (buf));
1944 node->add_property (X_("processor-after-last-custom-meter"), buf);
1947 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1954 Route::set_state (const XMLNode& node, int version)
1956 if (version < 3000) {
1957 return set_state_2X (node, version);
1961 XMLNodeConstIterator niter;
1963 const XMLProperty *prop;
1965 if (node.name() != "Route"){
1966 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1970 if ((prop = node.property (X_("name"))) != 0) {
1971 Route::set_name (prop->value());
1975 _initial_io_setup = true;
1977 if ((prop = node.property (X_("flags"))) != 0) {
1978 _flags = Flag (string_2_enum (prop->value(), _flags));
1983 if (is_master() || is_monitor() || is_auditioner()) {
1984 _mute_master->set_solo_ignore (true);
1988 /* monitor bus does not get a panner, but if (re)created
1989 via XML, it will already have one by the time we
1990 call ::set_state(). so ... remove it.
1995 /* add all processors (except amp, which is always present) */
1997 nlist = node.children();
1998 XMLNode processor_state (X_("processor_state"));
2000 Stateful::save_extra_xml (node);
2002 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2006 if (child->name() == IO::state_node_name) {
2007 if ((prop = child->property (X_("direction"))) == 0) {
2011 if (prop->value() == "Input") {
2012 _input->set_state (*child, version);
2013 } else if (prop->value() == "Output") {
2014 _output->set_state (*child, version);
2018 if (child->name() == X_("Processor")) {
2019 processor_state.add_child_copy (*child);
2022 if (child->name() == X_("Pannable")) {
2024 _pannable->set_state (*child, version);
2026 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2031 if ((prop = node.property (X_("meter-point"))) != 0) {
2032 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2033 set_meter_point (mp, true);
2035 _meter->set_display_to_user (_meter_point == MeterCustom);
2039 if ((prop = node.property (X_("meter-type"))) != 0) {
2040 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2043 _initial_io_setup = false;
2045 set_processor_state (processor_state);
2047 // this looks up the internal instrument in processors
2048 reset_instrument_info();
2050 if ((prop = node.property ("self-solo")) != 0) {
2051 set_self_solo (string_is_affirmative (prop->value()));
2054 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2055 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2056 mod_solo_by_others_upstream (atoi (prop->value()));
2059 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2060 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2061 mod_solo_by_others_downstream (atoi (prop->value()));
2064 if ((prop = node.property ("solo-isolated")) != 0) {
2065 set_solo_isolated (string_is_affirmative (prop->value()), this);
2068 if ((prop = node.property ("solo-safe")) != 0) {
2069 set_solo_safe (string_is_affirmative (prop->value()), this);
2072 if ((prop = node.property (X_("phase-invert"))) != 0) {
2073 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2076 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2077 set_denormal_protection (string_is_affirmative (prop->value()));
2080 if ((prop = node.property (X_("active"))) != 0) {
2081 bool yn = string_is_affirmative (prop->value());
2082 _active = !yn; // force switch
2083 set_active (yn, this);
2086 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2087 set_order_key (atoi(prop->value()));
2090 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2094 string::size_type colon, equal;
2095 string remaining = prop->value();
2097 while (remaining.length()) {
2099 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2100 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2103 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2104 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2107 string keyname = remaining.substr (0, equal);
2109 if ((keyname == "EditorSort") || (keyname == "editor")) {
2110 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2116 colon = remaining.find_first_of (':');
2118 if (colon != string::npos) {
2119 remaining = remaining.substr (colon+1);
2126 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2127 PBD::ID id (prop->value ());
2128 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2129 ProcessorList::const_iterator i = _processors.begin ();
2130 while (i != _processors.end() && (*i)->id() != id) {
2134 if (i != _processors.end ()) {
2135 _processor_after_last_custom_meter = *i;
2136 _custom_meter_position_noted = true;
2140 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2141 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2144 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2147 if (child->name() == X_("Comment")) {
2149 /* XXX this is a terrible API design in libxml++ */
2151 XMLNode *cmt = *(child->children().begin());
2152 _comment = cmt->content();
2154 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2155 if (prop->value() == "solo") {
2156 _solo_control->set_state (*child, version);
2157 } else if (prop->value() == "mute") {
2158 _mute_control->set_state (*child, version);
2161 } else if (child->name() == X_("RemoteControl")) {
2162 if ((prop = child->property (X_("id"))) != 0) {
2164 sscanf (prop->value().c_str(), "%d", &x);
2165 set_remote_control_id_internal (x);
2168 } else if (child->name() == X_("MuteMaster")) {
2169 _mute_master->set_state (*child, version);
2177 Route::set_state_2X (const XMLNode& node, int version)
2180 XMLNodeConstIterator niter;
2182 const XMLProperty *prop;
2184 /* 2X things which still remain to be handled:
2190 if (node.name() != "Route") {
2191 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2195 if ((prop = node.property (X_("flags"))) != 0) {
2196 string f = prop->value ();
2197 boost::replace_all (f, "ControlOut", "MonitorOut");
2198 _flags = Flag (string_2_enum (f, _flags));
2203 if (is_master() || is_monitor() || is_auditioner()) {
2204 _mute_master->set_solo_ignore (true);
2207 if ((prop = node.property (X_("phase-invert"))) != 0) {
2208 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2209 if (string_is_affirmative (prop->value ())) {
2212 set_phase_invert (p);
2215 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2216 set_denormal_protection (string_is_affirmative (prop->value()));
2219 if ((prop = node.property (X_("soloed"))) != 0) {
2220 bool yn = string_is_affirmative (prop->value());
2222 /* XXX force reset of solo status */
2224 set_solo (yn, this);
2227 if ((prop = node.property (X_("muted"))) != 0) {
2230 bool muted = string_is_affirmative (prop->value());
2236 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2238 if (string_is_affirmative (prop->value())){
2239 mute_point = mute_point + "PreFader";
2244 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2246 if (string_is_affirmative (prop->value())){
2249 mute_point = mute_point + ",";
2252 mute_point = mute_point + "PostFader";
2257 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2259 if (string_is_affirmative (prop->value())){
2262 mute_point = mute_point + ",";
2265 mute_point = mute_point + "Listen";
2270 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2272 if (string_is_affirmative (prop->value())){
2275 mute_point = mute_point + ",";
2278 mute_point = mute_point + "Main";
2282 _mute_master->set_mute_points (mute_point);
2283 _mute_master->set_muted_by_self (true);
2287 if ((prop = node.property (X_("meter-point"))) != 0) {
2288 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2291 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2292 don't mean the same thing.
2295 if ((prop = node.property (X_("order-keys"))) != 0) {
2299 string::size_type colon, equal;
2300 string remaining = prop->value();
2302 while (remaining.length()) {
2304 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2305 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2308 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2309 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2312 string keyname = remaining.substr (0, equal);
2314 if (keyname == "EditorSort" || keyname == "editor") {
2315 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2321 colon = remaining.find_first_of (':');
2323 if (colon != string::npos) {
2324 remaining = remaining.substr (colon+1);
2333 nlist = node.children ();
2334 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2338 if (child->name() == IO::state_node_name) {
2340 /* there is a note in IO::set_state_2X() about why we have to call
2344 _input->set_state_2X (*child, version, true);
2345 _output->set_state_2X (*child, version, false);
2347 if ((prop = child->property (X_("name"))) != 0) {
2348 Route::set_name (prop->value ());
2353 if ((prop = child->property (X_("active"))) != 0) {
2354 bool yn = string_is_affirmative (prop->value());
2355 _active = !yn; // force switch
2356 set_active (yn, this);
2359 if ((prop = child->property (X_("gain"))) != 0) {
2362 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2363 _amp->gain_control()->set_value (val);
2367 /* Set up Panners in the IO */
2368 XMLNodeList io_nlist = child->children ();
2370 XMLNodeConstIterator io_niter;
2373 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2375 io_child = *io_niter;
2377 if (io_child->name() == X_("Panner")) {
2378 _main_outs->panner_shell()->set_state(*io_child, version);
2379 } else if (io_child->name() == X_("Automation")) {
2380 /* IO's automation is for the fader */
2381 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2387 XMLNodeList redirect_nodes;
2389 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2393 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2394 redirect_nodes.push_back(child);
2399 set_processor_state_2X (redirect_nodes, version);
2401 Stateful::save_extra_xml (node);
2403 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2406 if (child->name() == X_("Comment")) {
2408 /* XXX this is a terrible API design in libxml++ */
2410 XMLNode *cmt = *(child->children().begin());
2411 _comment = cmt->content();
2413 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2414 if (prop->value() == X_("solo")) {
2415 _solo_control->set_state (*child, version);
2416 } else if (prop->value() == X_("mute")) {
2417 _mute_control->set_state (*child, version);
2420 } else if (child->name() == X_("RemoteControl")) {
2421 if ((prop = child->property (X_("id"))) != 0) {
2423 sscanf (prop->value().c_str(), "%d", &x);
2424 set_remote_control_id_internal (x);
2434 Route::get_processor_state ()
2436 XMLNode* root = new XMLNode (X_("redirects"));
2437 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2438 root->add_child_nocopy ((*i)->state (true));
2445 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2447 /* We don't bother removing existing processors not in nList, as this
2448 method will only be called when creating a Route from scratch, not
2449 for undo purposes. Just put processors in at the appropriate place
2453 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2454 add_processor_from_xml_2X (**i, version);
2459 Route::set_processor_state (const XMLNode& node)
2461 const XMLNodeList &nlist = node.children();
2462 XMLNodeConstIterator niter;
2463 ProcessorList new_order;
2464 bool must_configure = false;
2466 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2468 XMLProperty* prop = (*niter)->property ("type");
2470 if (prop->value() == "amp") {
2471 _amp->set_state (**niter, Stateful::current_state_version);
2472 new_order.push_back (_amp);
2473 } else if (prop->value() == "meter") {
2474 _meter->set_state (**niter, Stateful::current_state_version);
2475 new_order.push_back (_meter);
2476 } else if (prop->value() == "main-outs") {
2477 _main_outs->set_state (**niter, Stateful::current_state_version);
2478 } else if (prop->value() == "intreturn") {
2480 _intreturn.reset (new InternalReturn (_session));
2481 must_configure = true;
2483 _intreturn->set_state (**niter, Stateful::current_state_version);
2484 } else if (is_monitor() && prop->value() == "monitor") {
2485 if (!_monitor_control) {
2486 _monitor_control.reset (new MonitorProcessor (_session));
2487 must_configure = true;
2489 _monitor_control->set_state (**niter, Stateful::current_state_version);
2490 } else if (prop->value() == "capture") {
2491 /* CapturingProcessor should never be restored, it's always
2492 added explicitly when needed */
2494 ProcessorList::iterator o;
2496 for (o = _processors.begin(); o != _processors.end(); ++o) {
2497 XMLProperty* id_prop = (*niter)->property(X_("id"));
2498 if (id_prop && (*o)->id() == id_prop->value()) {
2499 (*o)->set_state (**niter, Stateful::current_state_version);
2500 new_order.push_back (*o);
2505 // If the processor (*niter) is not on the route then create it
2507 if (o == _processors.end()) {
2509 boost::shared_ptr<Processor> processor;
2511 if (prop->value() == "intsend") {
2513 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2515 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2516 prop->value() == "lv2" ||
2517 prop->value() == "windows-vst" ||
2518 prop->value() == "lxvst" ||
2519 prop->value() == "audiounit") {
2521 processor.reset (new PluginInsert(_session));
2523 } else if (prop->value() == "port") {
2525 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2527 } else if (prop->value() == "send") {
2529 processor.reset (new Send (_session, _pannable, _mute_master));
2532 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2536 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2537 /* This processor could not be configured. Turn it into a UnknownProcessor */
2538 processor.reset (new UnknownProcessor (_session, **niter));
2541 /* we have to note the monitor send here, otherwise a new one will be created
2542 and the state of this one will be lost.
2544 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2545 if (isend && isend->role() == Delivery::Listen) {
2546 _monitor_send = isend;
2549 /* it doesn't matter if invisible processors are added here, as they
2550 will be sorted out by setup_invisible_processors () shortly.
2553 new_order.push_back (processor);
2554 must_configure = true;
2560 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2561 _processors = new_order;
2563 if (must_configure) {
2564 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2565 configure_processors_unlocked (0);
2568 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2570 (*i)->set_owner (this);
2571 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2573 boost::shared_ptr<PluginInsert> pi;
2575 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2576 if (pi->has_no_inputs ()) {
2577 _have_internal_generator = true;
2584 reset_instrument_info ();
2585 processors_changed (RouteProcessorChange ());
2586 set_processor_positions ();
2590 Route::curve_reallocate ()
2592 // _gain_automation_curve.finish_resize ();
2593 // _pan_automation_curve.finish_resize ();
2597 Route::silence (framecnt_t nframes)
2599 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2604 silence_unlocked (nframes);
2608 Route::silence_unlocked (framecnt_t nframes)
2610 /* Must be called with the processor lock held */
2614 _output->silence (nframes);
2616 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2617 boost::shared_ptr<PluginInsert> pi;
2619 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2620 // skip plugins, they don't need anything when we're not active
2624 (*i)->silence (nframes);
2627 if (nframes == _session.get_block_size()) {
2634 Route::add_internal_return ()
2637 _intreturn.reset (new InternalReturn (_session));
2638 add_processor (_intreturn, PreFader);
2643 Route::add_send_to_internal_return (InternalSend* send)
2645 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2647 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2648 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2651 return d->add_send (send);
2657 Route::remove_send_from_internal_return (InternalSend* send)
2659 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2661 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2662 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2665 return d->remove_send (send);
2671 Route::enable_monitor_send ()
2673 /* Caller must hold process lock */
2674 assert (!AudioEngine::instance()->process_lock().trylock());
2676 /* master never sends to monitor section via the normal mechanism */
2677 assert (!is_master ());
2679 /* make sure we have one */
2680 if (!_monitor_send) {
2681 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2682 _monitor_send->set_display_to_user (false);
2686 configure_processors (0);
2689 /** Add an aux send to a route.
2690 * @param route route to send to.
2691 * @param before Processor to insert before, or 0 to insert at the end.
2694 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2696 assert (route != _session.monitor_out ());
2699 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2701 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2703 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2705 if (d && d->target_route() == route) {
2706 /* already listening via the specified IO: do nothing */
2714 boost::shared_ptr<InternalSend> listener;
2717 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2718 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2721 add_processor (listener, before);
2723 } catch (failed_constructor& err) {
2731 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2733 ProcessorStreams err;
2734 ProcessorList::iterator tmp;
2737 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2739 /* have to do this early because otherwise processor reconfig
2740 * will put _monitor_send back in the list
2743 if (route == _session.monitor_out()) {
2744 _monitor_send.reset ();
2748 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2750 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2752 if (d && d->target_route() == route) {
2754 remove_processor (*x, &err, false);
2757 /* list could have been demolished while we dropped the lock
2768 Route::set_comment (string cmt, void *src)
2771 comment_changed (src);
2772 _session.set_dirty ();
2776 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2778 FeedRecord fr (other, via_sends_only);
2780 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2782 if (!result.second) {
2784 /* already a record for "other" - make sure sends-only information is correct */
2785 if (!via_sends_only && result.first->sends_only) {
2786 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2787 frp->sends_only = false;
2791 return result.second;
2795 Route::clear_fed_by ()
2801 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2803 const FedBy& fed_by (other->fed_by());
2805 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2806 boost::shared_ptr<Route> sr = f->r.lock();
2808 if (sr && (sr.get() == this)) {
2810 if (via_sends_only) {
2811 *via_sends_only = f->sends_only;
2822 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2824 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2826 if (_output->connected_to (other->input())) {
2827 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2828 if (via_send_only) {
2829 *via_send_only = false;
2836 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2838 boost::shared_ptr<IOProcessor> iop;
2840 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2841 if (iop->feeds (other)) {
2842 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2843 if (via_send_only) {
2844 *via_send_only = true;
2848 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2851 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2856 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2861 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2863 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2866 /** Called from the (non-realtime) butler thread when the transport is stopped */
2868 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
2870 framepos_t now = _session.transport_frame();
2873 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2875 Automatable::transport_stopped (now);
2877 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2879 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2883 (*i)->transport_stopped (now);
2887 _roll_delay = _initial_delay;
2891 Route::input_change_handler (IOChange change, void * /*src*/)
2893 bool need_to_queue_solo_change = true;
2895 if ((change.type & IOChange::ConfigurationChanged)) {
2896 /* This is called with the process lock held if change
2897 contains ConfigurationChanged
2899 need_to_queue_solo_change = false;
2900 configure_processors (0);
2901 _phase_invert.resize (_input->n_ports().n_audio ());
2902 io_changed (); /* EMIT SIGNAL */
2905 if (!_input->connected() && _soloed_by_others_upstream) {
2906 if (need_to_queue_solo_change) {
2907 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2909 cancel_solo_after_disconnect (true);
2915 Route::output_change_handler (IOChange change, void * /*src*/)
2917 bool need_to_queue_solo_change = true;
2918 if (_initial_io_setup) {
2922 if ((change.type & IOChange::ConfigurationChanged)) {
2923 /* This is called with the process lock held if change
2924 contains ConfigurationChanged
2926 need_to_queue_solo_change = false;
2927 configure_processors (0);
2928 io_changed (); /* EMIT SIGNAL */
2931 if (!_output->connected() && _soloed_by_others_downstream) {
2932 if (need_to_queue_solo_change) {
2933 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2935 cancel_solo_after_disconnect (false);
2941 Route::cancel_solo_after_disconnect (bool upstream)
2944 _soloed_by_others_upstream = 0;
2946 _soloed_by_others_downstream = 0;
2948 set_mute_master_solo ();
2949 solo_changed (false, this);
2953 Route::pans_required () const
2955 if (n_outputs().n_audio() < 2) {
2959 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2963 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2965 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2971 if (n_outputs().n_total() == 0) {
2975 if (!_active || n_inputs() == ChanCount::ZERO) {
2976 silence_unlocked (nframes);
2980 if (session_state_changing) {
2981 if (_session.transport_speed() != 0.0f) {
2982 /* we're rolling but some state is changing (e.g. our diskstream contents)
2983 so we cannot use them. Be silent till this is over.
2985 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2987 silence_unlocked (nframes);
2990 /* we're really not rolling, so we're either delivery silence or actually
2991 monitoring, both of which are safe to do while session_state_changing is true.
2995 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
2997 fill_buffers_with_input (bufs, _input, nframes);
2999 if (_meter_point == MeterInput) {
3000 _meter->run (bufs, start_frame, end_frame, nframes, true);
3003 _amp->apply_gain_automation (false);
3004 passthru (bufs, start_frame, end_frame, nframes, 0);
3010 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3012 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3017 if (n_outputs().n_total() == 0) {
3021 if (!_active || n_inputs().n_total() == 0) {
3022 silence_unlocked (nframes);
3026 framepos_t unused = 0;
3028 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3034 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3036 fill_buffers_with_input (bufs, _input, nframes);
3038 if (_meter_point == MeterInput) {
3039 _meter->run (bufs, start_frame, end_frame, nframes, true);
3042 passthru (bufs, start_frame, end_frame, nframes, declick);
3048 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3055 Route::flush_processors ()
3057 /* XXX shouldn't really try to take this lock, since
3058 this is called from the RT audio thread.
3061 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3063 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3069 Route::set_meter_point (MeterPoint p, bool force)
3071 if (_meter_point == p && !force) {
3075 bool meter_was_visible_to_user = _meter->display_to_user ();
3078 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3080 maybe_note_meter_position ();
3084 if (_meter_point != MeterCustom) {
3086 _meter->set_display_to_user (false);
3088 setup_invisible_processors ();
3092 _meter->set_display_to_user (true);
3094 /* If we have a previous position for the custom meter, try to put it there */
3095 if (_custom_meter_position_noted) {
3096 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3099 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3100 if (i != _processors.end ()) {
3101 _processors.remove (_meter);
3102 _processors.insert (i, _meter);
3104 } else if (_last_custom_meter_was_at_end) {
3105 _processors.remove (_meter);
3106 _processors.push_back (_meter);
3111 /* Set up the meter for its new position */
3113 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3117 if (loc == _processors.begin()) {
3118 m_in = _input->n_ports();
3120 ProcessorList::iterator before = loc;
3122 m_in = (*before)->output_streams ();
3125 _meter->reflect_inputs (m_in);
3127 /* we do not need to reconfigure the processors, because the meter
3128 (a) is always ready to handle processor_max_streams
3129 (b) is always an N-in/N-out processor, and thus moving
3130 it doesn't require any changes to the other processors.
3134 meter_change (); /* EMIT SIGNAL */
3136 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3138 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3142 Route::listen_position_changed ()
3145 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3146 ProcessorState pstate (this);
3149 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3151 if (configure_processors_unlocked (0)) {
3153 configure_processors_unlocked (0); // it worked before we tried to add it ...
3159 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3160 _session.set_dirty ();
3163 boost::shared_ptr<CapturingProcessor>
3164 Route::add_export_point()
3166 if (!_capturing_processor) {
3168 _capturing_processor.reset (new CapturingProcessor (_session));
3169 _capturing_processor->activate ();
3172 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3173 configure_processors (0);
3178 return _capturing_processor;
3182 Route::update_signal_latency ()
3184 framecnt_t l = _output->user_latency();
3186 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3187 if ((*i)->active ()) {
3188 l += (*i)->signal_latency ();
3192 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3194 if (_signal_latency != l) {
3195 _signal_latency = l;
3196 signal_latency_changed (); /* EMIT SIGNAL */
3199 return _signal_latency;
3203 Route::set_user_latency (framecnt_t nframes)
3205 _output->set_user_latency (nframes);
3206 _session.update_latency_compensation ();
3210 Route::set_latency_compensation (framecnt_t longest_session_latency)
3212 framecnt_t old = _initial_delay;
3214 if (_signal_latency < longest_session_latency) {
3215 _initial_delay = longest_session_latency - _signal_latency;
3220 DEBUG_TRACE (DEBUG::Latency, string_compose (
3221 "%1: compensate for maximum latency of %2,"
3222 "given own latency of %3, using initial delay of %4\n",
3223 name(), longest_session_latency, _signal_latency, _initial_delay));
3225 if (_initial_delay != old) {
3226 initial_delay_changed (); /* EMIT SIGNAL */
3229 if (_session.transport_stopped()) {
3230 _roll_delay = _initial_delay;
3234 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3235 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3236 boost::shared_ptr<AutomationList>(), name)
3239 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3244 Route::SoloControllable::set_value (double val)
3246 bool bval = ((val >= 0.5f) ? true: false);
3248 boost::shared_ptr<RouteList> rl (new RouteList);
3250 boost::shared_ptr<Route> r = _route.lock ();
3257 if (Config->get_solo_control_is_listen_control()) {
3258 _session.set_listen (rl, bval);
3260 _session.set_solo (rl, bval);
3265 Route::SoloControllable::get_value () const
3267 boost::shared_ptr<Route> r = _route.lock ();
3272 if (Config->get_solo_control_is_listen_control()) {
3273 return r->listening_via_monitor() ? 1.0f : 0.0f;
3275 return r->self_soloed() ? 1.0f : 0.0f;
3279 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3280 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3281 boost::shared_ptr<AutomationList>(), name)
3284 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3289 Route::MuteControllable::set_value (double val)
3291 bool bval = ((val >= 0.5f) ? true: false);
3293 boost::shared_ptr<RouteList> rl (new RouteList);
3295 boost::shared_ptr<Route> r = _route.lock ();
3301 _session.set_mute (rl, bval);
3305 Route::MuteControllable::get_value () const
3307 boost::shared_ptr<Route> r = _route.lock ();
3312 return r->muted() ? 1.0f : 0.0f;
3316 Route::set_block_size (pframes_t nframes)
3318 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3319 (*i)->set_block_size (nframes);
3322 _session.ensure_buffers (n_process_buffers ());
3326 Route::protect_automation ()
3328 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3329 (*i)->protect_automation();
3332 /** @param declick 1 to set a pending declick fade-in,
3333 * -1 to set a pending declick fade-out
3336 Route::set_pending_declick (int declick)
3339 /* this call is not allowed to turn off a pending declick */
3341 _pending_declick = declick;
3344 _pending_declick = 0;
3348 /** Shift automation forwards from a particular place, thereby inserting time.
3349 * Adds undo commands for any shifts that are performed.
3351 * @param pos Position to start shifting from.
3352 * @param frames Amount to shift forwards by.
3356 Route::shift (framepos_t pos, framecnt_t frames)
3358 /* gain automation */
3360 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3362 XMLNode &before = gc->alist()->get_state ();
3363 gc->alist()->shift (pos, frames);
3364 XMLNode &after = gc->alist()->get_state ();
3365 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3368 /* pan automation */
3370 ControlSet::Controls& c (_pannable->controls());
3372 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3373 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3375 boost::shared_ptr<AutomationList> al = pc->alist();
3376 XMLNode& before = al->get_state ();
3377 al->shift (pos, frames);
3378 XMLNode& after = al->get_state ();
3379 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3384 /* redirect automation */
3386 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3387 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3389 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3391 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3392 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3394 boost::shared_ptr<AutomationList> al = ac->alist();
3395 XMLNode &before = al->get_state ();
3396 al->shift (pos, frames);
3397 XMLNode &after = al->get_state ();
3398 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3407 Route::save_as_template (const string& path, const string& name)
3409 XMLNode& node (state (false));
3412 IO::set_name_in_state (*node.children().front(), name);
3414 tree.set_root (&node);
3415 return tree.write (path.c_str());
3420 Route::set_name (const string& str)
3426 name = Route::ensure_track_or_route_name (str, _session);
3427 SessionObject::set_name (name);
3429 ret = (_input->set_name(name) && _output->set_name(name));
3432 /* rename the main outs. Leave other IO processors
3433 * with whatever name they already have, because its
3434 * just fine as it is (it will not contain the route
3435 * name if its a port insert, port send or port return).
3439 if (_main_outs->set_name (name)) {
3440 /* XXX returning false here is stupid because
3441 we already changed the route name.
3451 /** Set the name of a route in an XML description.
3452 * @param node XML <Route> node to set the name in.
3453 * @param name New name.
3456 Route::set_name_in_state (XMLNode& node, string const & name)
3458 node.add_property (X_("name"), name);
3460 XMLNodeList children = node.children();
3461 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3463 if ((*i)->name() == X_("IO")) {
3465 IO::set_name_in_state (**i, name);
3467 } else if ((*i)->name() == X_("Processor")) {
3469 XMLProperty* role = (*i)->property (X_("role"));
3470 if (role && role->value() == X_("Main")) {
3471 (*i)->add_property (X_("name"), name);
3474 } else if ((*i)->name() == X_("Diskstream")) {
3476 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3477 (*i)->add_property (X_("name"), name);
3483 boost::shared_ptr<Send>
3484 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3486 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3488 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3489 boost::shared_ptr<InternalSend> send;
3491 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3492 if (send->target_route() == target) {
3498 return boost::shared_ptr<Send>();
3501 /** @param c Audio channel index.
3502 * @param yn true to invert phase, otherwise false.
3505 Route::set_phase_invert (uint32_t c, bool yn)
3507 if (_phase_invert[c] != yn) {
3508 _phase_invert[c] = yn;
3509 phase_invert_changed (); /* EMIT SIGNAL */
3510 _session.set_dirty ();
3515 Route::set_phase_invert (boost::dynamic_bitset<> p)
3517 if (_phase_invert != p) {
3519 phase_invert_changed (); /* EMIT SIGNAL */
3520 _session.set_dirty ();
3525 Route::phase_invert (uint32_t c) const
3527 return _phase_invert[c];
3530 boost::dynamic_bitset<>
3531 Route::phase_invert () const
3533 return _phase_invert;
3537 Route::set_denormal_protection (bool yn)
3539 if (_denormal_protection != yn) {
3540 _denormal_protection = yn;
3541 denormal_protection_changed (); /* EMIT SIGNAL */
3546 Route::denormal_protection () const
3548 return _denormal_protection;
3552 Route::set_active (bool yn, void* src)
3554 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3555 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3559 if (_active != yn) {
3561 _input->set_active (yn);
3562 _output->set_active (yn);
3563 active_changed (); // EMIT SIGNAL
3564 _session.set_dirty ();
3571 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3577 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3579 boost::shared_ptr<Send> s;
3580 boost::shared_ptr<Return> r;
3582 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3583 s->meter()->meter();
3584 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3585 r->meter()->meter ();
3590 boost::shared_ptr<Pannable>
3591 Route::pannable() const
3596 boost::shared_ptr<Panner>
3597 Route::panner() const
3600 return _main_outs->panner_shell()->panner();
3603 boost::shared_ptr<PannerShell>
3604 Route::panner_shell() const
3606 return _main_outs->panner_shell();
3609 boost::shared_ptr<AutomationControl>
3610 Route::gain_control() const
3612 return _amp->gain_control();
3615 boost::shared_ptr<AutomationControl>
3616 Route::get_control (const Evoral::Parameter& param)
3618 /* either we own the control or .... */
3620 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3624 /* maybe one of our processors does or ... */
3626 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3627 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3628 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3636 /* nobody does so we'll make a new one */
3638 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3645 boost::shared_ptr<Processor>
3646 Route::nth_plugin (uint32_t n)
3648 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3649 ProcessorList::iterator i;
3651 for (i = _processors.begin(); i != _processors.end(); ++i) {
3652 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3659 return boost::shared_ptr<Processor> ();
3662 boost::shared_ptr<Processor>
3663 Route::nth_send (uint32_t n)
3665 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3666 ProcessorList::iterator i;
3668 for (i = _processors.begin(); i != _processors.end(); ++i) {
3669 if (boost::dynamic_pointer_cast<Send> (*i)) {
3676 return boost::shared_ptr<Processor> ();
3680 Route::has_io_processor_named (const string& name)
3682 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3683 ProcessorList::iterator i;
3685 for (i = _processors.begin(); i != _processors.end(); ++i) {
3686 if (boost::dynamic_pointer_cast<Send> (*i) ||
3687 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3688 if ((*i)->name() == name) {
3697 MuteMaster::MutePoint
3698 Route::mute_points () const
3700 return _mute_master->mute_points ();
3704 Route::set_processor_positions ()
3706 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3708 bool had_amp = false;
3709 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3710 (*i)->set_pre_fader (!had_amp);
3711 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3717 /** Called when there is a proposed change to the input port count */
3719 Route::input_port_count_changing (ChanCount to)
3721 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3723 /* The processors cannot be configured with the new input arrangement, so
3729 /* The change is ok */
3733 /** Called when there is a proposed change to the output port count */
3735 Route::output_port_count_changing (ChanCount to)
3737 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3738 if (processor_out_streams.get(*t) > to.get(*t)) {
3742 /* The change is ok */
3747 Route::unknown_processors () const
3751 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3752 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3753 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3754 p.push_back ((*i)->name ());
3763 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3765 /* we assume that all our input ports feed all our output ports. its not
3766 universally true, but the alternative is way too corner-case to worry about.
3769 LatencyRange all_connections;
3772 all_connections.min = 0;
3773 all_connections.max = 0;
3775 all_connections.min = ~((pframes_t) 0);
3776 all_connections.max = 0;
3778 /* iterate over all "from" ports and determine the latency range for all of their
3779 connections to the "outside" (outside of this Route).
3782 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3786 p->get_connected_latency_range (range, playback);
3788 all_connections.min = min (all_connections.min, range.min);
3789 all_connections.max = max (all_connections.max, range.max);
3793 /* set the "from" port latencies to the max/min range of all their connections */
3795 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3796 p->set_private_latency_range (all_connections, playback);
3799 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3801 all_connections.min += our_latency;
3802 all_connections.max += our_latency;
3804 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3805 p->set_private_latency_range (all_connections, playback);
3808 return all_connections.max;
3812 Route::set_private_port_latencies (bool playback) const
3814 framecnt_t own_latency = 0;
3816 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3817 OR LATENCY CALLBACK.
3819 This is called (early) from the latency callback. It computes the REAL
3820 latency associated with each port and stores the result as the "private"
3821 latency of the port. A later call to Route::set_public_port_latencies()
3822 sets all ports to the same value to reflect the fact that we do latency
3823 compensation and so all signals are delayed by the same amount as they
3824 flow through ardour.
3827 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3828 if ((*i)->active ()) {
3829 own_latency += (*i)->signal_latency ();
3834 /* playback: propagate latency from "outside the route" to outputs to inputs */
3835 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3837 /* capture: propagate latency from "outside the route" to inputs to outputs */
3838 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3843 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3845 /* this is called to set the JACK-visible port latencies, which take
3846 latency compensation into account.
3855 const PortSet& ports (_input->ports());
3856 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3857 p->set_public_latency_range (range, playback);
3862 const PortSet& ports (_output->ports());
3863 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3864 p->set_public_latency_range (range, playback);
3869 /** Put the invisible processors in the right place in _processors.
3870 * Must be called with a writer lock on _processor_lock held.
3873 Route::setup_invisible_processors ()
3876 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3877 assert (!lm.locked ());
3881 /* too early to be doing this stuff */
3885 /* we'll build this new list here and then use it */
3887 ProcessorList new_processors;
3889 /* find visible processors */
3891 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3892 if ((*i)->display_to_user ()) {
3893 new_processors.push_back (*i);
3899 ProcessorList::iterator amp = new_processors.begin ();
3900 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3904 assert (amp != _processors.end ());
3906 /* and the processor after the amp */
3908 ProcessorList::iterator after_amp = amp;
3914 switch (_meter_point) {
3916 assert (!_meter->display_to_user ());
3917 new_processors.push_front (_meter);
3920 assert (!_meter->display_to_user ());
3921 new_processors.insert (amp, _meter);
3923 case MeterPostFader:
3924 /* do nothing here */
3927 /* do nothing here */
3930 /* the meter is visible, so we don't touch it here */
3937 assert (_main_outs);
3938 assert (!_main_outs->display_to_user ());
3939 new_processors.push_back (_main_outs);
3941 /* iterator for the main outs */
3943 ProcessorList::iterator main = new_processors.end();
3946 /* OUTPUT METERING */
3948 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3949 assert (!_meter->display_to_user ());
3951 /* add the processor just before or just after the main outs */
3953 ProcessorList::iterator meter_point = main;
3955 if (_meter_point == MeterOutput) {
3958 new_processors.insert (meter_point, _meter);
3963 if (_monitor_send && !is_monitor ()) {
3964 assert (!_monitor_send->display_to_user ());
3965 if (Config->get_solo_control_is_listen_control()) {
3966 switch (Config->get_listen_position ()) {
3967 case PreFaderListen:
3968 switch (Config->get_pfl_position ()) {
3969 case PFLFromBeforeProcessors:
3970 new_processors.push_front (_monitor_send);
3972 case PFLFromAfterProcessors:
3973 new_processors.insert (amp, _monitor_send);
3976 _monitor_send->set_can_pan (false);
3978 case AfterFaderListen:
3979 switch (Config->get_afl_position ()) {
3980 case AFLFromBeforeProcessors:
3981 new_processors.insert (after_amp, _monitor_send);
3983 case AFLFromAfterProcessors:
3984 new_processors.insert (new_processors.end(), _monitor_send);
3987 _monitor_send->set_can_pan (true);
3991 new_processors.insert (new_processors.end(), _monitor_send);
3992 _monitor_send->set_can_pan (false);
3996 /* MONITOR CONTROL */
3998 if (_monitor_control && is_monitor ()) {
3999 assert (!_monitor_control->display_to_user ());
4000 new_processors.push_front (_monitor_control);
4003 /* INTERNAL RETURN */
4005 /* doing this here means that any monitor control will come just after
4010 assert (!_intreturn->display_to_user ());
4011 new_processors.push_front (_intreturn);
4014 /* EXPORT PROCESSOR */
4016 if (_capturing_processor) {
4017 assert (!_capturing_processor->display_to_user ());
4018 new_processors.push_front (_capturing_processor);
4021 _processors = new_processors;
4023 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4024 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4025 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4032 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4033 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4037 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4038 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4045 /** If the meter point is `Custom', make a note of where the meter is.
4046 * This is so that if the meter point is subsequently set to something else,
4047 * and then back to custom, we can put the meter back where it was last time
4048 * custom was enabled.
4050 * Must be called with the _processor_lock held.
4053 Route::maybe_note_meter_position ()
4055 if (_meter_point != MeterCustom) {
4059 _custom_meter_position_noted = true;
4060 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4061 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4062 ProcessorList::iterator j = i;
4064 if (j != _processors.end ()) {
4065 _processor_after_last_custom_meter = *j;
4066 _last_custom_meter_was_at_end = false;
4068 _last_custom_meter_was_at_end = true;
4074 boost::shared_ptr<Processor>
4075 Route::processor_by_id (PBD::ID id) const
4077 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4078 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4079 if ((*i)->id() == id) {
4084 return boost::shared_ptr<Processor> ();
4087 /** @return the monitoring state, or in other words what data we are pushing
4088 * into the route (data from the inputs, data from disk or silence)
4091 Route::monitoring_state () const
4093 return MonitoringInput;
4096 /** @return what we should be metering; either the data coming from the input
4097 * IO or the data that is flowing through the route.
4100 Route::metering_state () const
4102 return MeteringRoute;
4106 Route::has_external_redirects () const
4108 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4110 /* ignore inactive processors and obviously ignore the main
4111 * outs since everything has them and we don't care.
4114 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4122 boost::shared_ptr<Processor>
4123 Route::the_instrument () const
4125 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4126 return the_instrument_unlocked ();
4129 boost::shared_ptr<Processor>
4130 Route::the_instrument_unlocked () const
4132 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4133 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4134 if ((*i)->input_streams().n_midi() > 0 &&
4135 (*i)->output_streams().n_audio() > 0) {
4140 return boost::shared_ptr<Processor>();
4146 Route::non_realtime_locate (framepos_t pos)
4149 _pannable->transport_located (pos);
4153 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4155 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4156 (*i)->transport_located (pos);
4162 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4169 * We don't currently mix MIDI input together, so we don't need the
4170 * complex logic of the audio case.
4173 n_buffers = bufs.count().n_midi ();
4175 for (i = 0; i < n_buffers; ++i) {
4177 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4178 MidiBuffer& buf (bufs.get_midi (i));
4181 buf.copy (source_port->get_midi_buffer(nframes));
4183 buf.silence (nframes);
4189 n_buffers = bufs.count().n_audio();
4191 size_t n_ports = io->n_ports().n_audio();
4192 float scaling = 1.0f;
4194 if (n_ports > n_buffers) {
4195 scaling = ((float) n_buffers) / n_ports;
4198 for (i = 0; i < n_ports; ++i) {
4200 /* if there are more ports than buffers, map them onto buffers
4201 * in a round-robin fashion
4204 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4205 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4208 if (i < n_buffers) {
4210 /* first time through just copy a channel into
4214 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4216 if (scaling != 1.0f) {
4217 buf.apply_gain (scaling, nframes);
4222 /* on subsequent times around, merge data from
4223 * the port with what is already there
4226 if (scaling != 1.0f) {
4227 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4229 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4234 /* silence any remaining buffers */
4236 for (; i < n_buffers; ++i) {
4237 AudioBuffer& buf (bufs.get_audio (i));
4238 buf.silence (nframes);
4241 /* establish the initial setup of the buffer set, reflecting what was
4242 copied into it. unless, of course, we are the auditioner, in which
4243 case nothing was fed into it from the inputs at all.
4246 if (!is_auditioner()) {
4247 bufs.set_count (io->n_ports());