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() && nframes > 0) {
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)
1836 if (eg == _edit_group) {
1841 _edit_group->remove (this);
1844 if ((_edit_group = eg) != 0) {
1845 _edit_group->add (this);
1848 _session.set_dirty ();
1849 edit_group_changed (src); /* EMIT SIGNAL */
1853 Route::drop_edit_group (void *src)
1856 _session.set_dirty ();
1857 edit_group_changed (src); /* EMIT SIGNAL */
1861 Route::set_mix_group (RouteGroup *mg, void *src)
1864 if (mg == _mix_group) {
1869 _mix_group->remove (this);
1872 if ((_mix_group = mg) != 0) {
1873 _mix_group->add (this);
1876 _session.set_dirty ();
1877 mix_group_changed (src); /* EMIT SIGNAL */
1881 Route::drop_mix_group (void *src)
1884 _session.set_dirty ();
1885 mix_group_changed (src); /* EMIT SIGNAL */
1889 Route::set_comment (string cmt, void *src)
1892 comment_changed (src);
1893 _session.set_dirty ();
1897 Route::feeds (Route *o)
1903 uint32_t no = self.n_outputs();
1904 uint32_t ni = other.n_inputs ();
1906 for (i = 0; i < no; ++i) {
1907 for (j = 0; j < ni; ++j) {
1908 if (self.output(i)->connected_to (other.input(j)->name())) {
1914 /* check Redirects which may also interconnect Routes */
1916 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1918 no = (*r)->n_outputs();
1920 for (i = 0; i < no; ++i) {
1921 for (j = 0; j < ni; ++j) {
1922 if ((*r)->output(i)->connected_to (other.input (j)->name())) {
1929 /* check for control room outputs which may also interconnect Routes */
1931 if (_control_outs) {
1933 no = _control_outs->n_outputs();
1935 for (i = 0; i < no; ++i) {
1936 for (j = 0; j < ni; ++j) {
1937 if (_control_outs->output(i)->connected_to (other.input (j)->name())) {
1948 Route::set_mute_config (mute_type t, bool onoff, void *src)
1952 _mute_affects_pre_fader = onoff;
1953 pre_fader_changed(src); /* EMIT SIGNAL */
1957 _mute_affects_post_fader = onoff;
1958 post_fader_changed(src); /* EMIT SIGNAL */
1962 _mute_affects_control_outs = onoff;
1963 control_outs_changed(src); /* EMIT SIGNAL */
1967 _mute_affects_main_outs = onoff;
1968 main_outs_changed(src); /* EMIT SIGNAL */
1974 Route::get_mute_config (mute_type t)
1980 onoff = _mute_affects_pre_fader;
1983 onoff = _mute_affects_post_fader;
1986 onoff = _mute_affects_control_outs;
1989 onoff = _mute_affects_main_outs;
1997 Route::set_active (bool yn)
2000 active_changed(); /* EMIT SIGNAL */
2004 Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2006 jack_nframes_t now = _session.transport_frame();
2009 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2012 automation_snapshot (now);
2015 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2017 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2018 (*i)->deactivate ();
2022 (*i)->transport_stopped (now);
2026 IO::transport_stopped (now);
2028 _roll_delay = _initial_delay;
2032 Route::get_memento() const
2034 void (Route::*pmf)(state_id_t) = &Route::set_state;
2035 return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id);
2039 Route::set_state (state_id_t id)
2045 Route::input_change_handler (IOChange change, void *ignored)
2047 if (change & ConfigurationChanged) {
2048 reset_plugin_counts (0);
2053 Route::output_change_handler (IOChange change, void *ignored)
2055 if (change & ConfigurationChanged) {
2056 if (_control_outs) {
2057 _control_outs->ensure_io (0, n_outputs(), true, this);
2060 reset_plugin_counts (0);
2065 Route::pans_required () const
2067 if (n_outputs() < 2) {
2071 return max (n_inputs (), redirect_max_outs);
2075 Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2076 bool session_state_changing, bool can_record, bool rec_monitors_input)
2078 if (n_outputs() == 0) {
2082 if (session_state_changing || !_active) {
2083 silence (nframes, offset);
2087 apply_gain_automation = false;
2090 passthru (start_frame, end_frame, nframes, offset, 0, false);
2092 silence (nframes, offset);
2099 Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack_nframes_t& transport_frame)
2101 if (_roll_delay > nframes) {
2103 _roll_delay -= nframes;
2104 silence (nframes, offset);
2105 /* transport frame is not legal for caller to use */
2108 } else if (_roll_delay > 0) {
2110 nframes -= _roll_delay;
2112 silence (_roll_delay, offset);
2114 offset += _roll_delay;
2115 transport_frame += _roll_delay;
2124 Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, int declick,
2125 bool can_record, bool rec_monitors_input)
2128 TentativeRWLockMonitor lm(redirect_lock, false, __LINE__, __FILE__);
2130 // automation snapshot can also be called from the non-rt context
2131 // and it uses the redirect list, so we take the lock out here
2132 automation_snapshot (_session.transport_frame());
2136 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2137 silence (nframes, offset);
2141 jack_nframes_t unused = 0;
2143 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2149 apply_gain_automation = false;
2152 TentativeLockMonitor am (automation_lock, __LINE__, __FILE__);
2154 if (am.locked() && _session.transport_rolling()) {
2156 jack_nframes_t start_frame = end_frame - nframes;
2158 if (gain_automation_playback()) {
2159 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2164 passthru (start_frame, end_frame, nframes, offset, declick, false);
2170 Route::silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2171 bool can_record, bool rec_monitors_input)
2173 silence (nframes, offset);
2178 Route::toggle_monitor_input ()
2180 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2181 (*i)->request_monitor_input(!(*i)->monitoring_input());
2186 Route::has_external_redirects () const
2188 const PortInsert* pi;
2190 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2191 if ((pi = dynamic_cast<const PortInsert*>(*i)) != 0) {
2193 uint32_t no = pi->n_outputs();
2195 for (uint32_t n = 0; n < no; ++n) {
2197 string port_name = pi->output(n)->name();
2198 string client_name = port_name.substr (0, port_name.find(':'));
2200 /* only say "yes" if the redirect is actually in use */
2202 if (client_name != "ardour" && pi->active()) {
2213 Route::reset_midi_control (MIDI::Port* port, bool on)
2215 MIDI::channel_t chn;
2219 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2220 (*i)->reset_midi_control (port, on);
2223 IO::reset_midi_control (port, on);
2225 _midi_solo_control.get_control_info (chn, ev, extra);
2229 _midi_solo_control.midi_rebind (port, chn);
2231 _midi_mute_control.get_control_info (chn, ev, extra);
2235 _midi_mute_control.midi_rebind (port, chn);
2239 Route::send_all_midi_feedback ()
2241 if (_session.get_midi_feedback()) {
2244 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2245 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2246 (*i)->send_all_midi_feedback ();
2250 IO::send_all_midi_feedback();
2252 _midi_solo_control.send_feedback (_soloed);
2253 _midi_mute_control.send_feedback (_muted);
2258 Route::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize)
2260 buf = _midi_solo_control.write_feedback (buf, bufsize, _soloed);
2261 buf = _midi_mute_control.write_feedback (buf, bufsize, _muted);
2264 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2265 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2266 buf = (*i)->write_midi_feedback (buf, bufsize);
2270 return IO::write_midi_feedback (buf, bufsize);
2274 Route::flush_redirects ()
2276 /* XXX shouldn't really try to take this lock, since
2277 this is called from the RT audio thread.
2280 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2282 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2283 (*i)->deactivate ();
2289 Route::set_meter_point (MeterPoint p, void *src)
2291 if (_meter_point != p) {
2293 meter_change (src); /* EMIT SIGNAL */
2294 _session.set_dirty ();
2299 Route::update_total_latency ()
2303 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2304 if ((*i)->active ()) {
2305 _own_latency += (*i)->latency ();
2309 set_port_latency (_own_latency);
2311 /* this (virtual) function is used for pure Routes,
2312 not derived classes like AudioTrack. this means
2313 that the data processed here comes from an input
2314 port, not prerecorded material, and therefore we
2315 have to take into account any input latency.
2318 _own_latency += input_latency ();
2320 return _own_latency;
2324 Route::set_latency_delay (jack_nframes_t longest_session_latency)
2326 _initial_delay = longest_session_latency - _own_latency;
2328 if (_session.transport_stopped()) {
2329 _roll_delay = _initial_delay;
2334 Route::automation_snapshot (jack_nframes_t now)
2336 IO::automation_snapshot (now);
2338 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2339 (*i)->automation_snapshot (now);
2343 Route::MIDIToggleControl::MIDIToggleControl (Route& s, ToggleType tp, MIDI::Port* port)
2344 : MIDI::Controllable (port, true), route (s), type(tp), setting(false)
2346 last_written = false; /* XXX need a good out-of-bound-value */
2350 Route::MIDIToggleControl::set_value (float val)
2353 MIDI::channel_t chn;
2354 MIDI::byte additional;
2356 get_control_info (chn, et, additional);
2360 #ifdef HOLD_TOGGLE_VALUES
2361 if (et == MIDI::off || et == MIDI::on) {
2363 /* literal toggle */
2367 route.set_mute (!route.muted(), this);
2370 route.set_solo (!route.soloed(), this);
2379 /* map full control range to a boolean */
2381 bool bval = ((val >= 0.5f) ? true: false);
2385 route.set_mute (bval, this);
2388 route.set_solo (bval, this);
2394 #ifdef HOLD_TOGGLE_VALUES
2402 Route::MIDIToggleControl::send_feedback (bool value)
2405 if (!setting && get_midi_feedback()) {
2406 MIDI::byte val = (MIDI::byte) (value ? 127: 0);
2407 MIDI::channel_t ch = 0;
2408 MIDI::eventType ev = MIDI::none;
2409 MIDI::byte additional = 0;
2410 MIDI::EventTwoBytes data;
2412 if (get_control_info (ch, ev, additional)) {
2413 data.controller_number = additional;
2415 last_written = value;
2417 route._session.send_midi_message (get_port(), ev, ch, data);
2424 Route::MIDIToggleControl::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool val, bool force)
2426 if (get_midi_feedback() && bufsize > 2) {
2427 MIDI::channel_t ch = 0;
2428 MIDI::eventType ev = MIDI::none;
2429 MIDI::byte additional = 0;
2431 if (get_control_info (ch, ev, additional)) {
2432 if (val != last_written || force) {
2433 *buf++ = (0xF0 & ev) | (0xF & ch);
2434 *buf++ = additional; /* controller number */
2435 *buf++ = (MIDI::byte) (val ? 127 : 0);
2446 Route::set_block_size (jack_nframes_t nframes)
2448 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2449 (*i)->set_block_size (nframes);
2454 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2456 _session.update_latency_compensation (false, false);
2460 Route::protect_automation ()
2462 switch (gain_automation_state()) {
2465 set_gain_automation_state (Off);
2471 switch (panner().automation_state ()) {
2474 panner().set_automation_state (Off);
2480 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2482 if ((pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
2483 pi->protect_automation ();
2489 Route::set_pending_declick (int declick)
2492 /* this call is not allowed to turn off a pending declick unless "force" is true */
2494 _pending_declick = declick;
2496 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2498 _pending_declick = 0;