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.
25 #include <sigc++/bind.h>
26 #include <pbd/xml++.h>
27 #include <pbd/enumwriter.h>
29 #include <ardour/timestamps.h>
30 #include <ardour/buffer.h>
31 #include <ardour/audioengine.h>
32 #include <ardour/route.h>
33 #include <ardour/insert.h>
34 #include <ardour/send.h>
35 #include <ardour/session.h>
36 #include <ardour/utils.h>
37 #include <ardour/configuration.h>
38 #include <ardour/cycle_timer.h>
39 #include <ardour/route_group.h>
40 #include <ardour/port.h>
41 #include <ardour/ladspa_plugin.h>
42 #include <ardour/panner.h>
43 #include <ardour/dB.h>
44 #include <ardour/mix.h>
49 using namespace ARDOUR;
53 uint32_t Route::order_key_cnt = 0;
56 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
57 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
59 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
60 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
65 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
66 : IO (sess, *node.child ("IO"), default_type),
67 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
68 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
71 _set_state (node, false);
77 redirect_max_outs = 0;
81 _phase_invert = false;
82 order_keys[strdup (N_("signal"))] = order_key_cnt++;
85 _meter_point = MeterPostFader;
89 _have_internal_generator = false;
91 _pending_declick = true;
92 _remote_control_id = 0;
93 _ignore_gain_on_deliver = true;
98 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
99 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
100 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
101 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
104 desired_solo_gain = 1.0;
106 desired_mute_gain = 1.0;
110 input_changed.connect (mem_fun (this, &Route::input_change_handler));
111 output_changed.connect (mem_fun (this, &Route::output_change_handler));
116 clear_redirects (this);
118 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
119 free ((void*)(i->first));
123 delete _control_outs;
128 Route::set_remote_control_id (uint32_t id)
130 if (id != _remote_control_id) {
131 _remote_control_id = id;
132 RemoteControlIDChanged ();
137 Route::remote_control_id() const
139 return _remote_control_id;
143 Route::order_key (const char* name) const
145 OrderKeys::const_iterator i;
147 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
148 if (!strcmp (name, i->first)) {
157 Route::set_order_key (const char* name, long n)
159 order_keys[strdup(name)] = n;
160 _session.set_dirty ();
164 Route::inc_gain (gain_t fraction, void *src)
166 IO::inc_gain (fraction, src);
170 Route::set_gain (gain_t val, void *src)
172 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
174 if (_mix_group->is_relative()) {
177 gain_t usable_gain = gain();
178 if (usable_gain < 0.000001f) {
179 usable_gain=0.000001f;
183 if (delta < 0.000001f) {
187 delta -= usable_gain;
189 if (delta == 0.0f) return;
191 gain_t factor = delta / usable_gain;
194 factor = _mix_group->get_max_factor(factor);
195 if (factor == 0.0f) {
200 factor = _mix_group->get_min_factor(factor);
201 if (factor == 0.0f) {
207 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
211 _mix_group->apply (&Route::set_gain, val, _mix_group);
221 IO::set_gain (val, src);
225 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
226 nframes_t start_frame, nframes_t end_frame,
227 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
231 RedirectList::iterator i;
232 bool post_fader_work = false;
233 bool mute_declick_applied = false;
235 vector<Sample*>::iterator bufiter;
240 gain_t* gab = _session.gain_automation_buffer();
242 switch (Config->get_monitoring_model()) {
243 case HardwareMonitoring:
244 case ExternalMonitoring:
251 declick = _pending_declick;
254 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
264 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
267 dmg = desired_mute_gain;
268 dsg = desired_solo_gain;
277 /* ----------------------------------------------------------------------------------------------------
278 GLOBAL DECLICK (for transport changes etc.)
279 -------------------------------------------------------------------------------------------------- */
282 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, false);
283 _pending_declick = 0;
284 } else if (declick < 0) {
285 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, false);
286 _pending_declick = 0;
289 /* no global declick */
291 if (solo_gain != dsg) {
292 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, false);
298 /* ----------------------------------------------------------------------------------------------------
299 INPUT METERING & MONITORING
300 -------------------------------------------------------------------------------------------------- */
302 if (meter && (_meter_point == MeterInput)) {
303 for (n = 0; n < nbufs; ++n) {
304 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
308 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
309 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
311 mute_declick_applied = true;
314 if ((_meter_point == MeterInput) && co) {
316 solo_audible = dsg > 0;
317 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
319 if ( // muted by solo of another track
323 // muted by mute of this track
327 // rec-enabled but not s/w monitoring
329 // TODO: this is probably wrong
331 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
335 co->silence (nframes, offset);
339 co->deliver_output (bufs, nbufs, nframes, offset);
344 /* ----------------------------------------------------------------------------------------------------
346 -------------------------------------------------------------------------------------------------- */
348 if (with_redirects) {
349 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
351 if (mute_gain > 0 || !_mute_affects_pre_fader) {
352 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
353 switch ((*i)->placement()) {
356 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
357 (*i)->silence (nframes, offset);
360 (*i)->run (bufs, nbufs, nframes, offset);
364 post_fader_work = true;
369 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
370 switch ((*i)->placement()) {
372 (*i)->silence (nframes, offset);
375 post_fader_work = true;
384 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
385 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
387 mute_declick_applied = true;
390 /* ----------------------------------------------------------------------------------------------------
391 PRE-FADER METERING & MONITORING
392 -------------------------------------------------------------------------------------------------- */
394 if (meter && (_meter_point == MeterPreFader)) {
395 for (n = 0; n < nbufs; ++n) {
396 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
401 if ((_meter_point == MeterPreFader) && co) {
403 solo_audible = dsg > 0;
404 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
406 if ( // muted by solo of another track
410 // muted by mute of this track
414 // rec-enabled but not s/w monitoring
416 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
420 co->silence (nframes, offset);
424 co->deliver_output (bufs, nbufs, nframes, offset);
429 /* ----------------------------------------------------------------------------------------------------
431 -------------------------------------------------------------------------------------------------- */
433 /* if not recording or recording and requiring any monitor signal, then apply gain */
435 if ( // not recording
437 !(record_enabled() && _session.actively_recording()) ||
441 // h/w monitoring not in use
443 (!Config->get_monitoring_model() == HardwareMonitoring &&
445 // AND software monitoring required
447 Config->get_monitoring_model() == SoftwareMonitoring)) {
449 if (apply_gain_automation) {
452 for (n = 0; n < nbufs; ++n) {
453 Sample *sp = bufs[n];
455 for (nframes_t nx = 0; nx < nframes; ++nx) {
460 for (n = 0; n < nbufs; ++n) {
461 Sample *sp = bufs[n];
463 for (nframes_t nx = 0; nx < nframes; ++nx) {
469 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
470 _effective_gain = gab[nframes-1];
475 /* manual (scalar) gain */
479 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
482 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
484 /* no need to interpolate current gain value,
485 but its non-unity, so apply it. if the gain
486 is zero, do nothing because we'll ship silence
498 for (n = 0; n < nbufs; ++n) {
499 Sample *sp = bufs[n];
500 Session::apply_gain_to_buffer(sp,nframes,this_gain);
503 } else if (_gain == 0) {
504 for (n = 0; n < nbufs; ++n) {
505 memset (bufs[n], 0, sizeof (Sample) * nframes);
512 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
516 /* ----------------------------------------------------------------------------------------------------
518 -------------------------------------------------------------------------------------------------- */
520 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
522 if (post_fader_work) {
524 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
526 if (mute_gain > 0 || !_mute_affects_post_fader) {
527 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
528 switch ((*i)->placement()) {
533 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
534 (*i)->silence (nframes, offset);
537 (*i)->run (bufs, nbufs, nframes, offset);
543 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
544 switch ((*i)->placement()) {
548 (*i)->silence (nframes, offset);
556 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
557 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
559 mute_declick_applied = true;
562 /* ----------------------------------------------------------------------------------------------------
564 -------------------------------------------------------------------------------------------------- */
566 if ((_meter_point == MeterPostFader) && co) {
568 solo_audible = solo_gain > 0;
569 mute_audible = dmg > 0 || !_mute_affects_control_outs;
571 if ( // silent anyway
573 (_gain == 0 && !apply_gain_automation) ||
575 // muted by solo of another track
579 // muted by mute of this track
583 // recording but not s/w monitoring
585 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
589 co->silence (nframes, offset);
593 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
597 /* ----------------------------------------------------------------------
599 ----------------------------------------------------------------------*/
601 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
602 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
604 mute_declick_applied = true;
607 /* ----------------------------------------------------------------------------------------------------
609 -------------------------------------------------------------------------------------------------- */
611 solo_audible = dsg > 0;
612 mute_audible = dmg > 0 || !_mute_affects_main_outs;
614 if (n_outputs() == 0) {
618 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
620 IO::silence (nframes, offset);
624 if ( // silent anyway
626 (_gain == 0 && !apply_gain_automation) ||
628 // muted by solo of another track, but not using control outs for solo
630 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
632 // muted by mute of this track
638 /* don't use Route::silence() here, because that causes
639 all outputs (sends, port inserts, etc. to be silent).
642 if (_meter_point == MeterPostFader) {
643 reset_peak_meters ();
646 IO::silence (nframes, offset);
650 if ((_session.transport_speed() > 1.5f ||
651 _session.transport_speed() < -1.5f) &&
652 Config->get_quieten_at_speed()) {
653 pan (bufs, nbufs, nframes, offset, speed_quietning);
655 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
656 if (!_panner->empty() &&
657 (_panner->automation_state() & Play ||
658 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
659 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
661 pan (bufs, nbufs, nframes, offset, 1.0);
668 /* ----------------------------------------------------------------------------------------------------
670 -------------------------------------------------------------------------------------------------- */
672 if (meter && (_meter_point == MeterPostFader)) {
673 // cerr << "meter post" << endl;
675 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
676 uint32_t no = n_outputs();
677 for (n = 0; n < no; ++n) {
681 uint32_t no = n_outputs();
682 for (n = 0; n < no; ++n) {
683 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
690 Route::n_process_buffers ()
692 return max (n_inputs(), redirect_max_outs);
697 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
699 vector<Sample*>& bufs = _session.get_passthru_buffers();
700 uint32_t limit = n_process_buffers ();
704 collect_input (bufs, limit, nframes, offset);
706 #define meter_stream meter_first
709 for (uint32_t n = 0; n < limit; ++n) {
710 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
712 meter_stream = false;
717 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
723 Route::set_phase_invert (bool yn, void *src)
725 if (_phase_invert != yn) {
728 // phase_invert_changed (src); /* EMIT SIGNAL */
732 Route::set_solo (bool yn, void *src)
738 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
739 _mix_group->apply (&Route::set_solo, yn, _mix_group);
745 solo_changed (src); /* EMIT SIGNAL */
746 _solo_control.Changed (); /* EMIT SIGNAL */
751 Route::set_solo_mute (bool yn)
753 Glib::Mutex::Lock lm (declick_lock);
755 /* Called by Session in response to another Route being soloed.
758 desired_solo_gain = (yn?0.0:1.0);
762 Route::set_solo_safe (bool yn, void *src)
764 if (_solo_safe != yn) {
766 solo_safe_changed (src); /* EMIT SIGNAL */
771 Route::set_mute (bool yn, void *src)
774 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
775 _mix_group->apply (&Route::set_mute, yn, _mix_group);
781 mute_changed (src); /* EMIT SIGNAL */
783 _mute_control.Changed (); /* EMIT SIGNAL */
785 Glib::Mutex::Lock lm (declick_lock);
786 desired_mute_gain = (yn?0.0f:1.0f);
791 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
793 uint32_t old_rmo = redirect_max_outs;
795 if (!_session.engine().connected()) {
800 Glib::RWLock::WriterLock lm (redirect_lock);
802 boost::shared_ptr<PluginInsert> pi;
803 boost::shared_ptr<PortInsert> porti;
805 uint32_t potential_max_streams = 0;
807 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
810 if (pi->input_streams() == 0) {
811 /* instrument plugin */
812 _have_internal_generator = true;
815 potential_max_streams = max(pi->input_streams(), pi->output_streams());
817 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
819 /* force new port inserts to start out with an i/o configuration
820 that matches this route's i/o configuration.
822 the "inputs" for the port are supposed to match the output
825 the "outputs" of the route should match the inputs of this
826 route. XXX shouldn't they match the number of active signal
827 streams at the point of insertion?
831 porti->ensure_io (n_outputs (), n_inputs(), false, this);
834 // Ensure peak vector sizes before the plugin is activated
835 while (_peak_power.size() < potential_max_streams) {
836 _peak_power.push_back(0);
838 while (_visible_peak_power.size() < potential_max_streams) {
839 _visible_peak_power.push_back(-INFINITY);
841 while (_max_peak_power.size() < potential_max_streams) {
842 _max_peak_power.push_back(-INFINITY);
845 _redirects.push_back (redirect);
847 if (_reset_plugin_counts (err_streams)) {
848 _redirects.pop_back ();
849 _reset_plugin_counts (0); // it worked before we tried to add it ...
853 redirect->activate ();
854 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
857 if (redirect_max_outs != old_rmo || old_rmo == 0) {
862 redirects_changed (src); /* EMIT SIGNAL */
867 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
869 uint32_t old_rmo = redirect_max_outs;
871 if (!_session.engine().connected()) {
876 Glib::RWLock::WriterLock lm (redirect_lock);
878 RedirectList::iterator existing_end = _redirects.end();
881 uint32_t potential_max_streams = 0;
883 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
885 boost::shared_ptr<PluginInsert> pi;
887 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
890 uint32_t m = max(pi->input_streams(), pi->output_streams());
891 if (m > potential_max_streams)
892 potential_max_streams = m;
895 // Ensure peak vector sizes before the plugin is activated
896 while (_peak_power.size() < potential_max_streams) {
897 _peak_power.push_back(0);
899 while (_visible_peak_power.size() < potential_max_streams) {
900 _visible_peak_power.push_back(-INFINITY);
902 while (_max_peak_power.size() < potential_max_streams) {
903 _max_peak_power.push_back(-INFINITY);
906 _redirects.push_back (*i);
908 if (_reset_plugin_counts (err_streams)) {
910 _redirects.erase (existing_end, _redirects.end());
911 _reset_plugin_counts (0); // it worked before we tried to add it ...
916 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
920 if (redirect_max_outs != old_rmo || old_rmo == 0) {
924 redirects_changed (src); /* EMIT SIGNAL */
929 Route::clear_redirects (void *src)
931 uint32_t old_rmo = redirect_max_outs;
933 if (!_session.engine().connected()) {
938 Glib::RWLock::WriterLock lm (redirect_lock);
939 RedirectList::iterator i;
940 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
941 (*i)->drop_references ();
946 if (redirect_max_outs != old_rmo) {
950 redirect_max_outs = 0;
951 _have_internal_generator = false;
952 redirects_changed (src); /* EMIT SIGNAL */
956 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
958 uint32_t old_rmo = redirect_max_outs;
960 if (!_session.engine().connected()) {
964 redirect_max_outs = 0;
967 Glib::RWLock::WriterLock lm (redirect_lock);
968 RedirectList::iterator i;
969 bool removed = false;
971 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
972 if (*i == redirect) {
974 RedirectList::iterator tmp;
976 /* move along, see failure case for reset_plugin_counts()
977 where we may need to reinsert the redirect.
983 /* stop redirects that send signals to JACK ports
984 from causing noise as a result of no longer being
988 boost::shared_ptr<Send> send;
989 boost::shared_ptr<PortInsert> port_insert;
991 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
992 send->disconnect_inputs (this);
993 send->disconnect_outputs (this);
994 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
995 port_insert->disconnect_inputs (this);
996 port_insert->disconnect_outputs (this);
999 _redirects.erase (i);
1012 if (_reset_plugin_counts (err_streams)) {
1013 /* get back to where we where */
1014 _redirects.insert (i, redirect);
1015 /* we know this will work, because it worked before :) */
1016 _reset_plugin_counts (0);
1022 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1023 boost::shared_ptr<PluginInsert> pi;
1025 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1026 if (pi->is_generator()) {
1032 _have_internal_generator = foo;
1035 if (old_rmo != redirect_max_outs) {
1039 redirect->drop_references ();
1041 redirects_changed (src); /* EMIT SIGNAL */
1046 Route::reset_plugin_counts (uint32_t* lpc)
1048 Glib::RWLock::WriterLock lm (redirect_lock);
1049 return _reset_plugin_counts (lpc);
1054 Route::_reset_plugin_counts (uint32_t* err_streams)
1056 RedirectList::iterator r;
1059 map<Placement,list<InsertCount> > insert_map;
1060 nframes_t initial_streams;
1062 redirect_max_outs = 0;
1066 /* divide inserts up by placement so we get the signal flow
1067 properly modelled. we need to do this because the _redirects
1068 list is not sorted by placement, and because other reasons may
1069 exist now or in the future for this separate treatment.
1072 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1074 boost::shared_ptr<Insert> insert;
1076 /* do this here in case we bomb out before we get to the end of
1080 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1082 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1084 insert_map[insert->placement()].push_back (InsertCount (insert));
1086 /* reset plugin counts back to one for now so
1087 that we have a predictable, controlled
1088 state to try to configure.
1091 boost::shared_ptr<PluginInsert> pi;
1093 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1097 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1110 /* Now process each placement in order, checking to see if we
1111 can really do what has been requested.
1116 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1120 /* figure out the streams that will feed into PreFader */
1122 if (!insert_map[PreFader].empty()) {
1123 InsertCount& ic (insert_map[PreFader].back());
1124 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1126 initial_streams = n_inputs ();
1131 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1135 /* OK, everything can be set up correctly, so lets do it */
1137 apply_some_plugin_counts (insert_map[PreFader]);
1138 apply_some_plugin_counts (insert_map[PostFader]);
1140 /* recompute max outs of any redirect */
1144 redirect_max_outs = 0;
1145 RedirectList::iterator prev = _redirects.end();
1147 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1148 boost::shared_ptr<Send> s;
1150 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1151 if (r == _redirects.begin()) {
1152 s->expect_inputs (n_inputs());
1154 s->expect_inputs ((*prev)->output_streams());
1159 /* don't pay any attention to send output configuration, since it doesn't
1163 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1174 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1176 list<InsertCount>::iterator i;
1178 for (i = iclist.begin(); i != iclist.end(); ++i) {
1180 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1183 /* make sure that however many we have, they are all active */
1184 (*i).insert->activate ();
1191 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1193 list<InsertCount>::iterator i;
1195 for (i = iclist.begin(); i != iclist.end(); ++i) {
1197 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1199 *err_streams = required_inputs;
1204 (*i).in = required_inputs;
1205 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1207 required_inputs = (*i).out;
1214 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1216 uint32_t old_rmo = redirect_max_outs;
1222 RedirectList to_be_deleted;
1225 Glib::RWLock::WriterLock lm (redirect_lock);
1226 RedirectList::iterator tmp;
1227 RedirectList the_copy;
1229 the_copy = _redirects;
1231 /* remove all relevant redirects */
1233 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1237 if ((*i)->placement() == placement) {
1238 to_be_deleted.push_back (*i);
1239 _redirects.erase (i);
1245 /* now copy the relevant ones from "other" */
1247 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1248 if ((*i)->placement() == placement) {
1249 _redirects.push_back (Redirect::clone (*i));
1253 /* reset plugin stream handling */
1255 if (_reset_plugin_counts (err_streams)) {
1257 /* FAILED COPY ATTEMPT: we have to restore order */
1259 /* delete all cloned redirects */
1261 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1266 if ((*i)->placement() == placement) {
1267 _redirects.erase (i);
1273 /* restore the natural order */
1275 _redirects = the_copy;
1276 redirect_max_outs = old_rmo;
1278 /* we failed, even though things are OK again */
1284 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1285 to_be_deleted.clear ();
1289 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1293 redirects_changed (this); /* EMIT SIGNAL */
1298 Route::all_redirects_flip ()
1300 Glib::RWLock::ReaderLock lm (redirect_lock);
1302 if (_redirects.empty()) {
1306 bool first_is_on = _redirects.front()->active();
1308 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1309 (*i)->set_active (!first_is_on, this);
1314 Route::all_redirects_active (bool state)
1316 Glib::RWLock::ReaderLock lm (redirect_lock);
1318 if (_redirects.empty()) {
1322 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1323 (*i)->set_active (state, this);
1327 struct RedirectSorter {
1328 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1329 return a->sort_key() < b->sort_key();
1334 Route::sort_redirects (uint32_t* err_streams)
1337 RedirectSorter comparator;
1338 Glib::RWLock::WriterLock lm (redirect_lock);
1339 uint32_t old_rmo = redirect_max_outs;
1341 /* the sweet power of C++ ... */
1343 RedirectList as_it_was_before = _redirects;
1345 _redirects.sort (comparator);
1347 if (_reset_plugin_counts (err_streams)) {
1348 _redirects = as_it_was_before;
1349 redirect_max_outs = old_rmo;
1355 redirects_changed (this); /* EMIT SIGNAL */
1367 Route::get_template()
1369 return state(false);
1373 Route::state(bool full_state)
1375 XMLNode *node = new XMLNode("Route");
1376 RedirectList:: iterator i;
1380 node->add_property("flags", enum_2_string (_flags));
1383 node->add_property("default-type", _default_type.to_string());
1385 node->add_property("active", _active?"yes":"no");
1386 node->add_property("muted", _muted?"yes":"no");
1387 node->add_property("soloed", _soloed?"yes":"no");
1388 node->add_property("phase-invert", _phase_invert?"yes":"no");
1389 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1390 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1391 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1392 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1395 node->add_property("edit-group", _edit_group->name());
1398 node->add_property("mix-group", _mix_group->name());
1401 string order_string;
1402 OrderKeys::iterator x = order_keys.begin();
1404 while (x != order_keys.end()) {
1405 order_string += string ((*x).first);
1406 order_string += '=';
1407 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1408 order_string += buf;
1412 if (x == order_keys.end()) {
1416 order_string += ':';
1418 node->add_property ("order-keys", order_string);
1420 node->add_child_nocopy (IO::state (full_state));
1421 node->add_child_nocopy (_solo_control.get_state ());
1422 node->add_child_nocopy (_mute_control.get_state ());
1424 if (_control_outs) {
1425 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1426 cnode->add_child_nocopy (_control_outs->state (full_state));
1427 node->add_child_nocopy (*cnode);
1430 if (_comment.length()) {
1431 XMLNode *cmt = node->add_child ("Comment");
1432 cmt->add_content (_comment);
1435 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1436 node->add_child_nocopy((*i)->state (full_state));
1440 node->add_child_copy (*_extra_xml);
1447 Route::set_deferred_state ()
1450 XMLNodeConstIterator niter;
1452 if (!deferred_state) {
1456 nlist = deferred_state->children();
1458 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1459 add_redirect_from_xml (**niter);
1462 delete deferred_state;
1467 Route::add_redirect_from_xml (const XMLNode& node)
1469 const XMLProperty *prop;
1471 if (node.name() == "Send") {
1475 boost::shared_ptr<Send> send (new Send (_session, node));
1476 add_redirect (send, this);
1479 catch (failed_constructor &err) {
1480 error << _("Send construction failed") << endmsg;
1484 } else if (node.name() == "Insert") {
1487 if ((prop = node.property ("type")) != 0) {
1489 boost::shared_ptr<Insert> insert;
1491 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1493 insert.reset (new PluginInsert(_session, node));
1495 } else if (prop->value() == "port") {
1498 insert.reset (new PortInsert (_session, node));
1502 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1505 add_redirect (insert, this);
1508 error << _("Insert XML node has no type property") << endmsg;
1512 catch (failed_constructor &err) {
1513 warning << _("insert could not be created. Ignored.") << endmsg;
1520 Route::set_state (const XMLNode& node)
1522 return _set_state (node, true);
1526 Route::_set_state (const XMLNode& node, bool call_base)
1529 XMLNodeConstIterator niter;
1531 XMLPropertyList plist;
1532 const XMLProperty *prop;
1534 if (node.name() != "Route"){
1535 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1539 if ((prop = node.property (X_("flags"))) != 0) {
1540 _flags = Flag (string_2_enum (prop->value(), _flags));
1545 if ((prop = node.property (X_("default-type"))) != 0) {
1546 _default_type = DataType(prop->value());
1547 assert(_default_type != DataType::NIL);
1550 if ((prop = node.property (X_("phase-invert"))) != 0) {
1551 set_phase_invert(prop->value()=="yes"?true:false, this);
1554 if ((prop = node.property (X_("active"))) != 0) {
1555 set_active (prop->value() == "yes");
1558 if ((prop = node.property (X_("muted"))) != 0) {
1559 bool yn = prop->value()=="yes"?true:false;
1561 /* force reset of mute status */
1565 mute_gain = desired_mute_gain;
1568 if ((prop = node.property (X_("soloed"))) != 0) {
1569 bool yn = prop->value()=="yes"?true:false;
1571 /* force reset of solo status */
1574 set_solo (yn, this);
1575 solo_gain = desired_solo_gain;
1578 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1579 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1582 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1583 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1586 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1587 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1590 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1591 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1594 if ((prop = node.property (X_("edit-group"))) != 0) {
1595 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1596 if(edit_group == 0) {
1597 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1599 set_edit_group(edit_group, this);
1603 if ((prop = node.property (X_("order-keys"))) != 0) {
1607 string::size_type colon, equal;
1608 string remaining = prop->value();
1610 while (remaining.length()) {
1612 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1613 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1616 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1617 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1620 set_order_key (remaining.substr (0, equal).c_str(), n);
1624 colon = remaining.find_first_of (':');
1626 if (colon != string::npos) {
1627 remaining = remaining.substr (colon+1);
1634 nlist = node.children();
1636 if (deferred_state) {
1637 delete deferred_state;
1640 deferred_state = new XMLNode(X_("deferred state"));
1642 /* set parent class properties before anything else */
1644 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1648 if (child->name() == IO::state_node_name && call_base) {
1650 IO::set_state (*child);
1655 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1659 if (child->name() == X_("Send")) {
1662 if (!IO::ports_legal) {
1664 deferred_state->add_child_copy (*child);
1667 add_redirect_from_xml (*child);
1670 } else if (child->name() == X_("Insert")) {
1672 if (!IO::ports_legal) {
1674 deferred_state->add_child_copy (*child);
1678 add_redirect_from_xml (*child);
1681 } else if (child->name() == X_("Automation")) {
1683 if ((prop = child->property (X_("path"))) != 0) {
1684 load_automation (prop->value());
1687 } else if (child->name() == X_("ControlOuts")) {
1689 string coutname = _name;
1690 coutname += _("[control]");
1692 _control_outs = new IO (_session, coutname);
1693 _control_outs->set_state (**(child->children().begin()));
1695 } else if (child->name() == X_("Comment")) {
1697 /* XXX this is a terrible API design in libxml++ */
1699 XMLNode *cmt = *(child->children().begin());
1700 _comment = cmt->content();
1702 } else if (child->name() == X_("extra")) {
1704 _extra_xml = new XMLNode (*child);
1706 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1708 if (prop->value() == "solo") {
1709 _solo_control.set_state (*child);
1710 _session.add_controllable (&_solo_control);
1712 else if (prop->value() == "mute") {
1713 _mute_control.set_state (*child);
1714 _session.add_controllable (&_mute_control);
1719 if ((prop = node.property (X_("mix-group"))) != 0) {
1720 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1721 if (mix_group == 0) {
1722 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1724 set_mix_group(mix_group, this);
1732 Route::curve_reallocate ()
1734 // _gain_automation_curve.finish_resize ();
1735 // _pan_automation_curve.finish_resize ();
1739 Route::silence (nframes_t nframes, nframes_t offset)
1743 // reset_peak_meters ();
1745 IO::silence (nframes, offset);
1747 if (_control_outs) {
1748 _control_outs->silence (nframes, offset);
1752 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1755 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1756 boost::shared_ptr<PluginInsert> pi;
1757 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1758 // skip plugins, they don't need anything when we're not active
1762 (*i)->silence (nframes, offset);
1765 if (nframes == _session.get_block_size() && offset == 0) {
1775 Route::set_control_outs (const vector<string>& ports)
1777 Glib::Mutex::Lock lm (control_outs_lock);
1778 vector<string>::const_iterator i;
1780 if (_control_outs) {
1781 delete _control_outs;
1785 if (ports.empty()) {
1789 string coutname = _name;
1790 coutname += _("[control]");
1792 _control_outs = new IO (_session, coutname);
1794 /* our control outs need as many outputs as we
1795 have outputs. we track the changes in ::output_change_handler().
1798 _control_outs->ensure_io (0, n_outputs(), true, this);
1804 Route::set_edit_group (RouteGroup *eg, void *src)
1807 if (eg == _edit_group) {
1812 _edit_group->remove (this);
1815 if ((_edit_group = eg) != 0) {
1816 _edit_group->add (this);
1819 _session.set_dirty ();
1820 edit_group_changed (src); /* EMIT SIGNAL */
1824 Route::drop_edit_group (void *src)
1827 _session.set_dirty ();
1828 edit_group_changed (src); /* EMIT SIGNAL */
1832 Route::set_mix_group (RouteGroup *mg, void *src)
1835 if (mg == _mix_group) {
1840 _mix_group->remove (this);
1843 if ((_mix_group = mg) != 0) {
1844 _mix_group->add (this);
1847 _session.set_dirty ();
1848 mix_group_changed (src); /* EMIT SIGNAL */
1852 Route::drop_mix_group (void *src)
1855 _session.set_dirty ();
1856 mix_group_changed (src); /* EMIT SIGNAL */
1860 Route::set_comment (string cmt, void *src)
1863 comment_changed (src);
1864 _session.set_dirty ();
1868 Route::feeds (boost::shared_ptr<Route> other)
1873 uint32_t no = self.n_outputs();
1874 uint32_t ni = other->n_inputs ();
1876 for (i = 0; i < no; ++i) {
1877 for (j = 0; j < ni; ++j) {
1878 if (self.output(i)->connected_to (other->input(j)->name())) {
1884 /* check Redirects which may also interconnect Routes */
1886 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1888 no = (*r)->n_outputs();
1890 for (i = 0; i < no; ++i) {
1891 for (j = 0; j < ni; ++j) {
1892 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
1899 /* check for control room outputs which may also interconnect Routes */
1901 if (_control_outs) {
1903 no = _control_outs->n_outputs();
1905 for (i = 0; i < no; ++i) {
1906 for (j = 0; j < ni; ++j) {
1907 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
1918 Route::set_mute_config (mute_type t, bool onoff, void *src)
1922 _mute_affects_pre_fader = onoff;
1923 pre_fader_changed(src); /* EMIT SIGNAL */
1927 _mute_affects_post_fader = onoff;
1928 post_fader_changed(src); /* EMIT SIGNAL */
1932 _mute_affects_control_outs = onoff;
1933 control_outs_changed(src); /* EMIT SIGNAL */
1937 _mute_affects_main_outs = onoff;
1938 main_outs_changed(src); /* EMIT SIGNAL */
1944 Route::get_mute_config (mute_type t)
1950 onoff = _mute_affects_pre_fader;
1953 onoff = _mute_affects_post_fader;
1956 onoff = _mute_affects_control_outs;
1959 onoff = _mute_affects_main_outs;
1967 Route::set_active (bool yn)
1970 active_changed(); /* EMIT SIGNAL */
1974 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
1976 nframes_t now = _session.transport_frame();
1979 Glib::RWLock::ReaderLock lm (redirect_lock);
1982 automation_snapshot (now);
1985 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1987 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
1988 (*i)->deactivate ();
1992 (*i)->transport_stopped (now);
1996 IO::transport_stopped (now);
1998 _roll_delay = _initial_delay;
2002 Route::input_change_handler (IOChange change, void *ignored)
2004 if (change & ConfigurationChanged) {
2005 reset_plugin_counts (0);
2010 Route::output_change_handler (IOChange change, void *ignored)
2012 if (change & ConfigurationChanged) {
2013 if (_control_outs) {
2014 _control_outs->ensure_io (0, n_outputs(), true, this);
2017 reset_plugin_counts (0);
2022 Route::pans_required () const
2024 if (n_outputs() < 2) {
2028 return max (n_inputs (), redirect_max_outs);
2032 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2033 bool session_state_changing, bool can_record, bool rec_monitors_input)
2035 if (n_outputs() == 0) {
2039 if (session_state_changing || !_active) {
2040 silence (nframes, offset);
2044 apply_gain_automation = false;
2047 passthru (start_frame, end_frame, nframes, offset, 0, false);
2049 silence (nframes, offset);
2056 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2058 if (_roll_delay > nframes) {
2060 _roll_delay -= nframes;
2061 silence (nframes, offset);
2062 /* transport frame is not legal for caller to use */
2065 } else if (_roll_delay > 0) {
2067 nframes -= _roll_delay;
2069 silence (_roll_delay, offset);
2071 offset += _roll_delay;
2072 transport_frame += _roll_delay;
2081 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2082 bool can_record, bool rec_monitors_input)
2085 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2087 // automation snapshot can also be called from the non-rt context
2088 // and it uses the redirect list, so we take the lock out here
2089 automation_snapshot (_session.transport_frame());
2093 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2094 silence (nframes, offset);
2098 nframes_t unused = 0;
2100 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2106 apply_gain_automation = false;
2109 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2111 if (am.locked() && _session.transport_rolling()) {
2113 nframes_t start_frame = end_frame - nframes;
2115 if (gain_automation_playback()) {
2116 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2121 passthru (start_frame, end_frame, nframes, offset, declick, false);
2127 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2128 bool can_record, bool rec_monitors_input)
2130 silence (nframes, offset);
2135 Route::toggle_monitor_input ()
2137 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2138 (*i)->ensure_monitor_input(!(*i)->monitoring_input());
2143 Route::has_external_redirects () const
2145 boost::shared_ptr<const PortInsert> pi;
2147 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2148 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2150 uint32_t no = pi->n_outputs();
2152 for (uint32_t n = 0; n < no; ++n) {
2154 string port_name = pi->output(n)->name();
2155 string client_name = port_name.substr (0, port_name.find(':'));
2157 /* only say "yes" if the redirect is actually in use */
2159 if (client_name != "ardour" && pi->active()) {
2170 Route::flush_redirects ()
2172 /* XXX shouldn't really try to take this lock, since
2173 this is called from the RT audio thread.
2176 Glib::RWLock::ReaderLock lm (redirect_lock);
2178 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2179 (*i)->deactivate ();
2185 Route::set_meter_point (MeterPoint p, void *src)
2187 if (_meter_point != p) {
2189 meter_change (src); /* EMIT SIGNAL */
2190 _session.set_dirty ();
2195 Route::update_total_latency ()
2199 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2200 if ((*i)->active ()) {
2201 _own_latency += (*i)->latency ();
2205 set_port_latency (_own_latency);
2207 /* this (virtual) function is used for pure Routes,
2208 not derived classes like AudioTrack. this means
2209 that the data processed here comes from an input
2210 port, not prerecorded material, and therefore we
2211 have to take into account any input latency.
2214 _own_latency += input_latency ();
2216 return _own_latency;
2220 Route::set_latency_delay (nframes_t longest_session_latency)
2222 _initial_delay = longest_session_latency - _own_latency;
2224 if (_session.transport_stopped()) {
2225 _roll_delay = _initial_delay;
2230 Route::automation_snapshot (nframes_t now)
2232 IO::automation_snapshot (now);
2234 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2235 (*i)->automation_snapshot (now);
2239 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2240 : Controllable (name), route (s), type(tp)
2246 Route::ToggleControllable::set_value (float val)
2248 bool bval = ((val >= 0.5f) ? true: false);
2252 route.set_mute (bval, this);
2255 route.set_solo (bval, this);
2263 Route::ToggleControllable::get_value (void) const
2269 val = route.muted() ? 1.0f : 0.0f;
2272 val = route.soloed() ? 1.0f : 0.0f;
2282 Route::set_block_size (nframes_t nframes)
2284 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2285 (*i)->set_block_size (nframes);
2290 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2292 _session.update_latency_compensation (false, false);
2296 Route::protect_automation ()
2298 switch (gain_automation_state()) {
2301 set_gain_automation_state (Off);
2307 switch (panner().automation_state ()) {
2310 panner().set_automation_state (Off);
2316 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2317 boost::shared_ptr<PluginInsert> pi;
2318 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2319 pi->protect_automation ();
2325 Route::set_pending_declick (int declick)
2328 /* this call is not allowed to turn off a pending declick unless "force" is true */
2330 _pending_declick = declick;
2332 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2334 _pending_declick = 0;