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"
30 #include <boost/algorithm/string.hpp>
32 #include "pbd/xml++.h"
33 #include "pbd/enumwriter.h"
34 #include "pbd/memento_command.h"
35 #include "pbd/stacktrace.h"
36 #include "pbd/convert.h"
37 #include "pbd/boost_debug.h"
39 #include "ardour/amp.h"
40 #include "ardour/audio_buffer.h"
41 #include "ardour/audio_track.h"
42 #include "ardour/audio_port.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/buffer.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/capturing_processor.h"
47 #include "ardour/debug.h"
48 #include "ardour/delivery.h"
49 #include "ardour/internal_return.h"
50 #include "ardour/internal_send.h"
51 #include "ardour/meter.h"
52 #include "ardour/delayline.h"
53 #include "ardour/midi_buffer.h"
54 #include "ardour/midi_port.h"
55 #include "ardour/monitor_processor.h"
56 #include "ardour/pannable.h"
57 #include "ardour/panner.h"
58 #include "ardour/panner_shell.h"
59 #include "ardour/plugin_insert.h"
60 #include "ardour/port.h"
61 #include "ardour/port_insert.h"
62 #include "ardour/processor.h"
63 #include "ardour/profile.h"
64 #include "ardour/route.h"
65 #include "ardour/route_group.h"
66 #include "ardour/send.h"
67 #include "ardour/session.h"
68 #include "ardour/unknown_processor.h"
69 #include "ardour/utils.h"
74 using namespace ARDOUR;
77 PBD::Signal0<void> Route::SyncOrderKeys;
78 PBD::Signal0<void> Route::RemoteControlIDChange;
80 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
81 : SessionObject (sess, name)
83 , GraphNode (sess._process_graph)
86 , _signal_latency_at_amp_position (0)
87 , _signal_latency_at_trim_position (0)
90 , _pending_process_reorder (0)
92 , _pending_declick (true)
93 , _meter_point (MeterPostFader)
94 , _pending_meter_point (MeterPostFader)
95 , _meter_type (MeterPeak)
97 , _soloed_by_others_upstream (0)
98 , _soloed_by_others_downstream (0)
100 , _solo_isolated_by_upstream (0)
101 , _denormal_protection (false)
104 , _declickable (false)
105 , _mute_master (new MuteMaster (sess, name))
106 , _have_internal_generator (false)
108 , _default_type (default_type)
110 , _has_order_key (false)
111 , _remote_control_id (0)
113 , _in_configure_processors (false)
114 , _initial_io_setup (false)
115 , _custom_meter_position_noted (false)
117 processor_max_streams.reset();
123 /* set default meter type */
125 _meter_type = Config->get_meter_type_master ();
127 else if (dynamic_cast<Track*>(this)) {
128 _meter_type = Config->get_meter_type_track ();
130 _meter_type = Config->get_meter_type_bus ();
133 /* add standard controls */
135 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
136 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
138 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
139 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
141 add_control (_solo_control);
142 add_control (_mute_control);
146 if (!(_flags & Route::MonitorOut)) {
147 _pannable.reset (new Pannable (_session));
150 /* input and output objects */
152 _input.reset (new IO (_session, _name, IO::Input, _default_type));
153 _output.reset (new IO (_session, _name, IO::Output, _default_type));
155 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
156 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
158 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
159 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
161 #if 0 // not used - just yet
162 if (!is_master() && !is_monitor() && !is_auditioner()) {
163 _delayline.reset (new DelayLine (_session, _name));
164 add_processor (_delayline, PreFader);
168 /* add amp processor */
170 _amp.reset (new Amp (_session));
171 add_processor (_amp, PostFader);
174 _trim.reset (new Amp (_session, "trim"));
175 _trim->set_display_to_user (false);
177 if (dynamic_cast<AudioTrack*>(this)) {
178 /* we can't do this in the AudioTrack's constructor
179 * because _trim does not exit then
183 else if (!dynamic_cast<Track*>(this) && ! ( is_monitor() || is_auditioner() )) {
188 /* create standard processors: meter, main outs, monitor out;
189 they will be added to _processors by setup_invisible_processors ()
192 _meter.reset (new PeakMeter (_session, _name));
193 _meter->set_owner (this);
194 _meter->set_display_to_user (false);
197 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
198 _main_outs->activate ();
201 /* where we listen to tracks */
202 _intreturn.reset (new InternalReturn (_session));
203 _intreturn->activate ();
205 /* the thing that provides proper control over a control/monitor/listen bus
206 (such as per-channel cut, dim, solo, invert, etc).
208 _monitor_control.reset (new MonitorProcessor (_session));
209 _monitor_control->activate ();
212 if (is_master() || is_monitor() || is_auditioner()) {
213 _mute_master->set_solo_ignore (true);
216 /* now that we have _meter, its safe to connect to this */
219 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
220 configure_processors (0);
228 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
230 /* do this early so that we don't get incoming signals as we are going through destruction
235 /* don't use clear_processors here, as it depends on the session which may
236 be half-destroyed by now
239 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
240 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
241 (*i)->drop_references ();
244 _processors.clear ();
248 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
250 if (Config->get_remote_model() != UserOrdered) {
254 set_remote_control_id_internal (id, notify_class_listeners);
258 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
260 /* force IDs for master/monitor busses and prevent
261 any other route from accidentally getting these IDs
262 (i.e. legacy sessions)
265 if (is_master() && id != MasterBusRemoteControlID) {
266 id = MasterBusRemoteControlID;
269 if (is_monitor() && id != MonitorBusRemoteControlID) {
270 id = MonitorBusRemoteControlID;
277 /* don't allow it to collide */
279 if (!is_master () && !is_monitor() &&
280 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
281 id += MonitorBusRemoteControlID;
284 if (id != remote_control_id()) {
285 _remote_control_id = id;
286 RemoteControlIDChanged ();
288 if (notify_class_listeners) {
289 RemoteControlIDChange ();
295 Route::remote_control_id() const
298 return MasterBusRemoteControlID;
302 return MonitorBusRemoteControlID;
305 return _remote_control_id;
309 Route::has_order_key () const
311 return _has_order_key;
315 Route::order_key () const
321 Route::set_remote_control_id_explicit (uint32_t rid)
323 if (is_master() || is_monitor() || is_auditioner()) {
324 /* hard-coded remote IDs, or no remote ID */
328 if (_remote_control_id != rid) {
329 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
330 _remote_control_id = rid;
331 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
334 /* don't emit the class-level RID signal RemoteControlIDChange here,
335 leave that to the entity that changed the order key, so that we
336 don't get lots of emissions for no good reasons (e.g. when changing
337 all route order keys).
339 See Session::sync_remote_id_from_order_keys() for the (primary|only)
340 spot where that is emitted.
345 Route::set_order_key (uint32_t n)
347 _has_order_key = true;
349 if (_order_key == n) {
355 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
356 name(), order_key ()));
358 _session.set_dirty ();
362 Route::ensure_track_or_route_name(string name, Session &session)
364 string newname = name;
366 while (!session.io_name_is_legal (newname)) {
367 newname = bump_name_once (newname, '.');
374 Route::inc_gain (gain_t fraction, void *src)
376 _amp->inc_gain (fraction, src);
380 Route::set_gain (gain_t val, void *src)
382 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
384 if (_route_group->is_relative()) {
386 gain_t usable_gain = _amp->gain();
387 if (usable_gain < 0.000001f) {
388 usable_gain = 0.000001f;
392 if (delta < 0.000001f) {
396 delta -= usable_gain;
401 gain_t factor = delta / usable_gain;
404 factor = _route_group->get_max_factor(factor);
405 if (factor == 0.0f) {
406 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
410 factor = _route_group->get_min_factor(factor);
411 if (factor == 0.0f) {
412 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
417 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
421 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
427 if (val == _amp->gain()) {
431 _amp->set_gain (val, src);
435 Route::inc_trim (gain_t fraction, void *src)
437 _trim->inc_gain (fraction, src);
441 Route::set_trim (gain_t val, void * /* src */)
443 // TODO route group, see set_gain()
444 _trim->set_gain (val, 0);
448 Route::maybe_declick (BufferSet&, framecnt_t, int)
450 /* this is the "bus" implementation and they never declick.
455 /** Process this route for one (sub) cycle (process thread)
457 * @param bufs Scratch buffers to use for the signal path
458 * @param start_frame Initial transport frame
459 * @param end_frame Final transport frame
460 * @param nframes Number of frames to output (to ports)
462 * Note that (end_frame - start_frame) may not be equal to nframes when the
463 * transport speed isn't 1.0 (eg varispeed).
466 Route::process_output_buffers (BufferSet& bufs,
467 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
468 int declick, bool gain_automation_ok)
470 /* Caller must hold process lock */
471 assert (!AudioEngine::instance()->process_lock().trylock());
473 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
475 // can this actually happen? functions calling process_output_buffers()
476 // already take a reader-lock.
477 bufs.silence (nframes, 0);
481 /* figure out if we're going to use gain automation */
482 if (gain_automation_ok) {
483 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
484 _amp->setup_gain_automation (
485 start_frame + _signal_latency_at_amp_position,
486 end_frame + _signal_latency_at_amp_position,
489 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
490 _trim->setup_gain_automation (
491 start_frame + _signal_latency_at_trim_position,
492 end_frame + _signal_latency_at_trim_position,
495 _amp->apply_gain_automation (false);
496 _trim->apply_gain_automation (false);
499 /* Tell main outs what to do about monitoring. We do this so that
500 on a transition between monitoring states we get a de-clicking gain
501 change in the _main_outs delivery.
503 bool silence = monitoring_state () == MonitoringSilence;
505 //but we override this in the case where we have an internal generator
506 if ( _have_internal_generator )
509 _main_outs->no_outs_cuz_we_no_monitor (silence);
511 /* -------------------------------------------------------------------------------------------
512 GLOBAL DECLICK (for transport changes etc.)
513 ----------------------------------------------------------------------------------------- */
515 maybe_declick (bufs, nframes, declick);
516 _pending_declick = 0;
518 /* -------------------------------------------------------------------------------------------
519 DENORMAL CONTROL/PHASE INVERT
520 ----------------------------------------------------------------------------------------- */
522 if (_phase_invert.any ()) {
526 if (_denormal_protection || Config->get_denormal_protection()) {
528 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
529 Sample* const sp = i->data();
531 if (_phase_invert[chn]) {
532 for (pframes_t nx = 0; nx < nframes; ++nx) {
537 for (pframes_t nx = 0; nx < nframes; ++nx) {
545 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
546 Sample* const sp = i->data();
548 if (_phase_invert[chn]) {
549 for (pframes_t nx = 0; nx < nframes; ++nx) {
558 if (_denormal_protection || Config->get_denormal_protection()) {
560 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
561 Sample* const sp = i->data();
562 for (pframes_t nx = 0; nx < nframes; ++nx) {
570 /* -------------------------------------------------------------------------------------------
572 ----------------------------------------------------------------------------------------- */
574 /* set this to be true if the meter will already have been ::run() earlier */
575 bool const meter_already_run = metering_state() == MeteringInput;
577 framecnt_t latency = 0;
579 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
581 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
582 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
587 /* if it has any inputs, make sure they match */
588 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
589 if (bufs.count() != (*i)->input_streams()) {
591 DEBUG::Processors, string_compose (
592 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
593 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
600 /* should we NOT run plugins here if the route is inactive?
601 do we catch route != active somewhere higher?
604 if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
605 boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
608 (*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
609 bufs.set_count ((*i)->output_streams());
611 if ((*i)->active ()) {
612 latency += (*i)->signal_latency ();
618 Route::bounce_process (BufferSet& buffers, framepos_t start, framecnt_t nframes,
619 boost::shared_ptr<Processor> endpoint,
620 bool include_endpoint, bool for_export, bool for_freeze)
622 /* If no processing is required, there's no need to go any further. */
623 if (!endpoint && !include_endpoint) {
627 framecnt_t latency = bounce_get_latency(_amp, false, for_export, for_freeze);
628 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
629 _amp->setup_gain_automation (start - latency, start - latency + nframes, nframes);
631 /* trim is always at the top, for bounce no latency compensation is needed */
632 _trim->set_gain_automation_buffer (_session.trim_automation_buffer ());
633 _trim->setup_gain_automation (start, start + nframes, nframes);
636 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
638 if (!include_endpoint && (*i) == endpoint) {
642 /* if we're not exporting, stop processing if we come across a routing processor. */
643 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
646 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
650 /* don't run any processors that does routing.
651 * oh, and don't bother with the peak meter either.
653 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
654 (*i)->run (buffers, start - latency, start - latency + nframes, nframes, true);
655 buffers.set_count ((*i)->output_streams());
656 latency += (*i)->signal_latency ();
659 if ((*i) == endpoint) {
666 Route::bounce_get_latency (boost::shared_ptr<Processor> endpoint,
667 bool include_endpoint, bool for_export, bool for_freeze) const
669 framecnt_t latency = 0;
670 if (!endpoint && !include_endpoint) {
674 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
675 if (!include_endpoint && (*i) == endpoint) {
678 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
681 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
684 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
685 latency += (*i)->signal_latency ();
687 if ((*i) == endpoint) {
695 Route::bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint,
696 bool include_endpoint, bool for_export, bool for_freeze) const
698 if (!endpoint && !include_endpoint) {
702 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
703 if (!include_endpoint && (*i) == endpoint) {
706 if (!for_export && boost::dynamic_pointer_cast<PortInsert>(*i)) {
709 if (!for_export && for_freeze && (*i)->does_routing() && (*i)->active()) {
712 if (!(*i)->does_routing() && !boost::dynamic_pointer_cast<PeakMeter>(*i)) {
713 cc = (*i)->output_streams();
715 if ((*i) == endpoint) {
723 Route::n_process_buffers ()
725 return max (_input->n_ports(), processor_max_streams);
729 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
731 assert (is_monitor());
732 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
733 fill_buffers_with_input (bufs, _input, nframes);
734 passthru (bufs, start_frame, end_frame, nframes, declick);
738 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
742 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
744 /* control/monitor bus ignores input ports when something is
745 feeding the listen "stream". data will "arrive" into the
746 route from the intreturn processor element.
749 bufs.silence (nframes, 0);
752 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
753 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
757 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
759 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
761 bufs.set_count (_input->n_ports());
762 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
763 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
767 Route::set_listen (bool yn, void* src)
773 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
774 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
779 if (yn != _monitor_send->active()) {
781 _monitor_send->activate ();
782 _mute_master->set_soloed (true);
784 _monitor_send->deactivate ();
785 _mute_master->set_soloed (false);
788 listen_changed (src); /* EMIT SIGNAL */
794 Route::listening_via_monitor () const
797 return _monitor_send->active ();
804 Route::set_solo_safe (bool yn, void *src)
806 if (_solo_safe != yn) {
808 solo_safe_changed (src);
813 Route::solo_safe() const
819 Route::set_solo (bool yn, void *src)
822 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
826 if (is_master() || is_monitor() || is_auditioner()) {
827 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change (master, monitor or auditioner)\n", name()));
831 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
832 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
836 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
837 name(), yn, src, (src == _route_group), self_soloed()));
839 if (self_soloed() != yn) {
841 set_mute_master_solo ();
842 solo_changed (true, src); /* EMIT SIGNAL */
843 _solo_control->Changed (); /* EMIT SIGNAL */
846 /* XXX TRACKS DEVELOPERS: THIS LOGIC SUGGESTS THAT YOU ARE NOT AWARE OF
847 Config->get_solo_mute_overrride().
850 if (yn && Profile->get_trx()) {
851 set_mute (false, src);
856 Route::set_self_solo (bool yn)
858 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
863 Route::mod_solo_by_others_upstream (int32_t delta)
866 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
870 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
871 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
873 uint32_t old_sbu = _soloed_by_others_upstream;
876 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
877 _soloed_by_others_upstream += delta;
879 _soloed_by_others_upstream = 0;
882 _soloed_by_others_upstream += delta;
885 DEBUG_TRACE (DEBUG::Solo, string_compose (
886 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
887 name(), delta, _soloed_by_others_upstream, old_sbu,
888 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
890 /* push the inverse solo change to everything that feeds us.
892 This is important for solo-within-group. When we solo 1 track out of N that
893 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
894 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
895 tracks that feed it. This will silence them if they were audible because
896 of a bus solo, but the newly soloed track will still be audible (because
899 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
903 if ((_self_solo || _soloed_by_others_downstream) &&
904 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
905 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
907 if (delta > 0 || !Config->get_exclusive_solo()) {
908 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
909 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
910 boost::shared_ptr<Route> sr = i->r.lock();
912 sr->mod_solo_by_others_downstream (-delta);
918 set_mute_master_solo ();
919 solo_changed (false, this);
923 Route::mod_solo_by_others_downstream (int32_t delta)
926 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
930 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
931 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
934 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
935 _soloed_by_others_downstream += delta;
937 _soloed_by_others_downstream = 0;
940 _soloed_by_others_downstream += delta;
943 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
945 set_mute_master_solo ();
946 solo_changed (false, this);
950 Route::set_mute_master_solo ()
952 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
956 Route::mod_solo_isolated_by_upstream (bool yn, void* src)
958 bool old = solo_isolated ();
961 if (_solo_isolated_by_upstream >= 1) {
962 _solo_isolated_by_upstream--;
964 _solo_isolated_by_upstream = 0;
967 _solo_isolated_by_upstream++;
970 if (solo_isolated() != old) {
971 /* solo isolated status changed */
972 _mute_master->set_solo_ignore (yn);
973 solo_isolated_changed (src);
978 Route::set_solo_isolated (bool yn, void *src)
980 if (is_master() || is_monitor() || is_auditioner()) {
984 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
985 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
989 bool changed = false;
992 if (_solo_isolated == 0) {
993 _mute_master->set_solo_ignore (true);
998 if (_solo_isolated > 0) {
1000 if (_solo_isolated == 0) {
1001 _mute_master->set_solo_ignore (false);
1012 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
1014 boost::shared_ptr<RouteList> routes = _session.get_routes ();
1015 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
1017 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
1022 bool does_feed = feeds (*i, &sends_only);
1024 if (does_feed && !sends_only) {
1025 (*i)->mod_solo_isolated_by_upstream (yn, src);
1029 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
1031 solo_isolated_changed (src);
1035 Route::solo_isolated () const
1037 return (_solo_isolated > 0) || (_solo_isolated_by_upstream > 0);
1041 Route::set_mute_points (MuteMaster::MutePoint mp)
1043 _mute_master->set_mute_points (mp);
1044 mute_points_changed (); /* EMIT SIGNAL */
1046 if (_mute_master->muted_by_self()) {
1047 mute_changed (this); /* EMIT SIGNAL */
1048 _mute_control->Changed (); /* EMIT SIGNAL */
1053 Route::set_mute (bool yn, void *src)
1055 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
1056 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
1060 if (muted() != yn) {
1061 _mute_master->set_muted_by_self (yn);
1062 /* allow any derived classes to respond to the mute change
1063 before anybody else knows about it.
1066 /* tell everyone else */
1067 mute_changed (src); /* EMIT SIGNAL */
1068 _mute_control->Changed (); /* EMIT SIGNAL */
1073 Route::muted () const
1075 return _mute_master->muted_by_self();
1079 Route::muted_by_others () const
1081 //master is never muted by others
1085 //now check to see if something is soloed (and I am not)
1086 return (_session.soloing() && !self_soloed() && !solo_isolated());
1091 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
1093 cerr << name << " {" << endl;
1094 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
1095 p != procs.end(); ++p) {
1096 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
1098 cerr << "}" << endl;
1102 /** Supposing that we want to insert a Processor at a given Placement, return
1103 * the processor to add the new one before (or 0 to add at the end).
1105 boost::shared_ptr<Processor>
1106 Route::before_processor_for_placement (Placement p)
1108 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1110 ProcessorList::iterator loc;
1112 if (p == PreFader) {
1113 /* generic pre-fader: insert immediately before the amp */
1114 loc = find (_processors.begin(), _processors.end(), _amp);
1116 /* generic post-fader: insert right before the main outs */
1117 loc = find (_processors.begin(), _processors.end(), _main_outs);
1120 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
1123 /** Supposing that we want to insert a Processor at a given index, return
1124 * the processor to add the new one before (or 0 to add at the end).
1126 boost::shared_ptr<Processor>
1127 Route::before_processor_for_index (int index)
1130 return boost::shared_ptr<Processor> ();
1133 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1135 ProcessorList::iterator i = _processors.begin ();
1137 while (i != _processors.end() && j < index) {
1138 if ((*i)->display_to_user()) {
1145 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
1148 /** Add a processor either pre- or post-fader
1149 * @return 0 on success, non-0 on failure.
1152 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
1154 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
1158 /** Add a processor to a route such that it ends up with a given index into the visible processors.
1159 * @param index Index to add the processor at, or -1 to add at the end of the list.
1160 * @return 0 on success, non-0 on failure.
1163 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
1165 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
1168 /** Add a processor to the route.
1169 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
1170 * @return 0 on success, non-0 on failure.
1173 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
1175 assert (processor != _meter);
1176 assert (processor != _main_outs);
1178 DEBUG_TRACE (DEBUG::Processors, string_compose (
1179 "%1 adding processor %2\n", name(), processor->name()));
1181 if (!AudioEngine::instance()->connected() || !processor) {
1186 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1187 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1188 ProcessorState pstate (this);
1190 boost::shared_ptr<PluginInsert> pi;
1191 boost::shared_ptr<PortInsert> porti;
1193 if (processor == _amp) {
1194 /* Ensure that only one amp is in the list at any time */
1195 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
1196 if (check != _processors.end()) {
1197 if (before == _amp) {
1198 /* Already in position; all is well */
1201 _processors.erase (check);
1206 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1208 ProcessorList::iterator loc;
1210 /* inserting before a processor; find it */
1211 loc = find (_processors.begin(), _processors.end(), before);
1212 if (loc == _processors.end ()) {
1217 /* inserting at end */
1218 loc = _processors.end ();
1221 _processors.insert (loc, processor);
1222 processor->set_owner (this);
1224 // Set up processor list channels. This will set processor->[input|output]_streams(),
1225 // configure redirect ports properly, etc.
1228 if (configure_processors_unlocked (err)) {
1230 configure_processors_unlocked (0); // it worked before we tried to add it ...
1235 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1237 if (pi->has_no_inputs ()) {
1238 /* generator plugin */
1239 _have_internal_generator = true;
1244 if (activation_allowed && (!_session.get_disable_all_loaded_plugins () || !processor->display_to_user ())) {
1245 processor->activate ();
1248 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1250 _output->set_user_latency (0);
1253 reset_instrument_info ();
1254 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1255 set_processor_positions ();
1261 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1263 const XMLProperty *prop;
1266 boost::shared_ptr<Processor> processor;
1268 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1269 so that we can add the processor in the right place (pre/post-fader)
1272 XMLNodeList const & children = node.children ();
1273 XMLNodeList::const_iterator i = children.begin ();
1275 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1279 Placement placement = PreFader;
1281 if (i != children.end()) {
1282 if ((prop = (*i)->property (X_("placement"))) != 0) {
1283 placement = Placement (string_2_enum (prop->value(), placement));
1287 if (node.name() == "Insert") {
1289 if ((prop = node.property ("type")) != 0) {
1291 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1292 prop->value() == "lv2" ||
1293 prop->value() == "windows-vst" ||
1294 prop->value() == "lxvst" ||
1295 prop->value() == "audiounit") {
1297 processor.reset (new PluginInsert (_session));
1301 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1306 } else if (node.name() == "Send") {
1308 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
1309 processor.reset (new Send (_session, sendpan, _mute_master));
1313 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1317 if (processor->set_state (node, version)) {
1321 //A2 uses the "active" flag in the toplevel redirect node, not in the child plugin/IO
1322 if (i != children.end()) {
1323 if ((prop = (*i)->property (X_("active"))) != 0) {
1324 if ( string_is_affirmative (prop->value()) && (!_session.get_disable_all_loaded_plugins () || !processor->display_to_user () ) )
1325 processor->activate();
1327 processor->deactivate();
1331 return (add_processor (processor, placement, 0, false) == 0);
1334 catch (failed_constructor &err) {
1335 warning << _("processor could not be created. Ignored.") << endmsg;
1341 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1343 /* NOTE: this is intended to be used ONLY when copying
1344 processors from another Route. Hence the subtle
1345 differences between this and ::add_processor()
1348 ProcessorList::iterator loc;
1351 loc = find(_processors.begin(), _processors.end(), before);
1353 /* nothing specified - at end */
1354 loc = _processors.end ();
1357 if (!_session.engine().connected()) {
1361 if (others.empty()) {
1366 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1367 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1368 ProcessorState pstate (this);
1370 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1376 boost::shared_ptr<PluginInsert> pi;
1378 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1382 _processors.insert (loc, *i);
1383 (*i)->set_owner (this);
1385 if ((*i)->active()) {
1389 /* Think: does this really need to be called for every processor in the loop? */
1391 if (configure_processors_unlocked (err)) {
1393 configure_processors_unlocked (0); // it worked before we tried to add it ...
1398 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1401 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1402 boost::shared_ptr<PluginInsert> pi;
1404 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1405 if (pi->has_no_inputs ()) {
1406 _have_internal_generator = true;
1412 _output->set_user_latency (0);
1415 reset_instrument_info ();
1416 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1417 set_processor_positions ();
1423 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1425 if (p == PreFader) {
1426 start = _processors.begin();
1427 end = find(_processors.begin(), _processors.end(), _amp);
1429 start = find(_processors.begin(), _processors.end(), _amp);
1431 end = _processors.end();
1435 /** Turn off all processors with a given placement
1436 * @param p Placement of processors to disable
1439 Route::disable_processors (Placement p)
1441 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1443 ProcessorList::iterator start, end;
1444 placement_range(p, start, end);
1446 for (ProcessorList::iterator i = start; i != end; ++i) {
1447 (*i)->deactivate ();
1450 _session.set_dirty ();
1453 /** Turn off all redirects
1456 Route::disable_processors ()
1458 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1460 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1461 (*i)->deactivate ();
1464 _session.set_dirty ();
1467 /** Turn off all redirects with a given placement
1468 * @param p Placement of redirects to disable
1471 Route::disable_plugins (Placement p)
1473 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1475 ProcessorList::iterator start, end;
1476 placement_range(p, start, end);
1478 for (ProcessorList::iterator i = start; i != end; ++i) {
1479 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1480 (*i)->deactivate ();
1484 _session.set_dirty ();
1487 /** Turn off all plugins
1490 Route::disable_plugins ()
1492 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1494 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1495 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1496 (*i)->deactivate ();
1500 _session.set_dirty ();
1505 Route::ab_plugins (bool forward)
1507 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1511 /* forward = turn off all active redirects, and mark them so that the next time
1512 we go the other way, we will revert them
1515 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1516 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1520 if ((*i)->active()) {
1521 (*i)->deactivate ();
1522 (*i)->set_next_ab_is_active (true);
1524 (*i)->set_next_ab_is_active (false);
1530 /* backward = if the redirect was marked to go active on the next ab, do so */
1532 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1534 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1538 if ((*i)->get_next_ab_is_active()) {
1541 (*i)->deactivate ();
1546 _session.set_dirty ();
1550 /** Remove processors with a given placement.
1551 * @param p Placement of processors to remove.
1554 Route::clear_processors (Placement p)
1556 if (!_session.engine().connected()) {
1560 bool already_deleting = _session.deletion_in_progress();
1561 if (!already_deleting) {
1562 _session.set_deletion_in_progress();
1566 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1567 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1568 ProcessorList new_list;
1569 ProcessorStreams err;
1570 bool seen_amp = false;
1572 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1578 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs || (*i) == _delayline || (*i) == _trim) {
1580 /* you can't remove these */
1582 new_list.push_back (*i);
1589 new_list.push_back (*i);
1592 (*i)->drop_references ();
1600 (*i)->drop_references ();
1603 new_list.push_back (*i);
1610 _processors = new_list;
1611 configure_processors_unlocked (&err); // this can't fail
1614 processor_max_streams.reset();
1615 _have_internal_generator = false;
1616 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1617 set_processor_positions ();
1619 reset_instrument_info ();
1621 if (!already_deleting) {
1622 _session.clear_deletion_in_progress();
1627 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1629 // TODO once the export point can be configured properly, do something smarter here
1630 if (processor == _capturing_processor) {
1631 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1632 if (need_process_lock) {
1636 _capturing_processor.reset();
1638 if (need_process_lock) {
1643 /* these can never be removed */
1645 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1649 if (!_session.engine().connected()) {
1653 processor_max_streams.reset();
1656 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1657 if (need_process_lock) {
1661 /* Caller must hold process lock */
1662 assert (!AudioEngine::instance()->process_lock().trylock());
1664 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1666 ProcessorState pstate (this);
1668 ProcessorList::iterator i;
1669 bool removed = false;
1671 for (i = _processors.begin(); i != _processors.end(); ) {
1672 if (*i == processor) {
1674 /* move along, see failure case for configure_processors()
1675 where we may need to reconfigure the processor.
1678 /* stop redirects that send signals to JACK ports
1679 from causing noise as a result of no longer being
1683 boost::shared_ptr<IOProcessor> iop;
1685 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1689 i = _processors.erase (i);
1697 _output->set_user_latency (0);
1705 if (configure_processors_unlocked (err)) {
1707 /* we know this will work, because it worked before :) */
1708 configure_processors_unlocked (0);
1712 _have_internal_generator = false;
1714 for (i = _processors.begin(); i != _processors.end(); ++i) {
1715 boost::shared_ptr<PluginInsert> pi;
1717 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1718 if (pi->has_no_inputs ()) {
1719 _have_internal_generator = true;
1724 if (need_process_lock) {
1729 reset_instrument_info ();
1730 processor->drop_references ();
1731 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1732 set_processor_positions ();
1738 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1740 ProcessorList deleted;
1742 if (!_session.engine().connected()) {
1746 processor_max_streams.reset();
1749 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1750 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1751 ProcessorState pstate (this);
1753 ProcessorList::iterator i;
1754 boost::shared_ptr<Processor> processor;
1756 for (i = _processors.begin(); i != _processors.end(); ) {
1760 /* these can never be removed */
1762 if (processor == _amp || processor == _meter || processor == _main_outs || processor == _delayline || processor == _trim) {
1767 /* see if its in the list of processors to delete */
1769 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1774 /* stop IOProcessors that send to JACK ports
1775 from causing noise as a result of no longer being
1779 boost::shared_ptr<IOProcessor> iop;
1781 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1785 deleted.push_back (processor);
1786 i = _processors.erase (i);
1789 if (deleted.empty()) {
1790 /* none of those in the requested list were found */
1794 _output->set_user_latency (0);
1796 if (configure_processors_unlocked (err)) {
1798 /* we know this will work, because it worked before :) */
1799 configure_processors_unlocked (0);
1804 _have_internal_generator = false;
1806 for (i = _processors.begin(); i != _processors.end(); ++i) {
1807 boost::shared_ptr<PluginInsert> pi;
1809 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1810 if (pi->has_no_inputs ()) {
1811 _have_internal_generator = true;
1818 /* now try to do what we need to so that those that were removed will be deleted */
1820 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1821 (*i)->drop_references ();
1824 reset_instrument_info ();
1825 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1826 set_processor_positions ();
1832 Route::reset_instrument_info ()
1834 boost::shared_ptr<Processor> instr = the_instrument();
1836 _instrument_info.set_internal_instrument (instr);
1840 /** Caller must hold process lock */
1842 Route::configure_processors (ProcessorStreams* err)
1844 #ifndef PLATFORM_WINDOWS
1845 assert (!AudioEngine::instance()->process_lock().trylock());
1848 if (!_in_configure_processors) {
1849 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1850 return configure_processors_unlocked (err);
1857 Route::input_streams () const
1859 return _input->n_ports ();
1862 list<pair<ChanCount, ChanCount> >
1863 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1865 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1867 return try_configure_processors_unlocked (in, err);
1870 list<pair<ChanCount, ChanCount> >
1871 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1873 // Check each processor in order to see if we can configure as requested
1875 list<pair<ChanCount, ChanCount> > configuration;
1878 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1879 DEBUG_TRACE (DEBUG::Processors, "{\n");
1881 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1883 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1884 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1885 DEBUG_TRACE (DEBUG::Processors, "}\n");
1886 return list<pair<ChanCount, ChanCount> > ();
1889 if ((*p)->can_support_io_configuration(in, out)) {
1890 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1891 configuration.push_back(make_pair(in, out));
1898 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1899 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1900 DEBUG_TRACE (DEBUG::Processors, "}\n");
1901 return list<pair<ChanCount, ChanCount> > ();
1905 DEBUG_TRACE (DEBUG::Processors, "}\n");
1907 return configuration;
1910 /** Set the input/output configuration of each processor in the processors list.
1911 * Caller must hold process lock.
1912 * Return 0 on success, otherwise configuration is impossible.
1915 Route::configure_processors_unlocked (ProcessorStreams* err)
1917 #ifndef PLATFORM_WINDOWS
1918 assert (!AudioEngine::instance()->process_lock().trylock());
1921 if (_in_configure_processors) {
1925 /* put invisible processors where they should be */
1926 setup_invisible_processors ();
1928 _in_configure_processors = true;
1930 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1932 if (configuration.empty ()) {
1933 _in_configure_processors = false;
1938 bool seen_mains_out = false;
1939 processor_out_streams = _input->n_ports();
1940 processor_max_streams.reset();
1942 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1943 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1945 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1949 (*p)->configure_io(c->first, c->second);
1950 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1951 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1953 boost::shared_ptr<PluginInsert> pi;
1954 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*p)) != 0) {
1955 /* plugins connected via Split Match may have more channels.
1956 * route/scratch buffers are needed for all of them*/
1957 processor_max_streams = ChanCount::max(processor_max_streams, pi->input_streams());
1958 processor_max_streams = ChanCount::max(processor_max_streams, pi->natural_input_streams());
1962 if (boost::dynamic_pointer_cast<Delivery> (*p)
1963 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1964 /* main delivery will increase port count to match input.
1965 * the Delivery::Main is usually the last processor - followed only by
1968 seen_mains_out = true;
1970 if (!seen_mains_out) {
1971 processor_out_streams = out;
1977 _meter->set_max_channels (processor_max_streams);
1980 /* make sure we have sufficient scratch buffers to cope with the new processor
1983 _session.ensure_buffers (n_process_buffers ());
1985 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1987 _in_configure_processors = false;
1991 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1992 * @param state New active state for those processors.
1995 Route::all_visible_processors_active (bool state)
1997 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1999 if (_processors.empty()) {
2003 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2004 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
2011 (*i)->deactivate ();
2015 _session.set_dirty ();
2019 Route::processors_reorder_needs_configure (const ProcessorList& new_order)
2021 /* check if re-order requires re-configuration of any processors
2022 * -> compare channel configuration for all processors
2024 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2025 ChanCount c = input_streams ();
2027 for (ProcessorList::const_iterator j = new_order.begin(); j != new_order.end(); ++j) {
2029 if (c != (*j)->input_streams()) {
2032 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2035 if ((*i)->input_streams() != c) {
2038 c = (*i)->output_streams();
2050 __attribute__((annotate("realtime")))
2053 Route::apply_processor_order (const ProcessorList& new_order)
2055 /* need to hold processor_lock; either read or write lock
2056 * and the engine process_lock.
2057 * Due to r/w lock ambiguity we can only assert the latter
2059 assert (!AudioEngine::instance()->process_lock().trylock());
2062 /* "new_order" is an ordered list of processors to be positioned according to "placement".
2063 * NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
2064 * processors in the current actual processor list that are hidden. Any visible processors
2065 * in the current list but not in "new_order" will be assumed to be deleted.
2068 /* "as_it_will_be" and "_processors" are lists of shared pointers.
2069 * actual memory usage is small, but insert/erase is not actually rt-safe :(
2070 * (note though that ::processors_reorder_needs_configure() ensured that
2071 * this function will only ever be called from the rt-thread if no processor were removed)
2073 * either way, I can't proove it, but an x-run due to re-order here is less likley
2074 * than an x-run-less 'ardour-silent cycle' both of which effectively "click".
2077 ProcessorList as_it_will_be;
2078 ProcessorList::iterator oiter;
2079 ProcessorList::const_iterator niter;
2081 oiter = _processors.begin();
2082 niter = new_order.begin();
2084 while (niter != new_order.end()) {
2086 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
2087 then append it to the temp list.
2089 Otherwise, see if the next processor in the old list is in the new list. if not,
2090 its been deleted. If its there, append it to the temp list.
2093 if (oiter == _processors.end()) {
2095 /* no more elements in the old list, so just stick the rest of
2096 the new order onto the temp list.
2099 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
2100 while (niter != new_order.end()) {
2107 if (!(*oiter)->display_to_user()) {
2109 as_it_will_be.push_back (*oiter);
2113 /* visible processor: check that its in the new order */
2115 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
2116 /* deleted: do nothing, shared_ptr<> will clean up */
2118 /* ignore this one, and add the next item from the new order instead */
2119 as_it_will_be.push_back (*niter);
2124 /* now remove from old order - its taken care of no matter what */
2125 oiter = _processors.erase (oiter);
2129 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
2131 /* If the meter is in a custom position, find it and make a rough note of its position */
2132 maybe_note_meter_position ();
2136 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
2138 // it a change is already queued, wait for it
2139 // (unless engine is stopped. apply immediately and proceed
2140 while (g_atomic_int_get (&_pending_process_reorder)) {
2141 if (!AudioEngine::instance()->running()) {
2142 DEBUG_TRACE (DEBUG::Processors, "offline apply queued processor re-order.\n");
2143 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2145 apply_processor_order(_pending_processor_order);
2146 setup_invisible_processors ();
2148 g_atomic_int_set (&_pending_process_reorder, 0);
2150 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2151 set_processor_positions ();
2153 // TODO rather use a semaphore or something.
2154 // but since ::reorder_processors() is called
2155 // from the GUI thread, this is fine..
2160 if (processors_reorder_needs_configure (new_order) || !AudioEngine::instance()->running()) {
2162 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2163 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2164 ProcessorState pstate (this);
2166 apply_processor_order (new_order);
2168 if (configure_processors_unlocked (err)) {
2176 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2177 set_processor_positions ();
2180 DEBUG_TRACE (DEBUG::Processors, "Queue clickless processor re-order.\n");
2181 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2183 // _pending_processor_order is protected by _processor_lock
2184 _pending_processor_order = new_order;
2185 g_atomic_int_set (&_pending_process_reorder, 1);
2198 Route::get_template()
2200 return state(false);
2204 Route::state(bool full_state)
2206 XMLNode *node = new XMLNode("Route");
2207 ProcessorList::iterator i;
2210 id().print (buf, sizeof (buf));
2211 node->add_property("id", buf);
2212 node->add_property ("name", _name);
2213 node->add_property("default-type", _default_type.to_string());
2216 node->add_property("flags", enum_2_string (_flags));
2219 node->add_property("active", _active?"yes":"no");
2221 boost::to_string (_phase_invert, p);
2222 node->add_property("phase-invert", p);
2223 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
2224 node->add_property("meter-point", enum_2_string (_meter_point));
2226 node->add_property("meter-type", enum_2_string (_meter_type));
2229 node->add_property("route-group", _route_group->name());
2232 snprintf (buf, sizeof (buf), "%d", _order_key);
2233 node->add_property ("order-key", buf);
2234 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
2235 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
2236 node->add_property ("soloed-by-upstream", buf);
2237 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
2238 node->add_property ("soloed-by-downstream", buf);
2239 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
2240 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
2242 node->add_child_nocopy (_input->state (full_state));
2243 node->add_child_nocopy (_output->state (full_state));
2244 node->add_child_nocopy (_solo_control->get_state ());
2245 node->add_child_nocopy (_mute_control->get_state ());
2246 node->add_child_nocopy (_mute_master->get_state ());
2249 node->add_child_nocopy (Automatable::get_automation_xml_state ());
2252 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
2253 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
2254 remote_control_node->add_property (X_("id"), buf);
2255 node->add_child_nocopy (*remote_control_node);
2257 if (_comment.length()) {
2258 XMLNode *cmt = node->add_child ("Comment");
2259 cmt->add_content (_comment);
2263 node->add_child_nocopy (_pannable->state (full_state));
2266 for (i = _processors.begin(); i != _processors.end(); ++i) {
2268 /* template save: do not include internal sends functioning as
2269 aux sends because the chance of the target ID
2270 in the session where this template is used
2273 similarly, do not save listen sends which connect to
2274 the monitor section, because these will always be
2277 boost::shared_ptr<InternalSend> is;
2279 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
2280 if (is->role() == Delivery::Listen) {
2285 node->add_child_nocopy((*i)->state (full_state));
2289 node->add_child_copy (*_extra_xml);
2292 if (_custom_meter_position_noted) {
2293 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
2295 after->id().print (buf, sizeof (buf));
2296 node->add_property (X_("processor-after-last-custom-meter"), buf);
2304 Route::set_state (const XMLNode& node, int version)
2306 if (version < 3000) {
2307 return set_state_2X (node, version);
2311 XMLNodeConstIterator niter;
2313 const XMLProperty *prop;
2315 if (node.name() != "Route"){
2316 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2320 if ((prop = node.property (X_("name"))) != 0) {
2321 Route::set_name (prop->value());
2325 _initial_io_setup = true;
2327 if ((prop = node.property (X_("flags"))) != 0) {
2328 _flags = Flag (string_2_enum (prop->value(), _flags));
2333 if (is_master() || is_monitor() || is_auditioner()) {
2334 _mute_master->set_solo_ignore (true);
2338 /* monitor bus does not get a panner, but if (re)created
2339 via XML, it will already have one by the time we
2340 call ::set_state(). so ... remove it.
2345 /* add all processors (except amp, which is always present) */
2347 nlist = node.children();
2348 XMLNode processor_state (X_("processor_state"));
2350 Stateful::save_extra_xml (node);
2352 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2356 if (child->name() == IO::state_node_name) {
2357 if ((prop = child->property (X_("direction"))) == 0) {
2361 if (prop->value() == "Input") {
2362 _input->set_state (*child, version);
2363 } else if (prop->value() == "Output") {
2364 _output->set_state (*child, version);
2368 if (child->name() == X_("Processor")) {
2369 processor_state.add_child_copy (*child);
2372 if (child->name() == X_("Pannable")) {
2374 _pannable->set_state (*child, version);
2376 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2381 if ((prop = node.property (X_("meter-point"))) != 0) {
2382 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2383 set_meter_point (mp, true);
2385 _meter->set_display_to_user (_meter_point == MeterCustom);
2389 if ((prop = node.property (X_("meter-type"))) != 0) {
2390 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2393 _initial_io_setup = false;
2395 set_processor_state (processor_state);
2397 // this looks up the internal instrument in processors
2398 reset_instrument_info();
2400 if ((prop = node.property ("self-solo")) != 0) {
2401 set_self_solo (string_is_affirmative (prop->value()));
2404 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2405 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2406 mod_solo_by_others_upstream (atoi (prop->value()));
2409 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2410 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2411 mod_solo_by_others_downstream (atoi (prop->value()));
2414 if ((prop = node.property ("solo-isolated")) != 0) {
2415 set_solo_isolated (string_is_affirmative (prop->value()), this);
2418 if ((prop = node.property ("solo-safe")) != 0) {
2419 set_solo_safe (string_is_affirmative (prop->value()), this);
2422 if ((prop = node.property (X_("phase-invert"))) != 0) {
2423 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2426 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2427 set_denormal_protection (string_is_affirmative (prop->value()));
2430 if ((prop = node.property (X_("active"))) != 0) {
2431 bool yn = string_is_affirmative (prop->value());
2432 _active = !yn; // force switch
2433 set_active (yn, this);
2436 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2437 set_order_key (atoi(prop->value()));
2440 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2444 string::size_type colon, equal;
2445 string remaining = prop->value();
2447 while (remaining.length()) {
2449 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2450 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2453 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2454 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2457 string keyname = remaining.substr (0, equal);
2459 if ((keyname == "EditorSort") || (keyname == "editor")) {
2460 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2466 colon = remaining.find_first_of (':');
2468 if (colon != string::npos) {
2469 remaining = remaining.substr (colon+1);
2476 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2477 PBD::ID id (prop->value ());
2478 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2479 ProcessorList::const_iterator i = _processors.begin ();
2480 while (i != _processors.end() && (*i)->id() != id) {
2484 if (i != _processors.end ()) {
2485 _processor_after_last_custom_meter = *i;
2486 _custom_meter_position_noted = true;
2490 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2493 if (child->name() == X_("Comment")) {
2495 /* XXX this is a terrible API design in libxml++ */
2497 XMLNode *cmt = *(child->children().begin());
2498 _comment = cmt->content();
2500 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2501 if (prop->value() == "solo") {
2502 _solo_control->set_state (*child, version);
2503 } else if (prop->value() == "mute") {
2504 _mute_control->set_state (*child, version);
2507 } else if (child->name() == X_("RemoteControl")) {
2508 if ((prop = child->property (X_("id"))) != 0) {
2510 sscanf (prop->value().c_str(), "%d", &x);
2511 set_remote_control_id_internal (x);
2514 } else if (child->name() == X_("MuteMaster")) {
2515 _mute_master->set_state (*child, version);
2517 } else if (child->name() == Automatable::xml_node_name) {
2518 set_automation_xml_state (*child, Evoral::Parameter(NullAutomation));
2526 Route::set_state_2X (const XMLNode& node, int version)
2528 LocaleGuard lg (X_("C"));
2530 XMLNodeConstIterator niter;
2532 const XMLProperty *prop;
2534 /* 2X things which still remain to be handled:
2540 if (node.name() != "Route") {
2541 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2545 if ((prop = node.property (X_("flags"))) != 0) {
2546 string f = prop->value ();
2547 boost::replace_all (f, "ControlOut", "MonitorOut");
2548 _flags = Flag (string_2_enum (f, _flags));
2553 if (is_master() || is_monitor() || is_auditioner()) {
2554 _mute_master->set_solo_ignore (true);
2557 if ((prop = node.property (X_("phase-invert"))) != 0) {
2558 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2559 if (string_is_affirmative (prop->value ())) {
2562 set_phase_invert (p);
2565 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2566 set_denormal_protection (string_is_affirmative (prop->value()));
2569 if ((prop = node.property (X_("soloed"))) != 0) {
2570 bool yn = string_is_affirmative (prop->value());
2572 /* XXX force reset of solo status */
2574 set_solo (yn, this);
2577 if ((prop = node.property (X_("muted"))) != 0) {
2580 bool muted = string_is_affirmative (prop->value());
2586 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2588 if (string_is_affirmative (prop->value())){
2589 mute_point = mute_point + "PreFader";
2594 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2596 if (string_is_affirmative (prop->value())){
2599 mute_point = mute_point + ",";
2602 mute_point = mute_point + "PostFader";
2607 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2609 if (string_is_affirmative (prop->value())){
2612 mute_point = mute_point + ",";
2615 mute_point = mute_point + "Listen";
2620 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2622 if (string_is_affirmative (prop->value())){
2625 mute_point = mute_point + ",";
2628 mute_point = mute_point + "Main";
2632 _mute_master->set_mute_points (mute_point);
2633 _mute_master->set_muted_by_self (true);
2637 if ((prop = node.property (X_("meter-point"))) != 0) {
2638 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2641 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2642 don't mean the same thing.
2645 if ((prop = node.property (X_("order-keys"))) != 0) {
2649 string::size_type colon, equal;
2650 string remaining = prop->value();
2652 while (remaining.length()) {
2654 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2655 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2658 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2659 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2662 string keyname = remaining.substr (0, equal);
2664 if (keyname == "EditorSort" || keyname == "editor") {
2665 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2671 colon = remaining.find_first_of (':');
2673 if (colon != string::npos) {
2674 remaining = remaining.substr (colon+1);
2683 nlist = node.children ();
2684 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2688 if (child->name() == IO::state_node_name) {
2690 /* there is a note in IO::set_state_2X() about why we have to call
2694 _input->set_state_2X (*child, version, true);
2695 _output->set_state_2X (*child, version, false);
2697 if ((prop = child->property (X_("name"))) != 0) {
2698 Route::set_name (prop->value ());
2703 if ((prop = child->property (X_("active"))) != 0) {
2704 bool yn = string_is_affirmative (prop->value());
2705 _active = !yn; // force switch
2706 set_active (yn, this);
2709 if ((prop = child->property (X_("gain"))) != 0) {
2712 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2713 _amp->gain_control()->set_value (val);
2717 /* Set up Panners in the IO */
2718 XMLNodeList io_nlist = child->children ();
2720 XMLNodeConstIterator io_niter;
2723 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2725 io_child = *io_niter;
2727 if (io_child->name() == X_("Panner")) {
2728 _main_outs->panner_shell()->set_state(*io_child, version);
2729 } else if (io_child->name() == X_("Automation")) {
2730 /* IO's automation is for the fader */
2731 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2737 XMLNodeList redirect_nodes;
2739 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2743 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2744 redirect_nodes.push_back(child);
2749 set_processor_state_2X (redirect_nodes, version);
2751 Stateful::save_extra_xml (node);
2753 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2756 if (child->name() == X_("Comment")) {
2758 /* XXX this is a terrible API design in libxml++ */
2760 XMLNode *cmt = *(child->children().begin());
2761 _comment = cmt->content();
2763 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2764 if (prop->value() == X_("solo")) {
2765 _solo_control->set_state (*child, version);
2766 } else if (prop->value() == X_("mute")) {
2767 _mute_control->set_state (*child, version);
2770 } else if (child->name() == X_("RemoteControl")) {
2771 if ((prop = child->property (X_("id"))) != 0) {
2773 sscanf (prop->value().c_str(), "%d", &x);
2774 set_remote_control_id_internal (x);
2784 Route::get_processor_state ()
2786 XMLNode* root = new XMLNode (X_("redirects"));
2787 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2788 root->add_child_nocopy ((*i)->state (true));
2795 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2797 /* We don't bother removing existing processors not in nList, as this
2798 method will only be called when creating a Route from scratch, not
2799 for undo purposes. Just put processors in at the appropriate place
2803 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2804 add_processor_from_xml_2X (**i, version);
2809 Route::set_processor_state (const XMLNode& node)
2811 const XMLNodeList &nlist = node.children();
2812 XMLNodeConstIterator niter;
2813 ProcessorList new_order;
2814 bool must_configure = false;
2816 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2818 XMLProperty* prop = (*niter)->property ("type");
2820 if (prop->value() == "amp") {
2821 _amp->set_state (**niter, Stateful::current_state_version);
2822 new_order.push_back (_amp);
2823 } else if (prop->value() == "trim") {
2824 _trim->set_state (**niter, Stateful::current_state_version);
2825 new_order.push_back (_trim);
2826 } else if (prop->value() == "meter") {
2827 _meter->set_state (**niter, Stateful::current_state_version);
2828 new_order.push_back (_meter);
2829 } else if (prop->value() == "delay") {
2831 _delayline->set_state (**niter, Stateful::current_state_version);
2832 new_order.push_back (_delayline);
2834 } else if (prop->value() == "main-outs") {
2835 _main_outs->set_state (**niter, Stateful::current_state_version);
2836 } else if (prop->value() == "intreturn") {
2838 _intreturn.reset (new InternalReturn (_session));
2839 must_configure = true;
2841 _intreturn->set_state (**niter, Stateful::current_state_version);
2842 } else if (is_monitor() && prop->value() == "monitor") {
2843 if (!_monitor_control) {
2844 _monitor_control.reset (new MonitorProcessor (_session));
2845 must_configure = true;
2847 _monitor_control->set_state (**niter, Stateful::current_state_version);
2848 } else if (prop->value() == "capture") {
2849 /* CapturingProcessor should never be restored, it's always
2850 added explicitly when needed */
2852 ProcessorList::iterator o;
2854 for (o = _processors.begin(); o != _processors.end(); ++o) {
2855 XMLProperty* id_prop = (*niter)->property(X_("id"));
2856 if (id_prop && (*o)->id() == id_prop->value()) {
2857 (*o)->set_state (**niter, Stateful::current_state_version);
2858 new_order.push_back (*o);
2863 // If the processor (*niter) is not on the route then create it
2865 if (o == _processors.end()) {
2867 boost::shared_ptr<Processor> processor;
2869 if (prop->value() == "intsend") {
2871 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), boost::shared_ptr<Route>(), Delivery::Aux, true));
2873 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2874 prop->value() == "lv2" ||
2875 prop->value() == "windows-vst" ||
2876 prop->value() == "lxvst" ||
2877 prop->value() == "audiounit") {
2879 processor.reset (new PluginInsert(_session));
2881 } else if (prop->value() == "port") {
2883 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2885 } else if (prop->value() == "send") {
2887 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2890 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2894 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2895 /* This processor could not be configured. Turn it into a UnknownProcessor */
2896 processor.reset (new UnknownProcessor (_session, **niter));
2899 /* we have to note the monitor send here, otherwise a new one will be created
2900 and the state of this one will be lost.
2902 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2903 if (isend && isend->role() == Delivery::Listen) {
2904 _monitor_send = isend;
2907 /* it doesn't matter if invisible processors are added here, as they
2908 will be sorted out by setup_invisible_processors () shortly.
2911 new_order.push_back (processor);
2912 must_configure = true;
2918 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2919 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2920 _processors = new_order;
2922 if (must_configure) {
2923 configure_processors_unlocked (0);
2926 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2928 (*i)->set_owner (this);
2929 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2931 boost::shared_ptr<PluginInsert> pi;
2933 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2934 if (pi->has_no_inputs ()) {
2935 _have_internal_generator = true;
2942 reset_instrument_info ();
2943 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
2944 set_processor_positions ();
2948 Route::curve_reallocate ()
2950 // _gain_automation_curve.finish_resize ();
2951 // _pan_automation_curve.finish_resize ();
2955 Route::silence (framecnt_t nframes)
2957 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2962 silence_unlocked (nframes);
2966 Route::silence_unlocked (framecnt_t nframes)
2968 /* Must be called with the processor lock held */
2972 _output->silence (nframes);
2974 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2975 boost::shared_ptr<PluginInsert> pi;
2977 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2978 // skip plugins, they don't need anything when we're not active
2982 (*i)->silence (nframes);
2985 if (nframes == _session.get_block_size()) {
2992 Route::add_internal_return ()
2995 _intreturn.reset (new InternalReturn (_session));
2996 add_processor (_intreturn, PreFader);
3001 Route::add_send_to_internal_return (InternalSend* send)
3003 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3005 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3006 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3009 return d->add_send (send);
3015 Route::remove_send_from_internal_return (InternalSend* send)
3017 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3019 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
3020 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
3023 return d->remove_send (send);
3029 Route::enable_monitor_send ()
3031 /* Caller must hold process lock */
3032 assert (!AudioEngine::instance()->process_lock().trylock());
3034 /* master never sends to monitor section via the normal mechanism */
3035 assert (!is_master ());
3036 assert (!is_monitor ());
3038 /* make sure we have one */
3039 if (!_monitor_send) {
3040 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), _session.monitor_out(), Delivery::Listen));
3041 _monitor_send->set_display_to_user (false);
3045 configure_processors (0);
3048 /** Add an aux send to a route.
3049 * @param route route to send to.
3050 * @param before Processor to insert before, or 0 to insert at the end.
3053 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
3055 assert (route != _session.monitor_out ());
3058 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
3060 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3062 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
3064 if (d && d->target_route() == route) {
3065 /* already listening via the specified IO: do nothing */
3073 boost::shared_ptr<InternalSend> listener;
3076 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3077 boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
3078 listener.reset (new InternalSend (_session, sendpan, _mute_master, boost::dynamic_pointer_cast<ARDOUR::Route>(shared_from_this()), route, Delivery::Aux));
3081 add_processor (listener, before);
3083 } catch (failed_constructor& err) {
3091 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
3093 ProcessorStreams err;
3094 ProcessorList::iterator tmp;
3097 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
3099 /* have to do this early because otherwise processor reconfig
3100 * will put _monitor_send back in the list
3103 if (route == _session.monitor_out()) {
3104 _monitor_send.reset ();
3108 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
3110 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
3112 if (d && d->target_route() == route) {
3114 remove_processor (*x, &err, false);
3117 /* list could have been demolished while we dropped the lock
3128 Route::set_comment (string cmt, void *src)
3131 comment_changed (src);
3132 _session.set_dirty ();
3136 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
3138 FeedRecord fr (other, via_sends_only);
3140 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
3142 if (!result.second) {
3144 /* already a record for "other" - make sure sends-only information is correct */
3145 if (!via_sends_only && result.first->sends_only) {
3146 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
3147 frp->sends_only = false;
3151 return result.second;
3155 Route::clear_fed_by ()
3161 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
3163 const FedBy& fed_by (other->fed_by());
3165 for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
3166 boost::shared_ptr<Route> sr = f->r.lock();
3168 if (sr && (sr.get() == this)) {
3170 if (via_sends_only) {
3171 *via_sends_only = f->sends_only;
3182 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
3184 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
3186 if (_output->connected_to (other->input())) {
3187 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
3188 if (via_send_only) {
3189 *via_send_only = false;
3196 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
3198 boost::shared_ptr<IOProcessor> iop;
3200 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
3201 if (iop->feeds (other)) {
3202 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
3203 if (via_send_only) {
3204 *via_send_only = true;
3208 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
3211 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
3216 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
3221 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
3223 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
3226 /** Called from the (non-realtime) butler thread when the transport is stopped */
3228 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
3230 framepos_t now = _session.transport_frame();
3233 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3235 Automatable::transport_stopped (now);
3237 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3239 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
3243 (*i)->transport_stopped (now);
3247 _roll_delay = _initial_delay;
3251 Route::input_change_handler (IOChange change, void * /*src*/)
3253 bool need_to_queue_solo_change = true;
3255 if ((change.type & IOChange::ConfigurationChanged)) {
3256 /* This is called with the process lock held if change
3257 contains ConfigurationChanged
3259 need_to_queue_solo_change = false;
3260 configure_processors (0);
3261 _phase_invert.resize (_input->n_ports().n_audio ());
3262 io_changed (); /* EMIT SIGNAL */
3265 if (!_input->connected() && _soloed_by_others_upstream) {
3266 if (need_to_queue_solo_change) {
3267 _session.cancel_solo_after_disconnect (shared_from_this(), true);
3269 cancel_solo_after_disconnect (true);
3275 Route::output_change_handler (IOChange change, void * /*src*/)
3277 bool need_to_queue_solo_change = true;
3278 if (_initial_io_setup) {
3282 if ((change.type & IOChange::ConfigurationChanged)) {
3283 /* This is called with the process lock held if change
3284 contains ConfigurationChanged
3286 need_to_queue_solo_change = false;
3287 configure_processors (0);
3290 _session.reset_monitor_section();
3293 io_changed (); /* EMIT SIGNAL */
3296 if (!_output->connected() && _soloed_by_others_downstream) {
3297 if (need_to_queue_solo_change) {
3298 _session.cancel_solo_after_disconnect (shared_from_this(), false);
3300 cancel_solo_after_disconnect (false);
3306 Route::cancel_solo_after_disconnect (bool upstream)
3309 _soloed_by_others_upstream = 0;
3311 _soloed_by_others_downstream = 0;
3313 set_mute_master_solo ();
3314 solo_changed (false, this);
3318 Route::pans_required () const
3320 if (n_outputs().n_audio() < 2) {
3324 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3328 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3330 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3336 if (n_outputs().n_total() == 0) {
3340 if (!_active || n_inputs() == ChanCount::ZERO) {
3341 silence_unlocked (nframes);
3345 if (session_state_changing) {
3346 if (_session.transport_speed() != 0.0f) {
3347 /* we're rolling but some state is changing (e.g. our diskstream contents)
3348 so we cannot use them. Be silent till this is over.
3350 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3352 silence_unlocked (nframes);
3355 /* we're really not rolling, so we're either delivery silence or actually
3356 monitoring, both of which are safe to do while session_state_changing is true.
3360 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3362 fill_buffers_with_input (bufs, _input, nframes);
3364 if (_meter_point == MeterInput) {
3365 _meter->run (bufs, start_frame, end_frame, nframes, true);
3368 _amp->apply_gain_automation (false);
3369 _trim->apply_gain_automation (false);
3370 passthru (bufs, start_frame, end_frame, nframes, 0);
3376 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3378 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3383 if (n_outputs().n_total() == 0) {
3387 if (!_active || n_inputs().n_total() == 0) {
3388 silence_unlocked (nframes);
3392 framepos_t unused = 0;
3394 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3400 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3402 fill_buffers_with_input (bufs, _input, nframes);
3404 if (_meter_point == MeterInput) {
3405 _meter->run (bufs, start_frame, end_frame, nframes, true);
3408 passthru (bufs, start_frame, end_frame, nframes, declick);
3414 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3421 Route::flush_processors ()
3423 /* XXX shouldn't really try to take this lock, since
3424 this is called from the RT audio thread.
3427 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3429 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3435 __attribute__((annotate("realtime")))
3438 Route::apply_processor_changes_rt ()
3440 int emissions = EmitNone;
3442 if (_pending_meter_point != _meter_point) {
3443 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3445 /* meters always have buffers for 'processor_max_streams'
3446 * they can be re-positioned without re-allocation */
3447 if (set_meter_point_unlocked()) {
3448 emissions |= EmitMeterChanged | EmitMeterVisibilityChange;;
3450 emissions |= EmitMeterChanged;
3455 bool changed = false;
3457 if (g_atomic_int_get (&_pending_process_reorder)) {
3458 Glib::Threads::RWLock::WriterLock pwl (_processor_lock, Glib::Threads::TRY_LOCK);
3460 apply_processor_order (_pending_processor_order);
3461 setup_invisible_processors ();
3463 g_atomic_int_set (&_pending_process_reorder, 0);
3464 emissions |= EmitRtProcessorChange;
3468 set_processor_positions ();
3470 if (emissions != 0) {
3471 g_atomic_int_set (&_pending_signals, emissions);
3478 Route::emit_pending_signals ()
3481 int sig = g_atomic_int_and (&_pending_signals, 0);
3482 if (sig & EmitMeterChanged) {
3483 _meter->emit_configuration_changed();
3484 meter_change (); /* EMIT SIGNAL */
3485 if (sig & EmitMeterVisibilityChange) {
3486 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3488 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3491 if (sig & EmitRtProcessorChange) {
3492 processors_changed (RouteProcessorChange (RouteProcessorChange::RealTimeChange)); /* EMIT SIGNAL */
3497 Route::set_meter_point (MeterPoint p, bool force)
3499 if (_pending_meter_point == p && !force) {
3503 if (force || !AudioEngine::instance()->running()) {
3504 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3505 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3506 _pending_meter_point = p;
3507 _meter->emit_configuration_changed();
3508 meter_change (); /* EMIT SIGNAL */
3509 if (set_meter_point_unlocked()) {
3510 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, true)); /* EMIT SIGNAL */
3512 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, false)); /* EMIT SIGNAL */
3515 _pending_meter_point = p;
3521 __attribute__((annotate("realtime")))
3524 Route::set_meter_point_unlocked ()
3527 /* Caller must hold process and processor write lock */
3528 assert (!AudioEngine::instance()->process_lock().trylock());
3529 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3530 assert (!lm.locked ());
3533 _meter_point = _pending_meter_point;
3535 bool meter_was_visible_to_user = _meter->display_to_user ();
3537 if (!_custom_meter_position_noted) {
3538 maybe_note_meter_position ();
3541 if (_meter_point != MeterCustom) {
3543 _meter->set_display_to_user (false);
3545 setup_invisible_processors ();
3548 _meter->set_display_to_user (true);
3550 /* If we have a previous position for the custom meter, try to put it there */
3551 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3553 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3554 if (i != _processors.end ()) {
3555 _processors.remove (_meter);
3556 _processors.insert (i, _meter);
3558 } else {// at end, right before the mains_out/panner
3559 _processors.remove (_meter);
3560 ProcessorList::iterator main = _processors.end();
3561 _processors.insert (--main, _meter);
3565 /* Set up the meter for its new position */
3567 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3571 if (loc == _processors.begin()) {
3572 m_in = _input->n_ports();
3574 ProcessorList::iterator before = loc;
3576 m_in = (*before)->output_streams ();
3579 _meter->reflect_inputs (m_in);
3581 /* we do not need to reconfigure the processors, because the meter
3582 (a) is always ready to handle processor_max_streams
3583 (b) is always an N-in/N-out processor, and thus moving
3584 it doesn't require any changes to the other processors.
3587 /* these should really be done after releasing the lock
3588 * but all those signals are subscribed to with gui_thread()
3591 return (_meter->display_to_user() != meter_was_visible_to_user);
3595 Route::listen_position_changed ()
3598 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3599 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3600 ProcessorState pstate (this);
3602 if (configure_processors_unlocked (0)) {
3604 configure_processors_unlocked (0); // it worked before we tried to add it ...
3609 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3610 _session.set_dirty ();
3613 boost::shared_ptr<CapturingProcessor>
3614 Route::add_export_point()
3616 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3617 if (!_capturing_processor) {
3619 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3620 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3622 _capturing_processor.reset (new CapturingProcessor (_session));
3623 _capturing_processor->activate ();
3625 configure_processors_unlocked (0);
3629 return _capturing_processor;
3633 Route::update_signal_latency ()
3635 framecnt_t l = _output->user_latency();
3636 framecnt_t lamp = 0;
3637 bool before_amp = true;
3638 framecnt_t ltrim = 0;
3639 bool before_trim = true;
3641 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3642 if ((*i)->active ()) {
3643 l += (*i)->signal_latency ();
3648 if ((*i) == _trim) {
3659 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3661 // TODO: (lamp - _signal_latency) to sync to output (read-ahed), currently _roll_delay shifts this around
3662 _signal_latency_at_amp_position = lamp;
3663 _signal_latency_at_trim_position = ltrim;
3665 if (_signal_latency != l) {
3666 _signal_latency = l;
3667 signal_latency_changed (); /* EMIT SIGNAL */
3670 return _signal_latency;
3674 Route::set_user_latency (framecnt_t nframes)
3676 _output->set_user_latency (nframes);
3677 _session.update_latency_compensation ();
3681 Route::set_latency_compensation (framecnt_t longest_session_latency)
3683 framecnt_t old = _initial_delay;
3685 if (_signal_latency < longest_session_latency) {
3686 _initial_delay = longest_session_latency - _signal_latency;
3691 DEBUG_TRACE (DEBUG::Latency, string_compose (
3692 "%1: compensate for maximum latency of %2,"
3693 "given own latency of %3, using initial delay of %4\n",
3694 name(), longest_session_latency, _signal_latency, _initial_delay));
3696 if (_initial_delay != old) {
3697 initial_delay_changed (); /* EMIT SIGNAL */
3700 if (_session.transport_stopped()) {
3701 _roll_delay = _initial_delay;
3705 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3706 : AutomationControl (r->session(),
3707 Evoral::Parameter (SoloAutomation),
3708 ParameterDescriptor(Evoral::Parameter (SoloAutomation)),
3709 boost::shared_ptr<AutomationList>(), name)
3712 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3713 gl->set_interpolation(Evoral::ControlList::Discrete);
3718 Route::SoloControllable::set_value (double val)
3720 const bool bval = ((val >= 0.5) ? true : false);
3722 boost::shared_ptr<RouteList> rl (new RouteList);
3724 boost::shared_ptr<Route> r = _route.lock ();
3731 if (Config->get_solo_control_is_listen_control()) {
3732 _session.set_listen (rl, bval);
3734 _session.set_solo (rl, bval);
3739 Route::SoloControllable::get_value () const
3741 boost::shared_ptr<Route> r = _route.lock ();
3746 if (Config->get_solo_control_is_listen_control()) {
3747 return r->listening_via_monitor() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3749 return r->self_soloed() ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3753 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3754 : AutomationControl (r->session(),
3755 Evoral::Parameter (MuteAutomation),
3756 ParameterDescriptor (Evoral::Parameter (MuteAutomation)),
3757 boost::shared_ptr<AutomationList>(),
3761 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3762 gl->set_interpolation(Evoral::ControlList::Discrete);
3767 Route::MuteControllable::set_superficial_value(bool muted)
3769 /* Note we can not use AutomationControl::set_value here since it will emit
3770 Changed(), but the value will not be correct to the observer. */
3772 bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
3774 Control::set_double (muted, _session.transport_frame(), to_list);
3778 Route::MuteControllable::set_value (double val)
3780 const bool bval = ((val >= 0.5) ? true : false);
3782 boost::shared_ptr<Route> r = _route.lock ();
3787 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3788 // Playing back automation, set route mute directly
3789 r->set_mute (bval, this);
3791 // Set from user, queue mute event
3792 boost::shared_ptr<RouteList> rl (new RouteList);
3794 _session.set_mute (rl, bval, Session::rt_cleanup);
3797 // Set superficial/automation value to drive controller (and possibly record)
3798 set_superficial_value(bval);
3802 Route::MuteControllable::get_value () const
3804 if (_list && ((AutomationList*)_list.get())->automation_playback()) {
3805 // Playing back automation, get the value from the list
3806 return AutomationControl::get_value();
3809 // Not playing back automation, get the actual route mute value
3810 boost::shared_ptr<Route> r = _route.lock ();
3811 return (r && r->muted()) ? GAIN_COEFF_UNITY : GAIN_COEFF_ZERO;
3815 Route::set_block_size (pframes_t nframes)
3817 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3818 (*i)->set_block_size (nframes);
3821 _session.ensure_buffers (n_process_buffers ());
3825 Route::protect_automation ()
3827 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3828 (*i)->protect_automation();
3831 /** @param declick 1 to set a pending declick fade-in,
3832 * -1 to set a pending declick fade-out
3835 Route::set_pending_declick (int declick)
3838 /* this call is not allowed to turn off a pending declick */
3840 _pending_declick = declick;
3843 _pending_declick = 0;
3847 /** Shift automation forwards from a particular place, thereby inserting time.
3848 * Adds undo commands for any shifts that are performed.
3850 * @param pos Position to start shifting from.
3851 * @param frames Amount to shift forwards by.
3855 Route::shift (framepos_t pos, framecnt_t frames)
3857 /* gain automation */
3859 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3861 XMLNode &before = gc->alist()->get_state ();
3862 gc->alist()->shift (pos, frames);
3863 XMLNode &after = gc->alist()->get_state ();
3864 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3867 /* gain automation */
3869 boost::shared_ptr<AutomationControl> gc = _trim->gain_control();
3871 XMLNode &before = gc->alist()->get_state ();
3872 gc->alist()->shift (pos, frames);
3873 XMLNode &after = gc->alist()->get_state ();
3874 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3877 // TODO mute automation ??
3879 /* pan automation */
3881 ControlSet::Controls& c (_pannable->controls());
3883 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3884 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3886 boost::shared_ptr<AutomationList> al = pc->alist();
3887 XMLNode& before = al->get_state ();
3888 al->shift (pos, frames);
3889 XMLNode& after = al->get_state ();
3890 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3895 /* redirect automation */
3897 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3898 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3900 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3902 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3903 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3905 boost::shared_ptr<AutomationList> al = ac->alist();
3906 XMLNode &before = al->get_state ();
3907 al->shift (pos, frames);
3908 XMLNode &after = al->get_state ();
3909 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3918 Route::save_as_template (const string& path, const string& name)
3920 XMLNode& node (state (false));
3923 IO::set_name_in_state (*node.children().front(), name);
3925 tree.set_root (&node);
3926 return tree.write (path.c_str());
3931 Route::set_name (const string& str)
3933 if (str == name()) {
3937 string name = Route::ensure_track_or_route_name (str, _session);
3938 SessionObject::set_name (name);
3940 bool ret = (_input->set_name(name) && _output->set_name(name));
3943 /* rename the main outs. Leave other IO processors
3944 * with whatever name they already have, because its
3945 * just fine as it is (it will not contain the route
3946 * name if its a port insert, port send or port return).
3950 if (_main_outs->set_name (name)) {
3951 /* XXX returning false here is stupid because
3952 we already changed the route name.
3962 /** Set the name of a route in an XML description.
3963 * @param node XML <Route> node to set the name in.
3964 * @param name New name.
3967 Route::set_name_in_state (XMLNode& node, string const & name)
3969 node.add_property (X_("name"), name);
3971 XMLNodeList children = node.children();
3972 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3974 if ((*i)->name() == X_("IO")) {
3976 IO::set_name_in_state (**i, name);
3978 } else if ((*i)->name() == X_("Processor")) {
3980 XMLProperty* role = (*i)->property (X_("role"));
3981 if (role && role->value() == X_("Main")) {
3982 (*i)->add_property (X_("name"), name);
3985 } else if ((*i)->name() == X_("Diskstream")) {
3987 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3988 (*i)->add_property (X_("name"), name);
3994 boost::shared_ptr<Send>
3995 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3997 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3999 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4000 boost::shared_ptr<InternalSend> send;
4002 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
4003 if (send->target_route() == target) {
4009 return boost::shared_ptr<Send>();
4012 /** @param c Audio channel index.
4013 * @param yn true to invert phase, otherwise false.
4016 Route::set_phase_invert (uint32_t c, bool yn)
4018 if (_phase_invert[c] != yn) {
4019 _phase_invert[c] = yn;
4020 phase_invert_changed (); /* EMIT SIGNAL */
4021 _session.set_dirty ();
4026 Route::set_phase_invert (boost::dynamic_bitset<> p)
4028 if (_phase_invert != p) {
4030 phase_invert_changed (); /* EMIT SIGNAL */
4031 _session.set_dirty ();
4036 Route::phase_invert (uint32_t c) const
4038 return _phase_invert[c];
4041 boost::dynamic_bitset<>
4042 Route::phase_invert () const
4044 return _phase_invert;
4048 Route::set_denormal_protection (bool yn)
4050 if (_denormal_protection != yn) {
4051 _denormal_protection = yn;
4052 denormal_protection_changed (); /* EMIT SIGNAL */
4057 Route::denormal_protection () const
4059 return _denormal_protection;
4063 Route::set_active (bool yn, void* src)
4065 if (_session.transport_rolling()) {
4069 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
4070 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
4074 if (_active != yn) {
4076 _input->set_active (yn);
4077 _output->set_active (yn);
4078 active_changed (); // EMIT SIGNAL
4079 _session.set_dirty ();
4083 boost::shared_ptr<Pannable>
4084 Route::pannable() const
4089 boost::shared_ptr<Panner>
4090 Route::panner() const
4093 return _main_outs->panner_shell()->panner();
4096 boost::shared_ptr<PannerShell>
4097 Route::panner_shell() const
4099 return _main_outs->panner_shell();
4102 boost::shared_ptr<AutomationControl>
4103 Route::gain_control() const
4105 return _amp->gain_control();
4108 boost::shared_ptr<AutomationControl>
4109 Route::get_control (const Evoral::Parameter& param)
4111 /* either we own the control or .... */
4113 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
4117 /* maybe one of our processors does or ... */
4119 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
4120 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4121 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
4129 /* nobody does so we'll make a new one */
4131 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
4138 boost::shared_ptr<Processor>
4139 Route::nth_plugin (uint32_t n)
4141 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4142 ProcessorList::iterator i;
4144 for (i = _processors.begin(); i != _processors.end(); ++i) {
4145 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
4152 return boost::shared_ptr<Processor> ();
4155 boost::shared_ptr<Processor>
4156 Route::nth_send (uint32_t n)
4158 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4159 ProcessorList::iterator i;
4161 for (i = _processors.begin(); i != _processors.end(); ++i) {
4162 if (boost::dynamic_pointer_cast<Send> (*i)) {
4169 return boost::shared_ptr<Processor> ();
4173 Route::has_io_processor_named (const string& name)
4175 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4176 ProcessorList::iterator i;
4178 for (i = _processors.begin(); i != _processors.end(); ++i) {
4179 if (boost::dynamic_pointer_cast<Send> (*i) ||
4180 boost::dynamic_pointer_cast<PortInsert> (*i)) {
4181 if ((*i)->name() == name) {
4190 MuteMaster::MutePoint
4191 Route::mute_points () const
4193 return _mute_master->mute_points ();
4197 Route::set_processor_positions ()
4199 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4201 bool had_amp = false;
4202 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4203 (*i)->set_pre_fader (!had_amp);
4210 /** Called when there is a proposed change to the input port count */
4212 Route::input_port_count_changing (ChanCount to)
4214 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
4216 /* The processors cannot be configured with the new input arrangement, so
4222 /* The change is ok */
4226 /** Called when there is a proposed change to the output port count */
4228 Route::output_port_count_changing (ChanCount to)
4230 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
4231 if (processor_out_streams.get(*t) > to.get(*t)) {
4235 /* The change is ok */
4240 Route::unknown_processors () const
4244 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4245 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4246 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
4247 p.push_back ((*i)->name ());
4256 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
4258 /* we assume that all our input ports feed all our output ports. its not
4259 universally true, but the alternative is way too corner-case to worry about.
4262 LatencyRange all_connections;
4265 all_connections.min = 0;
4266 all_connections.max = 0;
4268 all_connections.min = ~((pframes_t) 0);
4269 all_connections.max = 0;
4271 /* iterate over all "from" ports and determine the latency range for all of their
4272 connections to the "outside" (outside of this Route).
4275 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4279 p->get_connected_latency_range (range, playback);
4281 all_connections.min = min (all_connections.min, range.min);
4282 all_connections.max = max (all_connections.max, range.max);
4286 /* set the "from" port latencies to the max/min range of all their connections */
4288 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
4289 p->set_private_latency_range (all_connections, playback);
4292 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
4294 all_connections.min += our_latency;
4295 all_connections.max += our_latency;
4297 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
4298 p->set_private_latency_range (all_connections, playback);
4301 return all_connections.max;
4305 Route::set_private_port_latencies (bool playback) const
4307 framecnt_t own_latency = 0;
4309 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
4310 OR LATENCY CALLBACK.
4312 This is called (early) from the latency callback. It computes the REAL
4313 latency associated with each port and stores the result as the "private"
4314 latency of the port. A later call to Route::set_public_port_latencies()
4315 sets all ports to the same value to reflect the fact that we do latency
4316 compensation and so all signals are delayed by the same amount as they
4317 flow through ardour.
4320 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4321 if ((*i)->active ()) {
4322 own_latency += (*i)->signal_latency ();
4327 /* playback: propagate latency from "outside the route" to outputs to inputs */
4328 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
4330 /* capture: propagate latency from "outside the route" to inputs to outputs */
4331 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
4336 Route::set_public_port_latencies (framecnt_t value, bool playback) const
4338 /* this is called to set the JACK-visible port latencies, which take
4339 latency compensation into account.
4348 const PortSet& ports (_input->ports());
4349 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4350 p->set_public_latency_range (range, playback);
4355 const PortSet& ports (_output->ports());
4356 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
4357 p->set_public_latency_range (range, playback);
4362 /** Put the invisible processors in the right place in _processors.
4363 * Must be called with a writer lock on _processor_lock held.
4366 __attribute__((annotate("realtime")))
4369 Route::setup_invisible_processors ()
4372 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
4373 assert (!lm.locked ());
4377 /* too early to be doing this stuff */
4381 /* we'll build this new list here and then use it
4383 * TODO put the ProcessorList is on the stack for RT-safety.
4386 ProcessorList new_processors;
4388 /* find visible processors */
4390 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4391 if ((*i)->display_to_user ()) {
4392 new_processors.push_back (*i);
4398 ProcessorList::iterator amp = new_processors.begin ();
4399 while (amp != new_processors.end() && *amp != _amp) {
4403 assert (amp != new_processors.end ());
4405 /* and the processor after the amp */
4407 ProcessorList::iterator after_amp = amp;
4413 switch (_meter_point) {
4415 assert (!_meter->display_to_user ());
4416 new_processors.push_front (_meter);
4419 assert (!_meter->display_to_user ());
4420 new_processors.insert (amp, _meter);
4422 case MeterPostFader:
4423 /* do nothing here */
4426 /* do nothing here */
4429 /* the meter is visible, so we don't touch it here */
4436 assert (_main_outs);
4437 assert (!_main_outs->display_to_user ());
4438 new_processors.push_back (_main_outs);
4440 /* iterator for the main outs */
4442 ProcessorList::iterator main = new_processors.end();
4445 /* OUTPUT METERING */
4447 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4448 assert (!_meter->display_to_user ());
4450 /* add the processor just before or just after the main outs */
4452 ProcessorList::iterator meter_point = main;
4454 if (_meter_point == MeterOutput) {
4457 new_processors.insert (meter_point, _meter);
4462 if (_monitor_send && !is_monitor ()) {
4463 assert (!_monitor_send->display_to_user ());
4464 if (Config->get_solo_control_is_listen_control()) {
4465 switch (Config->get_listen_position ()) {
4466 case PreFaderListen:
4467 switch (Config->get_pfl_position ()) {
4468 case PFLFromBeforeProcessors:
4469 new_processors.push_front (_monitor_send);
4471 case PFLFromAfterProcessors:
4472 new_processors.insert (amp, _monitor_send);
4475 _monitor_send->set_can_pan (false);
4477 case AfterFaderListen:
4478 switch (Config->get_afl_position ()) {
4479 case AFLFromBeforeProcessors:
4480 new_processors.insert (after_amp, _monitor_send);
4482 case AFLFromAfterProcessors:
4483 new_processors.insert (new_processors.end(), _monitor_send);
4486 _monitor_send->set_can_pan (true);
4490 new_processors.insert (new_processors.end(), _monitor_send);
4491 _monitor_send->set_can_pan (false);
4495 #if 0 // not used - just yet
4496 if (!is_master() && !is_monitor() && !is_auditioner()) {
4497 new_processors.push_front (_delayline);
4501 /* MONITOR CONTROL */
4503 if (_monitor_control && is_monitor ()) {
4504 assert (!_monitor_control->display_to_user ());
4505 new_processors.push_front (_monitor_control);
4508 /* INTERNAL RETURN */
4510 /* doing this here means that any monitor control will come just after
4515 assert (!_intreturn->display_to_user ());
4516 new_processors.push_front (_intreturn);
4519 if (_trim && _trim->active()) {
4520 assert (!_trim->display_to_user ());
4521 new_processors.push_front (_trim);
4523 /* EXPORT PROCESSOR */
4525 if (_capturing_processor) {
4526 assert (!_capturing_processor->display_to_user ());
4527 new_processors.push_front (_capturing_processor);
4530 _processors = new_processors;
4532 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4533 if (!(*i)->display_to_user () && !(*i)->active ()) {
4538 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4539 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4540 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4547 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4548 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4552 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4553 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4560 /** If the meter point is `Custom', make a note of where the meter is.
4561 * This is so that if the meter point is subsequently set to something else,
4562 * and then back to custom, we can put the meter back where it was last time
4563 * custom was enabled.
4565 * Must be called with the _processor_lock held.
4568 Route::maybe_note_meter_position ()
4570 if (_meter_point != MeterCustom) {
4574 _custom_meter_position_noted = true;
4575 /* custom meter points range from after trim to before panner/main_outs
4576 * this is a limitation by the current processor UI
4578 bool seen_trim = false;
4579 _processor_after_last_custom_meter.reset();
4580 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4581 if ((*i) == _trim) {
4584 if ((*i) == _main_outs) {
4585 _processor_after_last_custom_meter = *i;
4588 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4590 _processor_after_last_custom_meter = _trim;
4592 ProcessorList::iterator j = i;
4594 assert(j != _processors.end ()); // main_outs should be before
4595 _processor_after_last_custom_meter = *j;
4600 assert(_processor_after_last_custom_meter.lock());
4603 boost::shared_ptr<Processor>
4604 Route::processor_by_id (PBD::ID id) const
4606 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4607 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4608 if ((*i)->id() == id) {
4613 return boost::shared_ptr<Processor> ();
4616 /** @return the monitoring state, or in other words what data we are pushing
4617 * into the route (data from the inputs, data from disk or silence)
4620 Route::monitoring_state () const
4622 return MonitoringInput;
4625 /** @return what we should be metering; either the data coming from the input
4626 * IO or the data that is flowing through the route.
4629 Route::metering_state () const
4631 return MeteringRoute;
4635 Route::has_external_redirects () const
4637 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4639 /* ignore inactive processors and obviously ignore the main
4640 * outs since everything has them and we don't care.
4643 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4651 boost::shared_ptr<Processor>
4652 Route::the_instrument () const
4654 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4655 return the_instrument_unlocked ();
4658 boost::shared_ptr<Processor>
4659 Route::the_instrument_unlocked () const
4661 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4662 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4663 if ((*i)->input_streams().n_midi() > 0 &&
4664 (*i)->output_streams().n_audio() > 0) {
4669 return boost::shared_ptr<Processor>();
4675 Route::non_realtime_locate (framepos_t pos)
4678 _pannable->transport_located (pos);
4681 if (_delayline.get()) {
4682 _delayline.get()->flush();
4686 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4687 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4689 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4690 (*i)->transport_located (pos);
4696 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4703 * We don't currently mix MIDI input together, so we don't need the
4704 * complex logic of the audio case.
4707 n_buffers = bufs.count().n_midi ();
4709 for (i = 0; i < n_buffers; ++i) {
4711 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4712 MidiBuffer& buf (bufs.get_midi (i));
4715 buf.copy (source_port->get_midi_buffer(nframes));
4717 buf.silence (nframes);
4723 n_buffers = bufs.count().n_audio();
4725 size_t n_ports = io->n_ports().n_audio();
4726 float scaling = 1.0f;
4728 if (n_ports > n_buffers) {
4729 scaling = ((float) n_buffers) / n_ports;
4732 for (i = 0; i < n_ports; ++i) {
4734 /* if there are more ports than buffers, map them onto buffers
4735 * in a round-robin fashion
4738 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4739 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4742 if (i < n_buffers) {
4744 /* first time through just copy a channel into
4748 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4750 if (scaling != 1.0f) {
4751 buf.apply_gain (scaling, nframes);
4756 /* on subsequent times around, merge data from
4757 * the port with what is already there
4760 if (scaling != 1.0f) {
4761 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4763 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4768 /* silence any remaining buffers */
4770 for (; i < n_buffers; ++i) {
4771 AudioBuffer& buf (bufs.get_audio (i));
4772 buf.silence (nframes);
4775 /* establish the initial setup of the buffer set, reflecting what was
4776 copied into it. unless, of course, we are the auditioner, in which
4777 case nothing was fed into it from the inputs at all.
4780 if (!is_auditioner()) {
4781 bufs.set_count (io->n_ports());