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::Signal1<void,RouteSortOrderKey> 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 , _remote_control_id (0)
100 , _in_configure_processors (false)
101 , _initial_io_setup (false)
102 , _custom_meter_position_noted (false)
103 , _last_custom_meter_was_at_end (false)
106 _meter_type = MeterK20;
108 processor_max_streams.reset();
114 /* add standard controls */
116 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
117 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
119 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
120 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
122 add_control (_solo_control);
123 add_control (_mute_control);
127 if (!(_flags & Route::MonitorOut)) {
128 _pannable.reset (new Pannable (_session));
131 /* input and output objects */
133 _input.reset (new IO (_session, _name, IO::Input, _default_type));
134 _output.reset (new IO (_session, _name, IO::Output, _default_type));
136 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
137 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
139 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
140 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
142 /* add amp processor */
144 _amp.reset (new Amp (_session));
145 add_processor (_amp, PostFader);
147 /* create standard processors: meter, main outs, monitor out;
148 they will be added to _processors by setup_invisible_processors ()
151 _meter.reset (new PeakMeter (_session, _name));
152 _meter->set_display_to_user (false);
155 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
156 _main_outs->activate ();
159 /* where we listen to tracks */
160 _intreturn.reset (new InternalReturn (_session));
161 _intreturn->activate ();
163 /* the thing that provides proper control over a control/monitor/listen bus
164 (such as per-channel cut, dim, solo, invert, etc).
166 _monitor_control.reset (new MonitorProcessor (_session));
167 _monitor_control->activate ();
170 if (is_master() || is_monitor() || is_auditioner()) {
171 _mute_master->set_solo_ignore (true);
174 /* now that we have _meter, its safe to connect to this */
176 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
179 /* run a configure so that the invisible processors get set up */
180 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
181 configure_processors (0);
189 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
191 /* do this early so that we don't get incoming signals as we are going through destruction
196 /* don't use clear_processors here, as it depends on the session which may
197 be half-destroyed by now
200 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
201 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
202 (*i)->drop_references ();
205 _processors.clear ();
209 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
211 if (Config->get_remote_model() != UserOrdered) {
215 set_remote_control_id_internal (id, notify_class_listeners);
219 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
221 /* force IDs for master/monitor busses and prevent
222 any other route from accidentally getting these IDs
223 (i.e. legacy sessions)
226 if (is_master() && id != MasterBusRemoteControlID) {
227 id = MasterBusRemoteControlID;
230 if (is_monitor() && id != MonitorBusRemoteControlID) {
231 id = MonitorBusRemoteControlID;
238 /* don't allow it to collide */
240 if (!is_master () && !is_monitor() &&
241 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
242 id += MonitorBusRemoteControlID;
245 if (id != remote_control_id()) {
246 _remote_control_id = id;
247 RemoteControlIDChanged ();
249 if (notify_class_listeners) {
250 RemoteControlIDChange ();
256 Route::remote_control_id() const
259 return MasterBusRemoteControlID;
263 return MonitorBusRemoteControlID;
266 return _remote_control_id;
270 Route::has_order_key (RouteSortOrderKey key) const
272 return (order_keys.find (key) != order_keys.end());
276 Route::order_key (RouteSortOrderKey key) const
278 OrderKeys::const_iterator i = order_keys.find (key);
280 if (i == order_keys.end()) {
288 Route::sync_order_keys (RouteSortOrderKey base)
290 /* this is called after changes to 1 or more route order keys have been
291 * made, and we want to sync up.
294 OrderKeys::iterator i = order_keys.find (base);
296 if (i == order_keys.end()) {
300 for (OrderKeys::iterator k = order_keys.begin(); k != order_keys.end(); ++k) {
302 if (k->first != base) {
303 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 set key for %2 to %3 from %4\n",
305 enum_2_string (k->first),
307 enum_2_string (base)));
309 k->second = i->second;
315 Route::set_remote_control_id_from_order_key (RouteSortOrderKey /*key*/, uint32_t rid)
317 if (is_master() || is_monitor() || is_auditioner()) {
318 /* hard-coded remote IDs, or no remote ID */
322 if (_remote_control_id != rid) {
323 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
324 _remote_control_id = rid;
325 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
328 /* don't emit the class-level RID signal RemoteControlIDChange here,
329 leave that to the entity that changed the order key, so that we
330 don't get lots of emissions for no good reasons (e.g. when changing
331 all route order keys).
333 See Session::sync_remote_id_from_order_keys() for the (primary|only)
334 spot where that is emitted.
339 Route::set_order_key (RouteSortOrderKey key, uint32_t n)
341 OrderKeys::iterator i = order_keys.find (key);
343 if (i != order_keys.end() && i->second == n) {
349 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key %2 set to %3\n",
350 name(), enum_2_string (key), order_key (key)));
352 _session.set_dirty ();
356 Route::ensure_track_or_route_name(string name, Session &session)
358 string newname = name;
360 while (!session.io_name_is_legal (newname)) {
361 newname = bump_name_once (newname, '.');
369 Route::inc_gain (gain_t fraction, void *src)
371 _amp->inc_gain (fraction, src);
375 Route::set_gain (gain_t val, void *src)
377 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
379 if (_route_group->is_relative()) {
381 gain_t usable_gain = _amp->gain();
382 if (usable_gain < 0.000001f) {
383 usable_gain = 0.000001f;
387 if (delta < 0.000001f) {
391 delta -= usable_gain;
396 gain_t factor = delta / usable_gain;
399 factor = _route_group->get_max_factor(factor);
400 if (factor == 0.0f) {
401 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
405 factor = _route_group->get_min_factor(factor);
406 if (factor == 0.0f) {
407 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
412 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
416 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
422 if (val == _amp->gain()) {
426 _amp->set_gain (val, src);
430 Route::maybe_declick (BufferSet&, framecnt_t, int)
432 /* this is the "bus" implementation and they never declick.
437 /** Process this route for one (sub) cycle (process thread)
439 * @param bufs Scratch buffers to use for the signal path
440 * @param start_frame Initial transport frame
441 * @param end_frame Final transport frame
442 * @param nframes Number of frames to output (to ports)
444 * Note that (end_frame - start_frame) may not be equal to nframes when the
445 * transport speed isn't 1.0 (eg varispeed).
448 Route::process_output_buffers (BufferSet& bufs,
449 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
450 int declick, bool gain_automation_ok)
452 bufs.set_is_silent (false);
454 /* figure out if we're going to use gain automation */
455 if (gain_automation_ok) {
456 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
457 _amp->setup_gain_automation (start_frame, end_frame, nframes);
459 _amp->apply_gain_automation (false);
462 /* Tell main outs what to do about monitoring. We do this so that
463 on a transition between monitoring states we get a de-clicking gain
464 change in the _main_outs delivery.
467 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
469 /* -------------------------------------------------------------------------------------------
470 GLOBAL DECLICK (for transport changes etc.)
471 ----------------------------------------------------------------------------------------- */
473 maybe_declick (bufs, nframes, declick);
474 _pending_declick = 0;
476 /* -------------------------------------------------------------------------------------------
477 DENORMAL CONTROL/PHASE INVERT
478 ----------------------------------------------------------------------------------------- */
480 if (_phase_invert.any ()) {
484 if (_denormal_protection || Config->get_denormal_protection()) {
486 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
487 Sample* const sp = i->data();
489 if (_phase_invert[chn]) {
490 for (pframes_t nx = 0; nx < nframes; ++nx) {
495 for (pframes_t nx = 0; nx < nframes; ++nx) {
503 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
504 Sample* const sp = i->data();
506 if (_phase_invert[chn]) {
507 for (pframes_t nx = 0; nx < nframes; ++nx) {
516 if (_denormal_protection || Config->get_denormal_protection()) {
518 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
519 Sample* const sp = i->data();
520 for (pframes_t nx = 0; nx < nframes; ++nx) {
528 /* -------------------------------------------------------------------------------------------
530 ----------------------------------------------------------------------------------------- */
532 /* set this to be true if the meter will already have been ::run() earlier */
533 bool const meter_already_run = metering_state() == MeteringInput;
535 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
537 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
538 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
543 /* if it has any inputs, make sure they match */
544 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
545 if (bufs.count() != (*i)->input_streams()) {
547 DEBUG::Processors, string_compose (
548 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
549 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
556 /* should we NOT run plugins here if the route is inactive?
557 do we catch route != active somewhere higher?
560 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
561 bufs.set_count ((*i)->output_streams());
566 Route::n_process_buffers ()
568 return max (_input->n_ports(), processor_max_streams);
572 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
574 assert (is_monitor());
575 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
576 passthru (bufs, start_frame, end_frame, nframes, declick);
580 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
584 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
586 /* control/monitor bus ignores input ports when something is
587 feeding the listen "stream". data will "arrive" into the
588 route from the intreturn processor element.
591 bufs.silence (nframes, 0);
594 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
595 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
599 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
601 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
603 bufs.set_count (_input->n_ports());
604 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
605 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
609 Route::set_listen (bool yn, void* src)
615 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
616 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
621 if (yn != _monitor_send->active()) {
623 _monitor_send->activate ();
624 _mute_master->set_soloed (true);
626 _monitor_send->deactivate ();
627 _mute_master->set_soloed (false);
630 listen_changed (src); /* EMIT SIGNAL */
636 Route::listening_via_monitor () const
639 return _monitor_send->active ();
646 Route::set_solo_safe (bool yn, void *src)
648 if (_solo_safe != yn) {
650 solo_safe_changed (src);
655 Route::solo_safe() const
661 Route::set_solo (bool yn, void *src)
664 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
668 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
669 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
673 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
674 name(), yn, src, (src == _route_group), self_soloed()));
676 if (self_soloed() != yn) {
678 set_mute_master_solo ();
679 solo_changed (true, src); /* EMIT SIGNAL */
680 _solo_control->Changed (); /* EMIT SIGNAL */
685 Route::set_self_solo (bool yn)
687 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
692 Route::mod_solo_by_others_upstream (int32_t delta)
695 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
699 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
700 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
702 uint32_t old_sbu = _soloed_by_others_upstream;
705 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
706 _soloed_by_others_upstream += delta;
708 _soloed_by_others_upstream = 0;
711 _soloed_by_others_upstream += delta;
714 DEBUG_TRACE (DEBUG::Solo, string_compose (
715 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
716 name(), delta, _soloed_by_others_upstream, old_sbu,
717 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
719 /* push the inverse solo change to everything that feeds us.
721 This is important for solo-within-group. When we solo 1 track out of N that
722 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
723 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
724 tracks that feed it. This will silence them if they were audible because
725 of a bus solo, but the newly soloed track will still be audible (because
728 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
732 if ((_self_solo || _soloed_by_others_downstream) &&
733 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
734 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
736 if (delta > 0 || !Config->get_exclusive_solo()) {
737 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
738 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
739 boost::shared_ptr<Route> sr = i->r.lock();
741 sr->mod_solo_by_others_downstream (-delta);
747 set_mute_master_solo ();
748 solo_changed (false, this);
752 Route::mod_solo_by_others_downstream (int32_t delta)
755 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
759 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
760 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
763 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
764 _soloed_by_others_downstream += delta;
766 _soloed_by_others_downstream = 0;
769 _soloed_by_others_downstream += delta;
772 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
774 set_mute_master_solo ();
775 solo_changed (false, this);
779 Route::set_mute_master_solo ()
781 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
785 Route::set_solo_isolated (bool yn, void *src)
787 if (is_master() || is_monitor() || is_auditioner()) {
791 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
792 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
796 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
798 boost::shared_ptr<RouteList> routes = _session.get_routes ();
799 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
801 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
806 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
808 if (does_feed && !sends_only) {
809 (*i)->set_solo_isolated (yn, (*i)->route_group());
813 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
815 bool changed = false;
818 if (_solo_isolated == 0) {
819 _mute_master->set_solo_ignore (true);
824 if (_solo_isolated > 0) {
826 if (_solo_isolated == 0) {
827 _mute_master->set_solo_ignore (false);
834 solo_isolated_changed (src);
839 Route::solo_isolated () const
841 return _solo_isolated > 0;
845 Route::set_mute_points (MuteMaster::MutePoint mp)
847 _mute_master->set_mute_points (mp);
848 mute_points_changed (); /* EMIT SIGNAL */
850 if (_mute_master->muted_by_self()) {
851 mute_changed (this); /* EMIT SIGNAL */
852 _mute_control->Changed (); /* EMIT SIGNAL */
857 Route::set_mute (bool yn, void *src)
859 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
860 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
865 _mute_master->set_muted_by_self (yn);
866 /* allow any derived classes to respond to the mute change
867 before anybody else knows about it.
870 /* tell everyone else */
871 mute_changed (src); /* EMIT SIGNAL */
872 _mute_control->Changed (); /* EMIT SIGNAL */
877 Route::muted () const
879 return _mute_master->muted_by_self();
884 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
886 cerr << name << " {" << endl;
887 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
888 p != procs.end(); ++p) {
889 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
895 /** Supposing that we want to insert a Processor at a given Placement, return
896 * the processor to add the new one before (or 0 to add at the end).
898 boost::shared_ptr<Processor>
899 Route::before_processor_for_placement (Placement p)
901 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
903 ProcessorList::iterator loc;
906 /* generic pre-fader: insert immediately before the amp */
907 loc = find (_processors.begin(), _processors.end(), _amp);
909 /* generic post-fader: insert right before the main outs */
910 loc = find (_processors.begin(), _processors.end(), _main_outs);
913 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
916 /** Supposing that we want to insert a Processor at a given index, return
917 * the processor to add the new one before (or 0 to add at the end).
919 boost::shared_ptr<Processor>
920 Route::before_processor_for_index (int index)
923 return boost::shared_ptr<Processor> ();
926 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
928 ProcessorList::iterator i = _processors.begin ();
930 while (i != _processors.end() && j < index) {
931 if ((*i)->display_to_user()) {
938 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
941 /** Add a processor either pre- or post-fader
942 * @return 0 on success, non-0 on failure.
945 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
947 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
951 /** Add a processor to a route such that it ends up with a given index into the visible processors.
952 * @param index Index to add the processor at, or -1 to add at the end of the list.
953 * @return 0 on success, non-0 on failure.
956 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
958 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
961 /** Add a processor to the route.
962 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
963 * @return 0 on success, non-0 on failure.
966 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
968 assert (processor != _meter);
969 assert (processor != _main_outs);
971 DEBUG_TRACE (DEBUG::Processors, string_compose (
972 "%1 adding processor %2\n", name(), processor->name()));
974 if (!_session.engine().connected() || !processor) {
979 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
980 ProcessorState pstate (this);
982 boost::shared_ptr<PluginInsert> pi;
983 boost::shared_ptr<PortInsert> porti;
985 if (processor == _amp) {
986 /* Ensure that only one amp is in the list at any time */
987 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
988 if (check != _processors.end()) {
989 if (before == _amp) {
990 /* Already in position; all is well */
993 _processors.erase (check);
998 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1000 ProcessorList::iterator loc;
1002 /* inserting before a processor; find it */
1003 loc = find (_processors.begin(), _processors.end(), before);
1004 if (loc == _processors.end ()) {
1009 /* inserting at end */
1010 loc = _processors.end ();
1013 _processors.insert (loc, processor);
1015 // Set up processor list channels. This will set processor->[input|output]_streams(),
1016 // configure redirect ports properly, etc.
1019 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1021 if (configure_processors_unlocked (err)) {
1023 configure_processors_unlocked (0); // it worked before we tried to add it ...
1028 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1030 if (pi->has_no_inputs ()) {
1031 /* generator plugin */
1032 _have_internal_generator = true;
1037 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1038 processor->activate ();
1041 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1043 _output->set_user_latency (0);
1046 reset_instrument_info ();
1047 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1048 set_processor_positions ();
1054 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1056 const XMLProperty *prop;
1059 boost::shared_ptr<Processor> processor;
1061 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1062 so that we can add the processor in the right place (pre/post-fader)
1065 XMLNodeList const & children = node.children ();
1066 XMLNodeList::const_iterator i = children.begin ();
1068 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1072 Placement placement = PreFader;
1074 if (i != children.end()) {
1075 if ((prop = (*i)->property (X_("placement"))) != 0) {
1076 placement = Placement (string_2_enum (prop->value(), placement));
1080 if (node.name() == "Insert") {
1082 if ((prop = node.property ("type")) != 0) {
1084 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1085 prop->value() == "lv2" ||
1086 prop->value() == "windows-vst" ||
1087 prop->value() == "lxvst" ||
1088 prop->value() == "audiounit") {
1090 processor.reset (new PluginInsert (_session));
1094 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1099 } else if (node.name() == "Send") {
1101 processor.reset (new Send (_session, _pannable, _mute_master));
1105 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1109 if (processor->set_state (node, version)) {
1113 return (add_processor (processor, placement) == 0);
1116 catch (failed_constructor &err) {
1117 warning << _("processor could not be created. Ignored.") << endmsg;
1123 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1125 /* NOTE: this is intended to be used ONLY when copying
1126 processors from another Route. Hence the subtle
1127 differences between this and ::add_processor()
1130 ProcessorList::iterator loc;
1133 loc = find(_processors.begin(), _processors.end(), before);
1135 /* nothing specified - at end */
1136 loc = _processors.end ();
1139 if (!_session.engine().connected()) {
1143 if (others.empty()) {
1148 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1149 ProcessorState pstate (this);
1151 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1157 boost::shared_ptr<PluginInsert> pi;
1159 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1163 _processors.insert (loc, *i);
1165 if ((*i)->active()) {
1170 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1171 if (configure_processors_unlocked (err)) {
1173 configure_processors_unlocked (0); // it worked before we tried to add it ...
1178 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1181 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1182 boost::shared_ptr<PluginInsert> pi;
1184 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1185 if (pi->has_no_inputs ()) {
1186 _have_internal_generator = true;
1192 _output->set_user_latency (0);
1195 reset_instrument_info ();
1196 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1197 set_processor_positions ();
1203 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1205 if (p == PreFader) {
1206 start = _processors.begin();
1207 end = find(_processors.begin(), _processors.end(), _amp);
1209 start = find(_processors.begin(), _processors.end(), _amp);
1211 end = _processors.end();
1215 /** Turn off all processors with a given placement
1216 * @param p Placement of processors to disable
1219 Route::disable_processors (Placement p)
1221 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1223 ProcessorList::iterator start, end;
1224 placement_range(p, start, end);
1226 for (ProcessorList::iterator i = start; i != end; ++i) {
1227 (*i)->deactivate ();
1230 _session.set_dirty ();
1233 /** Turn off all redirects
1236 Route::disable_processors ()
1238 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1240 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1241 (*i)->deactivate ();
1244 _session.set_dirty ();
1247 /** Turn off all redirects with a given placement
1248 * @param p Placement of redirects to disable
1251 Route::disable_plugins (Placement p)
1253 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1255 ProcessorList::iterator start, end;
1256 placement_range(p, start, end);
1258 for (ProcessorList::iterator i = start; i != end; ++i) {
1259 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1260 (*i)->deactivate ();
1264 _session.set_dirty ();
1267 /** Turn off all plugins
1270 Route::disable_plugins ()
1272 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1274 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1275 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1276 (*i)->deactivate ();
1280 _session.set_dirty ();
1285 Route::ab_plugins (bool forward)
1287 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1291 /* forward = turn off all active redirects, and mark them so that the next time
1292 we go the other way, we will revert them
1295 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1296 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1300 if ((*i)->active()) {
1301 (*i)->deactivate ();
1302 (*i)->set_next_ab_is_active (true);
1304 (*i)->set_next_ab_is_active (false);
1310 /* backward = if the redirect was marked to go active on the next ab, do so */
1312 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1314 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1318 if ((*i)->get_next_ab_is_active()) {
1321 (*i)->deactivate ();
1326 _session.set_dirty ();
1330 /** Remove processors with a given placement.
1331 * @param p Placement of processors to remove.
1334 Route::clear_processors (Placement p)
1336 if (!_session.engine().connected()) {
1340 bool already_deleting = _session.deletion_in_progress();
1341 if (!already_deleting) {
1342 _session.set_deletion_in_progress();
1346 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1347 ProcessorList new_list;
1348 ProcessorStreams err;
1349 bool seen_amp = false;
1351 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1357 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1359 /* you can't remove these */
1361 new_list.push_back (*i);
1368 new_list.push_back (*i);
1371 (*i)->drop_references ();
1379 (*i)->drop_references ();
1382 new_list.push_back (*i);
1389 _processors = new_list;
1392 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1393 configure_processors_unlocked (&err); // this can't fail
1397 processor_max_streams.reset();
1398 _have_internal_generator = false;
1399 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1400 set_processor_positions ();
1402 reset_instrument_info ();
1404 if (!already_deleting) {
1405 _session.clear_deletion_in_progress();
1410 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1412 // TODO once the export point can be configured properly, do something smarter here
1413 if (processor == _capturing_processor) {
1414 _capturing_processor.reset();
1417 /* these can never be removed */
1419 if (processor == _amp || processor == _meter || processor == _main_outs) {
1423 if (!_session.engine().connected()) {
1427 processor_max_streams.reset();
1430 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1431 ProcessorState pstate (this);
1433 ProcessorList::iterator i;
1434 bool removed = false;
1436 for (i = _processors.begin(); i != _processors.end(); ) {
1437 if (*i == processor) {
1439 /* move along, see failure case for configure_processors()
1440 where we may need to reconfigure the processor.
1443 /* stop redirects that send signals to JACK ports
1444 from causing noise as a result of no longer being
1448 boost::shared_ptr<IOProcessor> iop;
1450 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1454 i = _processors.erase (i);
1462 _output->set_user_latency (0);
1470 if (need_process_lock) {
1471 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1473 if (configure_processors_unlocked (err)) {
1475 /* we know this will work, because it worked before :) */
1476 configure_processors_unlocked (0);
1480 if (configure_processors_unlocked (err)) {
1482 /* we know this will work, because it worked before :) */
1483 configure_processors_unlocked (0);
1488 _have_internal_generator = false;
1490 for (i = _processors.begin(); i != _processors.end(); ++i) {
1491 boost::shared_ptr<PluginInsert> pi;
1493 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1494 if (pi->has_no_inputs ()) {
1495 _have_internal_generator = true;
1502 reset_instrument_info ();
1503 processor->drop_references ();
1504 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1505 set_processor_positions ();
1511 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1513 ProcessorList deleted;
1515 if (!_session.engine().connected()) {
1519 processor_max_streams.reset();
1522 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1523 ProcessorState pstate (this);
1525 ProcessorList::iterator i;
1526 boost::shared_ptr<Processor> processor;
1528 for (i = _processors.begin(); i != _processors.end(); ) {
1532 /* these can never be removed */
1534 if (processor == _amp || processor == _meter || processor == _main_outs) {
1539 /* see if its in the list of processors to delete */
1541 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1546 /* stop IOProcessors that send to JACK ports
1547 from causing noise as a result of no longer being
1551 boost::shared_ptr<IOProcessor> iop;
1553 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1557 deleted.push_back (processor);
1558 i = _processors.erase (i);
1561 if (deleted.empty()) {
1562 /* none of those in the requested list were found */
1566 _output->set_user_latency (0);
1569 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1571 if (configure_processors_unlocked (err)) {
1573 /* we know this will work, because it worked before :) */
1574 configure_processors_unlocked (0);
1579 _have_internal_generator = false;
1581 for (i = _processors.begin(); i != _processors.end(); ++i) {
1582 boost::shared_ptr<PluginInsert> pi;
1584 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1585 if (pi->has_no_inputs ()) {
1586 _have_internal_generator = true;
1593 /* now try to do what we need to so that those that were removed will be deleted */
1595 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1596 (*i)->drop_references ();
1599 reset_instrument_info ();
1600 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1601 set_processor_positions ();
1607 Route::reset_instrument_info ()
1609 boost::shared_ptr<Processor> instr = the_instrument();
1611 _instrument_info.set_internal_instrument (instr);
1615 /** Caller must hold process lock */
1617 Route::configure_processors (ProcessorStreams* err)
1619 assert (!AudioEngine::instance()->process_lock().trylock());
1621 if (!_in_configure_processors) {
1622 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1623 return configure_processors_unlocked (err);
1630 Route::input_streams () const
1632 return _input->n_ports ();
1635 list<pair<ChanCount, ChanCount> >
1636 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1638 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1640 return try_configure_processors_unlocked (in, err);
1643 list<pair<ChanCount, ChanCount> >
1644 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1646 // Check each processor in order to see if we can configure as requested
1648 list<pair<ChanCount, ChanCount> > configuration;
1651 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1652 DEBUG_TRACE (DEBUG::Processors, "{\n");
1654 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1656 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1657 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1658 DEBUG_TRACE (DEBUG::Processors, "}\n");
1659 return list<pair<ChanCount, ChanCount> > ();
1662 if ((*p)->can_support_io_configuration(in, out)) {
1663 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1664 configuration.push_back(make_pair(in, out));
1671 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1672 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1673 DEBUG_TRACE (DEBUG::Processors, "}\n");
1674 return list<pair<ChanCount, ChanCount> > ();
1678 DEBUG_TRACE (DEBUG::Processors, "}\n");
1680 return configuration;
1683 /** Set the input/output configuration of each processor in the processors list.
1684 * Caller must hold process lock.
1685 * Return 0 on success, otherwise configuration is impossible.
1688 Route::configure_processors_unlocked (ProcessorStreams* err)
1690 assert (!AudioEngine::instance()->process_lock().trylock());
1692 if (_in_configure_processors) {
1696 /* put invisible processors where they should be */
1697 setup_invisible_processors ();
1699 _in_configure_processors = true;
1701 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1703 if (configuration.empty ()) {
1704 _in_configure_processors = false;
1709 bool seen_mains_out = false;
1710 processor_out_streams = _input->n_ports();
1712 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1713 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1715 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1719 (*p)->configure_io(c->first, c->second);
1720 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1721 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1724 if (boost::dynamic_pointer_cast<Delivery> (*p)
1725 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1726 /* main delivery will increase port count to match input.
1727 * the Delivery::Main is usually the last processor - followed only by
1730 seen_mains_out = true;
1732 if (!seen_mains_out) {
1733 processor_out_streams = out;
1739 _meter->reset_max_channels (processor_max_streams);
1742 /* make sure we have sufficient scratch buffers to cope with the new processor
1745 _session.ensure_buffers (n_process_buffers ());
1747 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1749 _in_configure_processors = false;
1753 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1754 * @param state New active state for those processors.
1757 Route::all_visible_processors_active (bool state)
1759 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1761 if (_processors.empty()) {
1765 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1766 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1773 (*i)->deactivate ();
1777 _session.set_dirty ();
1781 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1783 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1784 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1785 processors in the current actual processor list that are hidden. Any visible processors
1786 in the current list but not in "new_order" will be assumed to be deleted.
1790 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1791 ProcessorState pstate (this);
1793 ProcessorList::iterator oiter;
1794 ProcessorList::const_iterator niter;
1795 ProcessorList as_it_will_be;
1797 oiter = _processors.begin();
1798 niter = new_order.begin();
1800 while (niter != new_order.end()) {
1802 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1803 then append it to the temp list.
1805 Otherwise, see if the next processor in the old list is in the new list. if not,
1806 its been deleted. If its there, append it to the temp list.
1809 if (oiter == _processors.end()) {
1811 /* no more elements in the old list, so just stick the rest of
1812 the new order onto the temp list.
1815 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1816 while (niter != new_order.end()) {
1823 if (!(*oiter)->display_to_user()) {
1825 as_it_will_be.push_back (*oiter);
1829 /* visible processor: check that its in the new order */
1831 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1832 /* deleted: do nothing, shared_ptr<> will clean up */
1834 /* ignore this one, and add the next item from the new order instead */
1835 as_it_will_be.push_back (*niter);
1840 /* now remove from old order - its taken care of no matter what */
1841 oiter = _processors.erase (oiter);
1846 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1848 /* If the meter is in a custom position, find it and make a rough note of its position */
1849 maybe_note_meter_position ();
1852 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1854 if (configure_processors_unlocked (err)) {
1861 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1862 set_processor_positions ();
1874 Route::get_template()
1876 return state(false);
1880 Route::state(bool full_state)
1882 XMLNode *node = new XMLNode("Route");
1883 ProcessorList::iterator i;
1886 id().print (buf, sizeof (buf));
1887 node->add_property("id", buf);
1888 node->add_property ("name", _name);
1889 node->add_property("default-type", _default_type.to_string());
1892 node->add_property("flags", enum_2_string (_flags));
1895 node->add_property("active", _active?"yes":"no");
1897 boost::to_string (_phase_invert, p);
1898 node->add_property("phase-invert", p);
1899 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1900 node->add_property("meter-point", enum_2_string (_meter_point));
1902 node->add_property("meter-type", enum_2_string (_meter_type));
1905 node->add_property("route-group", _route_group->name());
1908 string order_string;
1909 OrderKeys::iterator x = order_keys.begin();
1911 while (x != order_keys.end()) {
1912 order_string += enum_2_string ((*x).first);
1913 order_string += '=';
1914 snprintf (buf, sizeof(buf), "%" PRId32, (*x).second);
1915 order_string += buf;
1919 if (x == order_keys.end()) {
1923 order_string += ':';
1925 node->add_property ("order-keys", order_string);
1926 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1927 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1928 node->add_property ("soloed-by-upstream", buf);
1929 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1930 node->add_property ("soloed-by-downstream", buf);
1931 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1932 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1934 node->add_child_nocopy (_input->state (full_state));
1935 node->add_child_nocopy (_output->state (full_state));
1936 node->add_child_nocopy (_solo_control->get_state ());
1937 node->add_child_nocopy (_mute_control->get_state ());
1938 node->add_child_nocopy (_mute_master->get_state ());
1940 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1941 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1942 remote_control_node->add_property (X_("id"), buf);
1943 node->add_child_nocopy (*remote_control_node);
1945 if (_comment.length()) {
1946 XMLNode *cmt = node->add_child ("Comment");
1947 cmt->add_content (_comment);
1951 node->add_child_nocopy (_pannable->state (full_state));
1954 for (i = _processors.begin(); i != _processors.end(); ++i) {
1956 /* template save: do not include internal sends functioning as
1957 aux sends because the chance of the target ID
1958 in the session where this template is used
1961 similarly, do not save listen sends which connect to
1962 the monitor section, because these will always be
1965 boost::shared_ptr<InternalSend> is;
1967 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1968 if (is->role() == Delivery::Listen) {
1973 node->add_child_nocopy((*i)->state (full_state));
1977 node->add_child_copy (*_extra_xml);
1980 if (_custom_meter_position_noted) {
1981 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1983 after->id().print (buf, sizeof (buf));
1984 node->add_property (X_("processor-after-last-custom-meter"), buf);
1987 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1994 Route::set_state (const XMLNode& node, int version)
1996 if (version < 3000) {
1997 return set_state_2X (node, version);
2001 XMLNodeConstIterator niter;
2003 const XMLProperty *prop;
2005 if (node.name() != "Route"){
2006 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2010 if ((prop = node.property (X_("name"))) != 0) {
2011 Route::set_name (prop->value());
2015 _initial_io_setup = true;
2017 if ((prop = node.property (X_("flags"))) != 0) {
2018 _flags = Flag (string_2_enum (prop->value(), _flags));
2023 if (is_master() || is_monitor() || is_auditioner()) {
2024 _mute_master->set_solo_ignore (true);
2028 /* monitor bus does not get a panner, but if (re)created
2029 via XML, it will already have one by the time we
2030 call ::set_state(). so ... remove it.
2035 /* add all processors (except amp, which is always present) */
2037 nlist = node.children();
2038 XMLNode processor_state (X_("processor_state"));
2040 Stateful::save_extra_xml (node);
2042 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2046 if (child->name() == IO::state_node_name) {
2047 if ((prop = child->property (X_("direction"))) == 0) {
2051 if (prop->value() == "Input") {
2052 _input->set_state (*child, version);
2053 } else if (prop->value() == "Output") {
2054 _output->set_state (*child, version);
2058 if (child->name() == X_("Processor")) {
2059 processor_state.add_child_copy (*child);
2062 if (child->name() == X_("Pannable")) {
2064 _pannable->set_state (*child, version);
2066 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2071 if ((prop = node.property (X_("meter-point"))) != 0) {
2072 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2073 set_meter_point (mp, true);
2075 _meter->set_display_to_user (_meter_point == MeterCustom);
2079 if ((prop = node.property (X_("meter-type"))) != 0) {
2080 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2083 _initial_io_setup = false;
2085 set_processor_state (processor_state);
2087 // this looks up the internal instrument in processors
2088 reset_instrument_info();
2090 if ((prop = node.property ("self-solo")) != 0) {
2091 set_self_solo (string_is_affirmative (prop->value()));
2094 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2095 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2096 mod_solo_by_others_upstream (atoi (prop->value()));
2099 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2100 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2101 mod_solo_by_others_downstream (atoi (prop->value()));
2104 if ((prop = node.property ("solo-isolated")) != 0) {
2105 set_solo_isolated (string_is_affirmative (prop->value()), this);
2108 if ((prop = node.property ("solo-safe")) != 0) {
2109 set_solo_safe (string_is_affirmative (prop->value()), this);
2112 if ((prop = node.property (X_("phase-invert"))) != 0) {
2113 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2116 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2117 set_denormal_protection (string_is_affirmative (prop->value()));
2120 if ((prop = node.property (X_("active"))) != 0) {
2121 bool yn = string_is_affirmative (prop->value());
2122 _active = !yn; // force switch
2123 set_active (yn, this);
2126 if ((prop = node.property (X_("order-keys"))) != 0) {
2130 string::size_type colon, equal;
2131 string remaining = prop->value();
2133 while (remaining.length()) {
2135 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2136 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2139 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2140 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2143 string keyname = remaining.substr (0, equal);
2144 RouteSortOrderKey sk;
2146 if (keyname == "signal") {
2148 } else if (keyname == "editor") {
2151 sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
2154 set_order_key (sk, n);
2158 colon = remaining.find_first_of (':');
2160 if (colon != string::npos) {
2161 remaining = remaining.substr (colon+1);
2168 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2169 PBD::ID id (prop->value ());
2170 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2171 ProcessorList::const_iterator i = _processors.begin ();
2172 while (i != _processors.end() && (*i)->id() != id) {
2176 if (i != _processors.end ()) {
2177 _processor_after_last_custom_meter = *i;
2178 _custom_meter_position_noted = true;
2182 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2183 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2186 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2189 if (child->name() == X_("Comment")) {
2191 /* XXX this is a terrible API design in libxml++ */
2193 XMLNode *cmt = *(child->children().begin());
2194 _comment = cmt->content();
2196 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2197 if (prop->value() == "solo") {
2198 _solo_control->set_state (*child, version);
2199 } else if (prop->value() == "mute") {
2200 _mute_control->set_state (*child, version);
2203 } else if (child->name() == X_("RemoteControl")) {
2204 if ((prop = child->property (X_("id"))) != 0) {
2206 sscanf (prop->value().c_str(), "%d", &x);
2207 set_remote_control_id_internal (x);
2210 } else if (child->name() == X_("MuteMaster")) {
2211 _mute_master->set_state (*child, version);
2219 Route::set_state_2X (const XMLNode& node, int version)
2222 XMLNodeConstIterator niter;
2224 const XMLProperty *prop;
2226 /* 2X things which still remain to be handled:
2232 if (node.name() != "Route") {
2233 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2237 if ((prop = node.property (X_("flags"))) != 0) {
2238 string f = prop->value ();
2239 boost::replace_all (f, "ControlOut", "MonitorOut");
2240 _flags = Flag (string_2_enum (f, _flags));
2245 if (is_master() || is_monitor() || is_auditioner()) {
2246 _mute_master->set_solo_ignore (true);
2249 if ((prop = node.property (X_("phase-invert"))) != 0) {
2250 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2251 if (string_is_affirmative (prop->value ())) {
2254 set_phase_invert (p);
2257 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2258 set_denormal_protection (string_is_affirmative (prop->value()));
2261 if ((prop = node.property (X_("soloed"))) != 0) {
2262 bool yn = string_is_affirmative (prop->value());
2264 /* XXX force reset of solo status */
2266 set_solo (yn, this);
2269 if ((prop = node.property (X_("muted"))) != 0) {
2272 bool muted = string_is_affirmative (prop->value());
2278 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2280 if (string_is_affirmative (prop->value())){
2281 mute_point = mute_point + "PreFader";
2286 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2288 if (string_is_affirmative (prop->value())){
2291 mute_point = mute_point + ",";
2294 mute_point = mute_point + "PostFader";
2299 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2301 if (string_is_affirmative (prop->value())){
2304 mute_point = mute_point + ",";
2307 mute_point = mute_point + "Listen";
2312 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2314 if (string_is_affirmative (prop->value())){
2317 mute_point = mute_point + ",";
2320 mute_point = mute_point + "Main";
2324 _mute_master->set_mute_points (mute_point);
2325 _mute_master->set_muted_by_self (true);
2329 if ((prop = node.property (X_("meter-point"))) != 0) {
2330 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2333 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2334 don't mean the same thing.
2337 if ((prop = node.property (X_("order-keys"))) != 0) {
2341 string::size_type colon, equal;
2342 string remaining = prop->value();
2344 while (remaining.length()) {
2346 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2347 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2350 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2351 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2354 string keyname = remaining.substr (0, equal);
2355 RouteSortOrderKey sk;
2357 if (keyname == "signal") {
2359 } else if (keyname == "editor") {
2362 sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
2365 set_order_key (sk, n);
2369 colon = remaining.find_first_of (':');
2371 if (colon != string::npos) {
2372 remaining = remaining.substr (colon+1);
2381 nlist = node.children ();
2382 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2386 if (child->name() == IO::state_node_name) {
2388 /* there is a note in IO::set_state_2X() about why we have to call
2392 _input->set_state_2X (*child, version, true);
2393 _output->set_state_2X (*child, version, false);
2395 if ((prop = child->property (X_("name"))) != 0) {
2396 Route::set_name (prop->value ());
2401 if ((prop = child->property (X_("active"))) != 0) {
2402 bool yn = string_is_affirmative (prop->value());
2403 _active = !yn; // force switch
2404 set_active (yn, this);
2407 if ((prop = child->property (X_("gain"))) != 0) {
2410 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2411 _amp->gain_control()->set_value (val);
2415 /* Set up Panners in the IO */
2416 XMLNodeList io_nlist = child->children ();
2418 XMLNodeConstIterator io_niter;
2421 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2423 io_child = *io_niter;
2425 if (io_child->name() == X_("Panner")) {
2426 _main_outs->panner_shell()->set_state(*io_child, version);
2427 } else if (io_child->name() == X_("Automation")) {
2428 /* IO's automation is for the fader */
2429 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2435 XMLNodeList redirect_nodes;
2437 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2441 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2442 redirect_nodes.push_back(child);
2447 set_processor_state_2X (redirect_nodes, version);
2449 Stateful::save_extra_xml (node);
2451 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2454 if (child->name() == X_("Comment")) {
2456 /* XXX this is a terrible API design in libxml++ */
2458 XMLNode *cmt = *(child->children().begin());
2459 _comment = cmt->content();
2461 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2462 if (prop->value() == X_("solo")) {
2463 _solo_control->set_state (*child, version);
2464 } else if (prop->value() == X_("mute")) {
2465 _mute_control->set_state (*child, version);
2468 } else if (child->name() == X_("RemoteControl")) {
2469 if ((prop = child->property (X_("id"))) != 0) {
2471 sscanf (prop->value().c_str(), "%d", &x);
2472 set_remote_control_id_internal (x);
2482 Route::get_processor_state ()
2484 XMLNode* root = new XMLNode (X_("redirects"));
2485 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2486 root->add_child_nocopy ((*i)->state (true));
2493 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2495 /* We don't bother removing existing processors not in nList, as this
2496 method will only be called when creating a Route from scratch, not
2497 for undo purposes. Just put processors in at the appropriate place
2501 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2502 add_processor_from_xml_2X (**i, version);
2507 Route::set_processor_state (const XMLNode& node)
2509 const XMLNodeList &nlist = node.children();
2510 XMLNodeConstIterator niter;
2511 ProcessorList new_order;
2512 bool must_configure = false;
2514 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2516 XMLProperty* prop = (*niter)->property ("type");
2518 if (prop->value() == "amp") {
2519 _amp->set_state (**niter, Stateful::current_state_version);
2520 new_order.push_back (_amp);
2521 } else if (prop->value() == "meter") {
2522 _meter->set_state (**niter, Stateful::current_state_version);
2523 new_order.push_back (_meter);
2524 } else if (prop->value() == "main-outs") {
2525 _main_outs->set_state (**niter, Stateful::current_state_version);
2526 } else if (prop->value() == "intreturn") {
2528 _intreturn.reset (new InternalReturn (_session));
2529 must_configure = true;
2531 _intreturn->set_state (**niter, Stateful::current_state_version);
2532 } else if (is_monitor() && prop->value() == "monitor") {
2533 if (!_monitor_control) {
2534 _monitor_control.reset (new MonitorProcessor (_session));
2535 must_configure = true;
2537 _monitor_control->set_state (**niter, Stateful::current_state_version);
2538 } else if (prop->value() == "capture") {
2539 /* CapturingProcessor should never be restored, it's always
2540 added explicitly when needed */
2542 ProcessorList::iterator o;
2544 for (o = _processors.begin(); o != _processors.end(); ++o) {
2545 XMLProperty* id_prop = (*niter)->property(X_("id"));
2546 if (id_prop && (*o)->id() == id_prop->value()) {
2547 (*o)->set_state (**niter, Stateful::current_state_version);
2548 new_order.push_back (*o);
2553 // If the processor (*niter) is not on the route then create it
2555 if (o == _processors.end()) {
2557 boost::shared_ptr<Processor> processor;
2559 if (prop->value() == "intsend") {
2561 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2563 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2564 prop->value() == "lv2" ||
2565 prop->value() == "windows-vst" ||
2566 prop->value() == "lxvst" ||
2567 prop->value() == "audiounit") {
2569 processor.reset (new PluginInsert(_session));
2571 } else if (prop->value() == "port") {
2573 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2575 } else if (prop->value() == "send") {
2577 processor.reset (new Send (_session, _pannable, _mute_master));
2580 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2584 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2585 /* This processor could not be configured. Turn it into a UnknownProcessor */
2586 processor.reset (new UnknownProcessor (_session, **niter));
2589 /* we have to note the monitor send here, otherwise a new one will be created
2590 and the state of this one will be lost.
2592 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2593 if (isend && isend->role() == Delivery::Listen) {
2594 _monitor_send = isend;
2597 /* it doesn't matter if invisible processors are added here, as they
2598 will be sorted out by setup_invisible_processors () shortly.
2601 new_order.push_back (processor);
2602 must_configure = true;
2608 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2609 _processors = new_order;
2611 if (must_configure) {
2612 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2613 configure_processors_unlocked (0);
2616 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2618 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2620 boost::shared_ptr<PluginInsert> pi;
2622 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2623 if (pi->has_no_inputs ()) {
2624 _have_internal_generator = true;
2631 reset_instrument_info ();
2632 processors_changed (RouteProcessorChange ());
2633 set_processor_positions ();
2637 Route::curve_reallocate ()
2639 // _gain_automation_curve.finish_resize ();
2640 // _pan_automation_curve.finish_resize ();
2644 Route::silence (framecnt_t nframes)
2646 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2651 silence_unlocked (nframes);
2655 Route::silence_unlocked (framecnt_t nframes)
2657 /* Must be called with the processor lock held */
2661 _output->silence (nframes);
2663 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2664 boost::shared_ptr<PluginInsert> pi;
2666 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2667 // skip plugins, they don't need anything when we're not active
2671 (*i)->silence (nframes);
2674 if (nframes == _session.get_block_size()) {
2681 Route::add_internal_return ()
2684 _intreturn.reset (new InternalReturn (_session));
2685 add_processor (_intreturn, PreFader);
2690 Route::add_send_to_internal_return (InternalSend* send)
2692 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2694 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2695 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2698 return d->add_send (send);
2704 Route::remove_send_from_internal_return (InternalSend* send)
2706 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2708 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2709 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2712 return d->remove_send (send);
2718 Route::enable_monitor_send ()
2720 /* Caller must hold process lock */
2721 assert (!AudioEngine::instance()->process_lock().trylock());
2723 /* master never sends to monitor section via the normal mechanism */
2724 assert (!is_master ());
2726 /* make sure we have one */
2727 if (!_monitor_send) {
2728 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2729 _monitor_send->set_display_to_user (false);
2733 configure_processors (0);
2736 /** Add an aux send to a route.
2737 * @param route route to send to.
2738 * @param before Processor to insert before, or 0 to insert at the end.
2741 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2743 assert (route != _session.monitor_out ());
2746 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
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) {
2753 /* already listening via the specified IO: do nothing */
2761 boost::shared_ptr<InternalSend> listener;
2764 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2765 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2768 add_processor (listener, before);
2770 } catch (failed_constructor& err) {
2778 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2780 ProcessorStreams err;
2781 ProcessorList::iterator tmp;
2784 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2786 /* have to do this early because otherwise processor reconfig
2787 * will put _monitor_send back in the list
2790 if (route == _session.monitor_out()) {
2791 _monitor_send.reset ();
2795 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2797 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2799 if (d && d->target_route() == route) {
2801 remove_processor (*x, &err, false);
2804 /* list could have been demolished while we dropped the lock
2815 Route::set_comment (string cmt, void *src)
2818 comment_changed (src);
2819 _session.set_dirty ();
2823 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2825 FeedRecord fr (other, via_sends_only);
2827 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2829 if (!result.second) {
2831 /* already a record for "other" - make sure sends-only information is correct */
2832 if (!via_sends_only && result.first->sends_only) {
2833 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2834 frp->sends_only = false;
2838 return result.second;
2842 Route::clear_fed_by ()
2848 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2850 const FedBy& fed_by (other->fed_by());
2852 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2853 boost::shared_ptr<Route> sr = f->r.lock();
2855 if (sr && (sr.get() == this)) {
2857 if (via_sends_only) {
2858 *via_sends_only = f->sends_only;
2869 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2871 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2873 if (_output->connected_to (other->input())) {
2874 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2875 if (via_send_only) {
2876 *via_send_only = false;
2883 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2885 boost::shared_ptr<IOProcessor> iop;
2887 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2888 if (iop->feeds (other)) {
2889 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2890 if (via_send_only) {
2891 *via_send_only = true;
2895 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2898 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2903 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2908 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2910 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2913 /** Called from the (non-realtime) butler thread when the transport is stopped */
2915 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
2917 framepos_t now = _session.transport_frame();
2920 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2922 Automatable::transport_stopped (now);
2924 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2926 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2930 (*i)->transport_stopped (now);
2934 _roll_delay = _initial_delay;
2938 Route::input_change_handler (IOChange change, void * /*src*/)
2940 bool need_to_queue_solo_change = true;
2942 if ((change.type & IOChange::ConfigurationChanged)) {
2943 /* This is called with the process lock held if change
2944 contains ConfigurationChanged
2946 need_to_queue_solo_change = false;
2947 configure_processors (0);
2948 _phase_invert.resize (_input->n_ports().n_audio ());
2949 io_changed (); /* EMIT SIGNAL */
2952 if (!_input->connected() && _soloed_by_others_upstream) {
2953 if (need_to_queue_solo_change) {
2954 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2956 cancel_solo_after_disconnect (true);
2962 Route::output_change_handler (IOChange change, void * /*src*/)
2964 bool need_to_queue_solo_change = true;
2965 if (_initial_io_setup) {
2969 if ((change.type & IOChange::ConfigurationChanged)) {
2970 /* This is called with the process lock held if change
2971 contains ConfigurationChanged
2973 need_to_queue_solo_change = false;
2974 configure_processors (0);
2975 io_changed (); /* EMIT SIGNAL */
2978 if (!_output->connected() && _soloed_by_others_downstream) {
2979 if (need_to_queue_solo_change) {
2980 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2982 cancel_solo_after_disconnect (false);
2988 Route::cancel_solo_after_disconnect (bool upstream)
2991 _soloed_by_others_upstream = 0;
2993 _soloed_by_others_downstream = 0;
2995 set_mute_master_solo ();
2996 solo_changed (false, this);
3000 Route::pans_required () const
3002 if (n_outputs().n_audio() < 2) {
3006 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3010 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3012 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3018 if (n_outputs().n_total() == 0) {
3022 if (!_active || n_inputs() == ChanCount::ZERO) {
3023 silence_unlocked (nframes);
3027 if (session_state_changing) {
3028 if (_session.transport_speed() != 0.0f) {
3029 /* we're rolling but some state is changing (e.g. our diskstream contents)
3030 so we cannot use them. Be silent till this is over.
3032 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3034 silence_unlocked (nframes);
3037 /* we're really not rolling, so we're either delivery silence or actually
3038 monitoring, both of which are safe to do while session_state_changing is true.
3042 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3044 fill_buffers_with_input (bufs, _input, nframes);
3046 if (_meter_point == MeterInput) {
3047 _meter->run (bufs, start_frame, end_frame, nframes, true);
3050 _amp->apply_gain_automation (false);
3051 passthru (bufs, start_frame, end_frame, nframes, 0);
3057 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3059 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3064 if (n_outputs().n_total() == 0) {
3068 if (!_active || n_inputs().n_total() == 0) {
3069 silence_unlocked (nframes);
3073 framepos_t unused = 0;
3075 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3081 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3083 fill_buffers_with_input (bufs, _input, nframes);
3085 if (_meter_point == MeterInput) {
3086 _meter->run (bufs, start_frame, end_frame, nframes, true);
3089 passthru (bufs, start_frame, end_frame, nframes, declick);
3095 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3102 Route::flush_processors ()
3104 /* XXX shouldn't really try to take this lock, since
3105 this is called from the RT audio thread.
3108 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3110 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3116 Route::set_meter_point (MeterPoint p, bool force)
3118 if (_meter_point == p && !force) {
3122 bool meter_was_visible_to_user = _meter->display_to_user ();
3125 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3127 maybe_note_meter_position ();
3131 if (_meter_point != MeterCustom) {
3133 _meter->set_display_to_user (false);
3135 setup_invisible_processors ();
3139 _meter->set_display_to_user (true);
3141 /* If we have a previous position for the custom meter, try to put it there */
3142 if (_custom_meter_position_noted) {
3143 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3146 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3147 if (i != _processors.end ()) {
3148 _processors.remove (_meter);
3149 _processors.insert (i, _meter);
3151 } else if (_last_custom_meter_was_at_end) {
3152 _processors.remove (_meter);
3153 _processors.push_back (_meter);
3158 /* Set up the meter for its new position */
3160 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3164 if (loc == _processors.begin()) {
3165 m_in = _input->n_ports();
3167 ProcessorList::iterator before = loc;
3169 m_in = (*before)->output_streams ();
3172 _meter->reflect_inputs (m_in);
3174 /* we do not need to reconfigure the processors, because the meter
3175 (a) is always ready to handle processor_max_streams
3176 (b) is always an N-in/N-out processor, and thus moving
3177 it doesn't require any changes to the other processors.
3181 meter_change (); /* EMIT SIGNAL */
3183 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3185 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3189 Route::listen_position_changed ()
3192 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3193 ProcessorState pstate (this);
3196 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3198 if (configure_processors_unlocked (0)) {
3200 configure_processors_unlocked (0); // it worked before we tried to add it ...
3206 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3207 _session.set_dirty ();
3210 boost::shared_ptr<CapturingProcessor>
3211 Route::add_export_point()
3213 if (!_capturing_processor) {
3215 _capturing_processor.reset (new CapturingProcessor (_session));
3216 _capturing_processor->activate ();
3219 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3220 configure_processors (0);
3225 return _capturing_processor;
3229 Route::update_signal_latency ()
3231 framecnt_t l = _output->user_latency();
3233 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3234 if ((*i)->active ()) {
3235 l += (*i)->signal_latency ();
3239 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3241 if (_signal_latency != l) {
3242 _signal_latency = l;
3243 signal_latency_changed (); /* EMIT SIGNAL */
3246 return _signal_latency;
3250 Route::set_user_latency (framecnt_t nframes)
3252 _output->set_user_latency (nframes);
3253 _session.update_latency_compensation ();
3257 Route::set_latency_compensation (framecnt_t longest_session_latency)
3259 framecnt_t old = _initial_delay;
3261 if (_signal_latency < longest_session_latency) {
3262 _initial_delay = longest_session_latency - _signal_latency;
3267 DEBUG_TRACE (DEBUG::Latency, string_compose (
3268 "%1: compensate for maximum latency of %2,"
3269 "given own latency of %3, using initial delay of %4\n",
3270 name(), longest_session_latency, _signal_latency, _initial_delay));
3272 if (_initial_delay != old) {
3273 initial_delay_changed (); /* EMIT SIGNAL */
3276 if (_session.transport_stopped()) {
3277 _roll_delay = _initial_delay;
3281 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3282 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3283 boost::shared_ptr<AutomationList>(), name)
3286 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3291 Route::SoloControllable::set_value (double val)
3293 bool bval = ((val >= 0.5f) ? true: false);
3295 boost::shared_ptr<RouteList> rl (new RouteList);
3297 boost::shared_ptr<Route> r = _route.lock ();
3304 if (Config->get_solo_control_is_listen_control()) {
3305 _session.set_listen (rl, bval);
3307 _session.set_solo (rl, bval);
3312 Route::SoloControllable::get_value () const
3314 boost::shared_ptr<Route> r = _route.lock ();
3319 if (Config->get_solo_control_is_listen_control()) {
3320 return r->listening_via_monitor() ? 1.0f : 0.0f;
3322 return r->self_soloed() ? 1.0f : 0.0f;
3326 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3327 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3328 boost::shared_ptr<AutomationList>(), name)
3331 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3336 Route::MuteControllable::set_value (double val)
3338 bool bval = ((val >= 0.5f) ? true: false);
3340 boost::shared_ptr<RouteList> rl (new RouteList);
3342 boost::shared_ptr<Route> r = _route.lock ();
3348 _session.set_mute (rl, bval);
3352 Route::MuteControllable::get_value () const
3354 boost::shared_ptr<Route> r = _route.lock ();
3359 return r->muted() ? 1.0f : 0.0f;
3363 Route::set_block_size (pframes_t nframes)
3365 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3366 (*i)->set_block_size (nframes);
3369 _session.ensure_buffers (n_process_buffers ());
3373 Route::protect_automation ()
3375 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3376 (*i)->protect_automation();
3379 /** @param declick 1 to set a pending declick fade-in,
3380 * -1 to set a pending declick fade-out
3383 Route::set_pending_declick (int declick)
3386 /* this call is not allowed to turn off a pending declick */
3388 _pending_declick = declick;
3391 _pending_declick = 0;
3395 /** Shift automation forwards from a particular place, thereby inserting time.
3396 * Adds undo commands for any shifts that are performed.
3398 * @param pos Position to start shifting from.
3399 * @param frames Amount to shift forwards by.
3403 Route::shift (framepos_t pos, framecnt_t frames)
3405 /* gain automation */
3407 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3409 XMLNode &before = gc->alist()->get_state ();
3410 gc->alist()->shift (pos, frames);
3411 XMLNode &after = gc->alist()->get_state ();
3412 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3415 /* pan automation */
3417 ControlSet::Controls& c (_pannable->controls());
3419 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3420 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3422 boost::shared_ptr<AutomationList> al = pc->alist();
3423 XMLNode& before = al->get_state ();
3424 al->shift (pos, frames);
3425 XMLNode& after = al->get_state ();
3426 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3431 /* redirect automation */
3433 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3434 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3436 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3438 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3439 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3441 boost::shared_ptr<AutomationList> al = ac->alist();
3442 XMLNode &before = al->get_state ();
3443 al->shift (pos, frames);
3444 XMLNode &after = al->get_state ();
3445 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3454 Route::save_as_template (const string& path, const string& name)
3456 XMLNode& node (state (false));
3459 IO::set_name_in_state (*node.children().front(), name);
3461 tree.set_root (&node);
3462 return tree.write (path.c_str());
3467 Route::set_name (const string& str)
3473 name = Route::ensure_track_or_route_name (str, _session);
3474 SessionObject::set_name (name);
3476 ret = (_input->set_name(name) && _output->set_name(name));
3479 /* rename the main outs. Leave other IO processors
3480 * with whatever name they already have, because its
3481 * just fine as it is (it will not contain the route
3482 * name if its a port insert, port send or port return).
3486 if (_main_outs->set_name (name)) {
3487 /* XXX returning false here is stupid because
3488 we already changed the route name.
3498 /** Set the name of a route in an XML description.
3499 * @param node XML <Route> node to set the name in.
3500 * @param name New name.
3503 Route::set_name_in_state (XMLNode& node, string const & name)
3505 node.add_property (X_("name"), name);
3507 XMLNodeList children = node.children();
3508 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3510 if ((*i)->name() == X_("IO")) {
3512 IO::set_name_in_state (**i, name);
3514 } else if ((*i)->name() == X_("Processor")) {
3516 XMLProperty* role = (*i)->property (X_("role"));
3517 if (role && role->value() == X_("Main")) {
3518 (*i)->add_property (X_("name"), name);
3521 } else if ((*i)->name() == X_("Diskstream")) {
3523 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3524 (*i)->add_property (X_("name"), name);
3530 boost::shared_ptr<Send>
3531 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3533 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3535 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3536 boost::shared_ptr<InternalSend> send;
3538 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3539 if (send->target_route() == target) {
3545 return boost::shared_ptr<Send>();
3548 /** @param c Audio channel index.
3549 * @param yn true to invert phase, otherwise false.
3552 Route::set_phase_invert (uint32_t c, bool yn)
3554 if (_phase_invert[c] != yn) {
3555 _phase_invert[c] = yn;
3556 phase_invert_changed (); /* EMIT SIGNAL */
3557 _session.set_dirty ();
3562 Route::set_phase_invert (boost::dynamic_bitset<> p)
3564 if (_phase_invert != p) {
3566 phase_invert_changed (); /* EMIT SIGNAL */
3567 _session.set_dirty ();
3572 Route::phase_invert (uint32_t c) const
3574 return _phase_invert[c];
3577 boost::dynamic_bitset<>
3578 Route::phase_invert () const
3580 return _phase_invert;
3584 Route::set_denormal_protection (bool yn)
3586 if (_denormal_protection != yn) {
3587 _denormal_protection = yn;
3588 denormal_protection_changed (); /* EMIT SIGNAL */
3593 Route::denormal_protection () const
3595 return _denormal_protection;
3599 Route::set_active (bool yn, void* src)
3601 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3602 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3606 if (_active != yn) {
3608 _input->set_active (yn);
3609 _output->set_active (yn);
3610 active_changed (); // EMIT SIGNAL
3611 _session.set_dirty ();
3618 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3624 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3626 boost::shared_ptr<Send> s;
3627 boost::shared_ptr<Return> r;
3629 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3630 s->meter()->meter();
3631 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3632 r->meter()->meter ();
3637 boost::shared_ptr<Pannable>
3638 Route::pannable() const
3643 boost::shared_ptr<Panner>
3644 Route::panner() const
3647 return _main_outs->panner_shell()->panner();
3650 boost::shared_ptr<PannerShell>
3651 Route::panner_shell() const
3653 return _main_outs->panner_shell();
3656 boost::shared_ptr<AutomationControl>
3657 Route::gain_control() const
3659 return _amp->gain_control();
3662 boost::shared_ptr<AutomationControl>
3663 Route::get_control (const Evoral::Parameter& param)
3665 /* either we own the control or .... */
3667 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3671 /* maybe one of our processors does or ... */
3673 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3674 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3675 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3683 /* nobody does so we'll make a new one */
3685 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3692 boost::shared_ptr<Processor>
3693 Route::nth_plugin (uint32_t n)
3695 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3696 ProcessorList::iterator i;
3698 for (i = _processors.begin(); i != _processors.end(); ++i) {
3699 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3706 return boost::shared_ptr<Processor> ();
3709 boost::shared_ptr<Processor>
3710 Route::nth_send (uint32_t n)
3712 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3713 ProcessorList::iterator i;
3715 for (i = _processors.begin(); i != _processors.end(); ++i) {
3716 if (boost::dynamic_pointer_cast<Send> (*i)) {
3723 return boost::shared_ptr<Processor> ();
3727 Route::has_io_processor_named (const string& name)
3729 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3730 ProcessorList::iterator i;
3732 for (i = _processors.begin(); i != _processors.end(); ++i) {
3733 if (boost::dynamic_pointer_cast<Send> (*i) ||
3734 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3735 if ((*i)->name() == name) {
3744 MuteMaster::MutePoint
3745 Route::mute_points () const
3747 return _mute_master->mute_points ();
3751 Route::set_processor_positions ()
3753 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3755 bool had_amp = false;
3756 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3757 (*i)->set_pre_fader (!had_amp);
3758 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3764 /** Called when there is a proposed change to the input port count */
3766 Route::input_port_count_changing (ChanCount to)
3768 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3770 /* The processors cannot be configured with the new input arrangement, so
3776 /* The change is ok */
3780 /** Called when there is a proposed change to the output port count */
3782 Route::output_port_count_changing (ChanCount to)
3784 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3785 if (processor_out_streams.get(*t) > to.get(*t)) {
3789 /* The change is ok */
3794 Route::unknown_processors () const
3798 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3799 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3800 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3801 p.push_back ((*i)->name ());
3810 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3812 /* we assume that all our input ports feed all our output ports. its not
3813 universally true, but the alternative is way too corner-case to worry about.
3816 jack_latency_range_t all_connections;
3819 all_connections.min = 0;
3820 all_connections.max = 0;
3822 all_connections.min = ~((jack_nframes_t) 0);
3823 all_connections.max = 0;
3825 /* iterate over all "from" ports and determine the latency range for all of their
3826 connections to the "outside" (outside of this Route).
3829 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3831 jack_latency_range_t range;
3833 p->get_connected_latency_range (range, playback);
3835 all_connections.min = min (all_connections.min, range.min);
3836 all_connections.max = max (all_connections.max, range.max);
3840 /* set the "from" port latencies to the max/min range of all their connections */
3842 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3843 p->set_private_latency_range (all_connections, playback);
3846 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3848 all_connections.min += our_latency;
3849 all_connections.max += our_latency;
3851 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3852 p->set_private_latency_range (all_connections, playback);
3855 return all_connections.max;
3859 Route::set_private_port_latencies (bool playback) const
3861 framecnt_t own_latency = 0;
3863 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3864 OR LATENCY CALLBACK.
3866 This is called (early) from the latency callback. It computes the REAL
3867 latency associated with each port and stores the result as the "private"
3868 latency of the port. A later call to Route::set_public_port_latencies()
3869 sets all ports to the same value to reflect the fact that we do latency
3870 compensation and so all signals are delayed by the same amount as they
3871 flow through ardour.
3874 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3875 if ((*i)->active ()) {
3876 own_latency += (*i)->signal_latency ();
3881 /* playback: propagate latency from "outside the route" to outputs to inputs */
3882 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3884 /* capture: propagate latency from "outside the route" to inputs to outputs */
3885 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3890 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3892 /* this is called to set the JACK-visible port latencies, which take
3893 latency compensation into account.
3896 jack_latency_range_t range;
3902 const PortSet& ports (_input->ports());
3903 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3904 p->set_public_latency_range (range, playback);
3909 const PortSet& ports (_output->ports());
3910 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3911 p->set_public_latency_range (range, playback);
3916 /** Put the invisible processors in the right place in _processors.
3917 * Must be called with a writer lock on _processor_lock held.
3920 Route::setup_invisible_processors ()
3923 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3924 assert (!lm.locked ());
3928 /* too early to be doing this stuff */
3932 /* we'll build this new list here and then use it */
3934 ProcessorList new_processors;
3936 /* find visible processors */
3938 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3939 if ((*i)->display_to_user ()) {
3940 new_processors.push_back (*i);
3946 ProcessorList::iterator amp = new_processors.begin ();
3947 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3951 assert (amp != _processors.end ());
3953 /* and the processor after the amp */
3955 ProcessorList::iterator after_amp = amp;
3961 switch (_meter_point) {
3963 assert (!_meter->display_to_user ());
3964 new_processors.push_front (_meter);
3967 assert (!_meter->display_to_user ());
3968 new_processors.insert (amp, _meter);
3970 case MeterPostFader:
3971 /* do nothing here */
3974 /* do nothing here */
3977 /* the meter is visible, so we don't touch it here */
3984 assert (_main_outs);
3985 assert (!_main_outs->display_to_user ());
3986 new_processors.push_back (_main_outs);
3988 /* iterator for the main outs */
3990 ProcessorList::iterator main = new_processors.end();
3993 /* OUTPUT METERING */
3995 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3996 assert (!_meter->display_to_user ());
3998 /* add the processor just before or just after the main outs */
4000 ProcessorList::iterator meter_point = main;
4002 if (_meter_point == MeterOutput) {
4005 new_processors.insert (meter_point, _meter);
4010 if (_monitor_send && !is_monitor ()) {
4011 assert (!_monitor_send->display_to_user ());
4012 if (Config->get_solo_control_is_listen_control()) {
4013 switch (Config->get_listen_position ()) {
4014 case PreFaderListen:
4015 switch (Config->get_pfl_position ()) {
4016 case PFLFromBeforeProcessors:
4017 new_processors.push_front (_monitor_send);
4019 case PFLFromAfterProcessors:
4020 new_processors.insert (amp, _monitor_send);
4023 _monitor_send->set_can_pan (false);
4025 case AfterFaderListen:
4026 switch (Config->get_afl_position ()) {
4027 case AFLFromBeforeProcessors:
4028 new_processors.insert (after_amp, _monitor_send);
4030 case AFLFromAfterProcessors:
4031 new_processors.insert (new_processors.end(), _monitor_send);
4034 _monitor_send->set_can_pan (true);
4038 new_processors.insert (new_processors.end(), _monitor_send);
4039 _monitor_send->set_can_pan (false);
4043 /* MONITOR CONTROL */
4045 if (_monitor_control && is_monitor ()) {
4046 assert (!_monitor_control->display_to_user ());
4047 new_processors.push_front (_monitor_control);
4050 /* INTERNAL RETURN */
4052 /* doing this here means that any monitor control will come just after
4057 assert (!_intreturn->display_to_user ());
4058 new_processors.push_front (_intreturn);
4061 /* EXPORT PROCESSOR */
4063 if (_capturing_processor) {
4064 assert (!_capturing_processor->display_to_user ());
4065 new_processors.push_front (_capturing_processor);
4068 _processors = new_processors;
4070 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4071 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4072 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4079 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4080 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4084 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4085 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4092 /** If the meter point is `Custom', make a note of where the meter is.
4093 * This is so that if the meter point is subsequently set to something else,
4094 * and then back to custom, we can put the meter back where it was last time
4095 * custom was enabled.
4097 * Must be called with the _processor_lock held.
4100 Route::maybe_note_meter_position ()
4102 if (_meter_point != MeterCustom) {
4106 _custom_meter_position_noted = true;
4107 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4108 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4109 ProcessorList::iterator j = i;
4111 if (j != _processors.end ()) {
4112 _processor_after_last_custom_meter = *j;
4113 _last_custom_meter_was_at_end = false;
4115 _last_custom_meter_was_at_end = true;
4121 boost::shared_ptr<Processor>
4122 Route::processor_by_id (PBD::ID id) const
4124 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4125 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4126 if ((*i)->id() == id) {
4131 return boost::shared_ptr<Processor> ();
4134 /** @return the monitoring state, or in other words what data we are pushing
4135 * into the route (data from the inputs, data from disk or silence)
4138 Route::monitoring_state () const
4140 return MonitoringInput;
4143 /** @return what we should be metering; either the data coming from the input
4144 * IO or the data that is flowing through the route.
4147 Route::metering_state () const
4149 return MeteringRoute;
4153 Route::has_external_redirects () const
4155 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4157 /* ignore inactive processors and obviously ignore the main
4158 * outs since everything has them and we don't care.
4161 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4169 boost::shared_ptr<Processor>
4170 Route::the_instrument () const
4172 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4173 return the_instrument_unlocked ();
4176 boost::shared_ptr<Processor>
4177 Route::the_instrument_unlocked () const
4179 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4180 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4181 if ((*i)->input_streams().n_midi() > 0 &&
4182 (*i)->output_streams().n_audio() > 0) {
4187 return boost::shared_ptr<Processor>();
4193 Route::non_realtime_locate (framepos_t pos)
4196 _pannable->transport_located (pos);
4200 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4202 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4203 (*i)->transport_located (pos);
4209 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4216 * We don't currently mix MIDI input together, so we don't need the
4217 * complex logic of the audio case.
4220 n_buffers = bufs.count().n_midi ();
4222 for (i = 0; i < n_buffers; ++i) {
4224 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4225 MidiBuffer& buf (bufs.get_midi (i));
4228 buf.copy (source_port->get_midi_buffer(nframes));
4230 buf.silence (nframes);
4236 n_buffers = bufs.count().n_audio();
4238 size_t n_ports = io->n_ports().n_audio();
4239 float scaling = 1.0f;
4241 if (n_ports > n_buffers) {
4242 scaling = ((float) n_buffers) / n_ports;
4245 for (i = 0; i < n_ports; ++i) {
4247 /* if there are more ports than buffers, map them onto buffers
4248 * in a round-robin fashion
4251 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4252 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4255 if (i < n_buffers) {
4257 /* first time through just copy a channel into
4261 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4263 if (scaling != 1.0f) {
4264 buf.apply_gain (scaling, nframes);
4269 /* on subsequent times around, merge data from
4270 * the port with what is already there
4273 if (scaling != 1.0f) {
4274 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4276 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4281 /* silence any remaining buffers */
4283 for (; i < n_buffers; ++i) {
4284 AudioBuffer& buf (bufs.get_audio (i));
4285 buf.silence (nframes);
4288 /* establish the initial setup of the buffer set, reflecting what was
4289 copied into it. unless, of course, we are the auditioner, in which
4290 case nothing was fed into it from the inputs at all.
4293 if (!is_auditioner()) {
4294 bufs.set_count (io->n_ports());