2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "libardour-config.h"
29 #include <boost/algorithm/string.hpp>
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/boost_debug.h"
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_port.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/buffer.h"
43 #include "ardour/buffer_set.h"
44 #include "ardour/capturing_processor.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/internal_return.h"
48 #include "ardour/internal_send.h"
49 #include "ardour/meter.h"
50 #include "ardour/midi_buffer.h"
51 #include "ardour/midi_port.h"
52 #include "ardour/monitor_processor.h"
53 #include "ardour/pannable.h"
54 #include "ardour/panner.h"
55 #include "ardour/panner_shell.h"
56 #include "ardour/plugin_insert.h"
57 #include "ardour/port.h"
58 #include "ardour/port_insert.h"
59 #include "ardour/processor.h"
60 #include "ardour/route.h"
61 #include "ardour/route_group.h"
62 #include "ardour/send.h"
63 #include "ardour/session.h"
64 #include "ardour/unknown_processor.h"
65 #include "ardour/utils.h"
70 using namespace ARDOUR;
73 PBD::Signal0<void> Route::SyncOrderKeys;
74 PBD::Signal0<void> Route::RemoteControlIDChange;
76 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
77 : SessionObject (sess, name)
79 , GraphNode (sess._process_graph)
85 , _pending_declick (true)
86 , _meter_point (MeterPostFader)
87 , _meter_type (MeterPeak)
89 , _soloed_by_others_upstream (0)
90 , _soloed_by_others_downstream (0)
92 , _denormal_protection (false)
95 , _declickable (false)
96 , _mute_master (new MuteMaster (sess, name))
97 , _have_internal_generator (false)
99 , _default_type (default_type)
101 , _has_order_key (false)
102 , _remote_control_id (0)
103 , _in_configure_processors (false)
104 , _initial_io_setup (false)
105 , _custom_meter_position_noted (false)
106 , _last_custom_meter_was_at_end (false)
109 _meter_type = MeterK20;
111 processor_max_streams.reset();
117 /* add standard controls */
119 _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
120 _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
122 _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
123 _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
125 add_control (_solo_control);
126 add_control (_mute_control);
130 if (!(_flags & Route::MonitorOut)) {
131 _pannable.reset (new Pannable (_session));
134 /* input and output objects */
136 _input.reset (new IO (_session, _name, IO::Input, _default_type));
137 _output.reset (new IO (_session, _name, IO::Output, _default_type));
139 _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
140 _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
142 _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
143 _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
145 /* add amp processor */
147 _amp.reset (new Amp (_session));
148 add_processor (_amp, PostFader);
150 /* create standard processors: meter, main outs, monitor out;
151 they will be added to _processors by setup_invisible_processors ()
154 _meter.reset (new PeakMeter (_session, _name));
155 _meter->set_owner (this);
156 _meter->set_display_to_user (false);
159 _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
160 _main_outs->activate ();
163 /* where we listen to tracks */
164 _intreturn.reset (new InternalReturn (_session));
165 _intreturn->activate ();
167 /* the thing that provides proper control over a control/monitor/listen bus
168 (such as per-channel cut, dim, solo, invert, etc).
170 _monitor_control.reset (new MonitorProcessor (_session));
171 _monitor_control->activate ();
174 if (is_master() || is_monitor() || is_auditioner()) {
175 _mute_master->set_solo_ignore (true);
178 /* now that we have _meter, its safe to connect to this */
180 Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
183 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
184 configure_processors (0);
192 DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
194 /* do this early so that we don't get incoming signals as we are going through destruction
199 /* don't use clear_processors here, as it depends on the session which may
200 be half-destroyed by now
203 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
204 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
205 (*i)->drop_references ();
208 _processors.clear ();
212 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
214 if (Config->get_remote_model() != UserOrdered) {
218 set_remote_control_id_internal (id, notify_class_listeners);
222 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
224 /* force IDs for master/monitor busses and prevent
225 any other route from accidentally getting these IDs
226 (i.e. legacy sessions)
229 if (is_master() && id != MasterBusRemoteControlID) {
230 id = MasterBusRemoteControlID;
233 if (is_monitor() && id != MonitorBusRemoteControlID) {
234 id = MonitorBusRemoteControlID;
241 /* don't allow it to collide */
243 if (!is_master () && !is_monitor() &&
244 (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
245 id += MonitorBusRemoteControlID;
248 if (id != remote_control_id()) {
249 _remote_control_id = id;
250 RemoteControlIDChanged ();
252 if (notify_class_listeners) {
253 RemoteControlIDChange ();
259 Route::remote_control_id() const
262 return MasterBusRemoteControlID;
266 return MonitorBusRemoteControlID;
269 return _remote_control_id;
273 Route::has_order_key () const
275 return _has_order_key;
279 Route::order_key () const
285 Route::set_remote_control_id_explicit (uint32_t rid)
287 if (is_master() || is_monitor() || is_auditioner()) {
288 /* hard-coded remote IDs, or no remote ID */
292 if (_remote_control_id != rid) {
293 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
294 _remote_control_id = rid;
295 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
298 /* don't emit the class-level RID signal RemoteControlIDChange here,
299 leave that to the entity that changed the order key, so that we
300 don't get lots of emissions for no good reasons (e.g. when changing
301 all route order keys).
303 See Session::sync_remote_id_from_order_keys() for the (primary|only)
304 spot where that is emitted.
309 Route::set_order_key (uint32_t n)
311 _has_order_key = true;
313 if (_order_key == n) {
319 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key set to %2\n",
320 name(), order_key ()));
322 _session.set_dirty ();
326 Route::ensure_track_or_route_name(string name, Session &session)
328 string newname = name;
330 while (!session.io_name_is_legal (newname)) {
331 newname = bump_name_once (newname, '.');
339 Route::inc_gain (gain_t fraction, void *src)
341 _amp->inc_gain (fraction, src);
345 Route::set_gain (gain_t val, void *src)
347 if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
349 if (_route_group->is_relative()) {
351 gain_t usable_gain = _amp->gain();
352 if (usable_gain < 0.000001f) {
353 usable_gain = 0.000001f;
357 if (delta < 0.000001f) {
361 delta -= usable_gain;
366 gain_t factor = delta / usable_gain;
369 factor = _route_group->get_max_factor(factor);
370 if (factor == 0.0f) {
371 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
375 factor = _route_group->get_min_factor(factor);
376 if (factor == 0.0f) {
377 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
382 _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
386 _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
392 if (val == _amp->gain()) {
396 _amp->set_gain (val, src);
400 Route::maybe_declick (BufferSet&, framecnt_t, int)
402 /* this is the "bus" implementation and they never declick.
407 /** Process this route for one (sub) cycle (process thread)
409 * @param bufs Scratch buffers to use for the signal path
410 * @param start_frame Initial transport frame
411 * @param end_frame Final transport frame
412 * @param nframes Number of frames to output (to ports)
414 * Note that (end_frame - start_frame) may not be equal to nframes when the
415 * transport speed isn't 1.0 (eg varispeed).
418 Route::process_output_buffers (BufferSet& bufs,
419 framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
420 int declick, bool gain_automation_ok)
422 /* Caller must hold process lock */
423 assert (!AudioEngine::instance()->process_lock().trylock());
425 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
428 /* figure out if we're going to use gain automation */
429 if (gain_automation_ok) {
430 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
431 _amp->setup_gain_automation (start_frame, end_frame, nframes);
433 _amp->apply_gain_automation (false);
436 /* Tell main outs what to do about monitoring. We do this so that
437 on a transition between monitoring states we get a de-clicking gain
438 change in the _main_outs delivery.
441 _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
443 /* -------------------------------------------------------------------------------------------
444 GLOBAL DECLICK (for transport changes etc.)
445 ----------------------------------------------------------------------------------------- */
447 maybe_declick (bufs, nframes, declick);
448 _pending_declick = 0;
450 /* -------------------------------------------------------------------------------------------
451 DENORMAL CONTROL/PHASE INVERT
452 ----------------------------------------------------------------------------------------- */
454 if (_phase_invert.any ()) {
458 if (_denormal_protection || Config->get_denormal_protection()) {
460 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
461 Sample* const sp = i->data();
463 if (_phase_invert[chn]) {
464 for (pframes_t nx = 0; nx < nframes; ++nx) {
469 for (pframes_t nx = 0; nx < nframes; ++nx) {
477 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
478 Sample* const sp = i->data();
480 if (_phase_invert[chn]) {
481 for (pframes_t nx = 0; nx < nframes; ++nx) {
490 if (_denormal_protection || Config->get_denormal_protection()) {
492 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
493 Sample* const sp = i->data();
494 for (pframes_t nx = 0; nx < nframes; ++nx) {
502 /* -------------------------------------------------------------------------------------------
504 ----------------------------------------------------------------------------------------- */
506 /* set this to be true if the meter will already have been ::run() earlier */
507 bool const meter_already_run = metering_state() == MeteringInput;
509 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
511 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
512 /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
517 /* if it has any inputs, make sure they match */
518 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
519 if (bufs.count() != (*i)->input_streams()) {
521 DEBUG::Processors, string_compose (
522 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
523 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
530 /* should we NOT run plugins here if the route is inactive?
531 do we catch route != active somewhere higher?
534 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
535 bufs.set_count ((*i)->output_streams());
540 Route::n_process_buffers ()
542 return max (_input->n_ports(), processor_max_streams);
546 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
548 assert (is_monitor());
549 BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
550 fill_buffers_with_input (bufs, _input, nframes);
551 passthru (bufs, start_frame, end_frame, nframes, declick);
555 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
559 if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
561 /* control/monitor bus ignores input ports when something is
562 feeding the listen "stream". data will "arrive" into the
563 route from the intreturn processor element.
566 bufs.silence (nframes, 0);
569 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
570 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
574 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
576 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
578 bufs.set_count (_input->n_ports());
579 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
580 process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
584 Route::set_listen (bool yn, void* src)
590 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
591 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
596 if (yn != _monitor_send->active()) {
598 _monitor_send->activate ();
599 _mute_master->set_soloed (true);
601 _monitor_send->deactivate ();
602 _mute_master->set_soloed (false);
605 listen_changed (src); /* EMIT SIGNAL */
611 Route::listening_via_monitor () const
614 return _monitor_send->active ();
621 Route::set_solo_safe (bool yn, void *src)
623 if (_solo_safe != yn) {
625 solo_safe_changed (src);
630 Route::solo_safe() const
636 Route::set_solo (bool yn, void *src)
639 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
643 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
644 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
648 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n",
649 name(), yn, src, (src == _route_group), self_soloed()));
651 if (self_soloed() != yn) {
653 set_mute_master_solo ();
654 solo_changed (true, src); /* EMIT SIGNAL */
655 _solo_control->Changed (); /* EMIT SIGNAL */
660 Route::set_self_solo (bool yn)
662 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
667 Route::mod_solo_by_others_upstream (int32_t delta)
670 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
674 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n",
675 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
677 uint32_t old_sbu = _soloed_by_others_upstream;
680 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
681 _soloed_by_others_upstream += delta;
683 _soloed_by_others_upstream = 0;
686 _soloed_by_others_upstream += delta;
689 DEBUG_TRACE (DEBUG::Solo, string_compose (
690 "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
691 name(), delta, _soloed_by_others_upstream, old_sbu,
692 _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
694 /* push the inverse solo change to everything that feeds us.
696 This is important for solo-within-group. When we solo 1 track out of N that
697 feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
698 on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
699 tracks that feed it. This will silence them if they were audible because
700 of a bus solo, but the newly soloed track will still be audible (because
703 but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
707 if ((_self_solo || _soloed_by_others_downstream) &&
708 ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
709 (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
711 if (delta > 0 || !Config->get_exclusive_solo()) {
712 DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
713 for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
714 boost::shared_ptr<Route> sr = i->r.lock();
716 sr->mod_solo_by_others_downstream (-delta);
722 set_mute_master_solo ();
723 solo_changed (false, this);
727 Route::mod_solo_by_others_downstream (int32_t delta)
730 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
734 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n",
735 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
738 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
739 _soloed_by_others_downstream += delta;
741 _soloed_by_others_downstream = 0;
744 _soloed_by_others_downstream += delta;
747 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
749 set_mute_master_solo ();
750 solo_changed (false, this);
754 Route::set_mute_master_solo ()
756 _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
760 Route::set_solo_isolated (bool yn, void *src)
762 if (is_master() || is_monitor() || is_auditioner()) {
766 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
767 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
771 /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
773 boost::shared_ptr<RouteList> routes = _session.get_routes ();
774 for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
776 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
781 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
783 if (does_feed && !sends_only) {
784 (*i)->set_solo_isolated (yn, (*i)->route_group());
788 /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
790 bool changed = false;
793 if (_solo_isolated == 0) {
794 _mute_master->set_solo_ignore (true);
799 if (_solo_isolated > 0) {
801 if (_solo_isolated == 0) {
802 _mute_master->set_solo_ignore (false);
809 solo_isolated_changed (src);
814 Route::solo_isolated () const
816 return _solo_isolated > 0;
820 Route::set_mute_points (MuteMaster::MutePoint mp)
822 _mute_master->set_mute_points (mp);
823 mute_points_changed (); /* EMIT SIGNAL */
825 if (_mute_master->muted_by_self()) {
826 mute_changed (this); /* EMIT SIGNAL */
827 _mute_control->Changed (); /* EMIT SIGNAL */
832 Route::set_mute (bool yn, void *src)
834 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
835 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
840 _mute_master->set_muted_by_self (yn);
841 /* allow any derived classes to respond to the mute change
842 before anybody else knows about it.
845 /* tell everyone else */
846 mute_changed (src); /* EMIT SIGNAL */
847 _mute_control->Changed (); /* EMIT SIGNAL */
852 Route::muted () const
854 return _mute_master->muted_by_self();
859 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
861 cerr << name << " {" << endl;
862 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
863 p != procs.end(); ++p) {
864 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
870 /** Supposing that we want to insert a Processor at a given Placement, return
871 * the processor to add the new one before (or 0 to add at the end).
873 boost::shared_ptr<Processor>
874 Route::before_processor_for_placement (Placement p)
876 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
878 ProcessorList::iterator loc;
881 /* generic pre-fader: insert immediately before the amp */
882 loc = find (_processors.begin(), _processors.end(), _amp);
884 /* generic post-fader: insert right before the main outs */
885 loc = find (_processors.begin(), _processors.end(), _main_outs);
888 return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
891 /** Supposing that we want to insert a Processor at a given index, return
892 * the processor to add the new one before (or 0 to add at the end).
894 boost::shared_ptr<Processor>
895 Route::before_processor_for_index (int index)
898 return boost::shared_ptr<Processor> ();
901 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
903 ProcessorList::iterator i = _processors.begin ();
905 while (i != _processors.end() && j < index) {
906 if ((*i)->display_to_user()) {
913 return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
916 /** Add a processor either pre- or post-fader
917 * @return 0 on success, non-0 on failure.
920 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
922 return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
926 /** Add a processor to a route such that it ends up with a given index into the visible processors.
927 * @param index Index to add the processor at, or -1 to add at the end of the list.
928 * @return 0 on success, non-0 on failure.
931 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
933 return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
936 /** Add a processor to the route.
937 * @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
938 * @return 0 on success, non-0 on failure.
941 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
943 assert (processor != _meter);
944 assert (processor != _main_outs);
946 DEBUG_TRACE (DEBUG::Processors, string_compose (
947 "%1 adding processor %2\n", name(), processor->name()));
949 if (!AudioEngine::instance()->connected() || !processor) {
954 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
955 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
956 ProcessorState pstate (this);
958 boost::shared_ptr<PluginInsert> pi;
959 boost::shared_ptr<PortInsert> porti;
961 if (processor == _amp) {
962 /* Ensure that only one amp is in the list at any time */
963 ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
964 if (check != _processors.end()) {
965 if (before == _amp) {
966 /* Already in position; all is well */
969 _processors.erase (check);
974 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
976 ProcessorList::iterator loc;
978 /* inserting before a processor; find it */
979 loc = find (_processors.begin(), _processors.end(), before);
980 if (loc == _processors.end ()) {
985 /* inserting at end */
986 loc = _processors.end ();
989 _processors.insert (loc, processor);
990 processor->set_owner (this);
992 // Set up processor list channels. This will set processor->[input|output]_streams(),
993 // configure redirect ports properly, etc.
996 if (configure_processors_unlocked (err)) {
998 configure_processors_unlocked (0); // it worked before we tried to add it ...
1003 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1005 if (pi->has_no_inputs ()) {
1006 /* generator plugin */
1007 _have_internal_generator = true;
1012 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1013 processor->activate ();
1016 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1018 _output->set_user_latency (0);
1021 reset_instrument_info ();
1022 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1023 set_processor_positions ();
1029 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1031 const XMLProperty *prop;
1034 boost::shared_ptr<Processor> processor;
1036 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1037 so that we can add the processor in the right place (pre/post-fader)
1040 XMLNodeList const & children = node.children ();
1041 XMLNodeList::const_iterator i = children.begin ();
1043 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1047 Placement placement = PreFader;
1049 if (i != children.end()) {
1050 if ((prop = (*i)->property (X_("placement"))) != 0) {
1051 placement = Placement (string_2_enum (prop->value(), placement));
1055 if (node.name() == "Insert") {
1057 if ((prop = node.property ("type")) != 0) {
1059 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1060 prop->value() == "lv2" ||
1061 prop->value() == "windows-vst" ||
1062 prop->value() == "lxvst" ||
1063 prop->value() == "audiounit") {
1065 processor.reset (new PluginInsert (_session));
1069 processor.reset (new PortInsert (_session, _pannable, _mute_master));
1074 } else if (node.name() == "Send") {
1076 processor.reset (new Send (_session, _pannable, _mute_master));
1080 error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1084 if (processor->set_state (node, version)) {
1088 return (add_processor (processor, placement) == 0);
1091 catch (failed_constructor &err) {
1092 warning << _("processor could not be created. Ignored.") << endmsg;
1098 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1100 /* NOTE: this is intended to be used ONLY when copying
1101 processors from another Route. Hence the subtle
1102 differences between this and ::add_processor()
1105 ProcessorList::iterator loc;
1108 loc = find(_processors.begin(), _processors.end(), before);
1110 /* nothing specified - at end */
1111 loc = _processors.end ();
1114 if (!_session.engine().connected()) {
1118 if (others.empty()) {
1123 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1124 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1125 ProcessorState pstate (this);
1127 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1133 boost::shared_ptr<PluginInsert> pi;
1135 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1139 _processors.insert (loc, *i);
1140 (*i)->set_owner (this);
1142 if ((*i)->active()) {
1146 /* Think: does this really need to be called for every processor in the loop? */
1148 if (configure_processors_unlocked (err)) {
1150 configure_processors_unlocked (0); // it worked before we tried to add it ...
1155 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1158 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1159 boost::shared_ptr<PluginInsert> pi;
1161 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1162 if (pi->has_no_inputs ()) {
1163 _have_internal_generator = true;
1169 _output->set_user_latency (0);
1172 reset_instrument_info ();
1173 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1174 set_processor_positions ();
1180 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1182 if (p == PreFader) {
1183 start = _processors.begin();
1184 end = find(_processors.begin(), _processors.end(), _amp);
1186 start = find(_processors.begin(), _processors.end(), _amp);
1188 end = _processors.end();
1192 /** Turn off all processors with a given placement
1193 * @param p Placement of processors to disable
1196 Route::disable_processors (Placement p)
1198 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1200 ProcessorList::iterator start, end;
1201 placement_range(p, start, end);
1203 for (ProcessorList::iterator i = start; i != end; ++i) {
1204 (*i)->deactivate ();
1207 _session.set_dirty ();
1210 /** Turn off all redirects
1213 Route::disable_processors ()
1215 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1217 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1218 (*i)->deactivate ();
1221 _session.set_dirty ();
1224 /** Turn off all redirects with a given placement
1225 * @param p Placement of redirects to disable
1228 Route::disable_plugins (Placement p)
1230 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1232 ProcessorList::iterator start, end;
1233 placement_range(p, start, end);
1235 for (ProcessorList::iterator i = start; i != end; ++i) {
1236 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1237 (*i)->deactivate ();
1241 _session.set_dirty ();
1244 /** Turn off all plugins
1247 Route::disable_plugins ()
1249 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1251 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1252 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1253 (*i)->deactivate ();
1257 _session.set_dirty ();
1262 Route::ab_plugins (bool forward)
1264 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1268 /* forward = turn off all active redirects, and mark them so that the next time
1269 we go the other way, we will revert them
1272 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1273 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1277 if ((*i)->active()) {
1278 (*i)->deactivate ();
1279 (*i)->set_next_ab_is_active (true);
1281 (*i)->set_next_ab_is_active (false);
1287 /* backward = if the redirect was marked to go active on the next ab, do so */
1289 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1291 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1295 if ((*i)->get_next_ab_is_active()) {
1298 (*i)->deactivate ();
1303 _session.set_dirty ();
1307 /** Remove processors with a given placement.
1308 * @param p Placement of processors to remove.
1311 Route::clear_processors (Placement p)
1313 if (!_session.engine().connected()) {
1317 bool already_deleting = _session.deletion_in_progress();
1318 if (!already_deleting) {
1319 _session.set_deletion_in_progress();
1323 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1324 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1325 ProcessorList new_list;
1326 ProcessorStreams err;
1327 bool seen_amp = false;
1329 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1335 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1337 /* you can't remove these */
1339 new_list.push_back (*i);
1346 new_list.push_back (*i);
1349 (*i)->drop_references ();
1357 (*i)->drop_references ();
1360 new_list.push_back (*i);
1367 _processors = new_list;
1368 configure_processors_unlocked (&err); // this can't fail
1371 processor_max_streams.reset();
1372 _have_internal_generator = false;
1373 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1374 set_processor_positions ();
1376 reset_instrument_info ();
1378 if (!already_deleting) {
1379 _session.clear_deletion_in_progress();
1384 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1386 // TODO once the export point can be configured properly, do something smarter here
1387 if (processor == _capturing_processor) {
1388 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1389 if (need_process_lock) {
1393 _capturing_processor.reset();
1395 if (need_process_lock) {
1400 /* these can never be removed */
1402 if (processor == _amp || processor == _meter || processor == _main_outs) {
1406 if (!_session.engine().connected()) {
1410 processor_max_streams.reset();
1413 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1414 if (need_process_lock) {
1418 /* Caller must hold process lock */
1419 assert (!AudioEngine::instance()->process_lock().trylock());
1421 Glib::Threads::RWLock::WriterLock lm (_processor_lock); // XXX deadlock after export
1423 ProcessorState pstate (this);
1425 ProcessorList::iterator i;
1426 bool removed = false;
1428 for (i = _processors.begin(); i != _processors.end(); ) {
1429 if (*i == processor) {
1431 /* move along, see failure case for configure_processors()
1432 where we may need to reconfigure the processor.
1435 /* stop redirects that send signals to JACK ports
1436 from causing noise as a result of no longer being
1440 boost::shared_ptr<IOProcessor> iop;
1442 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1446 i = _processors.erase (i);
1454 _output->set_user_latency (0);
1462 if (configure_processors_unlocked (err)) {
1464 /* we know this will work, because it worked before :) */
1465 configure_processors_unlocked (0);
1469 _have_internal_generator = false;
1471 for (i = _processors.begin(); i != _processors.end(); ++i) {
1472 boost::shared_ptr<PluginInsert> pi;
1474 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1475 if (pi->has_no_inputs ()) {
1476 _have_internal_generator = true;
1481 if (need_process_lock) {
1486 reset_instrument_info ();
1487 processor->drop_references ();
1488 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1489 set_processor_positions ();
1495 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1497 ProcessorList deleted;
1499 if (!_session.engine().connected()) {
1503 processor_max_streams.reset();
1506 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1507 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1508 ProcessorState pstate (this);
1510 ProcessorList::iterator i;
1511 boost::shared_ptr<Processor> processor;
1513 for (i = _processors.begin(); i != _processors.end(); ) {
1517 /* these can never be removed */
1519 if (processor == _amp || processor == _meter || processor == _main_outs) {
1524 /* see if its in the list of processors to delete */
1526 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1531 /* stop IOProcessors that send to JACK ports
1532 from causing noise as a result of no longer being
1536 boost::shared_ptr<IOProcessor> iop;
1538 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1542 deleted.push_back (processor);
1543 i = _processors.erase (i);
1546 if (deleted.empty()) {
1547 /* none of those in the requested list were found */
1551 _output->set_user_latency (0);
1553 if (configure_processors_unlocked (err)) {
1555 /* we know this will work, because it worked before :) */
1556 configure_processors_unlocked (0);
1561 _have_internal_generator = false;
1563 for (i = _processors.begin(); i != _processors.end(); ++i) {
1564 boost::shared_ptr<PluginInsert> pi;
1566 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1567 if (pi->has_no_inputs ()) {
1568 _have_internal_generator = true;
1575 /* now try to do what we need to so that those that were removed will be deleted */
1577 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1578 (*i)->drop_references ();
1581 reset_instrument_info ();
1582 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1583 set_processor_positions ();
1589 Route::reset_instrument_info ()
1591 boost::shared_ptr<Processor> instr = the_instrument();
1593 _instrument_info.set_internal_instrument (instr);
1597 /** Caller must hold process lock */
1599 Route::configure_processors (ProcessorStreams* err)
1601 assert (!AudioEngine::instance()->process_lock().trylock());
1602 if (!_in_configure_processors) {
1603 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1604 return configure_processors_unlocked (err);
1611 Route::input_streams () const
1613 return _input->n_ports ();
1616 list<pair<ChanCount, ChanCount> >
1617 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1619 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1621 return try_configure_processors_unlocked (in, err);
1624 list<pair<ChanCount, ChanCount> >
1625 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1627 // Check each processor in order to see if we can configure as requested
1629 list<pair<ChanCount, ChanCount> > configuration;
1632 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1633 DEBUG_TRACE (DEBUG::Processors, "{\n");
1635 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1637 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1638 DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1639 DEBUG_TRACE (DEBUG::Processors, "}\n");
1640 return list<pair<ChanCount, ChanCount> > ();
1643 if ((*p)->can_support_io_configuration(in, out)) {
1644 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1645 configuration.push_back(make_pair(in, out));
1652 DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1653 DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1654 DEBUG_TRACE (DEBUG::Processors, "}\n");
1655 return list<pair<ChanCount, ChanCount> > ();
1659 DEBUG_TRACE (DEBUG::Processors, "}\n");
1661 return configuration;
1664 /** Set the input/output configuration of each processor in the processors list.
1665 * Caller must hold process lock.
1666 * Return 0 on success, otherwise configuration is impossible.
1669 Route::configure_processors_unlocked (ProcessorStreams* err)
1671 assert (!AudioEngine::instance()->process_lock().trylock());
1673 if (_in_configure_processors) {
1677 /* put invisible processors where they should be */
1678 setup_invisible_processors ();
1680 _in_configure_processors = true;
1682 list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1684 if (configuration.empty ()) {
1685 _in_configure_processors = false;
1690 bool seen_mains_out = false;
1691 processor_out_streams = _input->n_ports();
1692 processor_max_streams.reset();
1694 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1695 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1697 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1701 (*p)->configure_io(c->first, c->second);
1702 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1703 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1706 if (boost::dynamic_pointer_cast<Delivery> (*p)
1707 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1708 /* main delivery will increase port count to match input.
1709 * the Delivery::Main is usually the last processor - followed only by
1712 seen_mains_out = true;
1714 if (!seen_mains_out) {
1715 processor_out_streams = out;
1721 _meter->reset_max_channels (processor_max_streams);
1724 /* make sure we have sufficient scratch buffers to cope with the new processor
1727 _session.ensure_buffers (n_process_buffers ());
1729 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1731 _in_configure_processors = false;
1735 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1736 * @param state New active state for those processors.
1739 Route::all_visible_processors_active (bool state)
1741 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1743 if (_processors.empty()) {
1747 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1748 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1755 (*i)->deactivate ();
1759 _session.set_dirty ();
1763 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1765 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1766 NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1767 processors in the current actual processor list that are hidden. Any visible processors
1768 in the current list but not in "new_order" will be assumed to be deleted.
1772 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
1773 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1774 ProcessorState pstate (this);
1776 ProcessorList::iterator oiter;
1777 ProcessorList::const_iterator niter;
1778 ProcessorList as_it_will_be;
1780 oiter = _processors.begin();
1781 niter = new_order.begin();
1783 while (niter != new_order.end()) {
1785 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1786 then append it to the temp list.
1788 Otherwise, see if the next processor in the old list is in the new list. if not,
1789 its been deleted. If its there, append it to the temp list.
1792 if (oiter == _processors.end()) {
1794 /* no more elements in the old list, so just stick the rest of
1795 the new order onto the temp list.
1798 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1799 while (niter != new_order.end()) {
1806 if (!(*oiter)->display_to_user()) {
1808 as_it_will_be.push_back (*oiter);
1812 /* visible processor: check that its in the new order */
1814 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1815 /* deleted: do nothing, shared_ptr<> will clean up */
1817 /* ignore this one, and add the next item from the new order instead */
1818 as_it_will_be.push_back (*niter);
1823 /* now remove from old order - its taken care of no matter what */
1824 oiter = _processors.erase (oiter);
1829 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1831 /* If the meter is in a custom position, find it and make a rough note of its position */
1832 maybe_note_meter_position ();
1834 if (configure_processors_unlocked (err)) {
1840 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1841 set_processor_positions ();
1853 Route::get_template()
1855 return state(false);
1859 Route::state(bool full_state)
1861 XMLNode *node = new XMLNode("Route");
1862 ProcessorList::iterator i;
1865 id().print (buf, sizeof (buf));
1866 node->add_property("id", buf);
1867 node->add_property ("name", _name);
1868 node->add_property("default-type", _default_type.to_string());
1871 node->add_property("flags", enum_2_string (_flags));
1874 node->add_property("active", _active?"yes":"no");
1876 boost::to_string (_phase_invert, p);
1877 node->add_property("phase-invert", p);
1878 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1879 node->add_property("meter-point", enum_2_string (_meter_point));
1881 node->add_property("meter-type", enum_2_string (_meter_type));
1884 node->add_property("route-group", _route_group->name());
1887 snprintf (buf, sizeof (buf), "%d", _order_key);
1888 node->add_property ("order-key", buf);
1889 node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1890 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1891 node->add_property ("soloed-by-upstream", buf);
1892 snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1893 node->add_property ("soloed-by-downstream", buf);
1894 node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1895 node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1897 node->add_child_nocopy (_input->state (full_state));
1898 node->add_child_nocopy (_output->state (full_state));
1899 node->add_child_nocopy (_solo_control->get_state ());
1900 node->add_child_nocopy (_mute_control->get_state ());
1901 node->add_child_nocopy (_mute_master->get_state ());
1903 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1904 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1905 remote_control_node->add_property (X_("id"), buf);
1906 node->add_child_nocopy (*remote_control_node);
1908 if (_comment.length()) {
1909 XMLNode *cmt = node->add_child ("Comment");
1910 cmt->add_content (_comment);
1914 node->add_child_nocopy (_pannable->state (full_state));
1917 for (i = _processors.begin(); i != _processors.end(); ++i) {
1919 /* template save: do not include internal sends functioning as
1920 aux sends because the chance of the target ID
1921 in the session where this template is used
1924 similarly, do not save listen sends which connect to
1925 the monitor section, because these will always be
1928 boost::shared_ptr<InternalSend> is;
1930 if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1931 if (is->role() == Delivery::Listen) {
1936 node->add_child_nocopy((*i)->state (full_state));
1940 node->add_child_copy (*_extra_xml);
1943 if (_custom_meter_position_noted) {
1944 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1946 after->id().print (buf, sizeof (buf));
1947 node->add_property (X_("processor-after-last-custom-meter"), buf);
1950 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1957 Route::set_state (const XMLNode& node, int version)
1959 if (version < 3000) {
1960 return set_state_2X (node, version);
1964 XMLNodeConstIterator niter;
1966 const XMLProperty *prop;
1968 if (node.name() != "Route"){
1969 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1973 if ((prop = node.property (X_("name"))) != 0) {
1974 Route::set_name (prop->value());
1978 _initial_io_setup = true;
1980 if ((prop = node.property (X_("flags"))) != 0) {
1981 _flags = Flag (string_2_enum (prop->value(), _flags));
1986 if (is_master() || is_monitor() || is_auditioner()) {
1987 _mute_master->set_solo_ignore (true);
1991 /* monitor bus does not get a panner, but if (re)created
1992 via XML, it will already have one by the time we
1993 call ::set_state(). so ... remove it.
1998 /* add all processors (except amp, which is always present) */
2000 nlist = node.children();
2001 XMLNode processor_state (X_("processor_state"));
2003 Stateful::save_extra_xml (node);
2005 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2009 if (child->name() == IO::state_node_name) {
2010 if ((prop = child->property (X_("direction"))) == 0) {
2014 if (prop->value() == "Input") {
2015 _input->set_state (*child, version);
2016 } else if (prop->value() == "Output") {
2017 _output->set_state (*child, version);
2021 if (child->name() == X_("Processor")) {
2022 processor_state.add_child_copy (*child);
2025 if (child->name() == X_("Pannable")) {
2027 _pannable->set_state (*child, version);
2029 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2034 if ((prop = node.property (X_("meter-point"))) != 0) {
2035 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2036 set_meter_point (mp, true);
2038 _meter->set_display_to_user (_meter_point == MeterCustom);
2042 if ((prop = node.property (X_("meter-type"))) != 0) {
2043 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2046 _initial_io_setup = false;
2048 set_processor_state (processor_state);
2050 // this looks up the internal instrument in processors
2051 reset_instrument_info();
2053 if ((prop = node.property ("self-solo")) != 0) {
2054 set_self_solo (string_is_affirmative (prop->value()));
2057 if ((prop = node.property ("soloed-by-upstream")) != 0) {
2058 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2059 mod_solo_by_others_upstream (atoi (prop->value()));
2062 if ((prop = node.property ("soloed-by-downstream")) != 0) {
2063 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2064 mod_solo_by_others_downstream (atoi (prop->value()));
2067 if ((prop = node.property ("solo-isolated")) != 0) {
2068 set_solo_isolated (string_is_affirmative (prop->value()), this);
2071 if ((prop = node.property ("solo-safe")) != 0) {
2072 set_solo_safe (string_is_affirmative (prop->value()), this);
2075 if ((prop = node.property (X_("phase-invert"))) != 0) {
2076 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2079 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2080 set_denormal_protection (string_is_affirmative (prop->value()));
2083 if ((prop = node.property (X_("active"))) != 0) {
2084 bool yn = string_is_affirmative (prop->value());
2085 _active = !yn; // force switch
2086 set_active (yn, this);
2089 if ((prop = node.property (X_("order-key"))) != 0) { // New order key (no separate mixer/editor ordering)
2090 set_order_key (atoi(prop->value()));
2093 if ((prop = node.property (X_("order-keys"))) != 0) { // Deprecated order keys
2097 string::size_type colon, equal;
2098 string remaining = prop->value();
2100 while (remaining.length()) {
2102 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2103 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2106 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2107 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2110 string keyname = remaining.substr (0, equal);
2112 if ((keyname == "EditorSort") || (keyname == "editor")) {
2113 cerr << "Setting " << name() << " order key to " << n << " using saved Editor order." << endl;
2119 colon = remaining.find_first_of (':');
2121 if (colon != string::npos) {
2122 remaining = remaining.substr (colon+1);
2129 if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2130 PBD::ID id (prop->value ());
2131 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2132 ProcessorList::const_iterator i = _processors.begin ();
2133 while (i != _processors.end() && (*i)->id() != id) {
2137 if (i != _processors.end ()) {
2138 _processor_after_last_custom_meter = *i;
2139 _custom_meter_position_noted = true;
2143 if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2144 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2147 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2150 if (child->name() == X_("Comment")) {
2152 /* XXX this is a terrible API design in libxml++ */
2154 XMLNode *cmt = *(child->children().begin());
2155 _comment = cmt->content();
2157 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2158 if (prop->value() == "solo") {
2159 _solo_control->set_state (*child, version);
2160 } else if (prop->value() == "mute") {
2161 _mute_control->set_state (*child, version);
2164 } else if (child->name() == X_("RemoteControl")) {
2165 if ((prop = child->property (X_("id"))) != 0) {
2167 sscanf (prop->value().c_str(), "%d", &x);
2168 set_remote_control_id_internal (x);
2171 } else if (child->name() == X_("MuteMaster")) {
2172 _mute_master->set_state (*child, version);
2180 Route::set_state_2X (const XMLNode& node, int version)
2183 XMLNodeConstIterator niter;
2185 const XMLProperty *prop;
2187 /* 2X things which still remain to be handled:
2193 if (node.name() != "Route") {
2194 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2198 if ((prop = node.property (X_("flags"))) != 0) {
2199 string f = prop->value ();
2200 boost::replace_all (f, "ControlOut", "MonitorOut");
2201 _flags = Flag (string_2_enum (f, _flags));
2206 if (is_master() || is_monitor() || is_auditioner()) {
2207 _mute_master->set_solo_ignore (true);
2210 if ((prop = node.property (X_("phase-invert"))) != 0) {
2211 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2212 if (string_is_affirmative (prop->value ())) {
2215 set_phase_invert (p);
2218 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2219 set_denormal_protection (string_is_affirmative (prop->value()));
2222 if ((prop = node.property (X_("soloed"))) != 0) {
2223 bool yn = string_is_affirmative (prop->value());
2225 /* XXX force reset of solo status */
2227 set_solo (yn, this);
2230 if ((prop = node.property (X_("muted"))) != 0) {
2233 bool muted = string_is_affirmative (prop->value());
2239 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2241 if (string_is_affirmative (prop->value())){
2242 mute_point = mute_point + "PreFader";
2247 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2249 if (string_is_affirmative (prop->value())){
2252 mute_point = mute_point + ",";
2255 mute_point = mute_point + "PostFader";
2260 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2262 if (string_is_affirmative (prop->value())){
2265 mute_point = mute_point + ",";
2268 mute_point = mute_point + "Listen";
2273 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2275 if (string_is_affirmative (prop->value())){
2278 mute_point = mute_point + ",";
2281 mute_point = mute_point + "Main";
2285 _mute_master->set_mute_points (mute_point);
2286 _mute_master->set_muted_by_self (true);
2290 if ((prop = node.property (X_("meter-point"))) != 0) {
2291 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2294 /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2295 don't mean the same thing.
2298 if ((prop = node.property (X_("order-keys"))) != 0) {
2302 string::size_type colon, equal;
2303 string remaining = prop->value();
2305 while (remaining.length()) {
2307 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2308 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2311 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2312 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2315 string keyname = remaining.substr (0, equal);
2317 if (keyname == "EditorSort" || keyname == "editor") {
2318 info << string_compose(_("Converting deprecated order key for %1 using Editor order %2"), name (), n) << endmsg;
2324 colon = remaining.find_first_of (':');
2326 if (colon != string::npos) {
2327 remaining = remaining.substr (colon+1);
2336 nlist = node.children ();
2337 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2341 if (child->name() == IO::state_node_name) {
2343 /* there is a note in IO::set_state_2X() about why we have to call
2347 _input->set_state_2X (*child, version, true);
2348 _output->set_state_2X (*child, version, false);
2350 if ((prop = child->property (X_("name"))) != 0) {
2351 Route::set_name (prop->value ());
2356 if ((prop = child->property (X_("active"))) != 0) {
2357 bool yn = string_is_affirmative (prop->value());
2358 _active = !yn; // force switch
2359 set_active (yn, this);
2362 if ((prop = child->property (X_("gain"))) != 0) {
2365 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2366 _amp->gain_control()->set_value (val);
2370 /* Set up Panners in the IO */
2371 XMLNodeList io_nlist = child->children ();
2373 XMLNodeConstIterator io_niter;
2376 for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2378 io_child = *io_niter;
2380 if (io_child->name() == X_("Panner")) {
2381 _main_outs->panner_shell()->set_state(*io_child, version);
2382 } else if (io_child->name() == X_("Automation")) {
2383 /* IO's automation is for the fader */
2384 _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2390 XMLNodeList redirect_nodes;
2392 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2396 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2397 redirect_nodes.push_back(child);
2402 set_processor_state_2X (redirect_nodes, version);
2404 Stateful::save_extra_xml (node);
2406 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2409 if (child->name() == X_("Comment")) {
2411 /* XXX this is a terrible API design in libxml++ */
2413 XMLNode *cmt = *(child->children().begin());
2414 _comment = cmt->content();
2416 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2417 if (prop->value() == X_("solo")) {
2418 _solo_control->set_state (*child, version);
2419 } else if (prop->value() == X_("mute")) {
2420 _mute_control->set_state (*child, version);
2423 } else if (child->name() == X_("RemoteControl")) {
2424 if ((prop = child->property (X_("id"))) != 0) {
2426 sscanf (prop->value().c_str(), "%d", &x);
2427 set_remote_control_id_internal (x);
2437 Route::get_processor_state ()
2439 XMLNode* root = new XMLNode (X_("redirects"));
2440 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2441 root->add_child_nocopy ((*i)->state (true));
2448 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2450 /* We don't bother removing existing processors not in nList, as this
2451 method will only be called when creating a Route from scratch, not
2452 for undo purposes. Just put processors in at the appropriate place
2456 for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2457 add_processor_from_xml_2X (**i, version);
2462 Route::set_processor_state (const XMLNode& node)
2464 const XMLNodeList &nlist = node.children();
2465 XMLNodeConstIterator niter;
2466 ProcessorList new_order;
2467 bool must_configure = false;
2469 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2471 XMLProperty* prop = (*niter)->property ("type");
2473 if (prop->value() == "amp") {
2474 _amp->set_state (**niter, Stateful::current_state_version);
2475 new_order.push_back (_amp);
2476 } else if (prop->value() == "meter") {
2477 _meter->set_state (**niter, Stateful::current_state_version);
2478 new_order.push_back (_meter);
2479 } else if (prop->value() == "main-outs") {
2480 _main_outs->set_state (**niter, Stateful::current_state_version);
2481 } else if (prop->value() == "intreturn") {
2483 _intreturn.reset (new InternalReturn (_session));
2484 must_configure = true;
2486 _intreturn->set_state (**niter, Stateful::current_state_version);
2487 } else if (is_monitor() && prop->value() == "monitor") {
2488 if (!_monitor_control) {
2489 _monitor_control.reset (new MonitorProcessor (_session));
2490 must_configure = true;
2492 _monitor_control->set_state (**niter, Stateful::current_state_version);
2493 } else if (prop->value() == "capture") {
2494 /* CapturingProcessor should never be restored, it's always
2495 added explicitly when needed */
2497 ProcessorList::iterator o;
2499 for (o = _processors.begin(); o != _processors.end(); ++o) {
2500 XMLProperty* id_prop = (*niter)->property(X_("id"));
2501 if (id_prop && (*o)->id() == id_prop->value()) {
2502 (*o)->set_state (**niter, Stateful::current_state_version);
2503 new_order.push_back (*o);
2508 // If the processor (*niter) is not on the route then create it
2510 if (o == _processors.end()) {
2512 boost::shared_ptr<Processor> processor;
2514 if (prop->value() == "intsend") {
2516 processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Aux, true));
2518 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2519 prop->value() == "lv2" ||
2520 prop->value() == "windows-vst" ||
2521 prop->value() == "lxvst" ||
2522 prop->value() == "audiounit") {
2524 processor.reset (new PluginInsert(_session));
2526 } else if (prop->value() == "port") {
2528 processor.reset (new PortInsert (_session, _pannable, _mute_master));
2530 } else if (prop->value() == "send") {
2532 processor.reset (new Send (_session, _pannable, _mute_master, Delivery::Send, true));
2535 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2539 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2540 /* This processor could not be configured. Turn it into a UnknownProcessor */
2541 processor.reset (new UnknownProcessor (_session, **niter));
2544 /* we have to note the monitor send here, otherwise a new one will be created
2545 and the state of this one will be lost.
2547 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2548 if (isend && isend->role() == Delivery::Listen) {
2549 _monitor_send = isend;
2552 /* it doesn't matter if invisible processors are added here, as they
2553 will be sorted out by setup_invisible_processors () shortly.
2556 new_order.push_back (processor);
2557 must_configure = true;
2563 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
2564 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2565 _processors = new_order;
2567 if (must_configure) {
2568 configure_processors_unlocked (0);
2571 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2573 (*i)->set_owner (this);
2574 (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2576 boost::shared_ptr<PluginInsert> pi;
2578 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2579 if (pi->has_no_inputs ()) {
2580 _have_internal_generator = true;
2587 reset_instrument_info ();
2588 processors_changed (RouteProcessorChange ());
2589 set_processor_positions ();
2593 Route::curve_reallocate ()
2595 // _gain_automation_curve.finish_resize ();
2596 // _pan_automation_curve.finish_resize ();
2600 Route::silence (framecnt_t nframes)
2602 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2607 silence_unlocked (nframes);
2611 Route::silence_unlocked (framecnt_t nframes)
2613 /* Must be called with the processor lock held */
2617 _output->silence (nframes);
2619 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2620 boost::shared_ptr<PluginInsert> pi;
2622 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2623 // skip plugins, they don't need anything when we're not active
2627 (*i)->silence (nframes);
2630 if (nframes == _session.get_block_size()) {
2637 Route::add_internal_return ()
2640 _intreturn.reset (new InternalReturn (_session));
2641 add_processor (_intreturn, PreFader);
2646 Route::add_send_to_internal_return (InternalSend* send)
2648 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2650 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2651 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2654 return d->add_send (send);
2660 Route::remove_send_from_internal_return (InternalSend* send)
2662 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2664 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2665 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2668 return d->remove_send (send);
2674 Route::enable_monitor_send ()
2676 /* Caller must hold process lock */
2677 assert (!AudioEngine::instance()->process_lock().trylock());
2679 /* master never sends to monitor section via the normal mechanism */
2680 assert (!is_master ());
2681 assert (!is_monitor ());
2683 /* make sure we have one */
2684 if (!_monitor_send) {
2685 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2686 _monitor_send->set_display_to_user (false);
2690 configure_processors (0);
2693 /** Add an aux send to a route.
2694 * @param route route to send to.
2695 * @param before Processor to insert before, or 0 to insert at the end.
2698 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2700 assert (route != _session.monitor_out ());
2703 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2705 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2707 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2709 if (d && d->target_route() == route) {
2710 /* already listening via the specified IO: do nothing */
2718 boost::shared_ptr<InternalSend> listener;
2721 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2722 listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2725 add_processor (listener, before);
2727 } catch (failed_constructor& err) {
2735 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2737 ProcessorStreams err;
2738 ProcessorList::iterator tmp;
2741 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2743 /* have to do this early because otherwise processor reconfig
2744 * will put _monitor_send back in the list
2747 if (route == _session.monitor_out()) {
2748 _monitor_send.reset ();
2752 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2754 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2756 if (d && d->target_route() == route) {
2758 remove_processor (*x, &err, false);
2761 /* list could have been demolished while we dropped the lock
2772 Route::set_comment (string cmt, void *src)
2775 comment_changed (src);
2776 _session.set_dirty ();
2780 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2782 FeedRecord fr (other, via_sends_only);
2784 pair<FedBy::iterator,bool> result = _fed_by.insert (fr);
2786 if (!result.second) {
2788 /* already a record for "other" - make sure sends-only information is correct */
2789 if (!via_sends_only && result.first->sends_only) {
2790 FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2791 frp->sends_only = false;
2795 return result.second;
2799 Route::clear_fed_by ()
2805 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2807 const FedBy& fed_by (other->fed_by());
2809 for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2810 boost::shared_ptr<Route> sr = f->r.lock();
2812 if (sr && (sr.get() == this)) {
2814 if (via_sends_only) {
2815 *via_sends_only = f->sends_only;
2826 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2828 DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2830 if (_output->connected_to (other->input())) {
2831 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2832 if (via_send_only) {
2833 *via_send_only = false;
2840 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2842 boost::shared_ptr<IOProcessor> iop;
2844 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2845 if (iop->feeds (other)) {
2846 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2847 if (via_send_only) {
2848 *via_send_only = true;
2852 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2855 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2860 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdoes NOT feed %1\n", other->name()));
2865 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2867 return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2870 /** Called from the (non-realtime) butler thread when the transport is stopped */
2872 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
2874 framepos_t now = _session.transport_frame();
2877 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2879 Automatable::transport_stopped (now);
2881 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2883 if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2887 (*i)->transport_stopped (now);
2891 _roll_delay = _initial_delay;
2895 Route::input_change_handler (IOChange change, void * /*src*/)
2897 bool need_to_queue_solo_change = true;
2899 if ((change.type & IOChange::ConfigurationChanged)) {
2900 /* This is called with the process lock held if change
2901 contains ConfigurationChanged
2903 need_to_queue_solo_change = false;
2904 configure_processors (0);
2905 _phase_invert.resize (_input->n_ports().n_audio ());
2906 io_changed (); /* EMIT SIGNAL */
2909 if (!_input->connected() && _soloed_by_others_upstream) {
2910 if (need_to_queue_solo_change) {
2911 _session.cancel_solo_after_disconnect (shared_from_this(), true);
2913 cancel_solo_after_disconnect (true);
2919 Route::output_change_handler (IOChange change, void * /*src*/)
2921 bool need_to_queue_solo_change = true;
2922 if (_initial_io_setup) {
2926 if ((change.type & IOChange::ConfigurationChanged)) {
2927 /* This is called with the process lock held if change
2928 contains ConfigurationChanged
2930 need_to_queue_solo_change = false;
2931 configure_processors (0);
2932 io_changed (); /* EMIT SIGNAL */
2935 if (!_output->connected() && _soloed_by_others_downstream) {
2936 if (need_to_queue_solo_change) {
2937 _session.cancel_solo_after_disconnect (shared_from_this(), false);
2939 cancel_solo_after_disconnect (false);
2945 Route::cancel_solo_after_disconnect (bool upstream)
2948 _soloed_by_others_upstream = 0;
2950 _soloed_by_others_downstream = 0;
2952 set_mute_master_solo ();
2953 solo_changed (false, this);
2957 Route::pans_required () const
2959 if (n_outputs().n_audio() < 2) {
2963 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2967 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
2969 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2975 if (n_outputs().n_total() == 0) {
2979 if (!_active || n_inputs() == ChanCount::ZERO) {
2980 silence_unlocked (nframes);
2984 if (session_state_changing) {
2985 if (_session.transport_speed() != 0.0f) {
2986 /* we're rolling but some state is changing (e.g. our diskstream contents)
2987 so we cannot use them. Be silent till this is over.
2989 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
2991 silence_unlocked (nframes);
2994 /* we're really not rolling, so we're either delivery silence or actually
2995 monitoring, both of which are safe to do while session_state_changing is true.
2999 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3001 fill_buffers_with_input (bufs, _input, nframes);
3003 if (_meter_point == MeterInput) {
3004 _meter->run (bufs, start_frame, end_frame, nframes, true);
3007 _amp->apply_gain_automation (false);
3008 passthru (bufs, start_frame, end_frame, nframes, 0);
3014 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3016 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3021 if (n_outputs().n_total() == 0) {
3025 if (!_active || n_inputs().n_total() == 0) {
3026 silence_unlocked (nframes);
3030 framepos_t unused = 0;
3032 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3038 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3040 fill_buffers_with_input (bufs, _input, nframes);
3042 if (_meter_point == MeterInput) {
3043 _meter->run (bufs, start_frame, end_frame, nframes, true);
3046 passthru (bufs, start_frame, end_frame, nframes, declick);
3052 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3059 Route::flush_processors ()
3061 /* XXX shouldn't really try to take this lock, since
3062 this is called from the RT audio thread.
3065 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3067 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3073 Route::set_meter_point (MeterPoint p, bool force)
3075 if (_meter_point == p && !force) {
3079 bool meter_was_visible_to_user = _meter->display_to_user ();
3082 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3083 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3085 maybe_note_meter_position ();
3089 if (_meter_point != MeterCustom) {
3091 _meter->set_display_to_user (false);
3093 setup_invisible_processors ();
3097 _meter->set_display_to_user (true);
3099 /* If we have a previous position for the custom meter, try to put it there */
3100 if (_custom_meter_position_noted) {
3101 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3104 ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3105 if (i != _processors.end ()) {
3106 _processors.remove (_meter);
3107 _processors.insert (i, _meter);
3109 } else if (_last_custom_meter_was_at_end) {
3110 _processors.remove (_meter);
3111 _processors.push_back (_meter);
3116 /* Set up the meter for its new position */
3118 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3122 if (loc == _processors.begin()) {
3123 m_in = _input->n_ports();
3125 ProcessorList::iterator before = loc;
3127 m_in = (*before)->output_streams ();
3130 _meter->reflect_inputs (m_in);
3132 /* we do not need to reconfigure the processors, because the meter
3133 (a) is always ready to handle processor_max_streams
3134 (b) is always an N-in/N-out processor, and thus moving
3135 it doesn't require any changes to the other processors.
3139 meter_change (); /* EMIT SIGNAL */
3141 bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3143 processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3147 Route::listen_position_changed ()
3150 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3151 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3152 ProcessorState pstate (this);
3154 if (configure_processors_unlocked (0)) {
3156 configure_processors_unlocked (0); // it worked before we tried to add it ...
3161 processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3162 _session.set_dirty ();
3165 boost::shared_ptr<CapturingProcessor>
3166 Route::add_export_point()
3168 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3169 if (!_capturing_processor) {
3171 Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
3172 Glib::Threads::RWLock::WriterLock lw (_processor_lock);
3174 _capturing_processor.reset (new CapturingProcessor (_session));
3175 _capturing_processor->activate ();
3177 configure_processors_unlocked (0);
3181 return _capturing_processor;
3185 Route::update_signal_latency ()
3187 framecnt_t l = _output->user_latency();
3189 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3190 if ((*i)->active ()) {
3191 l += (*i)->signal_latency ();
3195 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3197 if (_signal_latency != l) {
3198 _signal_latency = l;
3199 signal_latency_changed (); /* EMIT SIGNAL */
3202 return _signal_latency;
3206 Route::set_user_latency (framecnt_t nframes)
3208 _output->set_user_latency (nframes);
3209 _session.update_latency_compensation ();
3213 Route::set_latency_compensation (framecnt_t longest_session_latency)
3215 framecnt_t old = _initial_delay;
3217 if (_signal_latency < longest_session_latency) {
3218 _initial_delay = longest_session_latency - _signal_latency;
3223 DEBUG_TRACE (DEBUG::Latency, string_compose (
3224 "%1: compensate for maximum latency of %2,"
3225 "given own latency of %3, using initial delay of %4\n",
3226 name(), longest_session_latency, _signal_latency, _initial_delay));
3228 if (_initial_delay != old) {
3229 initial_delay_changed (); /* EMIT SIGNAL */
3232 if (_session.transport_stopped()) {
3233 _roll_delay = _initial_delay;
3237 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3238 : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3239 boost::shared_ptr<AutomationList>(), name)
3242 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3247 Route::SoloControllable::set_value (double val)
3249 bool bval = ((val >= 0.5f) ? true: false);
3251 boost::shared_ptr<RouteList> rl (new RouteList);
3253 boost::shared_ptr<Route> r = _route.lock ();
3260 if (Config->get_solo_control_is_listen_control()) {
3261 _session.set_listen (rl, bval);
3263 _session.set_solo (rl, bval);
3268 Route::SoloControllable::get_value () const
3270 boost::shared_ptr<Route> r = _route.lock ();
3275 if (Config->get_solo_control_is_listen_control()) {
3276 return r->listening_via_monitor() ? 1.0f : 0.0f;
3278 return r->self_soloed() ? 1.0f : 0.0f;
3282 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3283 : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3284 boost::shared_ptr<AutomationList>(), name)
3287 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3292 Route::MuteControllable::set_value (double val)
3294 bool bval = ((val >= 0.5f) ? true: false);
3296 boost::shared_ptr<RouteList> rl (new RouteList);
3298 boost::shared_ptr<Route> r = _route.lock ();
3304 _session.set_mute (rl, bval);
3308 Route::MuteControllable::get_value () const
3310 boost::shared_ptr<Route> r = _route.lock ();
3315 return r->muted() ? 1.0f : 0.0f;
3319 Route::set_block_size (pframes_t nframes)
3321 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3322 (*i)->set_block_size (nframes);
3325 _session.ensure_buffers (n_process_buffers ());
3329 Route::protect_automation ()
3331 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3332 (*i)->protect_automation();
3335 /** @param declick 1 to set a pending declick fade-in,
3336 * -1 to set a pending declick fade-out
3339 Route::set_pending_declick (int declick)
3342 /* this call is not allowed to turn off a pending declick */
3344 _pending_declick = declick;
3347 _pending_declick = 0;
3351 /** Shift automation forwards from a particular place, thereby inserting time.
3352 * Adds undo commands for any shifts that are performed.
3354 * @param pos Position to start shifting from.
3355 * @param frames Amount to shift forwards by.
3359 Route::shift (framepos_t pos, framecnt_t frames)
3361 /* gain automation */
3363 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3365 XMLNode &before = gc->alist()->get_state ();
3366 gc->alist()->shift (pos, frames);
3367 XMLNode &after = gc->alist()->get_state ();
3368 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3371 /* pan automation */
3373 ControlSet::Controls& c (_pannable->controls());
3375 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3376 boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3378 boost::shared_ptr<AutomationList> al = pc->alist();
3379 XMLNode& before = al->get_state ();
3380 al->shift (pos, frames);
3381 XMLNode& after = al->get_state ();
3382 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3387 /* redirect automation */
3389 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3390 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3392 set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3394 for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3395 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3397 boost::shared_ptr<AutomationList> al = ac->alist();
3398 XMLNode &before = al->get_state ();
3399 al->shift (pos, frames);
3400 XMLNode &after = al->get_state ();
3401 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3410 Route::save_as_template (const string& path, const string& name)
3412 XMLNode& node (state (false));
3415 IO::set_name_in_state (*node.children().front(), name);
3417 tree.set_root (&node);
3418 return tree.write (path.c_str());
3423 Route::set_name (const string& str)
3429 name = Route::ensure_track_or_route_name (str, _session);
3430 SessionObject::set_name (name);
3432 ret = (_input->set_name(name) && _output->set_name(name));
3435 /* rename the main outs. Leave other IO processors
3436 * with whatever name they already have, because its
3437 * just fine as it is (it will not contain the route
3438 * name if its a port insert, port send or port return).
3442 if (_main_outs->set_name (name)) {
3443 /* XXX returning false here is stupid because
3444 we already changed the route name.
3454 /** Set the name of a route in an XML description.
3455 * @param node XML <Route> node to set the name in.
3456 * @param name New name.
3459 Route::set_name_in_state (XMLNode& node, string const & name)
3461 node.add_property (X_("name"), name);
3463 XMLNodeList children = node.children();
3464 for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3466 if ((*i)->name() == X_("IO")) {
3468 IO::set_name_in_state (**i, name);
3470 } else if ((*i)->name() == X_("Processor")) {
3472 XMLProperty* role = (*i)->property (X_("role"));
3473 if (role && role->value() == X_("Main")) {
3474 (*i)->add_property (X_("name"), name);
3477 } else if ((*i)->name() == X_("Diskstream")) {
3479 (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3480 (*i)->add_property (X_("name"), name);
3486 boost::shared_ptr<Send>
3487 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3489 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3491 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3492 boost::shared_ptr<InternalSend> send;
3494 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3495 if (send->target_route() == target) {
3501 return boost::shared_ptr<Send>();
3504 /** @param c Audio channel index.
3505 * @param yn true to invert phase, otherwise false.
3508 Route::set_phase_invert (uint32_t c, bool yn)
3510 if (_phase_invert[c] != yn) {
3511 _phase_invert[c] = yn;
3512 phase_invert_changed (); /* EMIT SIGNAL */
3513 _session.set_dirty ();
3518 Route::set_phase_invert (boost::dynamic_bitset<> p)
3520 if (_phase_invert != p) {
3522 phase_invert_changed (); /* EMIT SIGNAL */
3523 _session.set_dirty ();
3528 Route::phase_invert (uint32_t c) const
3530 return _phase_invert[c];
3533 boost::dynamic_bitset<>
3534 Route::phase_invert () const
3536 return _phase_invert;
3540 Route::set_denormal_protection (bool yn)
3542 if (_denormal_protection != yn) {
3543 _denormal_protection = yn;
3544 denormal_protection_changed (); /* EMIT SIGNAL */
3549 Route::denormal_protection () const
3551 return _denormal_protection;
3555 Route::set_active (bool yn, void* src)
3557 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3558 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3562 if (_active != yn) {
3564 _input->set_active (yn);
3565 _output->set_active (yn);
3566 active_changed (); // EMIT SIGNAL
3567 _session.set_dirty ();
3574 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3580 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3582 boost::shared_ptr<Send> s;
3583 boost::shared_ptr<Return> r;
3585 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3586 s->meter()->meter();
3587 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3588 r->meter()->meter ();
3593 boost::shared_ptr<Pannable>
3594 Route::pannable() const
3599 boost::shared_ptr<Panner>
3600 Route::panner() const
3603 return _main_outs->panner_shell()->panner();
3606 boost::shared_ptr<PannerShell>
3607 Route::panner_shell() const
3609 return _main_outs->panner_shell();
3612 boost::shared_ptr<AutomationControl>
3613 Route::gain_control() const
3615 return _amp->gain_control();
3618 boost::shared_ptr<AutomationControl>
3619 Route::get_control (const Evoral::Parameter& param)
3621 /* either we own the control or .... */
3623 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3627 /* maybe one of our processors does or ... */
3629 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3630 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3631 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3639 /* nobody does so we'll make a new one */
3641 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3648 boost::shared_ptr<Processor>
3649 Route::nth_plugin (uint32_t n)
3651 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3652 ProcessorList::iterator i;
3654 for (i = _processors.begin(); i != _processors.end(); ++i) {
3655 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3662 return boost::shared_ptr<Processor> ();
3665 boost::shared_ptr<Processor>
3666 Route::nth_send (uint32_t n)
3668 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3669 ProcessorList::iterator i;
3671 for (i = _processors.begin(); i != _processors.end(); ++i) {
3672 if (boost::dynamic_pointer_cast<Send> (*i)) {
3679 return boost::shared_ptr<Processor> ();
3683 Route::has_io_processor_named (const string& name)
3685 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3686 ProcessorList::iterator i;
3688 for (i = _processors.begin(); i != _processors.end(); ++i) {
3689 if (boost::dynamic_pointer_cast<Send> (*i) ||
3690 boost::dynamic_pointer_cast<PortInsert> (*i)) {
3691 if ((*i)->name() == name) {
3700 MuteMaster::MutePoint
3701 Route::mute_points () const
3703 return _mute_master->mute_points ();
3707 Route::set_processor_positions ()
3709 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3711 bool had_amp = false;
3712 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3713 (*i)->set_pre_fader (!had_amp);
3714 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3720 /** Called when there is a proposed change to the input port count */
3722 Route::input_port_count_changing (ChanCount to)
3724 list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3726 /* The processors cannot be configured with the new input arrangement, so
3732 /* The change is ok */
3736 /** Called when there is a proposed change to the output port count */
3738 Route::output_port_count_changing (ChanCount to)
3740 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3741 if (processor_out_streams.get(*t) > to.get(*t)) {
3745 /* The change is ok */
3750 Route::unknown_processors () const
3754 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3755 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3756 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3757 p.push_back ((*i)->name ());
3766 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3768 /* we assume that all our input ports feed all our output ports. its not
3769 universally true, but the alternative is way too corner-case to worry about.
3772 LatencyRange all_connections;
3775 all_connections.min = 0;
3776 all_connections.max = 0;
3778 all_connections.min = ~((pframes_t) 0);
3779 all_connections.max = 0;
3781 /* iterate over all "from" ports and determine the latency range for all of their
3782 connections to the "outside" (outside of this Route).
3785 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3789 p->get_connected_latency_range (range, playback);
3791 all_connections.min = min (all_connections.min, range.min);
3792 all_connections.max = max (all_connections.max, range.max);
3796 /* set the "from" port latencies to the max/min range of all their connections */
3798 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3799 p->set_private_latency_range (all_connections, playback);
3802 /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3804 all_connections.min += our_latency;
3805 all_connections.max += our_latency;
3807 for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3808 p->set_private_latency_range (all_connections, playback);
3811 return all_connections.max;
3815 Route::set_private_port_latencies (bool playback) const
3817 framecnt_t own_latency = 0;
3819 /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3820 OR LATENCY CALLBACK.
3822 This is called (early) from the latency callback. It computes the REAL
3823 latency associated with each port and stores the result as the "private"
3824 latency of the port. A later call to Route::set_public_port_latencies()
3825 sets all ports to the same value to reflect the fact that we do latency
3826 compensation and so all signals are delayed by the same amount as they
3827 flow through ardour.
3830 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3831 if ((*i)->active ()) {
3832 own_latency += (*i)->signal_latency ();
3837 /* playback: propagate latency from "outside the route" to outputs to inputs */
3838 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3840 /* capture: propagate latency from "outside the route" to inputs to outputs */
3841 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3846 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3848 /* this is called to set the JACK-visible port latencies, which take
3849 latency compensation into account.
3858 const PortSet& ports (_input->ports());
3859 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3860 p->set_public_latency_range (range, playback);
3865 const PortSet& ports (_output->ports());
3866 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3867 p->set_public_latency_range (range, playback);
3872 /** Put the invisible processors in the right place in _processors.
3873 * Must be called with a writer lock on _processor_lock held.
3876 Route::setup_invisible_processors ()
3879 Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3880 assert (!lm.locked ());
3884 /* too early to be doing this stuff */
3888 /* we'll build this new list here and then use it */
3890 ProcessorList new_processors;
3892 /* find visible processors */
3894 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3895 if ((*i)->display_to_user ()) {
3896 new_processors.push_back (*i);
3902 ProcessorList::iterator amp = new_processors.begin ();
3903 while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3907 assert (amp != _processors.end ());
3909 /* and the processor after the amp */
3911 ProcessorList::iterator after_amp = amp;
3917 switch (_meter_point) {
3919 assert (!_meter->display_to_user ());
3920 new_processors.push_front (_meter);
3923 assert (!_meter->display_to_user ());
3924 new_processors.insert (amp, _meter);
3926 case MeterPostFader:
3927 /* do nothing here */
3930 /* do nothing here */
3933 /* the meter is visible, so we don't touch it here */
3940 assert (_main_outs);
3941 assert (!_main_outs->display_to_user ());
3942 new_processors.push_back (_main_outs);
3944 /* iterator for the main outs */
3946 ProcessorList::iterator main = new_processors.end();
3949 /* OUTPUT METERING */
3951 if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
3952 assert (!_meter->display_to_user ());
3954 /* add the processor just before or just after the main outs */
3956 ProcessorList::iterator meter_point = main;
3958 if (_meter_point == MeterOutput) {
3961 new_processors.insert (meter_point, _meter);
3966 if (_monitor_send && !is_monitor ()) {
3967 assert (!_monitor_send->display_to_user ());
3968 if (Config->get_solo_control_is_listen_control()) {
3969 switch (Config->get_listen_position ()) {
3970 case PreFaderListen:
3971 switch (Config->get_pfl_position ()) {
3972 case PFLFromBeforeProcessors:
3973 new_processors.push_front (_monitor_send);
3975 case PFLFromAfterProcessors:
3976 new_processors.insert (amp, _monitor_send);
3979 _monitor_send->set_can_pan (false);
3981 case AfterFaderListen:
3982 switch (Config->get_afl_position ()) {
3983 case AFLFromBeforeProcessors:
3984 new_processors.insert (after_amp, _monitor_send);
3986 case AFLFromAfterProcessors:
3987 new_processors.insert (new_processors.end(), _monitor_send);
3990 _monitor_send->set_can_pan (true);
3994 new_processors.insert (new_processors.end(), _monitor_send);
3995 _monitor_send->set_can_pan (false);
3999 /* MONITOR CONTROL */
4001 if (_monitor_control && is_monitor ()) {
4002 assert (!_monitor_control->display_to_user ());
4003 new_processors.push_front (_monitor_control);
4006 /* INTERNAL RETURN */
4008 /* doing this here means that any monitor control will come just after
4013 assert (!_intreturn->display_to_user ());
4014 new_processors.push_front (_intreturn);
4017 /* EXPORT PROCESSOR */
4019 if (_capturing_processor) {
4020 assert (!_capturing_processor->display_to_user ());
4021 new_processors.push_front (_capturing_processor);
4024 _processors = new_processors;
4026 DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4027 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4028 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4035 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4036 Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4040 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4041 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4048 /** If the meter point is `Custom', make a note of where the meter is.
4049 * This is so that if the meter point is subsequently set to something else,
4050 * and then back to custom, we can put the meter back where it was last time
4051 * custom was enabled.
4053 * Must be called with the _processor_lock held.
4056 Route::maybe_note_meter_position ()
4058 if (_meter_point != MeterCustom) {
4062 _custom_meter_position_noted = true;
4063 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4064 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4065 ProcessorList::iterator j = i;
4067 if (j != _processors.end ()) {
4068 _processor_after_last_custom_meter = *j;
4069 _last_custom_meter_was_at_end = false;
4071 _last_custom_meter_was_at_end = true;
4077 boost::shared_ptr<Processor>
4078 Route::processor_by_id (PBD::ID id) const
4080 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4081 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4082 if ((*i)->id() == id) {
4087 return boost::shared_ptr<Processor> ();
4090 /** @return the monitoring state, or in other words what data we are pushing
4091 * into the route (data from the inputs, data from disk or silence)
4094 Route::monitoring_state () const
4096 return MonitoringInput;
4099 /** @return what we should be metering; either the data coming from the input
4100 * IO or the data that is flowing through the route.
4103 Route::metering_state () const
4105 return MeteringRoute;
4109 Route::has_external_redirects () const
4111 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4113 /* ignore inactive processors and obviously ignore the main
4114 * outs since everything has them and we don't care.
4117 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4125 boost::shared_ptr<Processor>
4126 Route::the_instrument () const
4128 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4129 return the_instrument_unlocked ();
4132 boost::shared_ptr<Processor>
4133 Route::the_instrument_unlocked () const
4135 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4136 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4137 if ((*i)->input_streams().n_midi() > 0 &&
4138 (*i)->output_streams().n_audio() > 0) {
4143 return boost::shared_ptr<Processor>();
4149 Route::non_realtime_locate (framepos_t pos)
4152 _pannable->transport_located (pos);
4156 //Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
4157 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4159 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4160 (*i)->transport_located (pos);
4166 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4173 * We don't currently mix MIDI input together, so we don't need the
4174 * complex logic of the audio case.
4177 n_buffers = bufs.count().n_midi ();
4179 for (i = 0; i < n_buffers; ++i) {
4181 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4182 MidiBuffer& buf (bufs.get_midi (i));
4185 buf.copy (source_port->get_midi_buffer(nframes));
4187 buf.silence (nframes);
4193 n_buffers = bufs.count().n_audio();
4195 size_t n_ports = io->n_ports().n_audio();
4196 float scaling = 1.0f;
4198 if (n_ports > n_buffers) {
4199 scaling = ((float) n_buffers) / n_ports;
4202 for (i = 0; i < n_ports; ++i) {
4204 /* if there are more ports than buffers, map them onto buffers
4205 * in a round-robin fashion
4208 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4209 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4212 if (i < n_buffers) {
4214 /* first time through just copy a channel into
4218 buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4220 if (scaling != 1.0f) {
4221 buf.apply_gain (scaling, nframes);
4226 /* on subsequent times around, merge data from
4227 * the port with what is already there
4230 if (scaling != 1.0f) {
4231 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4233 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4238 /* silence any remaining buffers */
4240 for (; i < n_buffers; ++i) {
4241 AudioBuffer& buf (bufs.get_audio (i));
4242 buf.silence (nframes);
4245 /* establish the initial setup of the buffer set, reflecting what was
4246 copied into it. unless, of course, we are the auditioner, in which
4247 case nothing was fed into it from the inputs at all.
4250 if (!is_auditioner()) {
4251 bufs.set_count (io->n_ports());