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.h"
55 #include "ardour/panner_shell.h"
56 #include "ardour/plugin_insert.h"
57 #include "ardour/port.h"
58 #include "ardour/port_insert.h"
59 #include "ardour/processor.h"
60 #include "ardour/route.h"
61 #include "ardour/route_group.h"
62 #include "ardour/send.h"
63 #include "ardour/session.h"
64 #include "ardour/unknown_processor.h"
65 #include "ardour/utils.h"
70 using namespace ARDOUR;
73 PBD::Signal0<void> Route::SyncOrderKeys;
74 PBD::Signal0<void> Route::RemoteControlIDChange;
76 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
77 : SessionObject (sess, name)
79 , GraphNode (sess._process_graph)
85 , _pending_declick (true)
86 , _meter_point (MeterPostFader)
87 , _meter_type (MeterPeak)
89 , _soloed_by_others_upstream (0)
90 , _soloed_by_others_downstream (0)
92 , _denormal_protection (false)
95 , _declickable (false)
96 , _mute_master (new MuteMaster (sess, name))
97 , _have_internal_generator (false)
99 , _default_type (default_type)
101 , _has_order_key (false)
102 , _remote_control_id (0)
103 , _in_configure_processors (false)
104 , _initial_io_setup (false)
105 , _custom_meter_position_noted (false)
106 , _last_custom_meter_was_at_end (false)
109 _meter_type = MeterK20;
111 processor_max_streams.reset();
117 /* add standard controls */
119 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
120 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
122 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
123 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
125 add_control (_solo_control);
126 add_control (_mute_control);
130 if (!(_flags & Route::MonitorOut)) {
131 _pannable.reset (new Pannable (_session));
134 /* input and output objects */
136 _input.reset (new IO (_session, _name, IO::Input, _default_type));
137 _output.reset (new IO (_session, _name, IO::Output, _default_type));
139 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
140 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
142 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
143 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
145 /* add amp processor */
147 _amp.reset (new Amp (_session));
148 add_processor (_amp, PostFader);
150 /* create standard processors: meter, main outs, monitor out;
151 they will be added to _processors by setup_invisible_processors ()
154 _meter.reset (new PeakMeter (_session, _name));
155 _meter->set_owner (this);
156 _meter->set_display_to_user (false);
159 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
160 _main_outs->activate ();
163 /* where we listen to tracks */
164 _intreturn.reset (new InternalReturn (_session));
165 _intreturn->activate ();
167 /* the thing that provides proper control over a control/monitor/listen bus
168 (such as per-channel cut, dim, solo, invert, etc).
170 _monitor_control.reset (new MonitorProcessor (_session));
171 _monitor_control->activate ();
174 if (is_master() || is_monitor() || is_auditioner()) {
175 _mute_master->set_solo_ignore (true);
178 /* now that we have _meter, its safe to connect to this */
180 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
183 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
184 configure_processors (0);
192 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
194 /* do this early so that we don't get incoming signals as we are going through destruction
199 /* don't use clear_processors here, as it depends on the session which may
200 be half-destroyed by now
203 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
204 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
205 (*i)->drop_references ();
208 _processors.clear ();
212 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
214 if (Config->get_remote_model() != UserOrdered) {
218 set_remote_control_id_internal (id, notify_class_listeners);
222 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
224 /* force IDs for master/monitor busses and prevent
225 any other route from accidentally getting these IDs
226 (i.e. legacy sessions)
229 if (is_master() && id != MasterBusRemoteControlID) {
230 id = MasterBusRemoteControlID;
233 if (is_monitor() && id != MonitorBusRemoteControlID) {
234 id = MonitorBusRemoteControlID;
241 /* don't allow it to collide */
243 if (!is_master () && !is_monitor() &&
244 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
245 id += MonitorBusRemoteControlID;
248 if (id != remote_control_id()) {
249 _remote_control_id = id;
250 RemoteControlIDChanged ();
252 if (notify_class_listeners) {
253 RemoteControlIDChange ();
259 Route::remote_control_id() const
262 return MasterBusRemoteControlID;
266 return MonitorBusRemoteControlID;
269 return _remote_control_id;
273 Route::has_order_key () const
275 return _has_order_key;
279 Route::order_key () const
285 Route::set_remote_control_id_explicit (uint32_t rid)
287 if (is_master() || is_monitor() || is_auditioner()) {
288 /* hard-coded remote IDs, or no remote ID */
292 if (_remote_control_id != rid) {
293 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
294 _remote_control_id = rid;
295 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
298 /* don't emit the class-level RID signal RemoteControlIDChange here,
299 leave that to the entity that changed the order key, so that we
300 don't get lots of emissions for no good reasons (e.g. when changing
301 all route order keys).
303 See Session::sync_remote_id_from_order_keys() for the (primary|only)
304 spot where that is emitted.
309 Route::set_order_key (uint32_t n)
311 _has_order_key = true;
313 if (_order_key == n) {
319 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
320 name(), order_key ()));
322 _session.set_dirty ();
326 Route::ensure_track_or_route_name(string name, Session &session)
328 string newname = name;
330 while (!session.io_name_is_legal (newname)) {
331 newname = bump_name_once (newname, '.');
339 Route::inc_gain (gain_t fraction, void *src)
341 _amp->inc_gain (fraction, src);
345 Route::set_gain (gain_t val, void *src)
347 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
349 if (_route_group->is_relative()) {
351 gain_t usable_gain = _amp->gain();
352 if (usable_gain < 0.000001f) {
353 usable_gain = 0.000001f;
357 if (delta < 0.000001f) {
361 delta -= usable_gain;
366 gain_t factor = delta / usable_gain;
369 factor = _route_group->get_max_factor(factor);
370 if (factor == 0.0f) {
371 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
375 factor = _route_group->get_min_factor(factor);
376 if (factor == 0.0f) {
377 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
382 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
386 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
392 if (val == _amp->gain()) {
396 _amp->set_gain (val, src);
400 Route::maybe_declick (BufferSet&, framecnt_t, int)
402 /* this is the "bus" implementation and they never declick.
407 /** Process this route for one (sub) cycle (process thread)
409 * @param bufs Scratch buffers to use for the signal path
410 * @param start_frame Initial transport frame
411 * @param end_frame Final transport frame
412 * @param nframes Number of frames to output (to ports)
414 * Note that (end_frame - start_frame) may not be equal to nframes when the
415 * transport speed isn't 1.0 (eg varispeed).
418 Route::process_output_buffers (BufferSet& bufs,
419 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
420 int declick, bool gain_automation_ok)
422 /* Caller must hold process lock */
423 assert (!AudioEngine::instance()->process_lock().trylock());
425 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
428 /* figure out if we're going to use gain automation */
429 if (gain_automation_ok) {
430 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
431 _amp->setup_gain_automation (start_frame, end_frame, nframes);
433 _amp->apply_gain_automation (false);
436 /* Tell main outs what to do about monitoring. We do this so that
437 on a transition between monitoring states we get a de-clicking gain
438 change in the _main_outs delivery.
441 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
443 /* -------------------------------------------------------------------------------------------
444 GLOBAL DECLICK (for transport changes etc.)
445 ----------------------------------------------------------------------------------------- */
447 maybe_declick (bufs, nframes, declick);
448 _pending_declick = 0;
450 /* -------------------------------------------------------------------------------------------
451 DENORMAL CONTROL/PHASE INVERT
452 ----------------------------------------------------------------------------------------- */
454 if (_phase_invert.any ()) {
458 if (_denormal_protection || Config->get_denormal_protection()) {
460 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
461 Sample* const sp = i->data();
463 if (_phase_invert[chn]) {
464 for (pframes_t nx = 0; nx < nframes; ++nx) {
469 for (pframes_t nx = 0; nx < nframes; ++nx) {
477 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
478 Sample* const sp = i->data();
480 if (_phase_invert[chn]) {
481 for (pframes_t nx = 0; nx < nframes; ++nx) {
490 if (_denormal_protection || Config->get_denormal_protection()) {
492 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
493 Sample* const sp = i->data();
494 for (pframes_t nx = 0; nx < nframes; ++nx) {
502 /* -------------------------------------------------------------------------------------------
504 ----------------------------------------------------------------------------------------- */
506 /* set this to be true if the meter will already have been ::run() earlier */
507 bool const meter_already_run = metering_state() == MeteringInput;
509 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
511 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
512 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
517 /* if it has any inputs, make sure they match */
518 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
519 if (bufs.count() != (*i)->input_streams()) {
521 DEBUG::Processors, string_compose (
522 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
523 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
530 /* should we NOT run plugins here if the route is inactive?
531 do we catch route != active somewhere higher?
534 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
535 bufs.set_count ((*i)->output_streams());
540 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
541 boost::shared_ptr<Processor> endpoint,
542 bool include_endpoint, bool for_export, bool for_freeze)
544 /* If no processing is required, there's no need to go any further. */
545 if (!endpoint && !include_endpoint) {
549 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
550 _amp->setup_gain_automation (start, start + nframes, nframes);
552 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
554 if (!include_endpoint && (*i) == endpoint) {
558 /* if we're not exporting, stop processing if we come across a routing processor. */
559 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
562 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
566 /* don't run any processors that does routing.
567 * oh, and don't bother with the peak meter either.
569 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
570 (*i)->run (buffers, start, start+nframes, nframes, true);
571 buffers.set_count ((*i)->output_streams());
574 if ((*i) == endpoint) {
581 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
582 bool include_endpoint, bool for_export, bool for_freeze) const
584 framecnt_t latency = 0;
585 if (!endpoint && !include_endpoint) {
589 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
590 if (!include_endpoint && (*i) == endpoint) {
593 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
596 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
599 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
600 latency += (*i)->signal_latency ();
602 if ((*i) == endpoint) {
610 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
611 bool include_endpoint, bool for_export, bool for_freeze) const
613 if (!endpoint && !include_endpoint) {
617 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
618 if (!include_endpoint && (*i) == endpoint) {
621 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
624 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
627 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
628 cc = (*i)->output_streams();
630 if ((*i) == endpoint) {
638 Route::n_process_buffers ()
640 return max (_input->n_ports(), processor_max_streams);
644 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
646 assert (is_monitor());
647 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
648 fill_buffers_with_input (bufs, _input, nframes);
649 passthru (bufs, start_frame, end_frame, nframes, declick);
653 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
657 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
659 /* control/monitor bus ignores input ports when something is
660 feeding the listen "stream". data will "arrive" into the
661 route from the intreturn processor element.
664 bufs.silence (nframes, 0);
667 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
668 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
672 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
674 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
676 bufs.set_count (_input->n_ports());
677 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
678 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
682 Route::set_listen (bool yn, void* src)
688 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
689 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
694 if (yn != _monitor_send->active()) {
696 _monitor_send->activate ();
697 _mute_master->set_soloed (true);
699 _monitor_send->deactivate ();
700 _mute_master->set_soloed (false);
703 listen_changed (src); /* EMIT SIGNAL */
709 Route::listening_via_monitor () const
712 return _monitor_send->active ();
719 Route::set_solo_safe (bool yn, void *src)
721 if (_solo_safe != yn) {
723 solo_safe_changed (src);
728 Route::solo_safe() const
734 Route::set_solo (bool yn, void *src)
737 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
741 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
742 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
746 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
747 name(), yn, src, (src == _route_group), self_soloed()));
749 if (self_soloed() != yn) {
751 set_mute_master_solo ();
752 solo_changed (true, src); /* EMIT SIGNAL */
753 _solo_control->Changed (); /* EMIT SIGNAL */
758 Route::set_self_solo (bool yn)
760 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
765 Route::mod_solo_by_others_upstream (int32_t delta)
768 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
772 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
773 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
775 uint32_t old_sbu = _soloed_by_others_upstream;
778 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
779 _soloed_by_others_upstream += delta;
781 _soloed_by_others_upstream = 0;
784 _soloed_by_others_upstream += delta;
787 DEBUG_TRACE (DEBUG::Solo, string_compose (
788 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
789 name(), delta, _soloed_by_others_upstream, old_sbu,
790 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
792 /* push the inverse solo change to everything that feeds us.
794 This is important for solo-within-group. When we solo 1 track out of N that
795 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
796 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
797 tracks that feed it. This will silence them if they were audible because
798 of a bus solo, but the newly soloed track will still be audible (because
801 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
805 if ((_self_solo || _soloed_by_others_downstream) &&
806 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
807 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
809 if (delta > 0 || !Config->get_exclusive_solo()) {
810 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
811 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
812 boost::shared_ptr<Route> sr = i->r.lock();
814 sr->mod_solo_by_others_downstream (-delta);
820 set_mute_master_solo ();
821 solo_changed (false, this);
825 Route::mod_solo_by_others_downstream (int32_t delta)
828 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
832 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
833 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
836 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
837 _soloed_by_others_downstream += delta;
839 _soloed_by_others_downstream = 0;
842 _soloed_by_others_downstream += delta;
845 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
847 set_mute_master_solo ();
848 solo_changed (false, this);
852 Route::set_mute_master_solo ()
854 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
858 Route::set_solo_isolated (bool yn, void *src)
860 if (is_master() || is_monitor() || is_auditioner()) {
864 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
865 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
869 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
871 boost::shared_ptr<RouteList> routes = _session.get_routes ();
872 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
874 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
879 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
881 if (does_feed && !sends_only) {
882 (*i)->set_solo_isolated (yn, (*i)->route_group());
886 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
888 bool changed = false;
891 if (_solo_isolated == 0) {
892 _mute_master->set_solo_ignore (true);
897 if (_solo_isolated > 0) {
899 if (_solo_isolated == 0) {
900 _mute_master->set_solo_ignore (false);
907 solo_isolated_changed (src);
912 Route::solo_isolated () const
914 return _solo_isolated > 0;
918 Route::set_mute_points (MuteMaster::MutePoint mp)
920 _mute_master->set_mute_points (mp);
921 mute_points_changed (); /* EMIT SIGNAL */
923 if (_mute_master->muted_by_self()) {
924 mute_changed (this); /* EMIT SIGNAL */
925 _mute_control->Changed (); /* EMIT SIGNAL */
930 Route::set_mute (bool yn, void *src)
932 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
933 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
938 _mute_master->set_muted_by_self (yn);
939 /* allow any derived classes to respond to the mute change
940 before anybody else knows about it.
943 /* tell everyone else */
944 mute_changed (src); /* EMIT SIGNAL */
945 _mute_control->Changed (); /* EMIT SIGNAL */
950 Route::muted () const
952 return _mute_master->muted_by_self();
957 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
959 cerr << name << " {" << endl;
960 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
961 p != procs.end(); ++p) {
962 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
968 /** Supposing that we want to insert a Processor at a given Placement, return
969 * the processor to add the new one before (or 0 to add at the end).
971 boost::shared_ptr<Processor>
972 Route::before_processor_for_placement (Placement p)
974 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
976 ProcessorList::iterator loc;
979 /* generic pre-fader: insert immediately before the amp */
980 loc = find (_processors.begin(), _processors.end(), _amp);
982 /* generic post-fader: insert right before the main outs */
983 loc = find (_processors.begin(), _processors.end(), _main_outs);
986 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
989 /** Supposing that we want to insert a Processor at a given index, return
990 * the processor to add the new one before (or 0 to add at the end).
992 boost::shared_ptr<Processor>
993 Route::before_processor_for_index (int index)
996 return boost::shared_ptr<Processor> ();
999 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1001 ProcessorList::iterator i = _processors.begin ();
1003 while (i != _processors.end() && j < index) {
1004 if ((*i)->display_to_user()) {
1011 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1014 /** Add a processor either pre- or post-fader
1015 * @return 0 on success, non-0 on failure.
1018 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1020 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1024 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1025 * @param index Index to add the processor at, or -1 to add at the end of the list.
1026 * @return 0 on success, non-0 on failure.
1029 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1031 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1034 /** Add a processor to the route.
1035 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1036 * @return 0 on success, non-0 on failure.
1039 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1041 assert (processor != _meter);
1042 assert (processor != _main_outs);
1044 DEBUG_TRACE (DEBUG::Processors, string_compose (
1045 "%1 adding processor %2\n", name(), processor->name()));
1047 if (!AudioEngine::instance()->connected() || !processor) {
1052 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1053 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1054 ProcessorState pstate (this);
1056 boost::shared_ptr<PluginInsert> pi;
1057 boost::shared_ptr<PortInsert> porti;
1059 if (processor == _amp) {
1060 /* Ensure that only one amp is in the list at any time */
1061 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1062 if (check != _processors.end()) {
1063 if (before == _amp) {
1064 /* Already in position; all is well */
1067 _processors.erase (check);
1072 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1074 ProcessorList::iterator loc;
1076 /* inserting before a processor; find it */
1077 loc = find (_processors.begin(), _processors.end(), before);
1078 if (loc == _processors.end ()) {
1083 /* inserting at end */
1084 loc = _processors.end ();
1087 _processors.insert (loc, processor);
1088 processor->set_owner (this);
1090 // Set up processor list channels. This will set processor->[input|output]_streams(),
1091 // configure redirect ports properly, etc.
1094 if (configure_processors_unlocked (err)) {
1096 configure_processors_unlocked (0); // it worked before we tried to add it ...
1101 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1103 if (pi->has_no_inputs ()) {
1104 /* generator plugin */
1105 _have_internal_generator = true;
1110 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1111 processor->activate ();
1114 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1116 _output->set_user_latency (0);
1119 reset_instrument_info ();
1120 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1121 set_processor_positions ();
1127 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1129 const XMLProperty *prop;
1132 boost::shared_ptr<Processor> processor;
1134 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1135 so that we can add the processor in the right place (pre/post-fader)
1138 XMLNodeList const & children = node.children ();
1139 XMLNodeList::const_iterator i = children.begin ();
1141 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1145 Placement placement = PreFader;
1147 if (i != children.end()) {
1148 if ((prop = (*i)->property (X_("placement"))) != 0) {
1149 placement = Placement (string_2_enum (prop->value(), placement));
1153 if (node.name() == "Insert") {
1155 if ((prop = node.property ("type")) != 0) {
1157 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1158 prop->value() == "lv2" ||
1159 prop->value() == "windows-vst" ||
1160 prop->value() == "lxvst" ||
1161 prop->value() == "audiounit") {
1163 processor.reset (new PluginInsert (_session));
1167 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1172 } else if (node.name() == "Send") {
1174 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1175 processor.reset (new Send (_session, sendpan, _mute_master));
1179 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1183 if (processor->set_state (node, version)) {
1187 return (add_processor (processor, placement) == 0);
1190 catch (failed_constructor &err) {
1191 warning << _("processor could not be created. Ignored.") << endmsg;
1197 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1199 /* NOTE: this is intended to be used ONLY when copying
1200 processors from another Route. Hence the subtle
1201 differences between this and ::add_processor()
1204 ProcessorList::iterator loc;
1207 loc = find(_processors.begin(), _processors.end(), before);
1209 /* nothing specified - at end */
1210 loc = _processors.end ();
1213 if (!_session.engine().connected()) {
1217 if (others.empty()) {
1222 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1223 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1224 ProcessorState pstate (this);
1226 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1232 boost::shared_ptr<PluginInsert> pi;
1234 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1238 _processors.insert (loc, *i);
1239 (*i)->set_owner (this);
1241 if ((*i)->active()) {
1245 /* Think: does this really need to be called for every processor in the loop? */
1247 if (configure_processors_unlocked (err)) {
1249 configure_processors_unlocked (0); // it worked before we tried to add it ...
1254 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1257 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1258 boost::shared_ptr<PluginInsert> pi;
1260 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1261 if (pi->has_no_inputs ()) {
1262 _have_internal_generator = true;
1268 _output->set_user_latency (0);
1271 reset_instrument_info ();
1272 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1273 set_processor_positions ();
1279 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1281 if (p == PreFader) {
1282 start = _processors.begin();
1283 end = find(_processors.begin(), _processors.end(), _amp);
1285 start = find(_processors.begin(), _processors.end(), _amp);
1287 end = _processors.end();
1291 /** Turn off all processors with a given placement
1292 * @param p Placement of processors to disable
1295 Route::disable_processors (Placement p)
1297 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1299 ProcessorList::iterator start, end;
1300 placement_range(p, start, end);
1302 for (ProcessorList::iterator i = start; i != end; ++i) {
1303 (*i)->deactivate ();
1306 _session.set_dirty ();
1309 /** Turn off all redirects
1312 Route::disable_processors ()
1314 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1316 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1317 (*i)->deactivate ();
1320 _session.set_dirty ();
1323 /** Turn off all redirects with a given placement
1324 * @param p Placement of redirects to disable
1327 Route::disable_plugins (Placement p)
1329 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1331 ProcessorList::iterator start, end;
1332 placement_range(p, start, end);
1334 for (ProcessorList::iterator i = start; i != end; ++i) {
1335 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1336 (*i)->deactivate ();
1340 _session.set_dirty ();
1343 /** Turn off all plugins
1346 Route::disable_plugins ()
1348 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1350 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1351 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1352 (*i)->deactivate ();
1356 _session.set_dirty ();
1361 Route::ab_plugins (bool forward)
1363 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1367 /* forward = turn off all active redirects, and mark them so that the next time
1368 we go the other way, we will revert them
1371 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1372 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1376 if ((*i)->active()) {
1377 (*i)->deactivate ();
1378 (*i)->set_next_ab_is_active (true);
1380 (*i)->set_next_ab_is_active (false);
1386 /* backward = if the redirect was marked to go active on the next ab, do so */
1388 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1390 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1394 if ((*i)->get_next_ab_is_active()) {
1397 (*i)->deactivate ();
1402 _session.set_dirty ();
1406 /** Remove processors with a given placement.
1407 * @param p Placement of processors to remove.
1410 Route::clear_processors (Placement p)
1412 if (!_session.engine().connected()) {
1416 bool already_deleting = _session.deletion_in_progress();
1417 if (!already_deleting) {
1418 _session.set_deletion_in_progress();
1422 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1423 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1424 ProcessorList new_list;
1425 ProcessorStreams err;
1426 bool seen_amp = false;
1428 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1434 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1436 /* you can't remove these */
1438 new_list.push_back (*i);
1445 new_list.push_back (*i);
1448 (*i)->drop_references ();
1456 (*i)->drop_references ();
1459 new_list.push_back (*i);
1466 _processors = new_list;
1467 configure_processors_unlocked (&err); // this can't fail
1470 processor_max_streams.reset();
1471 _have_internal_generator = false;
1472 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1473 set_processor_positions ();
1475 reset_instrument_info ();
1477 if (!already_deleting) {
1478 _session.clear_deletion_in_progress();
1483 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1485 // TODO once the export point can be configured properly, do something smarter here
1486 if (processor == _capturing_processor) {
1487 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1488 if (need_process_lock) {
1492 _capturing_processor.reset();
1494 if (need_process_lock) {
1499 /* these can never be removed */
1501 if (processor == _amp || processor == _meter || processor == _main_outs) {
1505 if (!_session.engine().connected()) {
1509 processor_max_streams.reset();
1512 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1513 if (need_process_lock) {
1517 /* Caller must hold process lock */
1518 assert (!AudioEngine::instance()->process_lock().trylock());
1520 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1522 ProcessorState pstate (this);
1524 ProcessorList::iterator i;
1525 bool removed = false;
1527 for (i = _processors.begin(); i != _processors.end(); ) {
1528 if (*i == processor) {
1530 /* move along, see failure case for configure_processors()
1531 where we may need to reconfigure the processor.
1534 /* stop redirects that send signals to JACK ports
1535 from causing noise as a result of no longer being
1539 boost::shared_ptr<IOProcessor> iop;
1541 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1545 i = _processors.erase (i);
1553 _output->set_user_latency (0);
1561 if (configure_processors_unlocked (err)) {
1563 /* we know this will work, because it worked before :) */
1564 configure_processors_unlocked (0);
1568 _have_internal_generator = false;
1570 for (i = _processors.begin(); i != _processors.end(); ++i) {
1571 boost::shared_ptr<PluginInsert> pi;
1573 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1574 if (pi->has_no_inputs ()) {
1575 _have_internal_generator = true;
1580 if (need_process_lock) {
1585 reset_instrument_info ();
1586 processor->drop_references ();
1587 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1588 set_processor_positions ();
1594 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1596 ProcessorList deleted;
1598 if (!_session.engine().connected()) {
1602 processor_max_streams.reset();
1605 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1606 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1607 ProcessorState pstate (this);
1609 ProcessorList::iterator i;
1610 boost::shared_ptr<Processor> processor;
1612 for (i = _processors.begin(); i != _processors.end(); ) {
1616 /* these can never be removed */
1618 if (processor == _amp || processor == _meter || processor == _main_outs) {
1623 /* see if its in the list of processors to delete */
1625 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1630 /* stop IOProcessors that send to JACK ports
1631 from causing noise as a result of no longer being
1635 boost::shared_ptr<IOProcessor> iop;
1637 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1641 deleted.push_back (processor);
1642 i = _processors.erase (i);
1645 if (deleted.empty()) {
1646 /* none of those in the requested list were found */
1650 _output->set_user_latency (0);
1652 if (configure_processors_unlocked (err)) {
1654 /* we know this will work, because it worked before :) */
1655 configure_processors_unlocked (0);
1660 _have_internal_generator = false;
1662 for (i = _processors.begin(); i != _processors.end(); ++i) {
1663 boost::shared_ptr<PluginInsert> pi;
1665 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1666 if (pi->has_no_inputs ()) {
1667 _have_internal_generator = true;
1674 /* now try to do what we need to so that those that were removed will be deleted */
1676 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1677 (*i)->drop_references ();
1680 reset_instrument_info ();
1681 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1682 set_processor_positions ();
1688 Route::reset_instrument_info ()
1690 boost::shared_ptr<Processor> instr = the_instrument();
1692 _instrument_info.set_internal_instrument (instr);
1696 /** Caller must hold process lock */
1698 Route::configure_processors (ProcessorStreams* err)
1700 #ifndef PLATFORM_WINDOWS
1701 assert (!AudioEngine::instance()->process_lock().trylock());
1704 if (!_in_configure_processors) {
1705 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1706 return configure_processors_unlocked (err);
1713 Route::input_streams () const
1715 return _input->n_ports ();
1718 list<pair<ChanCount, ChanCount> >
1719 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1721 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1723 return try_configure_processors_unlocked (in, err);
1726 list<pair<ChanCount, ChanCount> >
1727 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1729 // Check each processor in order to see if we can configure as requested
1731 list<pair<ChanCount, ChanCount> > configuration;
1734 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1735 DEBUG_TRACE (DEBUG::Processors, "{\n");
1737 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1739 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1740 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1741 DEBUG_TRACE (DEBUG::Processors, "}\n");
1742 return list<pair<ChanCount, ChanCount> > ();
1745 if ((*p)->can_support_io_configuration(in, out)) {
1746 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1747 configuration.push_back(make_pair(in, out));
1754 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1755 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1756 DEBUG_TRACE (DEBUG::Processors, "}\n");
1757 return list<pair<ChanCount, ChanCount> > ();
1761 DEBUG_TRACE (DEBUG::Processors, "}\n");
1763 return configuration;
1766 /** Set the input/output configuration of each processor in the processors list.
1767 * Caller must hold process lock.
1768 * Return 0 on success, otherwise configuration is impossible.
1771 Route::configure_processors_unlocked (ProcessorStreams* err)
1773 #ifndef PLATFORM_WINDOWS
1774 assert (!AudioEngine::instance()->process_lock().trylock());
1777 if (_in_configure_processors) {
1781 /* put invisible processors where they should be */
1782 setup_invisible_processors ();
1784 _in_configure_processors = true;
1786 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1788 if (configuration.empty ()) {
1789 _in_configure_processors = false;
1794 bool seen_mains_out = false;
1795 processor_out_streams = _input->n_ports();
1796 processor_max_streams.reset();
1798 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1799 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1801 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1805 (*p)->configure_io(c->first, c->second);
1806 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1807 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1810 if (boost::dynamic_pointer_cast<Delivery> (*p)
1811 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1812 /* main delivery will increase port count to match input.
1813 * the Delivery::Main is usually the last processor - followed only by
1816 seen_mains_out = true;
1818 if (!seen_mains_out) {
1819 processor_out_streams = out;
1825 _meter->reset_max_channels (processor_max_streams);
1828 /* make sure we have sufficient scratch buffers to cope with the new processor
1831 _session.ensure_buffers (n_process_buffers ());
1833 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1835 _in_configure_processors = false;
1839 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1840 * @param state New active state for those processors.
1843 Route::all_visible_processors_active (bool state)
1845 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1847 if (_processors.empty()) {
1851 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1852 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1859 (*i)->deactivate ();
1863 _session.set_dirty ();
1867 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1869 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1870 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1871 processors in the current actual processor list that are hidden. Any visible processors
1872 in the current list but not in "new_order" will be assumed to be deleted.
1876 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1877 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1878 ProcessorState pstate (this);
1880 ProcessorList::iterator oiter;
1881 ProcessorList::const_iterator niter;
1882 ProcessorList as_it_will_be;
1884 oiter = _processors.begin();
1885 niter = new_order.begin();
1887 while (niter != new_order.end()) {
1889 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1890 then append it to the temp list.
1892 Otherwise, see if the next processor in the old list is in the new list. if not,
1893 its been deleted. If its there, append it to the temp list.
1896 if (oiter == _processors.end()) {
1898 /* no more elements in the old list, so just stick the rest of
1899 the new order onto the temp list.
1902 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1903 while (niter != new_order.end()) {
1910 if (!(*oiter)->display_to_user()) {
1912 as_it_will_be.push_back (*oiter);
1916 /* visible processor: check that its in the new order */
1918 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1919 /* deleted: do nothing, shared_ptr<> will clean up */
1921 /* ignore this one, and add the next item from the new order instead */
1922 as_it_will_be.push_back (*niter);
1927 /* now remove from old order - its taken care of no matter what */
1928 oiter = _processors.erase (oiter);
1933 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1935 /* If the meter is in a custom position, find it and make a rough note of its position */
1936 maybe_note_meter_position ();
1938 if (configure_processors_unlocked (err)) {
1944 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1945 set_processor_positions ();
1957 Route::get_template()
1959 return state(false);
1963 Route::state(bool full_state)
1965 XMLNode *node = new XMLNode("Route");
1966 ProcessorList::iterator i;
1969 id().print (buf, sizeof (buf));
1970 node->add_property("id", buf);
1971 node->add_property ("name", _name);
1972 node->add_property("default-type", _default_type.to_string());
1975 node->add_property("flags", enum_2_string (_flags));
1978 node->add_property("active", _active?"yes":"no");
1980 boost::to_string (_phase_invert, p);
1981 node->add_property("phase-invert", p);
1982 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1983 node->add_property("meter-point", enum_2_string (_meter_point));
1985 node->add_property("meter-type", enum_2_string (_meter_type));
1988 node->add_property("route-group", _route_group->name());
1991 snprintf (buf, sizeof (buf), "%d", _order_key);
1992 node->add_property ("order-key", buf);
1993 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1994 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1995 node->add_property ("soloed-by-upstream", buf);
1996 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1997 node->add_property ("soloed-by-downstream", buf);
1998 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1999 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2001 node->add_child_nocopy (_input->state (full_state));
2002 node->add_child_nocopy (_output->state (full_state));
2003 node->add_child_nocopy (_solo_control->get_state ());
2004 node->add_child_nocopy (_mute_control->get_state ());
2005 node->add_child_nocopy (_mute_master->get_state ());
2007 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2008 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2009 remote_control_node->add_property (X_("id"), buf);
2010 node->add_child_nocopy (*remote_control_node);
2012 if (_comment.length()) {
2013 XMLNode *cmt = node->add_child ("Comment");
2014 cmt->add_content (_comment);
2018 node->add_child_nocopy (_pannable->state (full_state));
2021 for (i = _processors.begin(); i != _processors.end(); ++i) {
2023 /* template save: do not include internal sends functioning as
2024 aux sends because the chance of the target ID
2025 in the session where this template is used
2028 similarly, do not save listen sends which connect to
2029 the monitor section, because these will always be
2032 boost::shared_ptr<InternalSend> is;
2034 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2035 if (is->role() == Delivery::Listen) {
2040 node->add_child_nocopy((*i)->state (full_state));
2044 node->add_child_copy (*_extra_xml);
2047 if (_custom_meter_position_noted) {
2048 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2050 after->id().print (buf, sizeof (buf));
2051 node->add_property (X_("processor-after-last-custom-meter"), buf);
2054 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
2061 Route::set_state (const XMLNode& node, int version)
2063 if (version < 3000) {
2064 return set_state_2X (node, version);
2068 XMLNodeConstIterator niter;
2070 const XMLProperty *prop;
2072 if (node.name() != "Route"){
2073 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2077 if ((prop = node.property (X_("name"))) != 0) {
2078 Route::set_name (prop->value());
2082 _initial_io_setup = true;
2084 if ((prop = node.property (X_("flags"))) != 0) {
2085 _flags = Flag (string_2_enum (prop->value(), _flags));
2090 if (is_master() || is_monitor() || is_auditioner()) {
2091 _mute_master->set_solo_ignore (true);
2095 /* monitor bus does not get a panner, but if (re)created
2096 via XML, it will already have one by the time we
2097 call ::set_state(). so ... remove it.
2102 /* add all processors (except amp, which is always present) */
2104 nlist = node.children();
2105 XMLNode processor_state (X_("processor_state"));
2107 Stateful::save_extra_xml (node);
2109 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2113 if (child->name() == IO::state_node_name) {
2114 if ((prop = child->property (X_("direction"))) == 0) {
2118 if (prop->value() == "Input") {
2119 _input->set_state (*child, version);
2120 } else if (prop->value() == "Output") {
2121 _output->set_state (*child, version);
2125 if (child->name() == X_("Processor")) {
2126 processor_state.add_child_copy (*child);
2129 if (child->name() == X_("Pannable")) {
2131 _pannable->set_state (*child, version);
2133 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2138 if ((prop = node.property (X_("meter-point"))) != 0) {
2139 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2140 set_meter_point (mp, true);
2142 _meter->set_display_to_user (_meter_point == MeterCustom);
2146 if ((prop = node.property (X_("meter-type"))) != 0) {
2147 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2150 _initial_io_setup = false;
2152 set_processor_state (processor_state);
2154 // this looks up the internal instrument in processors
2155 reset_instrument_info();
2157 if ((prop = node.property ("self-solo")) != 0) {
2158 set_self_solo (string_is_affirmative (prop->value()));
2161 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2162 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2163 mod_solo_by_others_upstream (atoi (prop->value()));
2166 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2167 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2168 mod_solo_by_others_downstream (atoi (prop->value()));
2171 if ((prop = node.property ("solo-isolated")) != 0) {
2172 set_solo_isolated (string_is_affirmative (prop->value()), this);
2175 if ((prop = node.property ("solo-safe")) != 0) {
2176 set_solo_safe (string_is_affirmative (prop->value()), this);
2179 if ((prop = node.property (X_("phase-invert"))) != 0) {
2180 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2183 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2184 set_denormal_protection (string_is_affirmative (prop->value()));
2187 if ((prop = node.property (X_("active"))) != 0) {
2188 bool yn = string_is_affirmative (prop->value());
2189 _active = !yn; // force switch
2190 set_active (yn, this);
2193 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2194 set_order_key (atoi(prop->value()));
2197 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2201 string::size_type colon, equal;
2202 string remaining = prop->value();
2204 while (remaining.length()) {
2206 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2207 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2210 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2211 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2214 string keyname = remaining.substr (0, equal);
2216 if ((keyname == "EditorSort") || (keyname == "editor")) {
2217 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2223 colon = remaining.find_first_of (':');
2225 if (colon != string::npos) {
2226 remaining = remaining.substr (colon+1);
2233 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2234 PBD::ID id (prop->value ());
2235 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2236 ProcessorList::const_iterator i = _processors.begin ();
2237 while (i != _processors.end() && (*i)->id() != id) {
2241 if (i != _processors.end ()) {
2242 _processor_after_last_custom_meter = *i;
2243 _custom_meter_position_noted = true;
2247 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2248 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2251 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2254 if (child->name() == X_("Comment")) {
2256 /* XXX this is a terrible API design in libxml++ */
2258 XMLNode *cmt = *(child->children().begin());
2259 _comment = cmt->content();
2261 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2262 if (prop->value() == "solo") {
2263 _solo_control->set_state (*child, version);
2264 } else if (prop->value() == "mute") {
2265 _mute_control->set_state (*child, version);
2268 } else if (child->name() == X_("RemoteControl")) {
2269 if ((prop = child->property (X_("id"))) != 0) {
2271 sscanf (prop->value().c_str(), "%d", &x);
2272 set_remote_control_id_internal (x);
2275 } else if (child->name() == X_("MuteMaster")) {
2276 _mute_master->set_state (*child, version);
2284 Route::set_state_2X (const XMLNode& node, int version)
2287 XMLNodeConstIterator niter;
2289 const XMLProperty *prop;
2291 /* 2X things which still remain to be handled:
2297 if (node.name() != "Route") {
2298 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2302 if ((prop = node.property (X_("flags"))) != 0) {
2303 string f = prop->value ();
2304 boost::replace_all (f, "ControlOut", "MonitorOut");
2305 _flags = Flag (string_2_enum (f, _flags));
2310 if (is_master() || is_monitor() || is_auditioner()) {
2311 _mute_master->set_solo_ignore (true);
2314 if ((prop = node.property (X_("phase-invert"))) != 0) {
2315 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2316 if (string_is_affirmative (prop->value ())) {
2319 set_phase_invert (p);
2322 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2323 set_denormal_protection (string_is_affirmative (prop->value()));
2326 if ((prop = node.property (X_("soloed"))) != 0) {
2327 bool yn = string_is_affirmative (prop->value());
2329 /* XXX force reset of solo status */
2331 set_solo (yn, this);
2334 if ((prop = node.property (X_("muted"))) != 0) {
2337 bool muted = string_is_affirmative (prop->value());
2343 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2345 if (string_is_affirmative (prop->value())){
2346 mute_point = mute_point + "PreFader";
2351 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2353 if (string_is_affirmative (prop->value())){
2356 mute_point = mute_point + ",";
2359 mute_point = mute_point + "PostFader";
2364 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2366 if (string_is_affirmative (prop->value())){
2369 mute_point = mute_point + ",";
2372 mute_point = mute_point + "Listen";
2377 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2379 if (string_is_affirmative (prop->value())){
2382 mute_point = mute_point + ",";
2385 mute_point = mute_point + "Main";
2389 _mute_master->set_mute_points (mute_point);
2390 _mute_master->set_muted_by_self (true);
2394 if ((prop = node.property (X_("meter-point"))) != 0) {
2395 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2398 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2399 don't mean the same thing.
2402 if ((prop = node.property (X_("order-keys"))) != 0) {
2406 string::size_type colon, equal;
2407 string remaining = prop->value();
2409 while (remaining.length()) {
2411 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2412 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2415 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2416 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2419 string keyname = remaining.substr (0, equal);
2421 if (keyname == "EditorSort" || keyname == "editor") {
2422 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2428 colon = remaining.find_first_of (':');
2430 if (colon != string::npos) {
2431 remaining = remaining.substr (colon+1);
2440 nlist = node.children ();
2441 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2445 if (child->name() == IO::state_node_name) {
2447 /* there is a note in IO::set_state_2X() about why we have to call
2451 _input->set_state_2X (*child, version, true);
2452 _output->set_state_2X (*child, version, false);
2454 if ((prop = child->property (X_("name"))) != 0) {
2455 Route::set_name (prop->value ());
2460 if ((prop = child->property (X_("active"))) != 0) {
2461 bool yn = string_is_affirmative (prop->value());
2462 _active = !yn; // force switch
2463 set_active (yn, this);
2466 if ((prop = child->property (X_("gain"))) != 0) {
2469 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2470 _amp->gain_control()->set_value (val);
2474 /* Set up Panners in the IO */
2475 XMLNodeList io_nlist = child->children ();
2477 XMLNodeConstIterator io_niter;
2480 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2482 io_child = *io_niter;
2484 if (io_child->name() == X_("Panner")) {
2485 _main_outs->panner_shell()->set_state(*io_child, version);
2486 } else if (io_child->name() == X_("Automation")) {
2487 /* IO's automation is for the fader */
2488 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2494 XMLNodeList redirect_nodes;
2496 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2500 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2501 redirect_nodes.push_back(child);
2506 set_processor_state_2X (redirect_nodes, version);
2508 Stateful::save_extra_xml (node);
2510 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2513 if (child->name() == X_("Comment")) {
2515 /* XXX this is a terrible API design in libxml++ */
2517 XMLNode *cmt = *(child->children().begin());
2518 _comment = cmt->content();
2520 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2521 if (prop->value() == X_("solo")) {
2522 _solo_control->set_state (*child, version);
2523 } else if (prop->value() == X_("mute")) {
2524 _mute_control->set_state (*child, version);
2527 } else if (child->name() == X_("RemoteControl")) {
2528 if ((prop = child->property (X_("id"))) != 0) {
2530 sscanf (prop->value().c_str(), "%d", &x);
2531 set_remote_control_id_internal (x);
2541 Route::get_processor_state ()
2543 XMLNode* root = new XMLNode (X_("redirects"));
2544 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2545 root->add_child_nocopy ((*i)->state (true));
2552 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2554 /* We don't bother removing existing processors not in nList, as this
2555 method will only be called when creating a Route from scratch, not
2556 for undo purposes. Just put processors in at the appropriate place
2560 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2561 add_processor_from_xml_2X (**i, version);
2566 Route::set_processor_state (const XMLNode& node)
2568 const XMLNodeList &nlist = node.children();
2569 XMLNodeConstIterator niter;
2570 ProcessorList new_order;
2571 bool must_configure = false;
2573 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2575 XMLProperty* prop = (*niter)->property ("type");
2577 if (prop->value() == "amp") {
2578 _amp->set_state (**niter, Stateful::current_state_version);
2579 new_order.push_back (_amp);
2580 } else if (prop->value() == "meter") {
2581 _meter->set_state (**niter, Stateful::current_state_version);
2582 new_order.push_back (_meter);
2583 } else if (prop->value() == "main-outs") {
2584 _main_outs->set_state (**niter, Stateful::current_state_version);
2585 } else if (prop->value() == "intreturn") {
2587 _intreturn.reset (new InternalReturn (_session));
2588 must_configure = true;
2590 _intreturn->set_state (**niter, Stateful::current_state_version);
2591 } else if (is_monitor() && prop->value() == "monitor") {
2592 if (!_monitor_control) {
2593 _monitor_control.reset (new MonitorProcessor (_session));
2594 must_configure = true;
2596 _monitor_control->set_state (**niter, Stateful::current_state_version);
2597 } else if (prop->value() == "capture") {
2598 /* CapturingProcessor should never be restored, it's always
2599 added explicitly when needed */
2601 ProcessorList::iterator o;
2603 for (o = _processors.begin(); o != _processors.end(); ++o) {
2604 XMLProperty* id_prop = (*niter)->property(X_("id"));
2605 if (id_prop && (*o)->id() == id_prop->value()) {
2606 (*o)->set_state (**niter, Stateful::current_state_version);
2607 new_order.push_back (*o);
2612 // If the processor (*niter) is not on the route then create it
2614 if (o == _processors.end()) {
2616 boost::shared_ptr<Processor> processor;
2618 if (prop->value() == "intsend") {
2620 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Aux, true));
2622 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2623 prop->value() == "lv2" ||
2624 prop->value() == "windows-vst" ||
2625 prop->value() == "lxvst" ||
2626 prop->value() == "audiounit") {
2628 processor.reset (new PluginInsert(_session));
2630 } else if (prop->value() == "port") {
2632 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2634 } else if (prop->value() == "send") {
2636 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2639 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2643 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2644 /* This processor could not be configured. Turn it into a UnknownProcessor */
2645 processor.reset (new UnknownProcessor (_session, **niter));
2648 /* we have to note the monitor send here, otherwise a new one will be created
2649 and the state of this one will be lost.
2651 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2652 if (isend && isend->role() == Delivery::Listen) {
2653 _monitor_send = isend;
2656 /* it doesn't matter if invisible processors are added here, as they
2657 will be sorted out by setup_invisible_processors () shortly.
2660 new_order.push_back (processor);
2661 must_configure = true;
2667 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2668 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2669 _processors = new_order;
2671 if (must_configure) {
2672 configure_processors_unlocked (0);
2675 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2677 (*i)->set_owner (this);
2678 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2680 boost::shared_ptr<PluginInsert> pi;
2682 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2683 if (pi->has_no_inputs ()) {
2684 _have_internal_generator = true;
2691 reset_instrument_info ();
2692 processors_changed (RouteProcessorChange ());
2693 set_processor_positions ();
2697 Route::curve_reallocate ()
2699 // _gain_automation_curve.finish_resize ();
2700 // _pan_automation_curve.finish_resize ();
2704 Route::silence (framecnt_t nframes)
2706 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2711 silence_unlocked (nframes);
2715 Route::silence_unlocked (framecnt_t nframes)
2717 /* Must be called with the processor lock held */
2721 _output->silence (nframes);
2723 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2724 boost::shared_ptr<PluginInsert> pi;
2726 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2727 // skip plugins, they don't need anything when we're not active
2731 (*i)->silence (nframes);
2734 if (nframes == _session.get_block_size()) {
2741 Route::add_internal_return ()
2744 _intreturn.reset (new InternalReturn (_session));
2745 add_processor (_intreturn, PreFader);
2750 Route::add_send_to_internal_return (InternalSend* send)
2752 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2754 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2755 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2758 return d->add_send (send);
2764 Route::remove_send_from_internal_return (InternalSend* send)
2766 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2768 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2769 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2772 return d->remove_send (send);
2778 Route::enable_monitor_send ()
2780 /* Caller must hold process lock */
2781 assert (!AudioEngine::instance()->process_lock().trylock());
2783 /* master never sends to monitor section via the normal mechanism */
2784 assert (!is_master ());
2785 assert (!is_monitor ());
2787 /* make sure we have one */
2788 if (!_monitor_send) {
2789 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2790 _monitor_send->set_display_to_user (false);
2794 configure_processors (0);
2797 /** Add an aux send to a route.
2798 * @param route route to send to.
2799 * @param before Processor to insert before, or 0 to insert at the end.
2802 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2804 assert (route != _session.monitor_out ());
2807 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2809 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2811 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2813 if (d && d->target_route() == route) {
2814 /* already listening via the specified IO: do nothing */
2822 boost::shared_ptr<InternalSend> listener;
2825 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2826 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
2827 listener.reset (new InternalSend (_session, sendpan, _mute_master, route, Delivery::Aux));
2830 add_processor (listener, before);
2832 } catch (failed_constructor& err) {
2840 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2842 ProcessorStreams err;
2843 ProcessorList::iterator tmp;
2846 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2848 /* have to do this early because otherwise processor reconfig
2849 * will put _monitor_send back in the list
2852 if (route == _session.monitor_out()) {
2853 _monitor_send.reset ();
2857 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2859 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2861 if (d && d->target_route() == route) {
2863 remove_processor (*x, &err, false);
2866 /* list could have been demolished while we dropped the lock
2877 Route::set_comment (string cmt, void *src)
2880 comment_changed (src);
2881 _session.set_dirty ();
2885 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2887 FeedRecord fr (other, via_sends_only);
2889 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2891 if (!result.second) {
2893 /* already a record for "other" - make sure sends-only information is correct */
2894 if (!via_sends_only && result.first->sends_only) {
2895 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2896 frp->sends_only = false;
2900 return result.second;
2904 Route::clear_fed_by ()
2910 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2912 const FedBy& fed_by (other->fed_by());
2914 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2915 boost::shared_ptr<Route> sr = f->r.lock();
2917 if (sr && (sr.get() == this)) {
2919 if (via_sends_only) {
2920 *via_sends_only = f->sends_only;
2931 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2933 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2935 if (_output->connected_to (other->input())) {
2936 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2937 if (via_send_only) {
2938 *via_send_only = false;
2945 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2947 boost::shared_ptr<IOProcessor> iop;
2949 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2950 if (iop->feeds (other)) {
2951 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2952 if (via_send_only) {
2953 *via_send_only = true;
2957 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2960 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2965 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2970 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2972 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2975 /** Called from the (non-realtime) butler thread when the transport is stopped */
2977 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
2979 framepos_t now = _session.transport_frame();
2982 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2984 Automatable::transport_stopped (now);
2986 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2988 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2992 (*i)->transport_stopped (now);
2996 _roll_delay = _initial_delay;
3000 Route::input_change_handler (IOChange change, void * /*src*/)
3002 bool need_to_queue_solo_change = true;
3004 if ((change.type & IOChange::ConfigurationChanged)) {
3005 /* This is called with the process lock held if change
3006 contains ConfigurationChanged
3008 need_to_queue_solo_change = false;
3009 configure_processors (0);
3010 _phase_invert.resize (_input->n_ports().n_audio ());
3011 io_changed (); /* EMIT SIGNAL */
3014 if (!_input->connected() && _soloed_by_others_upstream) {
3015 if (need_to_queue_solo_change) {
3016 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3018 cancel_solo_after_disconnect (true);
3024 Route::output_change_handler (IOChange change, void * /*src*/)
3026 bool need_to_queue_solo_change = true;
3027 if (_initial_io_setup) {
3031 if ((change.type & IOChange::ConfigurationChanged)) {
3032 /* This is called with the process lock held if change
3033 contains ConfigurationChanged
3035 need_to_queue_solo_change = false;
3036 configure_processors (0);
3037 io_changed (); /* EMIT SIGNAL */
3040 if (!_output->connected() && _soloed_by_others_downstream) {
3041 if (need_to_queue_solo_change) {
3042 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3044 cancel_solo_after_disconnect (false);
3050 Route::cancel_solo_after_disconnect (bool upstream)
3053 _soloed_by_others_upstream = 0;
3055 _soloed_by_others_downstream = 0;
3057 set_mute_master_solo ();
3058 solo_changed (false, this);
3062 Route::pans_required () const
3064 if (n_outputs().n_audio() < 2) {
3068 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3072 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3074 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3080 if (n_outputs().n_total() == 0) {
3084 if (!_active || n_inputs() == ChanCount::ZERO) {
3085 silence_unlocked (nframes);
3089 if (session_state_changing) {
3090 if (_session.transport_speed() != 0.0f) {
3091 /* we're rolling but some state is changing (e.g. our diskstream contents)
3092 so we cannot use them. Be silent till this is over.
3094 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3096 silence_unlocked (nframes);
3099 /* we're really not rolling, so we're either delivery silence or actually
3100 monitoring, both of which are safe to do while session_state_changing is true.
3104 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3106 fill_buffers_with_input (bufs, _input, nframes);
3108 if (_meter_point == MeterInput) {
3109 _meter->run (bufs, start_frame, end_frame, nframes, true);
3112 _amp->apply_gain_automation (false);
3113 passthru (bufs, start_frame, end_frame, nframes, 0);
3119 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3121 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3126 if (n_outputs().n_total() == 0) {
3130 if (!_active || n_inputs().n_total() == 0) {
3131 silence_unlocked (nframes);
3135 framepos_t unused = 0;
3137 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3143 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3145 fill_buffers_with_input (bufs, _input, nframes);
3147 if (_meter_point == MeterInput) {
3148 _meter->run (bufs, start_frame, end_frame, nframes, true);
3151 passthru (bufs, start_frame, end_frame, nframes, declick);
3157 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3164 Route::flush_processors ()
3166 /* XXX shouldn't really try to take this lock, since
3167 this is called from the RT audio thread.
3170 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3172 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3178 Route::set_meter_point (MeterPoint p, bool force)
3180 if (_meter_point == p && !force) {
3184 bool meter_was_visible_to_user = _meter->display_to_user ();
3187 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3188 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3190 maybe_note_meter_position ();
3194 if (_meter_point != MeterCustom) {
3196 _meter->set_display_to_user (false);
3198 setup_invisible_processors ();
3202 _meter->set_display_to_user (true);
3204 /* If we have a previous position for the custom meter, try to put it there */
3205 if (_custom_meter_position_noted) {
3206 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3209 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3210 if (i != _processors.end ()) {
3211 _processors.remove (_meter);
3212 _processors.insert (i, _meter);
3214 } else if (_last_custom_meter_was_at_end) {
3215 _processors.remove (_meter);
3216 _processors.push_back (_meter);
3221 /* Set up the meter for its new position */
3223 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3227 if (loc == _processors.begin()) {
3228 m_in = _input->n_ports();
3230 ProcessorList::iterator before = loc;
3232 m_in = (*before)->output_streams ();
3235 _meter->reflect_inputs (m_in);
3237 /* we do not need to reconfigure the processors, because the meter
3238 (a) is always ready to handle processor_max_streams
3239 (b) is always an N-in/N-out processor, and thus moving
3240 it doesn't require any changes to the other processors.
3244 meter_change (); /* EMIT SIGNAL */
3246 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3248 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3252 Route::listen_position_changed ()
3255 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3256 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3257 ProcessorState pstate (this);
3259 if (configure_processors_unlocked (0)) {
3261 configure_processors_unlocked (0); // it worked before we tried to add it ...
3266 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3267 _session.set_dirty ();
3270 boost::shared_ptr<CapturingProcessor>
3271 Route::add_export_point()
3273 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3274 if (!_capturing_processor) {
3276 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3277 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3279 _capturing_processor.reset (new CapturingProcessor (_session));
3280 _capturing_processor->activate ();
3282 configure_processors_unlocked (0);
3286 return _capturing_processor;
3290 Route::update_signal_latency ()
3292 framecnt_t l = _output->user_latency();
3294 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3295 if ((*i)->active ()) {
3296 l += (*i)->signal_latency ();
3300 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3302 if (_signal_latency != l) {
3303 _signal_latency = l;
3304 signal_latency_changed (); /* EMIT SIGNAL */
3307 return _signal_latency;
3311 Route::set_user_latency (framecnt_t nframes)
3313 _output->set_user_latency (nframes);
3314 _session.update_latency_compensation ();
3318 Route::set_latency_compensation (framecnt_t longest_session_latency)
3320 framecnt_t old = _initial_delay;
3322 if (_signal_latency < longest_session_latency) {
3323 _initial_delay = longest_session_latency - _signal_latency;
3328 DEBUG_TRACE (DEBUG::Latency, string_compose (
3329 "%1: compensate for maximum latency of %2,"
3330 "given own latency of %3, using initial delay of %4\n",
3331 name(), longest_session_latency, _signal_latency, _initial_delay));
3333 if (_initial_delay != old) {
3334 initial_delay_changed (); /* EMIT SIGNAL */
3337 if (_session.transport_stopped()) {
3338 _roll_delay = _initial_delay;
3342 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3343 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3344 boost::shared_ptr<AutomationList>(), name)
3347 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3352 Route::SoloControllable::set_value (double val)
3354 bool bval = ((val >= 0.5f) ? true: false);
3356 boost::shared_ptr<RouteList> rl (new RouteList);
3358 boost::shared_ptr<Route> r = _route.lock ();
3365 if (Config->get_solo_control_is_listen_control()) {
3366 _session.set_listen (rl, bval);
3368 _session.set_solo (rl, bval);
3373 Route::SoloControllable::get_value () const
3375 boost::shared_ptr<Route> r = _route.lock ();
3380 if (Config->get_solo_control_is_listen_control()) {
3381 return r->listening_via_monitor() ? 1.0f : 0.0f;
3383 return r->self_soloed() ? 1.0f : 0.0f;
3387 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3388 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3389 boost::shared_ptr<AutomationList>(), name)
3392 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3397 Route::MuteControllable::set_value (double val)
3399 bool bval = ((val >= 0.5f) ? true: false);
3401 boost::shared_ptr<RouteList> rl (new RouteList);
3403 boost::shared_ptr<Route> r = _route.lock ();
3409 _session.set_mute (rl, bval);
3413 Route::MuteControllable::get_value () const
3415 boost::shared_ptr<Route> r = _route.lock ();
3420 return r->muted() ? 1.0f : 0.0f;
3424 Route::set_block_size (pframes_t nframes)
3426 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3427 (*i)->set_block_size (nframes);
3430 _session.ensure_buffers (n_process_buffers ());
3434 Route::protect_automation ()
3436 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3437 (*i)->protect_automation();
3440 /** @param declick 1 to set a pending declick fade-in,
3441 * -1 to set a pending declick fade-out
3444 Route::set_pending_declick (int declick)
3447 /* this call is not allowed to turn off a pending declick */
3449 _pending_declick = declick;
3452 _pending_declick = 0;
3456 /** Shift automation forwards from a particular place, thereby inserting time.
3457 * Adds undo commands for any shifts that are performed.
3459 * @param pos Position to start shifting from.
3460 * @param frames Amount to shift forwards by.
3464 Route::shift (framepos_t pos, framecnt_t frames)
3466 /* gain automation */
3468 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3470 XMLNode &before = gc->alist()->get_state ();
3471 gc->alist()->shift (pos, frames);
3472 XMLNode &after = gc->alist()->get_state ();
3473 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3476 /* pan automation */
3478 ControlSet::Controls& c (_pannable->controls());
3480 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3481 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3483 boost::shared_ptr<AutomationList> al = pc->alist();
3484 XMLNode& before = al->get_state ();
3485 al->shift (pos, frames);
3486 XMLNode& after = al->get_state ();
3487 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3492 /* redirect automation */
3494 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3495 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3497 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3499 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3500 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3502 boost::shared_ptr<AutomationList> al = ac->alist();
3503 XMLNode &before = al->get_state ();
3504 al->shift (pos, frames);
3505 XMLNode &after = al->get_state ();
3506 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3515 Route::save_as_template (const string& path, const string& name)
3517 XMLNode& node (state (false));
3520 IO::set_name_in_state (*node.children().front(), name);
3522 tree.set_root (&node);
3523 return tree.write (path.c_str());
3528 Route::set_name (const string& str)
3534 name = Route::ensure_track_or_route_name (str, _session);
3535 SessionObject::set_name (name);
3537 ret = (_input->set_name(name) && _output->set_name(name));
3540 /* rename the main outs. Leave other IO processors
3541 * with whatever name they already have, because its
3542 * just fine as it is (it will not contain the route
3543 * name if its a port insert, port send or port return).
3547 if (_main_outs->set_name (name)) {
3548 /* XXX returning false here is stupid because
3549 we already changed the route name.
3559 /** Set the name of a route in an XML description.
3560 * @param node XML <Route> node to set the name in.
3561 * @param name New name.
3564 Route::set_name_in_state (XMLNode& node, string const & name)
3566 node.add_property (X_("name"), name);
3568 XMLNodeList children = node.children();
3569 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3571 if ((*i)->name() == X_("IO")) {
3573 IO::set_name_in_state (**i, name);
3575 } else if ((*i)->name() == X_("Processor")) {
3577 XMLProperty* role = (*i)->property (X_("role"));
3578 if (role && role->value() == X_("Main")) {
3579 (*i)->add_property (X_("name"), name);
3582 } else if ((*i)->name() == X_("Diskstream")) {
3584 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3585 (*i)->add_property (X_("name"), name);
3591 boost::shared_ptr<Send>
3592 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3594 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3596 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3597 boost::shared_ptr<InternalSend> send;
3599 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3600 if (send->target_route() == target) {
3606 return boost::shared_ptr<Send>();
3609 /** @param c Audio channel index.
3610 * @param yn true to invert phase, otherwise false.
3613 Route::set_phase_invert (uint32_t c, bool yn)
3615 if (_phase_invert[c] != yn) {
3616 _phase_invert[c] = yn;
3617 phase_invert_changed (); /* EMIT SIGNAL */
3618 _session.set_dirty ();
3623 Route::set_phase_invert (boost::dynamic_bitset<> p)
3625 if (_phase_invert != p) {
3627 phase_invert_changed (); /* EMIT SIGNAL */
3628 _session.set_dirty ();
3633 Route::phase_invert (uint32_t c) const
3635 return _phase_invert[c];
3638 boost::dynamic_bitset<>
3639 Route::phase_invert () const
3641 return _phase_invert;
3645 Route::set_denormal_protection (bool yn)
3647 if (_denormal_protection != yn) {
3648 _denormal_protection = yn;
3649 denormal_protection_changed (); /* EMIT SIGNAL */
3654 Route::denormal_protection () const
3656 return _denormal_protection;
3660 Route::set_active (bool yn, void* src)
3662 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3663 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3667 if (_active != yn) {
3669 _input->set_active (yn);
3670 _output->set_active (yn);
3671 active_changed (); // EMIT SIGNAL
3672 _session.set_dirty ();
3679 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3685 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3687 boost::shared_ptr<Send> s;
3688 boost::shared_ptr<Return> r;
3690 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3691 s->meter()->meter();
3692 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3693 r->meter()->meter ();
3698 boost::shared_ptr<Pannable>
3699 Route::pannable() const
3704 boost::shared_ptr<Panner>
3705 Route::panner() const
3708 return _main_outs->panner_shell()->panner();
3711 boost::shared_ptr<PannerShell>
3712 Route::panner_shell() const
3714 return _main_outs->panner_shell();
3717 boost::shared_ptr<AutomationControl>
3718 Route::gain_control() const
3720 return _amp->gain_control();
3723 boost::shared_ptr<AutomationControl>
3724 Route::get_control (const Evoral::Parameter& param)
3726 /* either we own the control or .... */
3728 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3732 /* maybe one of our processors does or ... */
3734 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3735 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3736 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3744 /* nobody does so we'll make a new one */
3746 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3753 boost::shared_ptr<Processor>
3754 Route::nth_plugin (uint32_t n)
3756 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3757 ProcessorList::iterator i;
3759 for (i = _processors.begin(); i != _processors.end(); ++i) {
3760 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3767 return boost::shared_ptr<Processor> ();
3770 boost::shared_ptr<Processor>
3771 Route::nth_send (uint32_t n)
3773 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3774 ProcessorList::iterator i;
3776 for (i = _processors.begin(); i != _processors.end(); ++i) {
3777 if (boost::dynamic_pointer_cast<Send> (*i)) {
3784 return boost::shared_ptr<Processor> ();
3788 Route::has_io_processor_named (const string& name)
3790 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3791 ProcessorList::iterator i;
3793 for (i = _processors.begin(); i != _processors.end(); ++i) {
3794 if (boost::dynamic_pointer_cast<Send> (*i) ||
3795 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3796 if ((*i)->name() == name) {
3805 MuteMaster::MutePoint
3806 Route::mute_points () const
3808 return _mute_master->mute_points ();
3812 Route::set_processor_positions ()
3814 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3816 bool had_amp = false;
3817 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3818 (*i)->set_pre_fader (!had_amp);
3819 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3825 /** Called when there is a proposed change to the input port count */
3827 Route::input_port_count_changing (ChanCount to)
3829 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3831 /* The processors cannot be configured with the new input arrangement, so
3837 /* The change is ok */
3841 /** Called when there is a proposed change to the output port count */
3843 Route::output_port_count_changing (ChanCount to)
3845 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3846 if (processor_out_streams.get(*t) > to.get(*t)) {
3850 /* The change is ok */
3855 Route::unknown_processors () const
3859 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3860 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3861 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3862 p.push_back ((*i)->name ());
3871 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3873 /* we assume that all our input ports feed all our output ports. its not
3874 universally true, but the alternative is way too corner-case to worry about.
3877 LatencyRange all_connections;
3880 all_connections.min = 0;
3881 all_connections.max = 0;
3883 all_connections.min = ~((pframes_t) 0);
3884 all_connections.max = 0;
3886 /* iterate over all "from" ports and determine the latency range for all of their
3887 connections to the "outside" (outside of this Route).
3890 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3894 p->get_connected_latency_range (range, playback);
3896 all_connections.min = min (all_connections.min, range.min);
3897 all_connections.max = max (all_connections.max, range.max);
3901 /* set the "from" port latencies to the max/min range of all their connections */
3903 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3904 p->set_private_latency_range (all_connections, playback);
3907 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3909 all_connections.min += our_latency;
3910 all_connections.max += our_latency;
3912 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3913 p->set_private_latency_range (all_connections, playback);
3916 return all_connections.max;
3920 Route::set_private_port_latencies (bool playback) const
3922 framecnt_t own_latency = 0;
3924 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3925 OR LATENCY CALLBACK.
3927 This is called (early) from the latency callback. It computes the REAL
3928 latency associated with each port and stores the result as the "private"
3929 latency of the port. A later call to Route::set_public_port_latencies()
3930 sets all ports to the same value to reflect the fact that we do latency
3931 compensation and so all signals are delayed by the same amount as they
3932 flow through ardour.
3935 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3936 if ((*i)->active ()) {
3937 own_latency += (*i)->signal_latency ();
3942 /* playback: propagate latency from "outside the route" to outputs to inputs */
3943 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3945 /* capture: propagate latency from "outside the route" to inputs to outputs */
3946 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3951 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3953 /* this is called to set the JACK-visible port latencies, which take
3954 latency compensation into account.
3963 const PortSet& ports (_input->ports());
3964 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3965 p->set_public_latency_range (range, playback);
3970 const PortSet& ports (_output->ports());
3971 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3972 p->set_public_latency_range (range, playback);
3977 /** Put the invisible processors in the right place in _processors.
3978 * Must be called with a writer lock on _processor_lock held.
3981 Route::setup_invisible_processors ()
3984 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3985 assert (!lm.locked ());
3989 /* too early to be doing this stuff */
3993 /* we'll build this new list here and then use it */
3995 ProcessorList new_processors;
3997 /* find visible processors */
3999 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4000 if ((*i)->display_to_user ()) {
4001 new_processors.push_back (*i);
4007 ProcessorList::iterator amp = new_processors.begin ();
4008 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
4012 assert (amp != new_processors.end ());
4014 /* and the processor after the amp */
4016 ProcessorList::iterator after_amp = amp;
4022 switch (_meter_point) {
4024 assert (!_meter->display_to_user ());
4025 new_processors.push_front (_meter);
4028 assert (!_meter->display_to_user ());
4029 new_processors.insert (amp, _meter);
4031 case MeterPostFader:
4032 /* do nothing here */
4035 /* do nothing here */
4038 /* the meter is visible, so we don't touch it here */
4045 assert (_main_outs);
4046 assert (!_main_outs->display_to_user ());
4047 new_processors.push_back (_main_outs);
4049 /* iterator for the main outs */
4051 ProcessorList::iterator main = new_processors.end();
4054 /* OUTPUT METERING */
4056 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4057 assert (!_meter->display_to_user ());
4059 /* add the processor just before or just after the main outs */
4061 ProcessorList::iterator meter_point = main;
4063 if (_meter_point == MeterOutput) {
4066 new_processors.insert (meter_point, _meter);
4071 if (_monitor_send && !is_monitor ()) {
4072 assert (!_monitor_send->display_to_user ());
4073 if (Config->get_solo_control_is_listen_control()) {
4074 switch (Config->get_listen_position ()) {
4075 case PreFaderListen:
4076 switch (Config->get_pfl_position ()) {
4077 case PFLFromBeforeProcessors:
4078 new_processors.push_front (_monitor_send);
4080 case PFLFromAfterProcessors:
4081 new_processors.insert (amp, _monitor_send);
4084 _monitor_send->set_can_pan (false);
4086 case AfterFaderListen:
4087 switch (Config->get_afl_position ()) {
4088 case AFLFromBeforeProcessors:
4089 new_processors.insert (after_amp, _monitor_send);
4091 case AFLFromAfterProcessors:
4092 new_processors.insert (new_processors.end(), _monitor_send);
4095 _monitor_send->set_can_pan (true);
4099 new_processors.insert (new_processors.end(), _monitor_send);
4100 _monitor_send->set_can_pan (false);
4104 /* MONITOR CONTROL */
4106 if (_monitor_control && is_monitor ()) {
4107 assert (!_monitor_control->display_to_user ());
4108 new_processors.push_front (_monitor_control);
4111 /* INTERNAL RETURN */
4113 /* doing this here means that any monitor control will come just after
4118 assert (!_intreturn->display_to_user ());
4119 new_processors.push_front (_intreturn);
4122 /* EXPORT PROCESSOR */
4124 if (_capturing_processor) {
4125 assert (!_capturing_processor->display_to_user ());
4126 new_processors.push_front (_capturing_processor);
4129 _processors = new_processors;
4131 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4132 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4133 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4140 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4141 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4145 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4146 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4153 /** If the meter point is `Custom', make a note of where the meter is.
4154 * This is so that if the meter point is subsequently set to something else,
4155 * and then back to custom, we can put the meter back where it was last time
4156 * custom was enabled.
4158 * Must be called with the _processor_lock held.
4161 Route::maybe_note_meter_position ()
4163 if (_meter_point != MeterCustom) {
4167 _custom_meter_position_noted = true;
4168 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4169 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4170 ProcessorList::iterator j = i;
4172 if (j != _processors.end ()) {
4173 _processor_after_last_custom_meter = *j;
4174 _last_custom_meter_was_at_end = false;
4176 _last_custom_meter_was_at_end = true;
4182 boost::shared_ptr<Processor>
4183 Route::processor_by_id (PBD::ID id) const
4185 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4186 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4187 if ((*i)->id() == id) {
4192 return boost::shared_ptr<Processor> ();
4195 /** @return the monitoring state, or in other words what data we are pushing
4196 * into the route (data from the inputs, data from disk or silence)
4199 Route::monitoring_state () const
4201 return MonitoringInput;
4204 /** @return what we should be metering; either the data coming from the input
4205 * IO or the data that is flowing through the route.
4208 Route::metering_state () const
4210 return MeteringRoute;
4214 Route::has_external_redirects () const
4216 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4218 /* ignore inactive processors and obviously ignore the main
4219 * outs since everything has them and we don't care.
4222 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4230 boost::shared_ptr<Processor>
4231 Route::the_instrument () const
4233 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4234 return the_instrument_unlocked ();
4237 boost::shared_ptr<Processor>
4238 Route::the_instrument_unlocked () const
4240 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4241 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4242 if ((*i)->input_streams().n_midi() > 0 &&
4243 (*i)->output_streams().n_audio() > 0) {
4248 return boost::shared_ptr<Processor>();
4254 Route::non_realtime_locate (framepos_t pos)
4257 _pannable->transport_located (pos);
4261 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4262 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4264 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4265 (*i)->transport_located (pos);
4271 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4278 * We don't currently mix MIDI input together, so we don't need the
4279 * complex logic of the audio case.
4282 n_buffers = bufs.count().n_midi ();
4284 for (i = 0; i < n_buffers; ++i) {
4286 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4287 MidiBuffer& buf (bufs.get_midi (i));
4290 buf.copy (source_port->get_midi_buffer(nframes));
4292 buf.silence (nframes);
4298 n_buffers = bufs.count().n_audio();
4300 size_t n_ports = io->n_ports().n_audio();
4301 float scaling = 1.0f;
4303 if (n_ports > n_buffers) {
4304 scaling = ((float) n_buffers) / n_ports;
4307 for (i = 0; i < n_ports; ++i) {
4309 /* if there are more ports than buffers, map them onto buffers
4310 * in a round-robin fashion
4313 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4314 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4317 if (i < n_buffers) {
4319 /* first time through just copy a channel into
4323 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4325 if (scaling != 1.0f) {
4326 buf.apply_gain (scaling, nframes);
4331 /* on subsequent times around, merge data from
4332 * the port with what is already there
4335 if (scaling != 1.0f) {
4336 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4338 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4343 /* silence any remaining buffers */
4345 for (; i < n_buffers; ++i) {
4346 AudioBuffer& buf (bufs.get_audio (i));
4347 buf.silence (nframes);
4350 /* establish the initial setup of the buffer set, reflecting what was
4351 copied into it. unless, of course, we are the auditioner, in which
4352 case nothing was fed into it from the inputs at all.
4355 if (!is_auditioner()) {
4356 bufs.set_count (io->n_ports());