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>
27 #include <ardour/timestamps.h>
28 #include <ardour/audioengine.h>
29 #include <ardour/route.h>
30 #include <ardour/insert.h>
31 #include <ardour/send.h>
32 #include <ardour/session.h>
33 #include <ardour/utils.h>
34 #include <ardour/configuration.h>
35 #include <ardour/cycle_timer.h>
36 #include <ardour/route_group.h>
37 #include <ardour/port.h>
38 #include <ardour/ladspa_plugin.h>
39 #include <ardour/panner.h>
40 #include <ardour/dB.h>
41 #include <ardour/mix.h>
46 using namespace ARDOUR;
47 //using namespace sigc;
50 uint32_t Route::order_key_cnt = 0;
53 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg)
54 : IO (sess, name, input_min, input_max, output_min, output_max),
56 _midi_solo_control (*this, MIDIToggleControl::SoloControl, _session.midi_port()),
57 _midi_mute_control (*this, MIDIToggleControl::MuteControl, _session.midi_port())
62 Route::Route (Session& sess, const XMLNode& node)
64 _midi_solo_control (*this, MIDIToggleControl::SoloControl, _session.midi_port()),
65 _midi_mute_control (*this, MIDIToggleControl::MuteControl, _session.midi_port())
74 redirect_max_outs = 0;
78 _phase_invert = false;
79 order_keys[N_("signal")] = order_key_cnt++;
82 _meter_point = MeterPostFader;
86 _have_internal_generator = false;
88 _pending_declick = true;
89 _remote_control_id = 0;
94 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
95 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
96 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
97 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
100 desired_solo_gain = 1.0;
102 desired_mute_gain = 1.0;
106 input_changed.connect (mem_fun (this, &Route::input_change_handler));
107 output_changed.connect (mem_fun (this, &Route::output_change_handler));
109 reset_midi_control (_session.midi_port(), _session.get_midi_control());
114 GoingAway (); /* EMIT SIGNAL */
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 jack_nframes_t start_frame, jack_nframes_t end_frame,
220 jack_nframes_t nframes, jack_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;
232 bool no_monitor = (Config->get_use_hardware_monitoring() || !Config->get_use_sw_monitoring ());
233 gain_t* gab = _session.gain_automation_buffer();
235 declick = _pending_declick;
238 TentativeLockMonitor cm (control_outs_lock, __LINE__, __FILE__);
248 TentativeLockMonitor dm (declick_lock, __LINE__, __FILE__);
251 dmg = desired_mute_gain;
252 dsg = desired_solo_gain;
261 /* ----------------------------------------------------------------------------------------------------
262 GLOBAL DECLICK (for transport changes etc.)
263 -------------------------------------------------------------------------------------------------- */
266 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, _phase_invert);
267 _pending_declick = 0;
268 } else if (declick < 0) {
269 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, _phase_invert);
270 _pending_declick = 0;
273 /* no global declick */
275 if (solo_gain != dsg) {
276 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, _phase_invert);
282 /* ----------------------------------------------------------------------------------------------------
283 INPUT METERING & MONITORING
284 -------------------------------------------------------------------------------------------------- */
286 if (meter && (_meter_point == MeterInput)) {
287 for (n = 0; n < nbufs; ++n) {
288 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
292 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
293 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
295 mute_declick_applied = true;
298 if ((_meter_point == MeterInput) && co) {
300 solo_audible = dsg > 0;
301 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
303 if ( // muted by solo of another track
307 // muted by mute of this track
311 // rec-enabled but not s/w monitoring
313 // TODO: this is probably wrong
315 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
319 co->silence (nframes, offset);
323 co->deliver_output (bufs, nbufs, nframes, offset);
328 /* ----------------------------------------------------------------------------------------------------
330 -------------------------------------------------------------------------------------------------- */
332 if (with_redirects) {
333 TentativeRWLockMonitor rm (redirect_lock, false, __LINE__, __FILE__);
335 if (mute_gain > 0 || !_mute_affects_pre_fader) {
336 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
337 switch ((*i)->placement()) {
339 (*i)->run (bufs, nbufs, nframes, offset);
342 post_fader_work = true;
347 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
348 switch ((*i)->placement()) {
350 (*i)->silence (nframes, offset);
353 post_fader_work = true;
362 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
363 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
365 mute_declick_applied = true;
368 /* ----------------------------------------------------------------------------------------------------
369 PRE-FADER METERING & MONITORING
370 -------------------------------------------------------------------------------------------------- */
372 if (meter && (_meter_point == MeterPreFader)) {
373 for (n = 0; n < nbufs; ++n) {
374 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
379 if ((_meter_point == MeterPreFader) && co) {
381 solo_audible = dsg > 0;
382 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
384 if ( // muted by solo of another track
388 // muted by mute of this track
392 // rec-enabled but not s/w monitoring
394 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
398 co->silence (nframes, offset);
402 co->deliver_output (bufs, nbufs, nframes, offset);
407 /* ----------------------------------------------------------------------------------------------------
409 -------------------------------------------------------------------------------------------------- */
411 /* if not recording or recording and requiring any monitor signal, then apply gain */
413 if ( // not recording
415 !(record_enabled() && _session.actively_recording()) ||
419 // h/w monitoring not in use
421 (!Config->get_use_hardware_monitoring() &&
423 // AND software monitoring required
425 Config->get_use_sw_monitoring())) {
427 if (apply_gain_automation) {
430 for (n = 0; n < nbufs; ++n) {
431 Sample *sp = bufs[n];
433 for (jack_nframes_t nx = 0; nx < nframes; ++nx) {
438 for (n = 0; n < nbufs; ++n) {
439 Sample *sp = bufs[n];
441 for (jack_nframes_t nx = 0; nx < nframes; ++nx) {
447 if (apply_gain_automation && _session.transport_rolling()) {
448 _effective_gain = gab[nframes-1];
453 /* manual (scalar) gain */
457 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
460 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
462 /* no need to interpolate current gain value,
463 but its non-unity, so apply it. if the gain
464 is zero, do nothing because we'll ship silence
476 for (n = 0; n < nbufs; ++n) {
477 Sample *sp = bufs[n];
478 apply_gain_to_buffer(sp,nframes,this_gain);
481 } else if (_gain == 0) {
482 for (n = 0; n < nbufs; ++n) {
483 memset (bufs[n], 0, sizeof (Sample) * nframes);
490 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
494 /* ----------------------------------------------------------------------------------------------------
496 -------------------------------------------------------------------------------------------------- */
498 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
500 if (post_fader_work) {
502 TentativeRWLockMonitor rm (redirect_lock, false, __LINE__, __FILE__);
504 if (mute_gain > 0 || !_mute_affects_post_fader) {
505 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
506 switch ((*i)->placement()) {
510 (*i)->run (bufs, nbufs, nframes, offset);
515 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
516 switch ((*i)->placement()) {
520 (*i)->silence (nframes, offset);
528 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
529 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
531 mute_declick_applied = true;
534 /* ----------------------------------------------------------------------------------------------------
536 -------------------------------------------------------------------------------------------------- */
538 if ((_meter_point == MeterPostFader) && co) {
540 solo_audible = solo_gain > 0;
541 mute_audible = dmg > 0 || !_mute_affects_control_outs;
543 if ( // silent anyway
545 (_gain == 0 && !apply_gain_automation) ||
547 // muted by solo of another track
551 // muted by mute of this track
555 // recording but not s/w monitoring
557 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
561 co->silence (nframes, offset);
565 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
569 /* ----------------------------------------------------------------------
571 ----------------------------------------------------------------------*/
573 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
574 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
576 mute_declick_applied = true;
579 /* ----------------------------------------------------------------------------------------------------
581 -------------------------------------------------------------------------------------------------- */
583 solo_audible = dsg > 0;
584 mute_audible = dmg > 0 || !_mute_affects_main_outs;
586 if (n_outputs() == 0) {
590 } else if (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording())) {
592 IO::silence (nframes, offset);
596 if ( // silent anyway
598 (_gain == 0 && !apply_gain_automation) ||
600 // muted by solo of another track, but not using control outs for solo
602 (!solo_audible && (_session.solo_model() != Session::SoloBus)) ||
604 // muted by mute of this track
610 /* don't use Route::silence() here, because that causes
611 all outputs (sends, port inserts, etc. to be silent).
614 if (_meter_point == MeterPostFader) {
615 reset_peak_meters ();
618 IO::silence (nframes, offset);
622 if (_session.transport_speed() > 1.5f || _session.transport_speed() < -1.5f) {
623 pan (bufs, nbufs, nframes, offset, speed_quietning);
625 if (!_panner->empty() &&
626 (_panner->automation_state() & Play ||
627 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
628 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
630 pan (bufs, nbufs, nframes, offset, 1.0);
637 /* ----------------------------------------------------------------------------------------------------
639 -------------------------------------------------------------------------------------------------- */
641 if (meter && (_meter_point == MeterPostFader)) {
642 // cerr << "meter post" << endl;
644 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
645 uint32_t no = n_outputs();
646 for (n = 0; n < no; ++n) {
650 uint32_t no = n_outputs();
651 for (n = 0; n < no; ++n) {
652 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
659 Route::n_process_buffers ()
661 return max (n_inputs(), redirect_max_outs);
666 Route::passthru (jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t nframes, jack_nframes_t offset, int declick, bool meter_first)
668 vector<Sample*>& bufs = _session.get_passthru_buffers();
669 uint32_t limit = n_process_buffers ();
673 collect_input (bufs, limit, nframes, offset);
675 #define meter_stream meter_first
678 for (uint32_t n = 0; n < limit; ++n) {
679 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
681 meter_stream = false;
686 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
692 Route::set_phase_invert (bool yn, void *src)
694 if (_phase_invert != yn) {
697 // phase_invert_changed (src); /* EMIT SIGNAL */
701 Route::set_solo (bool yn, void *src)
707 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
708 _mix_group->apply (&Route::set_solo, yn, _mix_group);
714 solo_changed (src); /* EMIT SIGNAL */
716 if (_session.get_midi_feedback()) {
717 _midi_solo_control.send_feedback (_soloed);
723 Route::set_solo_mute (bool yn)
725 LockMonitor lm (declick_lock, __LINE__, __FILE__);
727 /* Called by Session in response to another Route being soloed.
730 desired_solo_gain = (yn?0.0:1.0);
734 Route::set_solo_safe (bool yn, void *src)
736 if (_solo_safe != yn) {
738 solo_safe_changed (src); /* EMIT SIGNAL */
743 Route::set_mute (bool yn, void *src)
746 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
747 _mix_group->apply (&Route::set_mute, yn, _mix_group);
753 mute_changed (src); /* EMIT SIGNAL */
755 if (_session.get_midi_feedback()) {
756 _midi_mute_control.send_feedback (_muted);
759 LockMonitor lm (declick_lock, __LINE__, __FILE__);
760 desired_mute_gain = (yn?0.0f:1.0f);
765 Route::add_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
767 uint32_t old_rmo = redirect_max_outs;
769 if (!_session.engine().connected()) {
774 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
779 uint32_t potential_max_streams = 0;
781 if ((pi = dynamic_cast<PluginInsert*>(redirect)) != 0) {
784 if (pi->input_streams() == 0) {
785 /* instrument plugin */
786 _have_internal_generator = true;
789 potential_max_streams = max(pi->input_streams(), pi->output_streams());
791 } else if ((porti = dynamic_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?
805 porti->ensure_io (n_outputs (), n_inputs(), false, this);
808 // Ensure peak vector sizes before the plugin is activated
809 while (_peak_power.size() < potential_max_streams) {
810 _peak_power.push_back(0);
812 while (_stored_peak_power.size() < potential_max_streams) {
813 _stored_peak_power.push_back(0);
816 _redirects.push_back (redirect);
818 if (_reset_plugin_counts (err_streams)) {
819 _redirects.pop_back ();
820 _reset_plugin_counts (0); // it worked before we tried to add it ...
824 redirect->activate ();
825 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
828 if (redirect_max_outs != old_rmo || old_rmo == 0) {
833 redirects_changed (src); /* EMIT SIGNAL */
838 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
840 uint32_t old_rmo = redirect_max_outs;
842 if (!_session.engine().connected()) {
847 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
849 RedirectList::iterator existing_end = _redirects.end();
852 uint32_t potential_max_streams = 0;
854 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
858 if ((pi = dynamic_cast<PluginInsert*>(*i)) != 0) {
861 uint32_t m = max(pi->input_streams(), pi->output_streams());
862 if (m > potential_max_streams)
863 potential_max_streams = m;
866 // Ensure peak vector sizes before the plugin is activated
867 while (_peak_power.size() < potential_max_streams) {
868 _peak_power.push_back(0);
870 while (_stored_peak_power.size() < potential_max_streams) {
871 _stored_peak_power.push_back(0);
874 _redirects.push_back (*i);
876 if (_reset_plugin_counts (err_streams)) {
878 _redirects.erase (existing_end, _redirects.end());
879 _reset_plugin_counts (0); // it worked before we tried to add it ...
884 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
888 if (redirect_max_outs != old_rmo || old_rmo == 0) {
892 redirects_changed (src); /* EMIT SIGNAL */
897 Route::clear_redirects (void *src)
899 uint32_t old_rmo = redirect_max_outs;
901 if (!_session.engine().connected()) {
906 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
908 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
915 if (redirect_max_outs != old_rmo) {
919 redirect_max_outs = 0;
920 _have_internal_generator = false;
921 redirects_changed (src); /* EMIT SIGNAL */
925 Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
927 uint32_t old_rmo = redirect_max_outs;
929 if (!_session.engine().connected()) {
933 redirect_max_outs = 0;
936 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
937 RedirectList::iterator i;
938 bool removed = false;
940 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
941 if (*i == redirect) {
943 RedirectList::iterator tmp;
945 /* move along, see failure case for reset_plugin_counts()
946 where we may need to reinsert the redirect.
952 /* stop redirects that send signals to JACK ports
953 from causing noise as a result of no longer being
958 PortInsert* port_insert;
960 if ((send = dynamic_cast<Send*> (*i)) != 0) {
961 send->disconnect_inputs (this);
962 send->disconnect_outputs (this);
963 } else if ((port_insert = dynamic_cast<PortInsert*> (*i)) != 0) {
964 port_insert->disconnect_inputs (this);
965 port_insert->disconnect_outputs (this);
968 _redirects.erase (i);
981 if (_reset_plugin_counts (err_streams)) {
982 /* get back to where we where */
983 _redirects.insert (i, redirect);
984 /* we know this will work, because it worked before :) */
985 _reset_plugin_counts (0);
991 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
994 if ((pi = dynamic_cast<PluginInsert*>(*i)) != 0) {
995 if (pi->is_generator()) {
1001 _have_internal_generator = foo;
1004 if (old_rmo != redirect_max_outs) {
1008 redirects_changed (src); /* EMIT SIGNAL */
1013 Route::reset_plugin_counts (uint32_t* lpc)
1015 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
1016 return _reset_plugin_counts (lpc);
1021 Route::_reset_plugin_counts (uint32_t* err_streams)
1023 RedirectList::iterator r;
1026 map<Placement,list<InsertCount> > insert_map;
1027 jack_nframes_t initial_streams;
1029 redirect_max_outs = 0;
1033 /* divide inserts up by placement so we get the signal flow
1034 properly modelled. we need to do this because the _redirects
1035 list is not sorted by placement, and because other reasons may
1036 exist now or in the future for this separate treatment.
1039 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1043 /* do this here in case we bomb out before we get to the end of
1047 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1049 if ((insert = dynamic_cast<Insert*>(*r)) != 0) {
1051 insert_map[insert->placement()].push_back (InsertCount (*insert));
1053 /* reset plugin counts back to one for now so
1054 that we have a predictable, controlled
1055 state to try to configure.
1060 if ((pi = dynamic_cast<PluginInsert*>(insert)) != 0) {
1064 } else if (dynamic_cast<Send*> (*r) != 0) {
1077 /* Now process each placement in order, checking to see if we
1078 can really do what has been requested.
1083 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1087 /* figure out the streams that will feed into PreFader */
1089 if (!insert_map[PreFader].empty()) {
1090 InsertCount& ic (insert_map[PreFader].back());
1091 initial_streams = ic.insert.compute_output_streams (ic.cnt);
1093 initial_streams = n_inputs ();
1098 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1102 /* OK, everything can be set up correctly, so lets do it */
1104 apply_some_plugin_counts (insert_map[PreFader]);
1105 apply_some_plugin_counts (insert_map[PostFader]);
1107 /* recompute max outs of any redirect */
1111 redirect_max_outs = 0;
1112 RedirectList::iterator prev = _redirects.end();
1114 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1117 if ((s = dynamic_cast<Send*> (*r)) != 0) {
1118 if (r == _redirects.begin()) {
1119 s->expect_inputs (n_inputs());
1121 s->expect_inputs ((*prev)->output_streams());
1125 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1134 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1136 list<InsertCount>::iterator i;
1138 for (i = iclist.begin(); i != iclist.end(); ++i) {
1140 if ((*i).insert.configure_io ((*i).cnt, (*i).in, (*i).out)) {
1143 /* make sure that however many we have, they are all active */
1144 (*i).insert.activate ();
1151 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1153 list<InsertCount>::iterator i;
1155 for (i = iclist.begin(); i != iclist.end(); ++i) {
1157 if (((*i).cnt = (*i).insert.can_support_input_configuration (required_inputs)) < 0) {
1159 *err_streams = required_inputs;
1164 (*i).in = required_inputs;
1165 (*i).out = (*i).insert.compute_output_streams ((*i).cnt);
1167 required_inputs = (*i).out;
1174 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1176 uint32_t old_rmo = redirect_max_outs;
1182 RedirectList to_be_deleted;
1185 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
1186 RedirectList::iterator tmp;
1187 RedirectList the_copy;
1189 the_copy = _redirects;
1191 /* remove all relevant redirects */
1193 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1197 if ((*i)->placement() == placement) {
1198 to_be_deleted.push_back (*i);
1199 _redirects.erase (i);
1205 /* now copy the relevant ones from "other" */
1207 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1208 if ((*i)->placement() == placement) {
1209 _redirects.push_back (Redirect::clone (**i));
1213 /* reset plugin stream handling */
1215 if (_reset_plugin_counts (err_streams)) {
1217 /* FAILED COPY ATTEMPT: we have to restore order */
1219 /* delete all cloned redirects */
1221 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1226 if ((*i)->placement() == placement) {
1228 _redirects.erase (i);
1234 /* restore the natural order */
1236 _redirects = the_copy;
1237 redirect_max_outs = old_rmo;
1239 /* we failed, even though things are OK again */
1245 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1247 for (RedirectList::iterator i = to_be_deleted.begin(); i != to_be_deleted.end(); ++i) {
1253 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1257 redirects_changed (this); /* EMIT SIGNAL */
1262 Route::all_redirects_flip ()
1264 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1266 if (_redirects.empty()) {
1270 bool first_is_on = _redirects.front()->active();
1272 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1273 (*i)->set_active (!first_is_on, this);
1278 Route::all_redirects_active (bool state)
1280 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1282 if (_redirects.empty()) {
1286 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1287 (*i)->set_active (state, this);
1291 struct RedirectSorter {
1292 bool operator() (const Redirect *a, const Redirect *b) {
1293 return a->sort_key() < b->sort_key();
1298 Route::sort_redirects (uint32_t* err_streams)
1301 RedirectSorter comparator;
1302 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
1303 uint32_t old_rmo = redirect_max_outs;
1305 /* the sweet power of C++ ... */
1307 RedirectList as_it_was_before = _redirects;
1309 _redirects.sort (comparator);
1311 if (_reset_plugin_counts (err_streams)) {
1312 _redirects = as_it_was_before;
1313 redirect_max_outs = old_rmo;
1319 redirects_changed (this); /* EMIT SIGNAL */
1331 Route::get_template()
1333 return state(false);
1337 Route::state(bool full_state)
1339 XMLNode *node = new XMLNode("Route");
1341 RedirectList:: iterator i;
1345 snprintf (buf, sizeof (buf), "0x%x", _flags);
1346 node->add_property("flags", buf);
1348 node->add_property("active", _active?"yes":"no");
1349 node->add_property("muted", _muted?"yes":"no");
1350 node->add_property("soloed", _soloed?"yes":"no");
1351 node->add_property("phase-invert", _phase_invert?"yes":"no");
1352 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1353 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1354 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1355 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1358 node->add_property("edit-group", _edit_group->name());
1361 node->add_property("mix-group", _mix_group->name());
1366 MIDI::channel_t chn;
1368 MIDI::byte additional;
1369 XMLNode* midi_node = 0;
1372 midi_node = node->add_child ("MIDI");
1374 if (_midi_mute_control.get_control_info (chn, ev, additional)) {
1375 child = midi_node->add_child ("mute");
1376 set_midi_node_info (child, ev, chn, additional);
1378 if (_midi_solo_control.get_control_info (chn, ev, additional)) {
1379 child = midi_node->add_child ("solo");
1380 set_midi_node_info (child, ev, chn, additional);
1384 string order_string;
1385 OrderKeys::iterator x = order_keys.begin();
1387 while (x != order_keys.end()) {
1388 order_string += (*x).first;
1389 order_string += '=';
1390 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1391 order_string += buf;
1395 if (x == order_keys.end()) {
1399 order_string += ':';
1401 node->add_property ("order-keys", order_string);
1403 node->add_child_nocopy (IO::state (full_state));
1405 if (_control_outs) {
1406 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1407 cnode->add_child_nocopy (_control_outs->state (full_state));
1408 node->add_child_nocopy (*cnode);
1411 if (_comment.length()) {
1412 XMLNode *cmt = node->add_child ("Comment");
1413 cmt->add_content (_comment);
1419 path = _session.snap_name();
1421 path += legalize_for_path (_name);
1422 path += ".automation";
1424 /* XXX we didn't ask for a state save, we asked for the current state.
1428 if (save_automation (path)) {
1429 error << _("Could not get state of route. Problem with save_automation") << endmsg;
1432 aevents = node->add_child ("Automation");
1433 aevents->add_property ("path", path);
1436 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1437 node->add_child_nocopy((*i)->state (full_state));
1441 node->add_child_copy (*_extra_xml);
1448 Route::set_deferred_state ()
1451 XMLNodeConstIterator niter;
1453 if (!deferred_state) {
1457 nlist = deferred_state->children();
1459 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1460 add_redirect_from_xml (**niter);
1463 delete deferred_state;
1468 Route::add_redirect_from_xml (const XMLNode& node)
1470 const XMLProperty *prop;
1474 if (node.name() == "Send") {
1477 send = new Send (_session, node);
1480 catch (failed_constructor &err) {
1481 error << _("Send construction failed") << endmsg;
1485 add_redirect (send, this);
1487 } else if (node.name() == "Insert") {
1490 if ((prop = node.property ("type")) != 0) {
1492 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1494 insert = new PluginInsert(_session, node);
1496 } else if (prop->value() == "port") {
1499 insert = new PortInsert (_session, node);
1503 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1506 add_redirect (insert, this);
1509 error << _("Insert XML node has no type property") << endmsg;
1513 catch (failed_constructor &err) {
1514 warning << _("insert could not be created. Ignored.") << endmsg;
1521 Route::set_state (const XMLNode& node)
1524 XMLNodeConstIterator niter;
1526 XMLPropertyList plist;
1527 const XMLProperty *prop;
1528 XMLNodeList midi_kids;
1531 if (node.name() != "Route"){
1532 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1536 if ((prop = node.property ("flags")) != 0) {
1538 sscanf (prop->value().c_str(), "0x%x", &x);
1544 if ((prop = node.property ("phase-invert")) != 0) {
1545 set_phase_invert(prop->value()=="yes"?true:false, this);
1548 if ((prop = node.property ("active")) != 0) {
1549 set_active (prop->value() == "yes");
1552 if ((prop = node.property ("muted")) != 0) {
1553 bool yn = prop->value()=="yes"?true:false;
1555 /* force reset of mute status */
1559 mute_gain = desired_mute_gain;
1562 if ((prop = node.property ("soloed")) != 0) {
1563 bool yn = prop->value()=="yes"?true:false;
1565 /* force reset of solo status */
1568 set_solo (yn, this);
1569 solo_gain = desired_solo_gain;
1572 if ((prop = node.property ("mute-affects-pre-fader")) != 0) {
1573 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1576 if ((prop = node.property ("mute-affects-post-fader")) != 0) {
1577 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1580 if ((prop = node.property ("mute-affects-control-outs")) != 0) {
1581 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1584 if ((prop = node.property ("mute-affects-main-outs")) != 0) {
1585 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1588 if ((prop = node.property ("edit-group")) != 0) {
1589 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1590 if(edit_group == 0) {
1591 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1593 set_edit_group(edit_group, this);
1597 if ((prop = node.property ("order-keys")) != 0) {
1601 string::size_type colon, equal;
1602 string remaining = prop->value();
1604 while (remaining.length()) {
1606 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1607 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1610 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1611 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1614 set_order_key (remaining.substr (0, equal), n);
1618 colon = remaining.find_first_of (':');
1620 if (colon != string::npos) {
1621 remaining = remaining.substr (colon+1);
1628 nlist = node.children();
1630 if (deferred_state) {
1631 delete deferred_state;
1634 deferred_state = new XMLNode("deferred state");
1636 /* set parent class properties before anything else */
1638 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1642 if (child->name() == IO::state_node_name) {
1644 IO::set_state (*child);
1649 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1653 if (child->name() == "Send") {
1656 if (!IO::ports_legal) {
1658 deferred_state->add_child_copy (*child);
1661 add_redirect_from_xml (*child);
1664 } else if (child->name() == "Insert") {
1666 if (!IO::ports_legal) {
1668 deferred_state->add_child_copy (*child);
1672 add_redirect_from_xml (*child);
1675 } else if (child->name() == "Automation") {
1677 XMLPropertyList plist;
1678 XMLPropertyConstIterator piter;
1681 plist = child->properties();
1682 for (piter = plist.begin(); piter != plist.end(); ++piter) {
1684 if (prop->name() == "path") {
1685 load_automation (prop->value());
1689 } else if (child->name() == "ControlOuts") {
1691 string coutname = _name;
1692 coutname += _("[control]");
1694 _control_outs = new IO (_session, coutname);
1695 _control_outs->set_state (**(child->children().begin()));
1697 } else if (child->name() == "Comment") {
1699 /* XXX this is a terrible API design in libxml++ */
1701 XMLNode *cmt = *(child->children().begin());
1702 _comment = cmt->content();
1704 } else if (child->name() == "extra") {
1705 _extra_xml = new XMLNode (*child);
1709 if ((prop = node.property ("mix-group")) != 0) {
1710 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1711 if (mix_group == 0) {
1712 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1714 set_mix_group(mix_group, this);
1718 midi_kids = node.children ("MIDI");
1720 for (niter = midi_kids.begin(); niter != midi_kids.end(); ++niter) {
1723 XMLNodeConstIterator miter;
1726 kids = (*niter)->children ();
1728 for (miter = kids.begin(); miter != kids.end(); ++miter) {
1732 MIDI::eventType ev = MIDI::on; /* initialize to keep gcc happy */
1733 MIDI::byte additional = 0; /* ditto */
1734 MIDI::channel_t chn = 0; /* ditto */
1736 if (child->name() == "mute") {
1738 if (get_midi_node_info (child, ev, chn, additional)) {
1739 _midi_mute_control.set_control_type (chn, ev, additional);
1741 error << string_compose(_("MIDI mute control specification for %1 is incomplete, so it has been ignored"), _name) << endmsg;
1744 else if (child->name() == "solo") {
1746 if (get_midi_node_info (child, ev, chn, additional)) {
1747 _midi_solo_control.set_control_type (chn, ev, additional);
1749 error << string_compose(_("MIDI mute control specification for %1 is incomplete, so it has been ignored"), _name) << endmsg;
1761 Route::curve_reallocate ()
1763 // _gain_automation_curve.finish_resize ();
1764 // _pan_automation_curve.finish_resize ();
1768 Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
1772 // reset_peak_meters ();
1774 IO::silence (nframes, offset);
1776 if (_control_outs) {
1777 _control_outs->silence (nframes, offset);
1781 TentativeRWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1784 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1786 if (!_active && (pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
1787 // skip plugins, they don't need anything when we're not active
1791 (*i)->silence (nframes, offset);
1794 if (nframes == _session.get_block_size() && offset == 0) {
1804 Route::set_control_outs (const vector<string>& ports)
1806 LockMonitor lm (control_outs_lock, __LINE__, __FILE__);
1807 vector<string>::const_iterator i;
1809 if (_control_outs) {
1810 delete _control_outs;
1814 if (ports.empty()) {
1818 string coutname = _name;
1819 coutname += _("[control]");
1821 _control_outs = new IO (_session, coutname);
1823 /* our control outs need as many outputs as we
1824 have outputs. we track the changes in ::output_change_handler().
1827 _control_outs->ensure_io (0, n_outputs(), true, this);
1833 Route::set_edit_group (RouteGroup *eg, void *src)
1837 _edit_group->remove (this);
1840 if ((_edit_group = eg)) {
1841 _edit_group->add (this);
1844 _session.set_dirty ();
1846 edit_group_changed (src); /* EMIT SIGNAL */
1850 Route::set_mix_group (RouteGroup *mg, void *src)
1854 _mix_group->remove (this);
1857 if ((_mix_group = mg)) {
1858 _mix_group->add (this);
1861 _session.set_dirty ();
1863 mix_group_changed (src); /* EMIT SIGNAL */
1867 Route::set_comment (string cmt, void *src)
1870 comment_changed (src);
1871 _session.set_dirty ();
1875 Route::feeds (Route *o)
1881 uint32_t no = self.n_outputs();
1882 uint32_t ni = other.n_inputs ();
1884 for (i = 0; i < no; ++i) {
1885 for (j = 0; j < ni; ++j) {
1886 if (self.output(i)->connected_to (other.input(j)->name())) {
1892 /* check Redirects which may also interconnect Routes */
1894 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1896 no = (*r)->n_outputs();
1898 for (i = 0; i < no; ++i) {
1899 for (j = 0; j < ni; ++j) {
1900 if ((*r)->output(i)->connected_to (other.input (j)->name())) {
1907 /* check for control room outputs which may also interconnect Routes */
1909 if (_control_outs) {
1911 no = _control_outs->n_outputs();
1913 for (i = 0; i < no; ++i) {
1914 for (j = 0; j < ni; ++j) {
1915 if (_control_outs->output(i)->connected_to (other.input (j)->name())) {
1926 Route::set_mute_config (mute_type t, bool onoff, void *src)
1930 _mute_affects_pre_fader = onoff;
1931 pre_fader_changed(src); /* EMIT SIGNAL */
1935 _mute_affects_post_fader = onoff;
1936 post_fader_changed(src); /* EMIT SIGNAL */
1940 _mute_affects_control_outs = onoff;
1941 control_outs_changed(src); /* EMIT SIGNAL */
1945 _mute_affects_main_outs = onoff;
1946 main_outs_changed(src); /* EMIT SIGNAL */
1952 Route::get_mute_config (mute_type t)
1958 onoff = _mute_affects_pre_fader;
1961 onoff = _mute_affects_post_fader;
1964 onoff = _mute_affects_control_outs;
1967 onoff = _mute_affects_main_outs;
1975 Route::set_active (bool yn)
1978 active_changed(); /* EMIT SIGNAL */
1982 Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
1984 jack_nframes_t now = _session.transport_frame();
1987 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1990 automation_snapshot (now);
1993 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1995 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
1996 (*i)->deactivate ();
2000 (*i)->transport_stopped (now);
2004 IO::transport_stopped (now);
2006 _roll_delay = _initial_delay;
2010 Route::get_memento() const
2012 void (Route::*pmf)(state_id_t) = &Route::set_state;
2013 return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id);
2017 Route::set_state (state_id_t id)
2023 Route::input_change_handler (IOChange change, void *ignored)
2025 if (change & ConfigurationChanged) {
2026 reset_plugin_counts (0);
2031 Route::output_change_handler (IOChange change, void *ignored)
2033 if (change & ConfigurationChanged) {
2034 if (_control_outs) {
2035 _control_outs->ensure_io (0, n_outputs(), true, this);
2038 reset_plugin_counts (0);
2043 Route::pans_required () const
2045 if (n_outputs() < 2) {
2049 return max (n_inputs (), redirect_max_outs);
2053 Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2054 bool session_state_changing, bool can_record, bool rec_monitors_input)
2056 if (n_outputs() == 0) {
2060 if (session_state_changing || !_active) {
2061 silence (nframes, offset);
2065 apply_gain_automation = false;
2068 passthru (start_frame, end_frame, nframes, offset, 0, false);
2070 silence (nframes, offset);
2077 Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack_nframes_t& transport_frame)
2079 if (_roll_delay > nframes) {
2081 _roll_delay -= nframes;
2082 silence (nframes, offset);
2083 /* transport frame is not legal for caller to use */
2086 } else if (_roll_delay > 0) {
2088 nframes -= _roll_delay;
2090 silence (_roll_delay, offset);
2092 offset += _roll_delay;
2093 transport_frame += _roll_delay;
2102 Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, int declick,
2103 bool can_record, bool rec_monitors_input)
2106 TentativeRWLockMonitor lm(redirect_lock, false, __LINE__, __FILE__);
2108 // automation snapshot can also be called from the non-rt context
2109 // and it uses the redirect list, so we take the lock out here
2110 automation_snapshot (_session.transport_frame());
2114 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2115 silence (nframes, offset);
2119 jack_nframes_t unused = 0;
2121 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2127 apply_gain_automation = false;
2130 TentativeLockMonitor am (automation_lock, __LINE__, __FILE__);
2132 if (am.locked() && _session.transport_rolling()) {
2134 jack_nframes_t start_frame = end_frame - nframes;
2136 if (gain_automation_playback()) {
2137 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2142 passthru (start_frame, end_frame, nframes, offset, declick, false);
2148 Route::silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2149 bool can_record, bool rec_monitors_input)
2151 silence (nframes, offset);
2156 Route::toggle_monitor_input ()
2158 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2159 (*i)->request_monitor_input(!(*i)->monitoring_input());
2164 Route::has_external_redirects () const
2166 const PortInsert* pi;
2168 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2169 if ((pi = dynamic_cast<const PortInsert*>(*i)) != 0) {
2171 uint32_t no = pi->n_outputs();
2173 for (uint32_t n = 0; n < no; ++n) {
2175 string port_name = pi->output(n)->name();
2176 string client_name = port_name.substr (0, port_name.find(':'));
2178 /* only say "yes" if the redirect is actually in use */
2180 if (client_name != "ardour" && pi->active()) {
2191 Route::reset_midi_control (MIDI::Port* port, bool on)
2193 MIDI::channel_t chn;
2197 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2198 (*i)->reset_midi_control (port, on);
2201 IO::reset_midi_control (port, on);
2203 _midi_solo_control.get_control_info (chn, ev, extra);
2207 _midi_solo_control.midi_rebind (port, chn);
2209 _midi_mute_control.get_control_info (chn, ev, extra);
2213 _midi_mute_control.midi_rebind (port, chn);
2217 Route::send_all_midi_feedback ()
2219 if (_session.get_midi_feedback()) {
2222 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2223 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2224 (*i)->send_all_midi_feedback ();
2228 IO::send_all_midi_feedback();
2230 _midi_solo_control.send_feedback (_soloed);
2231 _midi_mute_control.send_feedback (_muted);
2236 Route::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize)
2238 buf = _midi_solo_control.write_feedback (buf, bufsize, _soloed);
2239 buf = _midi_mute_control.write_feedback (buf, bufsize, _muted);
2242 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2243 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2244 buf = (*i)->write_midi_feedback (buf, bufsize);
2248 return IO::write_midi_feedback (buf, bufsize);
2252 Route::flush_redirects ()
2254 /* XXX shouldn't really try to take this lock, since
2255 this is called from the RT audio thread.
2258 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2260 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2261 (*i)->deactivate ();
2267 Route::set_meter_point (MeterPoint p, void *src)
2269 if (_meter_point != p) {
2271 meter_change (src); /* EMIT SIGNAL */
2272 _session.set_dirty ();
2277 Route::update_total_latency ()
2281 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2282 if ((*i)->active ()) {
2283 _own_latency += (*i)->latency ();
2287 set_port_latency (_own_latency);
2289 /* this (virtual) function is used for pure Routes,
2290 not derived classes like AudioTrack. this means
2291 that the data processed here comes from an input
2292 port, not prerecorded material, and therefore we
2293 have to take into account any input latency.
2296 _own_latency += input_latency ();
2298 return _own_latency;
2302 Route::set_latency_delay (jack_nframes_t longest_session_latency)
2304 _initial_delay = longest_session_latency - _own_latency;
2306 if (_session.transport_stopped()) {
2307 _roll_delay = _initial_delay;
2312 Route::automation_snapshot (jack_nframes_t now)
2314 IO::automation_snapshot (now);
2316 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2317 (*i)->automation_snapshot (now);
2321 Route::MIDIToggleControl::MIDIToggleControl (Route& s, ToggleType tp, MIDI::Port* port)
2322 : MIDI::Controllable (port, true), route (s), type(tp), setting(false)
2324 last_written = false; /* XXX need a good out-of-bound-value */
2328 Route::MIDIToggleControl::set_value (float val)
2331 MIDI::channel_t chn;
2332 MIDI::byte additional;
2334 get_control_info (chn, et, additional);
2338 #ifdef HOLD_TOGGLE_VALUES
2339 if (et == MIDI::off || et == MIDI::on) {
2341 /* literal toggle */
2345 route.set_mute (!route.muted(), this);
2348 route.set_solo (!route.soloed(), this);
2357 /* map full control range to a boolean */
2359 bool bval = ((val >= 0.5f) ? true: false);
2363 route.set_mute (bval, this);
2366 route.set_solo (bval, this);
2372 #ifdef HOLD_TOGGLE_VALUES
2380 Route::MIDIToggleControl::send_feedback (bool value)
2383 if (!setting && get_midi_feedback()) {
2384 MIDI::byte val = (MIDI::byte) (value ? 127: 0);
2385 MIDI::channel_t ch = 0;
2386 MIDI::eventType ev = MIDI::none;
2387 MIDI::byte additional = 0;
2388 MIDI::EventTwoBytes data;
2390 if (get_control_info (ch, ev, additional)) {
2391 data.controller_number = additional;
2393 last_written = value;
2395 route._session.send_midi_message (get_port(), ev, ch, data);
2402 Route::MIDIToggleControl::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool val, bool force)
2404 if (get_midi_feedback() && bufsize > 2) {
2405 MIDI::channel_t ch = 0;
2406 MIDI::eventType ev = MIDI::none;
2407 MIDI::byte additional = 0;
2409 if (get_control_info (ch, ev, additional)) {
2410 if (val != last_written || force) {
2411 *buf++ = (0xF0 & ev) | (0xF & ch);
2412 *buf++ = additional; /* controller number */
2413 *buf++ = (MIDI::byte) (val ? 127 : 0);
2424 Route::set_block_size (jack_nframes_t nframes)
2426 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2427 (*i)->set_block_size (nframes);
2432 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2434 _session.update_latency_compensation (false, false);
2438 Route::protect_automation ()
2440 switch (gain_automation_state()) {
2443 set_gain_automation_state (Off);
2449 switch (panner().automation_state ()) {
2452 panner().set_automation_state (Off);
2458 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2460 if ((pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
2461 pi->protect_automation ();
2467 Route::set_pending_declick (int declick)
2470 /* this call is not allowed to turn off a pending declick unless "force" is true */
2472 _pending_declick = declick;
2474 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2476 _pending_declick = 0;