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.
24 #include <sigc++/bind.h>
25 #include <pbd/xml++.h>
26 #include <pbd/enumwriter.h>
28 #include <ardour/timestamps.h>
29 #include <ardour/audioengine.h>
30 #include <ardour/route.h>
31 #include <ardour/buffer.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/audio_port.h>
41 #include <ardour/ladspa_plugin.h>
42 #include <ardour/panner.h>
43 #include <ardour/dB.h>
44 #include <ardour/mix.h>
45 #include <ardour/amp.h>
46 #include <ardour/meter.h>
47 #include <ardour/buffer_set.h>
51 using namespace ARDOUR;
54 uint32_t Route::order_key_cnt = 0;
57 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
58 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
60 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
61 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
66 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
67 : IO (sess, *node.child ("IO"), default_type),
68 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
69 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
72 _set_state (node, false);
78 redirect_max_outs.reset();
82 _phase_invert = false;
83 order_keys[strdup (N_("signal"))] = order_key_cnt++;
86 _meter_point = MeterPostFader;
90 _have_internal_generator = false;
92 _pending_declick = true;
93 _remote_control_id = 0;
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);
224 /** Process this route for one (sub) cycle (process thread)
226 * @param bufs Scratch buffers to use for the signal path
227 * @param start_frame Initial transport frame
228 * @param end_frame Final transport frame
229 * @param nframes Number of frames to output (to ports)
230 * @param offset Output offset (of port buffers, for split cycles)
232 * Note that (end_frame - start_frame) may not be equal to nframes when the
233 * transport speed isn't 1.0 (eg varispeed).
236 Route::process_output_buffers (BufferSet& bufs,
237 nframes_t start_frame, nframes_t end_frame,
238 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
241 // This is definitely very audio-only for now
242 assert(_default_type == DataType::AUDIO);
244 RedirectList::iterator i;
245 bool post_fader_work = false;
246 bool mute_declick_applied = false;
252 gain_t* gab = _session.gain_automation_buffer();
254 switch (Config->get_monitoring_model()) {
255 case HardwareMonitoring:
256 case ExternalMonitoring:
263 declick = _pending_declick;
266 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
276 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
279 dmg = desired_mute_gain;
280 dsg = desired_solo_gain;
289 /* ----------------------------------------------------------------------------------------------------
290 GLOBAL DECLICK (for transport changes etc.)
291 -------------------------------------------------------------------------------------------------- */
294 Amp::run (bufs, nframes, 0.0, 1.0, false);
295 _pending_declick = 0;
296 } else if (declick < 0) {
297 Amp::run (bufs, nframes, 1.0, 0.0, false);
298 _pending_declick = 0;
301 /* no global declick */
303 if (solo_gain != dsg) {
304 Amp::run (bufs, nframes, solo_gain, dsg, false);
310 /* ----------------------------------------------------------------------------------------------------
311 INPUT METERING & MONITORING
312 -------------------------------------------------------------------------------------------------- */
314 if (meter && (_meter_point == MeterInput)) {
315 _meter->run(bufs, nframes);
318 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
319 Amp::run (bufs, nframes, mute_gain, dmg, false);
321 mute_declick_applied = true;
324 if ((_meter_point == MeterInput) && co) {
326 solo_audible = dsg > 0;
327 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
329 if ( // muted by solo of another track
333 // muted by mute of this track
337 // rec-enabled but not s/w monitoring
339 // TODO: this is probably wrong
341 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
345 co->silence (nframes, offset);
349 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
354 /* ---------------------------------------------------------------------------------------------------
356 -------------------------------------------------------------------------------------------------- */
358 /* FIXME: Somewhere in these loops is where bufs.count() should go from n_inputs() to redirect_max_outs()
359 * (if they differ). Something explicit needs to be done here to make sure the list of redirects will
360 * give us what we need (possibly by inserting transparent 'translators' into the list to make it work) */
362 if (with_redirects) {
363 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
365 if (mute_gain > 0 || !_mute_affects_pre_fader) {
366 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
367 switch ((*i)->placement()) {
369 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
372 post_fader_work = true;
377 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
378 switch ((*i)->placement()) {
380 (*i)->silence (nframes, offset);
383 post_fader_work = true;
391 // FIXME: for now, just hope the redirects list did what it was supposed to
392 bufs.set_count(n_process_buffers());
395 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
396 Amp::run (bufs, nframes, mute_gain, dmg, false);
398 mute_declick_applied = true;
401 /* ----------------------------------------------------------------------------------------------------
402 PRE-FADER METERING & MONITORING
403 -------------------------------------------------------------------------------------------------- */
405 if (meter && (_meter_point == MeterPreFader)) {
406 _meter->run(bufs, nframes);
410 if ((_meter_point == MeterPreFader) && co) {
412 solo_audible = dsg > 0;
413 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
415 if ( // muted by solo of another track
419 // muted by mute of this track
423 // rec-enabled but not s/w monitoring
425 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
429 co->silence (nframes, offset);
433 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
438 /* ----------------------------------------------------------------------------------------------------
440 -------------------------------------------------------------------------------------------------- */
442 /* if not recording or recording and requiring any monitor signal, then apply gain */
444 if ( // not recording
446 !(record_enabled() && _session.actively_recording()) ||
450 // h/w monitoring not in use
452 (!Config->get_monitoring_model() == HardwareMonitoring &&
454 // AND software monitoring required
456 Config->get_monitoring_model() == SoftwareMonitoring)) {
458 if (apply_gain_automation) {
461 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
462 Sample* const sp = i->data(nframes);
464 for (nframes_t nx = 0; nx < nframes; ++nx) {
469 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
470 Sample* const sp = i->data(nframes);
472 for (nframes_t nx = 0; nx < nframes; ++nx) {
478 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
479 _effective_gain = gab[nframes-1];
484 /* manual (scalar) gain */
488 Amp::run (bufs, nframes, _gain, dg, _phase_invert);
491 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
493 /* no need to interpolate current gain value,
494 but its non-unity, so apply it. if the gain
495 is zero, do nothing because we'll ship silence
507 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
508 Sample* const sp = i->data(nframes);
509 Session::apply_gain_to_buffer(sp,nframes,this_gain);
512 } else if (_gain == 0) {
513 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
521 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
525 /* ----------------------------------------------------------------------------------------------------
527 -------------------------------------------------------------------------------------------------- */
529 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
531 if (post_fader_work) {
533 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
535 if (mute_gain > 0 || !_mute_affects_post_fader) {
536 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
537 switch ((*i)->placement()) {
541 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
546 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
547 switch ((*i)->placement()) {
551 (*i)->silence (nframes, offset);
559 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
560 Amp::run (bufs, nframes, mute_gain, dmg, false);
562 mute_declick_applied = true;
565 /* ----------------------------------------------------------------------------------------------------
567 -------------------------------------------------------------------------------------------------- */
569 if ((_meter_point == MeterPostFader) && co) {
571 solo_audible = solo_gain > 0;
572 mute_audible = dmg > 0 || !_mute_affects_control_outs;
574 if ( // silent anyway
576 (_gain == 0 && !apply_gain_automation) ||
578 // muted by solo of another track
582 // muted by mute of this track
586 // recording but not s/w monitoring
588 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
592 co->silence (nframes, offset);
596 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
600 /* ----------------------------------------------------------------------
602 ----------------------------------------------------------------------*/
604 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
605 Amp::run (bufs, nframes, mute_gain, dmg, false);
607 mute_declick_applied = true;
610 /* ----------------------------------------------------------------------------------------------------
612 -------------------------------------------------------------------------------------------------- */
614 solo_audible = dsg > 0;
615 mute_audible = dmg > 0 || !_mute_affects_main_outs;
617 if (n_outputs().get(_default_type) == 0) {
621 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
623 IO::silence (nframes, offset);
627 if ( // silent anyway
629 (_gain == 0 && !apply_gain_automation) ||
631 // muted by solo of another track, but not using control outs for solo
633 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
635 // muted by mute of this track
641 /* don't use Route::silence() here, because that causes
642 all outputs (sends, port inserts, etc. to be silent).
645 if (_meter_point == MeterPostFader) {
646 peak_meter().reset();
649 IO::silence (nframes, offset);
653 deliver_output(bufs, start_frame, end_frame, nframes, offset);
659 /* ----------------------------------------------------------------------------------------------------
661 -------------------------------------------------------------------------------------------------- */
663 if (meter && (_meter_point == MeterPostFader)) {
664 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
667 _meter->run(output_buffers(), nframes, offset);
673 Route::n_process_buffers ()
675 return max (n_inputs(), redirect_max_outs);
679 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
681 BufferSet& bufs = _session.get_scratch_buffers(n_process_buffers());
685 collect_input (bufs, nframes, offset);
687 #define meter_stream meter_first
690 _meter->run(bufs, nframes);
691 meter_stream = false;
696 process_output_buffers (bufs, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
702 Route::passthru_silence (jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t nframes, jack_nframes_t offset, int declick, bool meter)
704 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, offset, true, declick, meter);
708 Route::set_solo (bool yn, void *src)
714 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
715 _mix_group->apply (&Route::set_solo, yn, _mix_group);
721 solo_changed (src); /* EMIT SIGNAL */
722 _solo_control.Changed (); /* EMIT SIGNAL */
727 Route::set_solo_mute (bool yn)
729 Glib::Mutex::Lock lm (declick_lock);
731 /* Called by Session in response to another Route being soloed.
734 desired_solo_gain = (yn?0.0:1.0);
738 Route::set_solo_safe (bool yn, void *src)
740 if (_solo_safe != yn) {
742 solo_safe_changed (src); /* EMIT SIGNAL */
747 Route::set_mute (bool yn, void *src)
750 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
751 _mix_group->apply (&Route::set_mute, yn, _mix_group);
757 mute_changed (src); /* EMIT SIGNAL */
759 _mute_control.Changed (); /* EMIT SIGNAL */
761 Glib::Mutex::Lock lm (declick_lock);
762 desired_mute_gain = (yn?0.0f:1.0f);
767 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
769 ChanCount old_rmo = redirect_max_outs;
771 if (!_session.engine().connected()) {
776 Glib::RWLock::WriterLock lm (redirect_lock);
778 boost::shared_ptr<PluginInsert> pi;
779 boost::shared_ptr<PortInsert> porti;
781 redirect->set_default_type(_default_type);
783 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
786 if (pi->input_streams() == ChanCount::ZERO) {
787 /* generator plugin */
788 _have_internal_generator = true;
791 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
793 /* force new port inserts to start out with an i/o configuration
794 that matches this route's i/o configuration.
796 the "inputs" for the port are supposed to match the output
799 the "outputs" of the route should match the inputs of this
800 route. XXX shouldn't they match the number of active signal
801 streams at the point of insertion?
803 // FIXME: (yes, they should)
805 porti->ensure_io (n_outputs (), n_inputs(), false, this);
808 // Ensure peak vector sizes before the plugin is activated
809 ChanCount potential_max_streams = max(redirect->input_streams(), redirect->output_streams());
810 _meter->setup(potential_max_streams);
812 _redirects.push_back (redirect);
814 if (_reset_plugin_counts (err_streams)) {
815 _redirects.pop_back ();
816 _reset_plugin_counts (0); // it worked before we tried to add it ...
820 redirect->activate ();
821 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
824 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
829 redirects_changed (src); /* EMIT SIGNAL */
834 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
836 ChanCount old_rmo = redirect_max_outs;
838 if (!_session.engine().connected()) {
843 Glib::RWLock::WriterLock lm (redirect_lock);
845 RedirectList::iterator existing_end = _redirects.end();
848 ChanCount potential_max_streams;
850 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
852 boost::shared_ptr<PluginInsert> pi;
854 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
857 ChanCount m = max(pi->input_streams(), pi->output_streams());
858 if (m > potential_max_streams)
859 potential_max_streams = m;
862 // Ensure peak vector sizes before the plugin is activated
863 _meter->setup(potential_max_streams);
865 _redirects.push_back (*i);
867 if (_reset_plugin_counts (err_streams)) {
869 _redirects.erase (existing_end, _redirects.end());
870 _reset_plugin_counts (0); // it worked before we tried to add it ...
875 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
879 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
883 redirects_changed (src); /* EMIT SIGNAL */
888 Route::clear_redirects (void *src)
890 ChanCount old_rmo = redirect_max_outs;
892 if (!_session.engine().connected()) {
897 Glib::RWLock::WriterLock lm (redirect_lock);
898 RedirectList::iterator i;
899 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
900 (*i)->drop_references ();
905 if (redirect_max_outs != old_rmo) {
909 redirect_max_outs.reset();
910 _have_internal_generator = false;
911 redirects_changed (src); /* EMIT SIGNAL */
915 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
917 ChanCount old_rmo = redirect_max_outs;
919 if (!_session.engine().connected()) {
923 redirect_max_outs.reset();
926 Glib::RWLock::WriterLock lm (redirect_lock);
927 RedirectList::iterator i;
928 bool removed = false;
930 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
931 if (*i == redirect) {
933 RedirectList::iterator tmp;
935 /* move along, see failure case for reset_plugin_counts()
936 where we may need to reinsert the redirect.
942 /* stop redirects that send signals to JACK ports
943 from causing noise as a result of no longer being
947 boost::shared_ptr<Send> send;
948 boost::shared_ptr<PortInsert> port_insert;
950 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
951 send->disconnect_inputs (this);
952 send->disconnect_outputs (this);
953 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
954 port_insert->disconnect_inputs (this);
955 port_insert->disconnect_outputs (this);
958 _redirects.erase (i);
971 if (_reset_plugin_counts (err_streams)) {
972 /* get back to where we where */
973 _redirects.insert (i, redirect);
974 /* we know this will work, because it worked before :) */
975 _reset_plugin_counts (0);
981 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
982 boost::shared_ptr<PluginInsert> pi;
984 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
985 if (pi->is_generator()) {
991 _have_internal_generator = foo;
994 if (old_rmo != redirect_max_outs) {
998 redirect->drop_references ();
1000 redirects_changed (src); /* EMIT SIGNAL */
1005 Route::reset_plugin_counts (uint32_t* lpc)
1007 Glib::RWLock::WriterLock lm (redirect_lock);
1008 return _reset_plugin_counts (lpc);
1013 Route::_reset_plugin_counts (uint32_t* err_streams)
1015 RedirectList::iterator r;
1018 map<Placement,list<InsertCount> > insert_map;
1019 nframes_t initial_streams;
1021 redirect_max_outs.reset();
1025 /* divide inserts up by placement so we get the signal flow
1026 properly modelled. we need to do this because the _redirects
1027 list is not sorted by placement, and because other reasons may
1028 exist now or in the future for this separate treatment.
1031 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1033 boost::shared_ptr<Insert> insert;
1035 /* do this here in case we bomb out before we get to the end of
1039 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1041 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1043 insert_map[insert->placement()].push_back (InsertCount (insert));
1045 /* reset plugin counts back to one for now so
1046 that we have a predictable, controlled
1047 state to try to configure.
1050 boost::shared_ptr<PluginInsert> pi;
1052 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1056 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1069 /* Now process each placement in order, checking to see if we
1070 can really do what has been requested.
1075 if (check_some_plugin_counts (insert_map[PreFader], n_inputs ().get(_default_type), err_streams)) {
1079 /* figure out the streams that will feed into PreFader */
1081 if (!insert_map[PreFader].empty()) {
1082 InsertCount& ic (insert_map[PreFader].back());
1083 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1085 initial_streams = n_inputs ().get(_default_type);
1090 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1094 /* OK, everything can be set up correctly, so lets do it */
1096 apply_some_plugin_counts (insert_map[PreFader]);
1097 apply_some_plugin_counts (insert_map[PostFader]);
1099 /* recompute max outs of any redirect */
1103 redirect_max_outs.reset();
1104 RedirectList::iterator prev = _redirects.end();
1106 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1107 boost::shared_ptr<Send> s;
1109 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1110 if (r == _redirects.begin()) {
1111 s->expect_inputs (n_inputs());
1113 s->expect_inputs ((*prev)->output_streams());
1118 /* don't pay any attention to send output configuration, since it doesn't
1122 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1133 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1135 list<InsertCount>::iterator i;
1137 for (i = iclist.begin(); i != iclist.end(); ++i) {
1139 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1142 /* make sure that however many we have, they are all active */
1143 (*i).insert->activate ();
1150 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1152 list<InsertCount>::iterator i;
1154 for (i = iclist.begin(); i != iclist.end(); ++i) {
1156 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1158 *err_streams = required_inputs;
1163 (*i).in = required_inputs;
1164 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1166 required_inputs = (*i).out;
1173 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1175 ChanCount old_rmo = redirect_max_outs;
1181 RedirectList to_be_deleted;
1184 Glib::RWLock::WriterLock lm (redirect_lock);
1185 RedirectList::iterator tmp;
1186 RedirectList the_copy;
1188 the_copy = _redirects;
1190 /* remove all relevant redirects */
1192 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1196 if ((*i)->placement() == placement) {
1197 to_be_deleted.push_back (*i);
1198 _redirects.erase (i);
1204 /* now copy the relevant ones from "other" */
1206 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1207 if ((*i)->placement() == placement) {
1208 _redirects.push_back (Redirect::clone (*i));
1212 /* reset plugin stream handling */
1214 if (_reset_plugin_counts (err_streams)) {
1216 /* FAILED COPY ATTEMPT: we have to restore order */
1218 /* delete all cloned redirects */
1220 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1225 if ((*i)->placement() == placement) {
1226 _redirects.erase (i);
1232 /* restore the natural order */
1234 _redirects = the_copy;
1235 redirect_max_outs = old_rmo;
1237 /* we failed, even though things are OK again */
1243 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1244 to_be_deleted.clear ();
1248 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
1252 redirects_changed (this); /* EMIT SIGNAL */
1257 Route::all_redirects_flip ()
1259 Glib::RWLock::ReaderLock lm (redirect_lock);
1261 if (_redirects.empty()) {
1265 bool first_is_on = _redirects.front()->active();
1267 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1268 (*i)->set_active (!first_is_on, this);
1273 Route::all_redirects_active (bool state)
1275 Glib::RWLock::ReaderLock lm (redirect_lock);
1277 if (_redirects.empty()) {
1281 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1282 (*i)->set_active (state, this);
1286 struct RedirectSorter {
1287 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1288 return a->sort_key() < b->sort_key();
1293 Route::sort_redirects (uint32_t* err_streams)
1296 RedirectSorter comparator;
1297 Glib::RWLock::WriterLock lm (redirect_lock);
1298 ChanCount old_rmo = redirect_max_outs;
1300 /* the sweet power of C++ ... */
1302 RedirectList as_it_was_before = _redirects;
1304 _redirects.sort (comparator);
1306 if (_reset_plugin_counts (err_streams)) {
1307 _redirects = as_it_was_before;
1308 redirect_max_outs = old_rmo;
1314 redirects_changed (this); /* EMIT SIGNAL */
1326 Route::get_template()
1328 return state(false);
1332 Route::state(bool full_state)
1334 XMLNode *node = new XMLNode("Route");
1335 RedirectList:: iterator i;
1339 node->add_property("flags", enum_2_string (_flags));
1342 node->add_property("default-type", _default_type.to_string());
1344 node->add_property("active", _active?"yes":"no");
1345 node->add_property("muted", _muted?"yes":"no");
1346 node->add_property("soloed", _soloed?"yes":"no");
1347 node->add_property("phase-invert", _phase_invert?"yes":"no");
1348 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1349 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1350 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1351 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1354 node->add_property("edit-group", _edit_group->name());
1357 node->add_property("mix-group", _mix_group->name());
1360 string order_string;
1361 OrderKeys::iterator x = order_keys.begin();
1363 while (x != order_keys.end()) {
1364 order_string += string ((*x).first);
1365 order_string += '=';
1366 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1367 order_string += buf;
1371 if (x == order_keys.end()) {
1375 order_string += ':';
1377 node->add_property ("order-keys", order_string);
1379 node->add_child_nocopy (IO::state (full_state));
1380 node->add_child_nocopy (_solo_control.get_state ());
1381 node->add_child_nocopy (_mute_control.get_state ());
1383 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1384 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1385 remote_control_node->add_property (X_("id"), buf);
1386 node->add_child_nocopy (*remote_control_node);
1388 if (_control_outs) {
1389 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1390 cnode->add_child_nocopy (_control_outs->state (full_state));
1391 node->add_child_nocopy (*cnode);
1394 if (_comment.length()) {
1395 XMLNode *cmt = node->add_child ("Comment");
1396 cmt->add_content (_comment);
1399 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1400 node->add_child_nocopy((*i)->state (full_state));
1404 node->add_child_copy (*_extra_xml);
1411 Route::set_deferred_state ()
1414 XMLNodeConstIterator niter;
1416 if (!deferred_state) {
1420 nlist = deferred_state->children();
1422 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1423 add_redirect_from_xml (**niter);
1426 delete deferred_state;
1431 Route::add_redirect_from_xml (const XMLNode& node)
1433 const XMLProperty *prop;
1435 if (node.name() == "Send") {
1439 boost::shared_ptr<Send> send (new Send (_session, node));
1440 add_redirect (send, this);
1443 catch (failed_constructor &err) {
1444 error << _("Send construction failed") << endmsg;
1448 } else if (node.name() == "Insert") {
1451 if ((prop = node.property ("type")) != 0) {
1453 boost::shared_ptr<Insert> insert;
1455 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1457 insert.reset (new PluginInsert(_session, node));
1459 } else if (prop->value() == "port") {
1462 insert.reset (new PortInsert (_session, node));
1466 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1469 add_redirect (insert, this);
1472 error << _("Insert XML node has no type property") << endmsg;
1476 catch (failed_constructor &err) {
1477 warning << _("insert could not be created. Ignored.") << endmsg;
1484 Route::set_state (const XMLNode& node)
1486 return _set_state (node, true);
1490 Route::_set_state (const XMLNode& node, bool call_base)
1493 XMLNodeConstIterator niter;
1495 XMLPropertyList plist;
1496 const XMLProperty *prop;
1498 if (node.name() != "Route"){
1499 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1503 if ((prop = node.property (X_("flags"))) != 0) {
1504 _flags = Flag (string_2_enum (prop->value(), _flags));
1509 if ((prop = node.property (X_("default-type"))) != 0) {
1510 _default_type = DataType(prop->value());
1511 assert(_default_type != DataType::NIL);
1514 if ((prop = node.property (X_("phase-invert"))) != 0) {
1515 set_phase_invert(prop->value()=="yes"?true:false, this);
1518 if ((prop = node.property (X_("active"))) != 0) {
1519 set_active (prop->value() == "yes");
1522 if ((prop = node.property (X_("muted"))) != 0) {
1523 bool yn = prop->value()=="yes"?true:false;
1525 /* force reset of mute status */
1529 mute_gain = desired_mute_gain;
1532 if ((prop = node.property (X_("soloed"))) != 0) {
1533 bool yn = prop->value()=="yes"?true:false;
1535 /* force reset of solo status */
1538 set_solo (yn, this);
1539 solo_gain = desired_solo_gain;
1542 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1543 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1546 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1547 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1550 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1551 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1554 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1555 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1558 if ((prop = node.property (X_("edit-group"))) != 0) {
1559 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1560 if(edit_group == 0) {
1561 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1563 set_edit_group(edit_group, this);
1567 if ((prop = node.property (X_("order-keys"))) != 0) {
1571 string::size_type colon, equal;
1572 string remaining = prop->value();
1574 while (remaining.length()) {
1576 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1577 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1580 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1581 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1584 set_order_key (remaining.substr (0, equal).c_str(), n);
1588 colon = remaining.find_first_of (':');
1590 if (colon != string::npos) {
1591 remaining = remaining.substr (colon+1);
1598 nlist = node.children();
1600 if (deferred_state) {
1601 delete deferred_state;
1604 deferred_state = new XMLNode(X_("deferred state"));
1606 /* set parent class properties before anything else */
1608 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1612 if (child->name() == IO::state_node_name && call_base) {
1614 IO::set_state (*child);
1619 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1623 if (child->name() == X_("Send")) {
1626 if (!IO::ports_legal) {
1628 deferred_state->add_child_copy (*child);
1631 add_redirect_from_xml (*child);
1634 } else if (child->name() == X_("Insert")) {
1636 if (!IO::ports_legal) {
1638 deferred_state->add_child_copy (*child);
1642 add_redirect_from_xml (*child);
1645 } else if (child->name() == X_("Automation")) {
1647 if ((prop = child->property (X_("path"))) != 0) {
1648 load_automation (prop->value());
1651 } else if (child->name() == X_("ControlOuts")) {
1653 string coutname = _name;
1654 coutname += _("[control]");
1656 _control_outs = new IO (_session, coutname);
1657 _control_outs->set_state (**(child->children().begin()));
1659 } else if (child->name() == X_("Comment")) {
1661 /* XXX this is a terrible API design in libxml++ */
1663 XMLNode *cmt = *(child->children().begin());
1664 _comment = cmt->content();
1666 } else if (child->name() == X_("extra")) {
1668 _extra_xml = new XMLNode (*child);
1670 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1672 if (prop->value() == "solo") {
1673 _solo_control.set_state (*child);
1674 _session.add_controllable (&_solo_control);
1676 else if (prop->value() == "mute") {
1677 _mute_control.set_state (*child);
1678 _session.add_controllable (&_mute_control);
1681 else if (child->name() == X_("remote_control")) {
1682 if ((prop = child->property (X_("id"))) != 0) {
1684 sscanf (prop->value().c_str(), "%d", &x);
1685 set_remote_control_id (x);
1690 if ((prop = node.property (X_("mix-group"))) != 0) {
1691 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1692 if (mix_group == 0) {
1693 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1695 set_mix_group(mix_group, this);
1703 Route::curve_reallocate ()
1705 // _gain_automation_curve.finish_resize ();
1706 // _pan_automation_curve.finish_resize ();
1710 Route::silence (nframes_t nframes, nframes_t offset)
1714 IO::silence (nframes, offset);
1716 if (_control_outs) {
1717 _control_outs->silence (nframes, offset);
1721 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1724 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1725 boost::shared_ptr<PluginInsert> pi;
1726 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1727 // skip plugins, they don't need anything when we're not active
1731 (*i)->silence (nframes, offset);
1734 if (nframes == _session.get_block_size() && offset == 0) {
1744 Route::set_control_outs (const vector<string>& ports)
1746 Glib::Mutex::Lock lm (control_outs_lock);
1747 vector<string>::const_iterator i;
1749 if (_control_outs) {
1750 delete _control_outs;
1754 if (ports.empty()) {
1758 string coutname = _name;
1759 coutname += _("[control]");
1761 _control_outs = new IO (_session, coutname);
1763 /* our control outs need as many outputs as we
1764 have audio outputs. we track the changes in ::output_change_handler().
1767 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().get(DataType::AUDIO)), true, this);
1773 Route::set_edit_group (RouteGroup *eg, void *src)
1776 if (eg == _edit_group) {
1781 _edit_group->remove (this);
1784 if ((_edit_group = eg) != 0) {
1785 _edit_group->add (this);
1788 _session.set_dirty ();
1789 edit_group_changed (src); /* EMIT SIGNAL */
1793 Route::drop_edit_group (void *src)
1796 _session.set_dirty ();
1797 edit_group_changed (src); /* EMIT SIGNAL */
1801 Route::set_mix_group (RouteGroup *mg, void *src)
1804 if (mg == _mix_group) {
1809 _mix_group->remove (this);
1812 if ((_mix_group = mg) != 0) {
1813 _mix_group->add (this);
1816 _session.set_dirty ();
1817 mix_group_changed (src); /* EMIT SIGNAL */
1821 Route::drop_mix_group (void *src)
1824 _session.set_dirty ();
1825 mix_group_changed (src); /* EMIT SIGNAL */
1829 Route::set_comment (string cmt, void *src)
1832 comment_changed (src);
1833 _session.set_dirty ();
1837 Route::feeds (boost::shared_ptr<Route> other)
1842 uint32_t no = self.n_outputs().get_total();
1843 uint32_t ni = other->n_inputs ().get_total();
1845 for (i = 0; i < no; ++i) {
1846 for (j = 0; j < ni; ++j) {
1847 if (self.output(i)->connected_to (other->input(j)->name())) {
1853 /* check Redirects which may also interconnect Routes */
1855 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1857 no = (*r)->n_outputs().get_total();
1859 for (i = 0; i < no; ++i) {
1860 for (j = 0; j < ni; ++j) {
1861 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
1868 /* check for control room outputs which may also interconnect Routes */
1870 if (_control_outs) {
1872 no = _control_outs->n_outputs().get_total();
1874 for (i = 0; i < no; ++i) {
1875 for (j = 0; j < ni; ++j) {
1876 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
1887 Route::set_mute_config (mute_type t, bool onoff, void *src)
1891 _mute_affects_pre_fader = onoff;
1892 pre_fader_changed(src); /* EMIT SIGNAL */
1896 _mute_affects_post_fader = onoff;
1897 post_fader_changed(src); /* EMIT SIGNAL */
1901 _mute_affects_control_outs = onoff;
1902 control_outs_changed(src); /* EMIT SIGNAL */
1906 _mute_affects_main_outs = onoff;
1907 main_outs_changed(src); /* EMIT SIGNAL */
1913 Route::get_mute_config (mute_type t)
1919 onoff = _mute_affects_pre_fader;
1922 onoff = _mute_affects_post_fader;
1925 onoff = _mute_affects_control_outs;
1928 onoff = _mute_affects_main_outs;
1936 Route::set_active (bool yn)
1939 active_changed(); /* EMIT SIGNAL */
1943 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
1945 nframes_t now = _session.transport_frame();
1948 Glib::RWLock::ReaderLock lm (redirect_lock);
1951 automation_snapshot (now);
1954 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1956 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
1957 (*i)->deactivate ();
1961 (*i)->transport_stopped (now);
1965 IO::transport_stopped (now);
1967 _roll_delay = _initial_delay;
1971 Route::input_change_handler (IOChange change, void *ignored)
1973 if (change & ConfigurationChanged) {
1974 reset_plugin_counts (0);
1979 Route::output_change_handler (IOChange change, void *ignored)
1981 if (change & ConfigurationChanged) {
1982 if (_control_outs) {
1983 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().get(DataType::AUDIO)), true, this);
1986 reset_plugin_counts (0);
1991 Route::pans_required () const
1993 if (n_outputs().get(DataType::AUDIO) < 2) {
1997 return max (n_inputs ().get(DataType::AUDIO), static_cast<size_t>(redirect_max_outs.get(DataType::AUDIO)));
2001 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2002 bool session_state_changing, bool can_record, bool rec_monitors_input)
2004 if (n_outputs().get_total() == 0) {
2008 if (session_state_changing || !_active) {
2009 silence (nframes, offset);
2013 apply_gain_automation = false;
2015 if (n_inputs().get_total()) {
2016 passthru (start_frame, end_frame, nframes, offset, 0, false);
2018 silence (nframes, offset);
2025 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2027 if (_roll_delay > nframes) {
2029 _roll_delay -= nframes;
2030 silence (nframes, offset);
2031 /* transport frame is not legal for caller to use */
2034 } else if (_roll_delay > 0) {
2036 nframes -= _roll_delay;
2038 silence (_roll_delay, offset);
2040 offset += _roll_delay;
2041 transport_frame += _roll_delay;
2050 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2051 bool can_record, bool rec_monitors_input)
2054 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2056 // automation snapshot can also be called from the non-rt context
2057 // and it uses the redirect list, so we take the lock out here
2058 automation_snapshot (_session.transport_frame());
2062 if ((n_outputs().get_total() == 0 && _redirects.empty()) || n_inputs().get_total() == 0 || !_active) {
2063 silence (nframes, offset);
2067 nframes_t unused = 0;
2069 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2075 apply_gain_automation = false;
2078 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2080 if (am.locked() && _session.transport_rolling()) {
2082 if (gain_automation_playback()) {
2083 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2088 passthru (start_frame, end_frame, nframes, offset, declick, false);
2094 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2095 bool can_record, bool rec_monitors_input)
2097 silence (nframes, offset);
2102 Route::toggle_monitor_input ()
2104 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2105 i->ensure_monitor_input( ! i->monitoring_input());
2110 Route::has_external_redirects () const
2112 boost::shared_ptr<const PortInsert> pi;
2114 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2115 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2117 for (PortSet::const_iterator port = pi->outputs().begin();
2118 port != pi->outputs().end(); ++port) {
2120 string port_name = port->name();
2121 string client_name = port_name.substr (0, port_name.find(':'));
2123 /* only say "yes" if the redirect is actually in use */
2125 if (client_name != "ardour" && pi->active()) {
2136 Route::flush_redirects ()
2138 /* XXX shouldn't really try to take this lock, since
2139 this is called from the RT audio thread.
2142 Glib::RWLock::ReaderLock lm (redirect_lock);
2144 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2145 (*i)->deactivate ();
2151 Route::set_meter_point (MeterPoint p, void *src)
2153 if (_meter_point != p) {
2155 meter_change (src); /* EMIT SIGNAL */
2156 _session.set_dirty ();
2161 Route::update_total_latency ()
2165 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2166 if ((*i)->active ()) {
2167 _own_latency += (*i)->latency ();
2171 set_port_latency (_own_latency);
2173 /* this (virtual) function is used for pure Routes,
2174 not derived classes like AudioTrack. this means
2175 that the data processed here comes from an input
2176 port, not prerecorded material, and therefore we
2177 have to take into account any input latency.
2180 _own_latency += input_latency ();
2182 return _own_latency;
2186 Route::set_latency_delay (nframes_t longest_session_latency)
2188 _initial_delay = longest_session_latency - _own_latency;
2190 if (_session.transport_stopped()) {
2191 _roll_delay = _initial_delay;
2196 Route::automation_snapshot (nframes_t now)
2198 IO::automation_snapshot (now);
2200 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2201 (*i)->automation_snapshot (now);
2205 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2206 : Controllable (name), route (s), type(tp)
2212 Route::ToggleControllable::set_value (float val)
2214 bool bval = ((val >= 0.5f) ? true: false);
2218 route.set_mute (bval, this);
2221 route.set_solo (bval, this);
2229 Route::ToggleControllable::get_value (void) const
2235 val = route.muted() ? 1.0f : 0.0f;
2238 val = route.soloed() ? 1.0f : 0.0f;
2248 Route::set_block_size (nframes_t nframes)
2250 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2251 (*i)->set_block_size (nframes);
2256 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2258 _session.update_latency_compensation (false, false);
2262 Route::protect_automation ()
2264 switch (gain_automation_state()) {
2267 set_gain_automation_state (Off);
2273 switch (panner().automation_state ()) {
2276 panner().set_automation_state (Off);
2282 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2283 boost::shared_ptr<PluginInsert> pi;
2284 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2285 pi->protect_automation ();
2291 Route::set_pending_declick (int declick)
2294 /* this call is not allowed to turn off a pending declick unless "force" is true */
2296 _pending_declick = declick;
2298 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2300 _pending_declick = 0;