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 cerr << _name << " have control outs, solo audible = " << solo_audible << " mute audible = " << mute_audible
546 if ( // silent anyway
548 (_gain == 0 && !apply_gain_automation) ||
550 // muted by solo of another track
554 // muted by mute of this track
558 // recording but not s/w monitoring
560 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
564 co->silence (nframes, offset);
568 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
572 /* ----------------------------------------------------------------------
574 ----------------------------------------------------------------------*/
576 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
577 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
579 mute_declick_applied = true;
582 /* ----------------------------------------------------------------------------------------------------
584 -------------------------------------------------------------------------------------------------- */
586 solo_audible = dsg > 0;
587 mute_audible = dmg > 0 || !_mute_affects_main_outs;
589 if (n_outputs() == 0) {
593 } else if (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording())) {
595 IO::silence (nframes, offset);
599 if ( // silent anyway
601 (_gain == 0 && !apply_gain_automation) ||
603 // muted by solo of another track, but not using control outs for solo
605 (!solo_audible && (_session.solo_model() != Session::SoloBus)) ||
607 // muted by mute of this track
613 /* don't use Route::silence() here, because that causes
614 all outputs (sends, port inserts, etc. to be silent).
617 if (_meter_point == MeterPostFader) {
618 reset_peak_meters ();
621 IO::silence (nframes, offset);
625 if (_session.transport_speed() > 1.5f || _session.transport_speed() < -1.5f) {
626 pan (bufs, nbufs, nframes, offset, speed_quietning);
628 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
629 if (!_panner->empty() &&
630 (_panner->automation_state() & Play ||
631 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
632 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
634 pan (bufs, nbufs, nframes, offset, 1.0);
641 /* ----------------------------------------------------------------------------------------------------
643 -------------------------------------------------------------------------------------------------- */
645 if (meter && (_meter_point == MeterPostFader)) {
646 // cerr << "meter post" << endl;
648 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
649 uint32_t no = n_outputs();
650 for (n = 0; n < no; ++n) {
654 uint32_t no = n_outputs();
655 for (n = 0; n < no; ++n) {
656 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
663 Route::n_process_buffers ()
665 return max (n_inputs(), redirect_max_outs);
670 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)
672 vector<Sample*>& bufs = _session.get_passthru_buffers();
673 uint32_t limit = n_process_buffers ();
677 collect_input (bufs, limit, nframes, offset);
679 #define meter_stream meter_first
682 for (uint32_t n = 0; n < limit; ++n) {
683 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
685 meter_stream = false;
690 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
696 Route::set_phase_invert (bool yn, void *src)
698 if (_phase_invert != yn) {
701 // phase_invert_changed (src); /* EMIT SIGNAL */
705 Route::set_solo (bool yn, void *src)
711 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
712 _mix_group->apply (&Route::set_solo, yn, _mix_group);
718 solo_changed (src); /* EMIT SIGNAL */
720 if (_session.get_midi_feedback()) {
721 _midi_solo_control.send_feedback (_soloed);
727 Route::set_solo_mute (bool yn)
729 LockMonitor lm (declick_lock, __LINE__, __FILE__);
731 /* Called by Session in response to another Route being soloed.
734 desired_solo_gain = (yn?0.0:1.0);
738 Route::set_solo_safe (bool yn, void *src)
740 if (_solo_safe != yn) {
742 solo_safe_changed (src); /* EMIT SIGNAL */
747 Route::set_mute (bool yn, void *src)
750 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
751 _mix_group->apply (&Route::set_mute, yn, _mix_group);
757 mute_changed (src); /* EMIT SIGNAL */
759 if (_session.get_midi_feedback()) {
760 _midi_mute_control.send_feedback (_muted);
763 LockMonitor lm (declick_lock, __LINE__, __FILE__);
764 desired_mute_gain = (yn?0.0f:1.0f);
769 Route::add_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
771 uint32_t old_rmo = redirect_max_outs;
773 if (!_session.engine().connected()) {
778 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
783 uint32_t potential_max_streams = 0;
785 if ((pi = dynamic_cast<PluginInsert*>(redirect)) != 0) {
788 if (pi->input_streams() == 0) {
789 /* instrument plugin */
790 _have_internal_generator = true;
793 potential_max_streams = max(pi->input_streams(), pi->output_streams());
795 } else if ((porti = dynamic_cast<PortInsert*>(redirect)) != 0) {
797 /* force new port inserts to start out with an i/o configuration
798 that matches this route's i/o configuration.
800 the "inputs" for the port are supposed to match the output
803 the "outputs" of the route should match the inputs of this
804 route. XXX shouldn't they match the number of active signal
805 streams at the point of insertion?
809 porti->ensure_io (n_outputs (), n_inputs(), false, this);
812 // Ensure peak vector sizes before the plugin is activated
813 while (_peak_power.size() < potential_max_streams) {
814 _peak_power.push_back(0);
816 while (_stored_peak_power.size() < potential_max_streams) {
817 _stored_peak_power.push_back(0);
820 _redirects.push_back (redirect);
822 if (_reset_plugin_counts (err_streams)) {
823 _redirects.pop_back ();
824 _reset_plugin_counts (0); // it worked before we tried to add it ...
828 redirect->activate ();
829 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
832 if (redirect_max_outs != old_rmo || old_rmo == 0) {
837 redirects_changed (src); /* EMIT SIGNAL */
842 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
844 uint32_t old_rmo = redirect_max_outs;
846 if (!_session.engine().connected()) {
851 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
853 RedirectList::iterator existing_end = _redirects.end();
856 uint32_t potential_max_streams = 0;
858 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
862 if ((pi = dynamic_cast<PluginInsert*>(*i)) != 0) {
865 uint32_t m = max(pi->input_streams(), pi->output_streams());
866 if (m > potential_max_streams)
867 potential_max_streams = m;
870 // Ensure peak vector sizes before the plugin is activated
871 while (_peak_power.size() < potential_max_streams) {
872 _peak_power.push_back(0);
874 while (_stored_peak_power.size() < potential_max_streams) {
875 _stored_peak_power.push_back(0);
878 _redirects.push_back (*i);
880 if (_reset_plugin_counts (err_streams)) {
882 _redirects.erase (existing_end, _redirects.end());
883 _reset_plugin_counts (0); // it worked before we tried to add it ...
888 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
892 if (redirect_max_outs != old_rmo || old_rmo == 0) {
896 redirects_changed (src); /* EMIT SIGNAL */
901 Route::clear_redirects (void *src)
903 uint32_t old_rmo = redirect_max_outs;
905 if (!_session.engine().connected()) {
910 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
912 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
919 if (redirect_max_outs != old_rmo) {
923 redirect_max_outs = 0;
924 _have_internal_generator = false;
925 redirects_changed (src); /* EMIT SIGNAL */
929 Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
931 uint32_t old_rmo = redirect_max_outs;
933 if (!_session.engine().connected()) {
937 redirect_max_outs = 0;
940 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
941 RedirectList::iterator i;
942 bool removed = false;
944 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
945 if (*i == redirect) {
947 RedirectList::iterator tmp;
949 /* move along, see failure case for reset_plugin_counts()
950 where we may need to reinsert the redirect.
956 /* stop redirects that send signals to JACK ports
957 from causing noise as a result of no longer being
962 PortInsert* port_insert;
964 if ((send = dynamic_cast<Send*> (*i)) != 0) {
965 send->disconnect_inputs (this);
966 send->disconnect_outputs (this);
967 } else if ((port_insert = dynamic_cast<PortInsert*> (*i)) != 0) {
968 port_insert->disconnect_inputs (this);
969 port_insert->disconnect_outputs (this);
972 _redirects.erase (i);
985 if (_reset_plugin_counts (err_streams)) {
986 /* get back to where we where */
987 _redirects.insert (i, redirect);
988 /* we know this will work, because it worked before :) */
989 _reset_plugin_counts (0);
995 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
998 if ((pi = dynamic_cast<PluginInsert*>(*i)) != 0) {
999 if (pi->is_generator()) {
1005 _have_internal_generator = foo;
1008 if (old_rmo != redirect_max_outs) {
1012 redirects_changed (src); /* EMIT SIGNAL */
1017 Route::reset_plugin_counts (uint32_t* lpc)
1019 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
1020 return _reset_plugin_counts (lpc);
1025 Route::_reset_plugin_counts (uint32_t* err_streams)
1027 RedirectList::iterator r;
1030 map<Placement,list<InsertCount> > insert_map;
1031 jack_nframes_t initial_streams;
1033 redirect_max_outs = 0;
1037 /* divide inserts up by placement so we get the signal flow
1038 properly modelled. we need to do this because the _redirects
1039 list is not sorted by placement, and because other reasons may
1040 exist now or in the future for this separate treatment.
1043 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1047 /* do this here in case we bomb out before we get to the end of
1051 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1053 if ((insert = dynamic_cast<Insert*>(*r)) != 0) {
1055 insert_map[insert->placement()].push_back (InsertCount (*insert));
1057 /* reset plugin counts back to one for now so
1058 that we have a predictable, controlled
1059 state to try to configure.
1064 if ((pi = dynamic_cast<PluginInsert*>(insert)) != 0) {
1068 } else if (dynamic_cast<Send*> (*r) != 0) {
1081 /* Now process each placement in order, checking to see if we
1082 can really do what has been requested.
1087 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1091 /* figure out the streams that will feed into PreFader */
1093 if (!insert_map[PreFader].empty()) {
1094 InsertCount& ic (insert_map[PreFader].back());
1095 initial_streams = ic.insert.compute_output_streams (ic.cnt);
1097 initial_streams = n_inputs ();
1102 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1106 /* OK, everything can be set up correctly, so lets do it */
1108 apply_some_plugin_counts (insert_map[PreFader]);
1109 apply_some_plugin_counts (insert_map[PostFader]);
1111 /* recompute max outs of any redirect */
1115 redirect_max_outs = 0;
1116 RedirectList::iterator prev = _redirects.end();
1118 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1121 if ((s = dynamic_cast<Send*> (*r)) != 0) {
1122 if (r == _redirects.begin()) {
1123 s->expect_inputs (n_inputs());
1125 s->expect_inputs ((*prev)->output_streams());
1129 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1138 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1140 list<InsertCount>::iterator i;
1142 for (i = iclist.begin(); i != iclist.end(); ++i) {
1144 if ((*i).insert.configure_io ((*i).cnt, (*i).in, (*i).out)) {
1147 /* make sure that however many we have, they are all active */
1148 (*i).insert.activate ();
1155 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1157 list<InsertCount>::iterator i;
1159 for (i = iclist.begin(); i != iclist.end(); ++i) {
1161 if (((*i).cnt = (*i).insert.can_support_input_configuration (required_inputs)) < 0) {
1163 *err_streams = required_inputs;
1168 (*i).in = required_inputs;
1169 (*i).out = (*i).insert.compute_output_streams ((*i).cnt);
1171 required_inputs = (*i).out;
1178 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1180 uint32_t old_rmo = redirect_max_outs;
1186 RedirectList to_be_deleted;
1189 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
1190 RedirectList::iterator tmp;
1191 RedirectList the_copy;
1193 the_copy = _redirects;
1195 /* remove all relevant redirects */
1197 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1201 if ((*i)->placement() == placement) {
1202 to_be_deleted.push_back (*i);
1203 _redirects.erase (i);
1209 /* now copy the relevant ones from "other" */
1211 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1212 if ((*i)->placement() == placement) {
1213 _redirects.push_back (Redirect::clone (**i));
1217 /* reset plugin stream handling */
1219 if (_reset_plugin_counts (err_streams)) {
1221 /* FAILED COPY ATTEMPT: we have to restore order */
1223 /* delete all cloned redirects */
1225 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1230 if ((*i)->placement() == placement) {
1232 _redirects.erase (i);
1238 /* restore the natural order */
1240 _redirects = the_copy;
1241 redirect_max_outs = old_rmo;
1243 /* we failed, even though things are OK again */
1249 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1251 for (RedirectList::iterator i = to_be_deleted.begin(); i != to_be_deleted.end(); ++i) {
1257 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1261 redirects_changed (this); /* EMIT SIGNAL */
1266 Route::all_redirects_flip ()
1268 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1270 if (_redirects.empty()) {
1274 bool first_is_on = _redirects.front()->active();
1276 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1277 (*i)->set_active (!first_is_on, this);
1282 Route::all_redirects_active (bool state)
1284 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1286 if (_redirects.empty()) {
1290 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1291 (*i)->set_active (state, this);
1295 struct RedirectSorter {
1296 bool operator() (const Redirect *a, const Redirect *b) {
1297 return a->sort_key() < b->sort_key();
1302 Route::sort_redirects (uint32_t* err_streams)
1305 RedirectSorter comparator;
1306 RWLockMonitor lm (redirect_lock, true, __LINE__, __FILE__);
1307 uint32_t old_rmo = redirect_max_outs;
1309 /* the sweet power of C++ ... */
1311 RedirectList as_it_was_before = _redirects;
1313 _redirects.sort (comparator);
1315 if (_reset_plugin_counts (err_streams)) {
1316 _redirects = as_it_was_before;
1317 redirect_max_outs = old_rmo;
1323 redirects_changed (this); /* EMIT SIGNAL */
1335 Route::get_template()
1337 return state(false);
1341 Route::state(bool full_state)
1343 XMLNode *node = new XMLNode("Route");
1345 RedirectList:: iterator i;
1349 snprintf (buf, sizeof (buf), "0x%x", _flags);
1350 node->add_property("flags", buf);
1352 node->add_property("active", _active?"yes":"no");
1353 node->add_property("muted", _muted?"yes":"no");
1354 node->add_property("soloed", _soloed?"yes":"no");
1355 node->add_property("phase-invert", _phase_invert?"yes":"no");
1356 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1357 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1358 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1359 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1362 node->add_property("edit-group", _edit_group->name());
1365 node->add_property("mix-group", _mix_group->name());
1370 MIDI::channel_t chn;
1372 MIDI::byte additional;
1373 XMLNode* midi_node = 0;
1376 midi_node = node->add_child ("MIDI");
1378 if (_midi_mute_control.get_control_info (chn, ev, additional)) {
1379 child = midi_node->add_child ("mute");
1380 set_midi_node_info (child, ev, chn, additional);
1382 if (_midi_solo_control.get_control_info (chn, ev, additional)) {
1383 child = midi_node->add_child ("solo");
1384 set_midi_node_info (child, ev, chn, additional);
1388 string order_string;
1389 OrderKeys::iterator x = order_keys.begin();
1391 while (x != order_keys.end()) {
1392 order_string += (*x).first;
1393 order_string += '=';
1394 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1395 order_string += buf;
1399 if (x == order_keys.end()) {
1403 order_string += ':';
1405 node->add_property ("order-keys", order_string);
1407 node->add_child_nocopy (IO::state (full_state));
1409 if (_control_outs) {
1410 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1411 cnode->add_child_nocopy (_control_outs->state (full_state));
1412 node->add_child_nocopy (*cnode);
1415 if (_comment.length()) {
1416 XMLNode *cmt = node->add_child ("Comment");
1417 cmt->add_content (_comment);
1423 path = _session.snap_name();
1425 path += legalize_for_path (_name);
1426 path += ".automation";
1428 /* XXX we didn't ask for a state save, we asked for the current state.
1432 if (save_automation (path)) {
1433 error << _("Could not get state of route. Problem with save_automation") << endmsg;
1436 aevents = node->add_child ("Automation");
1437 aevents->add_property ("path", path);
1440 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1441 node->add_child_nocopy((*i)->state (full_state));
1445 node->add_child_copy (*_extra_xml);
1452 Route::set_deferred_state ()
1455 XMLNodeConstIterator niter;
1457 if (!deferred_state) {
1461 nlist = deferred_state->children();
1463 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1464 add_redirect_from_xml (**niter);
1467 delete deferred_state;
1472 Route::add_redirect_from_xml (const XMLNode& node)
1474 const XMLProperty *prop;
1478 if (node.name() == "Send") {
1481 send = new Send (_session, node);
1484 catch (failed_constructor &err) {
1485 error << _("Send construction failed") << endmsg;
1489 add_redirect (send, this);
1491 } else if (node.name() == "Insert") {
1494 if ((prop = node.property ("type")) != 0) {
1496 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1498 insert = new PluginInsert(_session, node);
1500 } else if (prop->value() == "port") {
1503 insert = new PortInsert (_session, node);
1507 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1510 add_redirect (insert, this);
1513 error << _("Insert XML node has no type property") << endmsg;
1517 catch (failed_constructor &err) {
1518 warning << _("insert could not be created. Ignored.") << endmsg;
1525 Route::set_state (const XMLNode& node)
1528 XMLNodeConstIterator niter;
1530 XMLPropertyList plist;
1531 const XMLProperty *prop;
1532 XMLNodeList midi_kids;
1535 if (node.name() != "Route"){
1536 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1540 if ((prop = node.property ("flags")) != 0) {
1542 sscanf (prop->value().c_str(), "0x%x", &x);
1548 if ((prop = node.property ("phase-invert")) != 0) {
1549 set_phase_invert(prop->value()=="yes"?true:false, this);
1552 if ((prop = node.property ("active")) != 0) {
1553 set_active (prop->value() == "yes");
1556 if ((prop = node.property ("muted")) != 0) {
1557 bool yn = prop->value()=="yes"?true:false;
1559 /* force reset of mute status */
1563 mute_gain = desired_mute_gain;
1566 if ((prop = node.property ("soloed")) != 0) {
1567 bool yn = prop->value()=="yes"?true:false;
1569 /* force reset of solo status */
1572 set_solo (yn, this);
1573 solo_gain = desired_solo_gain;
1576 if ((prop = node.property ("mute-affects-pre-fader")) != 0) {
1577 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1580 if ((prop = node.property ("mute-affects-post-fader")) != 0) {
1581 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1584 if ((prop = node.property ("mute-affects-control-outs")) != 0) {
1585 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1588 if ((prop = node.property ("mute-affects-main-outs")) != 0) {
1589 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1592 if ((prop = node.property ("edit-group")) != 0) {
1593 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1594 if(edit_group == 0) {
1595 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1597 set_edit_group(edit_group, this);
1601 if ((prop = node.property ("order-keys")) != 0) {
1605 string::size_type colon, equal;
1606 string remaining = prop->value();
1608 while (remaining.length()) {
1610 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1611 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1614 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1615 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1618 set_order_key (remaining.substr (0, equal), n);
1622 colon = remaining.find_first_of (':');
1624 if (colon != string::npos) {
1625 remaining = remaining.substr (colon+1);
1632 nlist = node.children();
1634 if (deferred_state) {
1635 delete deferred_state;
1638 deferred_state = new XMLNode("deferred state");
1640 /* set parent class properties before anything else */
1642 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1646 if (child->name() == IO::state_node_name) {
1648 IO::set_state (*child);
1653 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1657 if (child->name() == "Send") {
1660 if (!IO::ports_legal) {
1662 deferred_state->add_child_copy (*child);
1665 add_redirect_from_xml (*child);
1668 } else if (child->name() == "Insert") {
1670 if (!IO::ports_legal) {
1672 deferred_state->add_child_copy (*child);
1676 add_redirect_from_xml (*child);
1679 } else if (child->name() == "Automation") {
1681 XMLPropertyList plist;
1682 XMLPropertyConstIterator piter;
1685 plist = child->properties();
1686 for (piter = plist.begin(); piter != plist.end(); ++piter) {
1688 if (prop->name() == "path") {
1689 load_automation (prop->value());
1693 } else if (child->name() == "ControlOuts") {
1695 string coutname = _name;
1696 coutname += _("[control]");
1698 _control_outs = new IO (_session, coutname);
1699 _control_outs->set_state (**(child->children().begin()));
1701 } else if (child->name() == "Comment") {
1703 /* XXX this is a terrible API design in libxml++ */
1705 XMLNode *cmt = *(child->children().begin());
1706 _comment = cmt->content();
1708 } else if (child->name() == "extra") {
1709 _extra_xml = new XMLNode (*child);
1713 if ((prop = node.property ("mix-group")) != 0) {
1714 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1715 if (mix_group == 0) {
1716 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1718 set_mix_group(mix_group, this);
1722 midi_kids = node.children ("MIDI");
1724 for (niter = midi_kids.begin(); niter != midi_kids.end(); ++niter) {
1727 XMLNodeConstIterator miter;
1730 kids = (*niter)->children ();
1732 for (miter = kids.begin(); miter != kids.end(); ++miter) {
1736 MIDI::eventType ev = MIDI::on; /* initialize to keep gcc happy */
1737 MIDI::byte additional = 0; /* ditto */
1738 MIDI::channel_t chn = 0; /* ditto */
1740 if (child->name() == "mute") {
1742 if (get_midi_node_info (child, ev, chn, additional)) {
1743 _midi_mute_control.set_control_type (chn, ev, additional);
1745 error << string_compose(_("MIDI mute control specification for %1 is incomplete, so it has been ignored"), _name) << endmsg;
1748 else if (child->name() == "solo") {
1750 if (get_midi_node_info (child, ev, chn, additional)) {
1751 _midi_solo_control.set_control_type (chn, ev, additional);
1753 error << string_compose(_("MIDI mute control specification for %1 is incomplete, so it has been ignored"), _name) << endmsg;
1765 Route::curve_reallocate ()
1767 // _gain_automation_curve.finish_resize ();
1768 // _pan_automation_curve.finish_resize ();
1772 Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
1776 // reset_peak_meters ();
1778 IO::silence (nframes, offset);
1780 if (_control_outs) {
1781 _control_outs->silence (nframes, offset);
1785 TentativeRWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
1788 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1790 if (!_active && (pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
1791 // skip plugins, they don't need anything when we're not active
1795 (*i)->silence (nframes, offset);
1798 if (nframes == _session.get_block_size() && offset == 0) {
1808 Route::set_control_outs (const vector<string>& ports)
1810 LockMonitor lm (control_outs_lock, __LINE__, __FILE__);
1811 vector<string>::const_iterator i;
1813 if (_control_outs) {
1814 delete _control_outs;
1818 if (ports.empty()) {
1822 string coutname = _name;
1823 coutname += _("[control]");
1825 _control_outs = new IO (_session, coutname);
1827 /* our control outs need as many outputs as we
1828 have outputs. we track the changes in ::output_change_handler().
1831 _control_outs->ensure_io (0, n_outputs(), true, this);
1837 Route::set_edit_group (RouteGroup *eg, void *src)
1840 if (eg == _edit_group) {
1845 _edit_group->remove (this);
1848 if ((_edit_group = eg) != 0) {
1849 _edit_group->add (this);
1852 _session.set_dirty ();
1853 edit_group_changed (src); /* EMIT SIGNAL */
1857 Route::drop_edit_group (void *src)
1860 _session.set_dirty ();
1861 edit_group_changed (src); /* EMIT SIGNAL */
1865 Route::set_mix_group (RouteGroup *mg, void *src)
1868 if (mg == _mix_group) {
1873 _mix_group->remove (this);
1876 if ((_mix_group = mg) != 0) {
1877 _mix_group->add (this);
1880 _session.set_dirty ();
1881 mix_group_changed (src); /* EMIT SIGNAL */
1885 Route::drop_mix_group (void *src)
1888 _session.set_dirty ();
1889 mix_group_changed (src); /* EMIT SIGNAL */
1893 Route::set_comment (string cmt, void *src)
1896 comment_changed (src);
1897 _session.set_dirty ();
1901 Route::feeds (Route *o)
1907 uint32_t no = self.n_outputs();
1908 uint32_t ni = other.n_inputs ();
1910 for (i = 0; i < no; ++i) {
1911 for (j = 0; j < ni; ++j) {
1912 if (self.output(i)->connected_to (other.input(j)->name())) {
1918 /* check Redirects which may also interconnect Routes */
1920 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1922 no = (*r)->n_outputs();
1924 for (i = 0; i < no; ++i) {
1925 for (j = 0; j < ni; ++j) {
1926 if ((*r)->output(i)->connected_to (other.input (j)->name())) {
1933 /* check for control room outputs which may also interconnect Routes */
1935 if (_control_outs) {
1937 no = _control_outs->n_outputs();
1939 for (i = 0; i < no; ++i) {
1940 for (j = 0; j < ni; ++j) {
1941 if (_control_outs->output(i)->connected_to (other.input (j)->name())) {
1952 Route::set_mute_config (mute_type t, bool onoff, void *src)
1956 _mute_affects_pre_fader = onoff;
1957 pre_fader_changed(src); /* EMIT SIGNAL */
1961 _mute_affects_post_fader = onoff;
1962 post_fader_changed(src); /* EMIT SIGNAL */
1966 _mute_affects_control_outs = onoff;
1967 control_outs_changed(src); /* EMIT SIGNAL */
1971 _mute_affects_main_outs = onoff;
1972 main_outs_changed(src); /* EMIT SIGNAL */
1978 Route::get_mute_config (mute_type t)
1984 onoff = _mute_affects_pre_fader;
1987 onoff = _mute_affects_post_fader;
1990 onoff = _mute_affects_control_outs;
1993 onoff = _mute_affects_main_outs;
2001 Route::set_active (bool yn)
2004 active_changed(); /* EMIT SIGNAL */
2008 Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2010 jack_nframes_t now = _session.transport_frame();
2013 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2016 automation_snapshot (now);
2019 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2021 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2022 (*i)->deactivate ();
2026 (*i)->transport_stopped (now);
2030 IO::transport_stopped (now);
2032 _roll_delay = _initial_delay;
2036 Route::get_memento() const
2038 void (Route::*pmf)(state_id_t) = &Route::set_state;
2039 return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id);
2043 Route::set_state (state_id_t id)
2049 Route::input_change_handler (IOChange change, void *ignored)
2051 if (change & ConfigurationChanged) {
2052 reset_plugin_counts (0);
2057 Route::output_change_handler (IOChange change, void *ignored)
2059 if (change & ConfigurationChanged) {
2060 if (_control_outs) {
2061 _control_outs->ensure_io (0, n_outputs(), true, this);
2064 reset_plugin_counts (0);
2069 Route::pans_required () const
2071 if (n_outputs() < 2) {
2075 return max (n_inputs (), redirect_max_outs);
2079 Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2080 bool session_state_changing, bool can_record, bool rec_monitors_input)
2082 if (n_outputs() == 0) {
2086 if (session_state_changing || !_active) {
2087 silence (nframes, offset);
2091 apply_gain_automation = false;
2094 passthru (start_frame, end_frame, nframes, offset, 0, false);
2096 silence (nframes, offset);
2103 Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack_nframes_t& transport_frame)
2105 if (_roll_delay > nframes) {
2107 _roll_delay -= nframes;
2108 silence (nframes, offset);
2109 /* transport frame is not legal for caller to use */
2112 } else if (_roll_delay > 0) {
2114 nframes -= _roll_delay;
2116 silence (_roll_delay, offset);
2118 offset += _roll_delay;
2119 transport_frame += _roll_delay;
2128 Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, int declick,
2129 bool can_record, bool rec_monitors_input)
2132 TentativeRWLockMonitor lm(redirect_lock, false, __LINE__, __FILE__);
2134 // automation snapshot can also be called from the non-rt context
2135 // and it uses the redirect list, so we take the lock out here
2136 automation_snapshot (_session.transport_frame());
2140 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2141 silence (nframes, offset);
2145 jack_nframes_t unused = 0;
2147 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2153 apply_gain_automation = false;
2156 TentativeLockMonitor am (automation_lock, __LINE__, __FILE__);
2158 if (am.locked() && _session.transport_rolling()) {
2160 jack_nframes_t start_frame = end_frame - nframes;
2162 if (gain_automation_playback()) {
2163 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2168 passthru (start_frame, end_frame, nframes, offset, declick, false);
2174 Route::silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2175 bool can_record, bool rec_monitors_input)
2177 silence (nframes, offset);
2182 Route::toggle_monitor_input ()
2184 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2185 (*i)->request_monitor_input(!(*i)->monitoring_input());
2190 Route::has_external_redirects () const
2192 const PortInsert* pi;
2194 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2195 if ((pi = dynamic_cast<const PortInsert*>(*i)) != 0) {
2197 uint32_t no = pi->n_outputs();
2199 for (uint32_t n = 0; n < no; ++n) {
2201 string port_name = pi->output(n)->name();
2202 string client_name = port_name.substr (0, port_name.find(':'));
2204 /* only say "yes" if the redirect is actually in use */
2206 if (client_name != "ardour" && pi->active()) {
2217 Route::reset_midi_control (MIDI::Port* port, bool on)
2219 MIDI::channel_t chn;
2223 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2224 (*i)->reset_midi_control (port, on);
2227 IO::reset_midi_control (port, on);
2229 _midi_solo_control.get_control_info (chn, ev, extra);
2233 _midi_solo_control.midi_rebind (port, chn);
2235 _midi_mute_control.get_control_info (chn, ev, extra);
2239 _midi_mute_control.midi_rebind (port, chn);
2243 Route::send_all_midi_feedback ()
2245 if (_session.get_midi_feedback()) {
2248 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2249 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2250 (*i)->send_all_midi_feedback ();
2254 IO::send_all_midi_feedback();
2256 _midi_solo_control.send_feedback (_soloed);
2257 _midi_mute_control.send_feedback (_muted);
2262 Route::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize)
2264 buf = _midi_solo_control.write_feedback (buf, bufsize, _soloed);
2265 buf = _midi_mute_control.write_feedback (buf, bufsize, _muted);
2268 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2269 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2270 buf = (*i)->write_midi_feedback (buf, bufsize);
2274 return IO::write_midi_feedback (buf, bufsize);
2278 Route::flush_redirects ()
2280 /* XXX shouldn't really try to take this lock, since
2281 this is called from the RT audio thread.
2284 RWLockMonitor lm (redirect_lock, false, __LINE__, __FILE__);
2286 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2287 (*i)->deactivate ();
2293 Route::set_meter_point (MeterPoint p, void *src)
2295 if (_meter_point != p) {
2297 meter_change (src); /* EMIT SIGNAL */
2298 _session.set_dirty ();
2303 Route::update_total_latency ()
2307 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2308 if ((*i)->active ()) {
2309 _own_latency += (*i)->latency ();
2313 set_port_latency (_own_latency);
2315 /* this (virtual) function is used for pure Routes,
2316 not derived classes like AudioTrack. this means
2317 that the data processed here comes from an input
2318 port, not prerecorded material, and therefore we
2319 have to take into account any input latency.
2322 _own_latency += input_latency ();
2324 return _own_latency;
2328 Route::set_latency_delay (jack_nframes_t longest_session_latency)
2330 _initial_delay = longest_session_latency - _own_latency;
2332 if (_session.transport_stopped()) {
2333 _roll_delay = _initial_delay;
2338 Route::automation_snapshot (jack_nframes_t now)
2340 IO::automation_snapshot (now);
2342 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2343 (*i)->automation_snapshot (now);
2347 Route::MIDIToggleControl::MIDIToggleControl (Route& s, ToggleType tp, MIDI::Port* port)
2348 : MIDI::Controllable (port, true), route (s), type(tp), setting(false)
2350 last_written = false; /* XXX need a good out-of-bound-value */
2354 Route::MIDIToggleControl::set_value (float val)
2357 MIDI::channel_t chn;
2358 MIDI::byte additional;
2360 get_control_info (chn, et, additional);
2364 #ifdef HOLD_TOGGLE_VALUES
2365 if (et == MIDI::off || et == MIDI::on) {
2367 /* literal toggle */
2371 route.set_mute (!route.muted(), this);
2374 route.set_solo (!route.soloed(), this);
2383 /* map full control range to a boolean */
2385 bool bval = ((val >= 0.5f) ? true: false);
2389 route.set_mute (bval, this);
2392 route.set_solo (bval, this);
2398 #ifdef HOLD_TOGGLE_VALUES
2406 Route::MIDIToggleControl::send_feedback (bool value)
2409 if (!setting && get_midi_feedback()) {
2410 MIDI::byte val = (MIDI::byte) (value ? 127: 0);
2411 MIDI::channel_t ch = 0;
2412 MIDI::eventType ev = MIDI::none;
2413 MIDI::byte additional = 0;
2414 MIDI::EventTwoBytes data;
2416 if (get_control_info (ch, ev, additional)) {
2417 data.controller_number = additional;
2419 last_written = value;
2421 route._session.send_midi_message (get_port(), ev, ch, data);
2428 Route::MIDIToggleControl::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool val, bool force)
2430 if (get_midi_feedback() && bufsize > 2) {
2431 MIDI::channel_t ch = 0;
2432 MIDI::eventType ev = MIDI::none;
2433 MIDI::byte additional = 0;
2435 if (get_control_info (ch, ev, additional)) {
2436 if (val != last_written || force) {
2437 *buf++ = (0xF0 & ev) | (0xF & ch);
2438 *buf++ = additional; /* controller number */
2439 *buf++ = (MIDI::byte) (val ? 127 : 0);
2450 Route::set_block_size (jack_nframes_t nframes)
2452 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2453 (*i)->set_block_size (nframes);
2458 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2460 _session.update_latency_compensation (false, false);
2464 Route::protect_automation ()
2466 switch (gain_automation_state()) {
2469 set_gain_automation_state (Off);
2475 switch (panner().automation_state ()) {
2478 panner().set_automation_state (Off);
2484 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2486 if ((pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
2487 pi->protect_automation ();
2493 Route::set_pending_declick (int declick)
2496 /* this call is not allowed to turn off a pending declick unless "force" is true */
2498 _pending_declick = declick;
2500 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2502 _pending_declick = 0;