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>
28 #include <ardour/timestamps.h>
29 #include <ardour/buffer.h>
30 #include <ardour/audioengine.h>
31 #include <ardour/route.h>
32 #include <ardour/insert.h>
33 #include <ardour/send.h>
34 #include <ardour/session.h>
35 #include <ardour/utils.h>
36 #include <ardour/configuration.h>
37 #include <ardour/cycle_timer.h>
38 #include <ardour/route_group.h>
39 #include <ardour/port.h>
40 #include <ardour/ladspa_plugin.h>
41 #include <ardour/panner.h>
42 #include <ardour/dB.h>
43 #include <ardour/mix.h>
48 using namespace ARDOUR;
52 uint32_t Route::order_key_cnt = 0;
55 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
56 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
58 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
59 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
64 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
65 : IO (sess, *node.child ("IO"), default_type),
66 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
67 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
70 _set_state (node, false);
76 redirect_max_outs = 0;
80 _phase_invert = false;
81 order_keys[N_("signal")] = order_key_cnt++;
84 _meter_point = MeterPostFader;
88 _have_internal_generator = false;
90 _pending_declick = true;
91 _remote_control_id = 0;
92 _ignore_gain_on_deliver = true;
97 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
98 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
99 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
100 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
103 desired_solo_gain = 1.0;
105 desired_mute_gain = 1.0;
109 input_changed.connect (mem_fun (this, &Route::input_change_handler));
110 output_changed.connect (mem_fun (this, &Route::output_change_handler));
115 clear_redirects (this);
118 delete _control_outs;
123 Route::set_remote_control_id (uint32_t id)
125 if (id != _remote_control_id) {
126 _remote_control_id = id;
127 RemoteControlIDChanged ();
132 Route::remote_control_id() const
134 return _remote_control_id;
138 Route::order_key (string name) const
140 OrderKeys::const_iterator i;
142 if ((i = order_keys.find (name)) == order_keys.end()) {
150 Route::set_order_key (string name, long n)
152 order_keys[name] = n;
153 _session.set_dirty ();
157 Route::inc_gain (gain_t fraction, void *src)
159 IO::inc_gain (fraction, src);
163 Route::set_gain (gain_t val, void *src)
165 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
167 if (_mix_group->is_relative()) {
170 gain_t usable_gain = gain();
171 if (usable_gain < 0.000001f) {
172 usable_gain=0.000001f;
176 if (delta < 0.000001f) {
180 delta -= usable_gain;
182 if (delta == 0.0f) return;
184 gain_t factor = delta / usable_gain;
187 factor = _mix_group->get_max_factor(factor);
188 if (factor == 0.0f) {
193 factor = _mix_group->get_min_factor(factor);
194 if (factor == 0.0f) {
200 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
204 _mix_group->apply (&Route::set_gain, val, _mix_group);
214 IO::set_gain (val, src);
218 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
219 nframes_t start_frame, nframes_t end_frame,
220 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
224 RedirectList::iterator i;
225 bool post_fader_work = false;
226 bool mute_declick_applied = false;
228 vector<Sample*>::iterator bufiter;
233 gain_t* gab = _session.gain_automation_buffer();
235 switch (Config->get_monitoring_model()) {
236 case HardwareMonitoring:
237 case ExternalMonitoring:
244 declick = _pending_declick;
247 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
257 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
260 dmg = desired_mute_gain;
261 dsg = desired_solo_gain;
270 /* ----------------------------------------------------------------------------------------------------
271 GLOBAL DECLICK (for transport changes etc.)
272 -------------------------------------------------------------------------------------------------- */
275 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, false);
276 _pending_declick = 0;
277 } else if (declick < 0) {
278 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, false);
279 _pending_declick = 0;
282 /* no global declick */
284 if (solo_gain != dsg) {
285 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, false);
291 /* ----------------------------------------------------------------------------------------------------
292 INPUT METERING & MONITORING
293 -------------------------------------------------------------------------------------------------- */
295 if (meter && (_meter_point == MeterInput)) {
296 for (n = 0; n < nbufs; ++n) {
297 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
301 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
302 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
304 mute_declick_applied = true;
307 if ((_meter_point == MeterInput) && co) {
309 solo_audible = dsg > 0;
310 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
312 if ( // muted by solo of another track
316 // muted by mute of this track
320 // rec-enabled but not s/w monitoring
322 // TODO: this is probably wrong
324 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
328 co->silence (nframes, offset);
332 co->deliver_output (bufs, nbufs, nframes, offset);
337 /* ----------------------------------------------------------------------------------------------------
339 -------------------------------------------------------------------------------------------------- */
341 if (with_redirects) {
342 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
344 if (mute_gain > 0 || !_mute_affects_pre_fader) {
345 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
346 switch ((*i)->placement()) {
349 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
350 (*i)->silence (nframes, offset);
353 (*i)->run (bufs, nbufs, nframes, offset);
357 post_fader_work = true;
362 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
363 switch ((*i)->placement()) {
365 (*i)->silence (nframes, offset);
368 post_fader_work = true;
377 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
378 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
380 mute_declick_applied = true;
383 /* ----------------------------------------------------------------------------------------------------
384 PRE-FADER METERING & MONITORING
385 -------------------------------------------------------------------------------------------------- */
387 if (meter && (_meter_point == MeterPreFader)) {
388 for (n = 0; n < nbufs; ++n) {
389 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
394 if ((_meter_point == MeterPreFader) && co) {
396 solo_audible = dsg > 0;
397 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
399 if ( // muted by solo of another track
403 // muted by mute of this track
407 // rec-enabled but not s/w monitoring
409 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
413 co->silence (nframes, offset);
417 co->deliver_output (bufs, nbufs, nframes, offset);
422 /* ----------------------------------------------------------------------------------------------------
424 -------------------------------------------------------------------------------------------------- */
426 /* if not recording or recording and requiring any monitor signal, then apply gain */
428 if ( // not recording
430 !(record_enabled() && _session.actively_recording()) ||
434 // h/w monitoring not in use
436 (!Config->get_monitoring_model() == HardwareMonitoring &&
438 // AND software monitoring required
440 Config->get_monitoring_model() == SoftwareMonitoring)) {
442 if (apply_gain_automation) {
445 for (n = 0; n < nbufs; ++n) {
446 Sample *sp = bufs[n];
448 for (nframes_t nx = 0; nx < nframes; ++nx) {
453 for (n = 0; n < nbufs; ++n) {
454 Sample *sp = bufs[n];
456 for (nframes_t nx = 0; nx < nframes; ++nx) {
462 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
463 _effective_gain = gab[nframes-1];
468 /* manual (scalar) gain */
472 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
475 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
477 /* no need to interpolate current gain value,
478 but its non-unity, so apply it. if the gain
479 is zero, do nothing because we'll ship silence
491 for (n = 0; n < nbufs; ++n) {
492 Sample *sp = bufs[n];
493 Session::apply_gain_to_buffer(sp,nframes,this_gain);
496 } else if (_gain == 0) {
497 for (n = 0; n < nbufs; ++n) {
498 memset (bufs[n], 0, sizeof (Sample) * nframes);
505 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
509 /* ----------------------------------------------------------------------------------------------------
511 -------------------------------------------------------------------------------------------------- */
513 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
515 if (post_fader_work) {
517 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
519 if (mute_gain > 0 || !_mute_affects_post_fader) {
520 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
521 switch ((*i)->placement()) {
526 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
527 (*i)->silence (nframes, offset);
530 (*i)->run (bufs, nbufs, nframes, offset);
536 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
537 switch ((*i)->placement()) {
541 (*i)->silence (nframes, offset);
549 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
550 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
552 mute_declick_applied = true;
555 /* ----------------------------------------------------------------------------------------------------
557 -------------------------------------------------------------------------------------------------- */
559 if ((_meter_point == MeterPostFader) && co) {
561 solo_audible = solo_gain > 0;
562 mute_audible = dmg > 0 || !_mute_affects_control_outs;
564 if ( // silent anyway
566 (_gain == 0 && !apply_gain_automation) ||
568 // muted by solo of another track
572 // muted by mute of this track
576 // recording but not s/w monitoring
578 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
582 co->silence (nframes, offset);
586 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
590 /* ----------------------------------------------------------------------
592 ----------------------------------------------------------------------*/
594 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
595 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
597 mute_declick_applied = true;
600 /* ----------------------------------------------------------------------------------------------------
602 -------------------------------------------------------------------------------------------------- */
604 solo_audible = dsg > 0;
605 mute_audible = dmg > 0 || !_mute_affects_main_outs;
607 if (n_outputs() == 0) {
611 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
613 IO::silence (nframes, offset);
617 if ( // silent anyway
619 (_gain == 0 && !apply_gain_automation) ||
621 // muted by solo of another track, but not using control outs for solo
623 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
625 // muted by mute of this track
631 /* don't use Route::silence() here, because that causes
632 all outputs (sends, port inserts, etc. to be silent).
635 if (_meter_point == MeterPostFader) {
636 reset_peak_meters ();
639 IO::silence (nframes, offset);
643 if ((_session.transport_speed() > 1.5f ||
644 _session.transport_speed() < -1.5f) &&
645 Config->get_quieten_at_speed()) {
646 pan (bufs, nbufs, nframes, offset, speed_quietning);
648 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
649 if (!_panner->empty() &&
650 (_panner->automation_state() & Play ||
651 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
652 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
654 pan (bufs, nbufs, nframes, offset, 1.0);
661 /* ----------------------------------------------------------------------------------------------------
663 -------------------------------------------------------------------------------------------------- */
665 if (meter && (_meter_point == MeterPostFader)) {
666 // cerr << "meter post" << endl;
668 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
669 uint32_t no = n_outputs();
670 for (n = 0; n < no; ++n) {
674 uint32_t no = n_outputs();
675 for (n = 0; n < no; ++n) {
676 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
683 Route::n_process_buffers ()
685 return max (n_inputs(), redirect_max_outs);
690 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
692 vector<Sample*>& bufs = _session.get_passthru_buffers();
693 uint32_t limit = n_process_buffers ();
697 collect_input (bufs, limit, nframes, offset);
699 #define meter_stream meter_first
702 for (uint32_t n = 0; n < limit; ++n) {
703 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
705 meter_stream = false;
710 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
716 Route::set_phase_invert (bool yn, void *src)
718 if (_phase_invert != yn) {
721 // phase_invert_changed (src); /* EMIT SIGNAL */
725 Route::set_solo (bool yn, void *src)
731 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
732 _mix_group->apply (&Route::set_solo, yn, _mix_group);
738 solo_changed (src); /* EMIT SIGNAL */
739 _solo_control.Changed (); /* EMIT SIGNAL */
744 Route::set_solo_mute (bool yn)
746 Glib::Mutex::Lock lm (declick_lock);
748 /* Called by Session in response to another Route being soloed.
751 desired_solo_gain = (yn?0.0:1.0);
755 Route::set_solo_safe (bool yn, void *src)
757 if (_solo_safe != yn) {
759 solo_safe_changed (src); /* EMIT SIGNAL */
764 Route::set_mute (bool yn, void *src)
767 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
768 _mix_group->apply (&Route::set_mute, yn, _mix_group);
774 mute_changed (src); /* EMIT SIGNAL */
776 _mute_control.Changed (); /* EMIT SIGNAL */
778 Glib::Mutex::Lock lm (declick_lock);
779 desired_mute_gain = (yn?0.0f:1.0f);
784 Route::count_sends ()
787 Glib::RWLock::ReaderLock lm (redirect_lock);
789 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
790 if (boost::dynamic_pointer_cast<Send> (*i)) {
799 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
801 uint32_t old_rmo = redirect_max_outs;
803 if (!_session.engine().connected()) {
808 Glib::RWLock::WriterLock lm (redirect_lock);
810 boost::shared_ptr<PluginInsert> pi;
811 boost::shared_ptr<PortInsert> porti;
813 uint32_t potential_max_streams = 0;
815 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
818 if (pi->input_streams() == 0) {
819 /* instrument plugin */
820 _have_internal_generator = true;
823 potential_max_streams = max(pi->input_streams(), pi->output_streams());
825 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
827 /* force new port inserts to start out with an i/o configuration
828 that matches this route's i/o configuration.
830 the "inputs" for the port are supposed to match the output
833 the "outputs" of the route should match the inputs of this
834 route. XXX shouldn't they match the number of active signal
835 streams at the point of insertion?
839 porti->ensure_io (n_outputs (), n_inputs(), false, this);
842 // Ensure peak vector sizes before the plugin is activated
843 while (_peak_power.size() < potential_max_streams) {
844 _peak_power.push_back(0);
846 while (_visible_peak_power.size() < potential_max_streams) {
847 _visible_peak_power.push_back(0);
850 _redirects.push_back (redirect);
852 if (_reset_plugin_counts (err_streams)) {
853 _redirects.pop_back ();
854 _reset_plugin_counts (0); // it worked before we tried to add it ...
858 redirect->activate ();
859 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
862 if (redirect_max_outs != old_rmo || old_rmo == 0) {
867 redirects_changed (src); /* EMIT SIGNAL */
872 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
874 uint32_t old_rmo = redirect_max_outs;
876 if (!_session.engine().connected()) {
881 Glib::RWLock::WriterLock lm (redirect_lock);
883 RedirectList::iterator existing_end = _redirects.end();
886 uint32_t potential_max_streams = 0;
888 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
890 boost::shared_ptr<PluginInsert> pi;
892 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
895 uint32_t m = max(pi->input_streams(), pi->output_streams());
896 if (m > potential_max_streams)
897 potential_max_streams = m;
900 // Ensure peak vector sizes before the plugin is activated
901 while (_peak_power.size() < potential_max_streams) {
902 _peak_power.push_back(0);
904 while (_visible_peak_power.size() < potential_max_streams) {
905 _visible_peak_power.push_back(0);
908 _redirects.push_back (*i);
910 if (_reset_plugin_counts (err_streams)) {
912 _redirects.erase (existing_end, _redirects.end());
913 _reset_plugin_counts (0); // it worked before we tried to add it ...
918 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
922 if (redirect_max_outs != old_rmo || old_rmo == 0) {
926 redirects_changed (src); /* EMIT SIGNAL */
931 Route::clear_redirects (void *src)
933 uint32_t old_rmo = redirect_max_outs;
935 if (!_session.engine().connected()) {
940 Glib::RWLock::WriterLock lm (redirect_lock);
941 RedirectList::iterator i;
942 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
943 (*i)->drop_references ();
948 if (redirect_max_outs != old_rmo) {
952 redirect_max_outs = 0;
953 _have_internal_generator = false;
954 redirects_changed (src); /* EMIT SIGNAL */
958 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
960 uint32_t old_rmo = redirect_max_outs;
962 if (!_session.engine().connected()) {
966 redirect_max_outs = 0;
969 Glib::RWLock::WriterLock lm (redirect_lock);
970 RedirectList::iterator i;
971 bool removed = false;
973 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
974 if (*i == redirect) {
976 RedirectList::iterator tmp;
978 /* move along, see failure case for reset_plugin_counts()
979 where we may need to reinsert the redirect.
985 /* stop redirects that send signals to JACK ports
986 from causing noise as a result of no longer being
990 boost::shared_ptr<Send> send;
991 boost::shared_ptr<PortInsert> port_insert;
993 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
994 send->disconnect_inputs (this);
995 send->disconnect_outputs (this);
996 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
997 port_insert->disconnect_inputs (this);
998 port_insert->disconnect_outputs (this);
1001 _redirects.erase (i);
1014 if (_reset_plugin_counts (err_streams)) {
1015 /* get back to where we where */
1016 _redirects.insert (i, redirect);
1017 /* we know this will work, because it worked before :) */
1018 _reset_plugin_counts (0);
1024 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1025 boost::shared_ptr<PluginInsert> pi;
1027 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1028 if (pi->is_generator()) {
1034 _have_internal_generator = foo;
1037 if (old_rmo != redirect_max_outs) {
1041 redirect->drop_references ();
1043 redirects_changed (src); /* EMIT SIGNAL */
1048 Route::reset_plugin_counts (uint32_t* lpc)
1050 Glib::RWLock::WriterLock lm (redirect_lock);
1051 return _reset_plugin_counts (lpc);
1056 Route::_reset_plugin_counts (uint32_t* err_streams)
1058 RedirectList::iterator r;
1061 map<Placement,list<InsertCount> > insert_map;
1062 nframes_t initial_streams;
1064 redirect_max_outs = 0;
1068 /* divide inserts up by placement so we get the signal flow
1069 properly modelled. we need to do this because the _redirects
1070 list is not sorted by placement, and because other reasons may
1071 exist now or in the future for this separate treatment.
1074 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1076 boost::shared_ptr<Insert> insert;
1078 /* do this here in case we bomb out before we get to the end of
1082 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1084 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1086 insert_map[insert->placement()].push_back (InsertCount (insert));
1088 /* reset plugin counts back to one for now so
1089 that we have a predictable, controlled
1090 state to try to configure.
1093 boost::shared_ptr<PluginInsert> pi;
1095 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1099 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1112 /* Now process each placement in order, checking to see if we
1113 can really do what has been requested.
1118 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1122 /* figure out the streams that will feed into PreFader */
1124 if (!insert_map[PreFader].empty()) {
1125 InsertCount& ic (insert_map[PreFader].back());
1126 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1128 initial_streams = n_inputs ();
1133 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1137 /* OK, everything can be set up correctly, so lets do it */
1139 apply_some_plugin_counts (insert_map[PreFader]);
1140 apply_some_plugin_counts (insert_map[PostFader]);
1142 /* recompute max outs of any redirect */
1146 redirect_max_outs = 0;
1147 RedirectList::iterator prev = _redirects.end();
1149 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1150 boost::shared_ptr<Send> s;
1152 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1153 if (r == _redirects.begin()) {
1154 s->expect_inputs (n_inputs());
1156 s->expect_inputs ((*prev)->output_streams());
1160 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1169 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1171 list<InsertCount>::iterator i;
1173 for (i = iclist.begin(); i != iclist.end(); ++i) {
1175 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1178 /* make sure that however many we have, they are all active */
1179 (*i).insert->activate ();
1186 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1188 list<InsertCount>::iterator i;
1190 for (i = iclist.begin(); i != iclist.end(); ++i) {
1192 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1194 *err_streams = required_inputs;
1199 (*i).in = required_inputs;
1200 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1202 required_inputs = (*i).out;
1209 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1211 uint32_t old_rmo = redirect_max_outs;
1217 RedirectList to_be_deleted;
1220 Glib::RWLock::WriterLock lm (redirect_lock);
1221 RedirectList::iterator tmp;
1222 RedirectList the_copy;
1224 the_copy = _redirects;
1226 /* remove all relevant redirects */
1228 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1232 if ((*i)->placement() == placement) {
1233 to_be_deleted.push_back (*i);
1234 _redirects.erase (i);
1240 /* now copy the relevant ones from "other" */
1242 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1243 if ((*i)->placement() == placement) {
1244 _redirects.push_back (Redirect::clone (*i));
1248 /* reset plugin stream handling */
1250 if (_reset_plugin_counts (err_streams)) {
1252 /* FAILED COPY ATTEMPT: we have to restore order */
1254 /* delete all cloned redirects */
1256 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1261 if ((*i)->placement() == placement) {
1262 _redirects.erase (i);
1268 /* restore the natural order */
1270 _redirects = the_copy;
1271 redirect_max_outs = old_rmo;
1273 /* we failed, even though things are OK again */
1279 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1280 to_be_deleted.clear ();
1284 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1288 redirects_changed (this); /* EMIT SIGNAL */
1293 Route::all_redirects_flip ()
1295 Glib::RWLock::ReaderLock lm (redirect_lock);
1297 if (_redirects.empty()) {
1301 bool first_is_on = _redirects.front()->active();
1303 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1304 (*i)->set_active (!first_is_on, this);
1309 Route::all_redirects_active (bool state)
1311 Glib::RWLock::ReaderLock lm (redirect_lock);
1313 if (_redirects.empty()) {
1317 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1318 (*i)->set_active (state, this);
1322 struct RedirectSorter {
1323 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1324 return a->sort_key() < b->sort_key();
1329 Route::sort_redirects (uint32_t* err_streams)
1332 RedirectSorter comparator;
1333 Glib::RWLock::WriterLock lm (redirect_lock);
1334 uint32_t old_rmo = redirect_max_outs;
1336 /* the sweet power of C++ ... */
1338 RedirectList as_it_was_before = _redirects;
1340 _redirects.sort (comparator);
1342 if (_reset_plugin_counts (err_streams)) {
1343 _redirects = as_it_was_before;
1344 redirect_max_outs = old_rmo;
1350 redirects_changed (this); /* EMIT SIGNAL */
1362 Route::get_template()
1364 return state(false);
1368 Route::state(bool full_state)
1370 XMLNode *node = new XMLNode("Route");
1371 RedirectList:: iterator i;
1375 snprintf (buf, sizeof (buf), "0x%x", _flags);
1376 node->add_property("flags", buf);
1379 node->add_property("default-type", _default_type.to_string());
1381 node->add_property("active", _active?"yes":"no");
1382 node->add_property("muted", _muted?"yes":"no");
1383 node->add_property("soloed", _soloed?"yes":"no");
1384 node->add_property("phase-invert", _phase_invert?"yes":"no");
1385 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1386 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1387 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1388 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1391 node->add_property("edit-group", _edit_group->name());
1394 node->add_property("mix-group", _mix_group->name());
1397 string order_string;
1398 OrderKeys::iterator x = order_keys.begin();
1400 while (x != order_keys.end()) {
1401 order_string += (*x).first;
1402 order_string += '=';
1403 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1404 order_string += buf;
1408 if (x == order_keys.end()) {
1412 order_string += ':';
1414 node->add_property ("order-keys", order_string);
1416 node->add_child_nocopy (IO::state (full_state));
1417 node->add_child_nocopy (_solo_control.get_state ());
1418 node->add_child_nocopy (_mute_control.get_state ());
1420 if (_control_outs) {
1421 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1422 cnode->add_child_nocopy (_control_outs->state (full_state));
1423 node->add_child_nocopy (*cnode);
1426 if (_comment.length()) {
1427 XMLNode *cmt = node->add_child ("Comment");
1428 cmt->add_content (_comment);
1431 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1432 node->add_child_nocopy((*i)->state (full_state));
1436 node->add_child_copy (*_extra_xml);
1443 Route::set_deferred_state ()
1446 XMLNodeConstIterator niter;
1448 if (!deferred_state) {
1452 nlist = deferred_state->children();
1454 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1455 add_redirect_from_xml (**niter);
1458 delete deferred_state;
1463 Route::add_redirect_from_xml (const XMLNode& node)
1465 const XMLProperty *prop;
1467 if (node.name() == "Send") {
1471 boost::shared_ptr<Send> send (new Send (_session, node));
1472 add_redirect (send, this);
1475 catch (failed_constructor &err) {
1476 error << _("Send construction failed") << endmsg;
1480 } else if (node.name() == "Insert") {
1483 if ((prop = node.property ("type")) != 0) {
1485 boost::shared_ptr<Insert> insert;
1487 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1489 insert.reset (new PluginInsert(_session, node));
1491 } else if (prop->value() == "port") {
1494 insert.reset (new PortInsert (_session, node));
1498 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1501 add_redirect (insert, this);
1504 error << _("Insert XML node has no type property") << endmsg;
1508 catch (failed_constructor &err) {
1509 warning << _("insert could not be created. Ignored.") << endmsg;
1516 Route::set_state (const XMLNode& node)
1518 return _set_state (node, true);
1522 Route::_set_state (const XMLNode& node, bool call_base)
1525 XMLNodeConstIterator niter;
1527 XMLPropertyList plist;
1528 const XMLProperty *prop;
1530 if (node.name() != "Route"){
1531 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1535 if ((prop = node.property (X_("flags"))) != 0) {
1537 sscanf (prop->value().c_str(), "0x%x", &x);
1543 if ((prop = node.property (X_("default-type"))) != 0) {
1544 _default_type = DataType(prop->value());
1545 assert(_default_type != DataType::NIL);
1548 if ((prop = node.property (X_("phase-invert"))) != 0) {
1549 set_phase_invert(prop->value()=="yes"?true:false, this);
1552 if ((prop = node.property (X_("active"))) != 0) {
1553 set_active (prop->value() == "yes");
1556 if ((prop = node.property (X_("muted"))) != 0) {
1557 bool yn = prop->value()=="yes"?true:false;
1559 /* force reset of mute status */
1563 mute_gain = desired_mute_gain;
1566 if ((prop = node.property (X_("soloed"))) != 0) {
1567 bool yn = prop->value()=="yes"?true:false;
1569 /* force reset of solo status */
1572 set_solo (yn, this);
1573 solo_gain = desired_solo_gain;
1576 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1577 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1580 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1581 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1584 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1585 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1588 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1589 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1592 if ((prop = node.property (X_("edit-group"))) != 0) {
1593 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1594 if(edit_group == 0) {
1595 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1597 set_edit_group(edit_group, this);
1601 if ((prop = node.property (X_("order-keys"))) != 0) {
1605 string::size_type colon, equal;
1606 string remaining = prop->value();
1608 while (remaining.length()) {
1610 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1611 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1614 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1615 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1618 set_order_key (remaining.substr (0, equal), n);
1622 colon = remaining.find_first_of (':');
1624 if (colon != string::npos) {
1625 remaining = remaining.substr (colon+1);
1632 nlist = node.children();
1634 if (deferred_state) {
1635 delete deferred_state;
1638 deferred_state = new XMLNode(X_("deferred state"));
1640 /* set parent class properties before anything else */
1642 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1646 if (child->name() == IO::state_node_name && call_base) {
1648 IO::set_state (*child);
1653 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1657 if (child->name() == X_("Send")) {
1660 if (!IO::ports_legal) {
1662 deferred_state->add_child_copy (*child);
1665 add_redirect_from_xml (*child);
1668 } else if (child->name() == X_("Insert")) {
1670 if (!IO::ports_legal) {
1672 deferred_state->add_child_copy (*child);
1676 add_redirect_from_xml (*child);
1679 } else if (child->name() == X_("Automation")) {
1681 if ((prop = child->property (X_("path"))) != 0) {
1682 load_automation (prop->value());
1685 } else if (child->name() == X_("ControlOuts")) {
1687 string coutname = _name;
1688 coutname += _("[control]");
1690 _control_outs = new IO (_session, coutname);
1691 _control_outs->set_state (**(child->children().begin()));
1693 } else if (child->name() == X_("Comment")) {
1695 /* XXX this is a terrible API design in libxml++ */
1697 XMLNode *cmt = *(child->children().begin());
1698 _comment = cmt->content();
1700 } else if (child->name() == X_("extra")) {
1701 _extra_xml = new XMLNode (*child);
1702 } else if (child->name() == X_("solo")) {
1703 _solo_control.set_state (*child);
1704 _session.add_controllable (&_solo_control);
1705 } else if (child->name() == X_("mute")) {
1706 _mute_control.set_state (*child);
1707 _session.add_controllable (&_mute_control);
1711 if ((prop = node.property (X_("mix-group"))) != 0) {
1712 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1713 if (mix_group == 0) {
1714 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1716 set_mix_group(mix_group, this);
1724 Route::curve_reallocate ()
1726 // _gain_automation_curve.finish_resize ();
1727 // _pan_automation_curve.finish_resize ();
1731 Route::silence (nframes_t nframes, nframes_t offset)
1735 // reset_peak_meters ();
1737 IO::silence (nframes, offset);
1739 if (_control_outs) {
1740 _control_outs->silence (nframes, offset);
1744 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1747 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1748 boost::shared_ptr<PluginInsert> pi;
1749 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1750 // skip plugins, they don't need anything when we're not active
1754 (*i)->silence (nframes, offset);
1757 if (nframes == _session.get_block_size() && offset == 0) {
1767 Route::set_control_outs (const vector<string>& ports)
1769 Glib::Mutex::Lock lm (control_outs_lock);
1770 vector<string>::const_iterator i;
1772 if (_control_outs) {
1773 delete _control_outs;
1777 if (ports.empty()) {
1781 string coutname = _name;
1782 coutname += _("[control]");
1784 _control_outs = new IO (_session, coutname);
1786 /* our control outs need as many outputs as we
1787 have outputs. we track the changes in ::output_change_handler().
1790 _control_outs->ensure_io (0, n_outputs(), true, this);
1796 Route::set_edit_group (RouteGroup *eg, void *src)
1799 if (eg == _edit_group) {
1804 _edit_group->remove (this);
1807 if ((_edit_group = eg) != 0) {
1808 _edit_group->add (this);
1811 _session.set_dirty ();
1812 edit_group_changed (src); /* EMIT SIGNAL */
1816 Route::drop_edit_group (void *src)
1819 _session.set_dirty ();
1820 edit_group_changed (src); /* EMIT SIGNAL */
1824 Route::set_mix_group (RouteGroup *mg, void *src)
1827 if (mg == _mix_group) {
1832 _mix_group->remove (this);
1835 if ((_mix_group = mg) != 0) {
1836 _mix_group->add (this);
1839 _session.set_dirty ();
1840 mix_group_changed (src); /* EMIT SIGNAL */
1844 Route::drop_mix_group (void *src)
1847 _session.set_dirty ();
1848 mix_group_changed (src); /* EMIT SIGNAL */
1852 Route::set_comment (string cmt, void *src)
1855 comment_changed (src);
1856 _session.set_dirty ();
1860 Route::feeds (boost::shared_ptr<Route> other)
1865 uint32_t no = self.n_outputs();
1866 uint32_t ni = other->n_inputs ();
1868 for (i = 0; i < no; ++i) {
1869 for (j = 0; j < ni; ++j) {
1870 if (self.output(i)->connected_to (other->input(j)->name())) {
1876 /* check Redirects which may also interconnect Routes */
1878 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1880 no = (*r)->n_outputs();
1882 for (i = 0; i < no; ++i) {
1883 for (j = 0; j < ni; ++j) {
1884 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
1891 /* check for control room outputs which may also interconnect Routes */
1893 if (_control_outs) {
1895 no = _control_outs->n_outputs();
1897 for (i = 0; i < no; ++i) {
1898 for (j = 0; j < ni; ++j) {
1899 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
1910 Route::set_mute_config (mute_type t, bool onoff, void *src)
1914 _mute_affects_pre_fader = onoff;
1915 pre_fader_changed(src); /* EMIT SIGNAL */
1919 _mute_affects_post_fader = onoff;
1920 post_fader_changed(src); /* EMIT SIGNAL */
1924 _mute_affects_control_outs = onoff;
1925 control_outs_changed(src); /* EMIT SIGNAL */
1929 _mute_affects_main_outs = onoff;
1930 main_outs_changed(src); /* EMIT SIGNAL */
1936 Route::get_mute_config (mute_type t)
1942 onoff = _mute_affects_pre_fader;
1945 onoff = _mute_affects_post_fader;
1948 onoff = _mute_affects_control_outs;
1951 onoff = _mute_affects_main_outs;
1959 Route::set_active (bool yn)
1962 active_changed(); /* EMIT SIGNAL */
1966 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
1968 nframes_t now = _session.transport_frame();
1971 Glib::RWLock::ReaderLock lm (redirect_lock);
1974 automation_snapshot (now);
1977 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1979 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
1980 (*i)->deactivate ();
1984 (*i)->transport_stopped (now);
1988 IO::transport_stopped (now);
1990 _roll_delay = _initial_delay;
1994 Route::input_change_handler (IOChange change, void *ignored)
1996 if (change & ConfigurationChanged) {
1997 reset_plugin_counts (0);
2002 Route::output_change_handler (IOChange change, void *ignored)
2004 if (change & ConfigurationChanged) {
2005 if (_control_outs) {
2006 _control_outs->ensure_io (0, n_outputs(), true, this);
2009 reset_plugin_counts (0);
2014 Route::pans_required () const
2016 if (n_outputs() < 2) {
2020 return max (n_inputs (), redirect_max_outs);
2024 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2025 bool session_state_changing, bool can_record, bool rec_monitors_input)
2027 if (n_outputs() == 0) {
2031 if (session_state_changing || !_active) {
2032 silence (nframes, offset);
2036 apply_gain_automation = false;
2039 passthru (start_frame, end_frame, nframes, offset, 0, false);
2041 silence (nframes, offset);
2048 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2050 if (_roll_delay > nframes) {
2052 _roll_delay -= nframes;
2053 silence (nframes, offset);
2054 /* transport frame is not legal for caller to use */
2057 } else if (_roll_delay > 0) {
2059 nframes -= _roll_delay;
2061 silence (_roll_delay, offset);
2063 offset += _roll_delay;
2064 transport_frame += _roll_delay;
2073 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2074 bool can_record, bool rec_monitors_input)
2077 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2079 // automation snapshot can also be called from the non-rt context
2080 // and it uses the redirect list, so we take the lock out here
2081 automation_snapshot (_session.transport_frame());
2085 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2086 silence (nframes, offset);
2090 nframes_t unused = 0;
2092 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2098 apply_gain_automation = false;
2101 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2103 if (am.locked() && _session.transport_rolling()) {
2105 nframes_t start_frame = end_frame - nframes;
2107 if (gain_automation_playback()) {
2108 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2113 passthru (start_frame, end_frame, nframes, offset, declick, false);
2119 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2120 bool can_record, bool rec_monitors_input)
2122 silence (nframes, offset);
2127 Route::toggle_monitor_input ()
2129 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2130 (*i)->ensure_monitor_input(!(*i)->monitoring_input());
2135 Route::has_external_redirects () const
2137 boost::shared_ptr<const PortInsert> pi;
2139 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2140 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2142 uint32_t no = pi->n_outputs();
2144 for (uint32_t n = 0; n < no; ++n) {
2146 string port_name = pi->output(n)->name();
2147 string client_name = port_name.substr (0, port_name.find(':'));
2149 /* only say "yes" if the redirect is actually in use */
2151 if (client_name != "ardour" && pi->active()) {
2162 Route::flush_redirects ()
2164 /* XXX shouldn't really try to take this lock, since
2165 this is called from the RT audio thread.
2168 Glib::RWLock::ReaderLock lm (redirect_lock);
2170 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2171 (*i)->deactivate ();
2177 Route::set_meter_point (MeterPoint p, void *src)
2179 if (_meter_point != p) {
2181 meter_change (src); /* EMIT SIGNAL */
2182 _session.set_dirty ();
2187 Route::update_total_latency ()
2191 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2192 if ((*i)->active ()) {
2193 _own_latency += (*i)->latency ();
2197 set_port_latency (_own_latency);
2199 /* this (virtual) function is used for pure Routes,
2200 not derived classes like AudioTrack. this means
2201 that the data processed here comes from an input
2202 port, not prerecorded material, and therefore we
2203 have to take into account any input latency.
2206 _own_latency += input_latency ();
2208 return _own_latency;
2212 Route::set_latency_delay (nframes_t longest_session_latency)
2214 _initial_delay = longest_session_latency - _own_latency;
2216 if (_session.transport_stopped()) {
2217 _roll_delay = _initial_delay;
2222 Route::automation_snapshot (nframes_t now)
2224 IO::automation_snapshot (now);
2226 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2227 (*i)->automation_snapshot (now);
2231 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2232 : Controllable (name), route (s), type(tp)
2238 Route::ToggleControllable::set_value (float val)
2240 bool bval = ((val >= 0.5f) ? true: false);
2244 route.set_mute (bval, this);
2247 route.set_solo (bval, this);
2255 Route::ToggleControllable::get_value (void) const
2261 val = route.muted() ? 1.0f : 0.0f;
2264 val = route.soloed() ? 1.0f : 0.0f;
2274 Route::set_block_size (nframes_t nframes)
2276 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2277 (*i)->set_block_size (nframes);
2282 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2284 _session.update_latency_compensation (false, false);
2288 Route::protect_automation ()
2290 switch (gain_automation_state()) {
2293 set_gain_automation_state (Off);
2299 switch (panner().automation_state ()) {
2302 panner().set_automation_state (Off);
2308 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2309 boost::shared_ptr<PluginInsert> pi;
2310 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2311 pi->protect_automation ();
2317 Route::set_pending_declick (int declick)
2320 /* this call is not allowed to turn off a pending declick unless "force" is true */
2322 _pending_declick = declick;
2324 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2326 _pending_declick = 0;