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 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
248 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
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 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
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 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
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 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
626 if (!_panner->empty() &&
627 (_panner->automation_state() & Play ||
628 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
629 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
631 pan (bufs, nbufs, nframes, offset, 1.0);
638 /* ----------------------------------------------------------------------------------------------------
640 -------------------------------------------------------------------------------------------------- */
642 if (meter && (_meter_point == MeterPostFader)) {
643 // cerr << "meter post" << endl;
645 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
646 uint32_t no = n_outputs();
647 for (n = 0; n < no; ++n) {
651 uint32_t no = n_outputs();
652 for (n = 0; n < no; ++n) {
653 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
660 Route::n_process_buffers ()
662 return max (n_inputs(), redirect_max_outs);
667 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)
669 vector<Sample*>& bufs = _session.get_passthru_buffers();
670 uint32_t limit = n_process_buffers ();
674 collect_input (bufs, limit, nframes, offset);
676 #define meter_stream meter_first
679 for (uint32_t n = 0; n < limit; ++n) {
680 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
682 meter_stream = false;
687 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
693 Route::set_phase_invert (bool yn, void *src)
695 if (_phase_invert != yn) {
698 // phase_invert_changed (src); /* EMIT SIGNAL */
702 Route::set_solo (bool yn, void *src)
708 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
709 _mix_group->apply (&Route::set_solo, yn, _mix_group);
715 solo_changed (src); /* EMIT SIGNAL */
717 if (_session.get_midi_feedback()) {
718 _midi_solo_control.send_feedback (_soloed);
724 Route::set_solo_mute (bool yn)
726 Glib::Mutex::Lock lm (declick_lock);
728 /* Called by Session in response to another Route being soloed.
731 desired_solo_gain = (yn?0.0:1.0);
735 Route::set_solo_safe (bool yn, void *src)
737 if (_solo_safe != yn) {
739 solo_safe_changed (src); /* EMIT SIGNAL */
744 Route::set_mute (bool yn, void *src)
747 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
748 _mix_group->apply (&Route::set_mute, yn, _mix_group);
754 mute_changed (src); /* EMIT SIGNAL */
756 if (_session.get_midi_feedback()) {
757 _midi_mute_control.send_feedback (_muted);
760 Glib::Mutex::Lock lm (declick_lock);
761 desired_mute_gain = (yn?0.0f:1.0f);
766 Route::add_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
768 uint32_t old_rmo = redirect_max_outs;
770 if (!_session.engine().connected()) {
775 Glib::RWLock::WriterLock lm (redirect_lock);
780 uint32_t potential_max_streams = 0;
782 if ((pi = dynamic_cast<PluginInsert*>(redirect)) != 0) {
785 if (pi->input_streams() == 0) {
786 /* instrument plugin */
787 _have_internal_generator = true;
790 potential_max_streams = max(pi->input_streams(), pi->output_streams());
792 } else if ((porti = dynamic_cast<PortInsert*>(redirect)) != 0) {
794 /* force new port inserts to start out with an i/o configuration
795 that matches this route's i/o configuration.
797 the "inputs" for the port are supposed to match the output
800 the "outputs" of the route should match the inputs of this
801 route. XXX shouldn't they match the number of active signal
802 streams at the point of insertion?
806 porti->ensure_io (n_outputs (), n_inputs(), false, this);
809 // Ensure peak vector sizes before the plugin is activated
810 while (_peak_power.size() < potential_max_streams) {
811 _peak_power.push_back(0);
813 while (_visible_peak_power.size() < potential_max_streams) {
814 _visible_peak_power.push_back(0);
817 _redirects.push_back (redirect);
819 if (_reset_plugin_counts (err_streams)) {
820 _redirects.pop_back ();
821 _reset_plugin_counts (0); // it worked before we tried to add it ...
825 redirect->activate ();
826 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
829 if (redirect_max_outs != old_rmo || old_rmo == 0) {
834 redirects_changed (src); /* EMIT SIGNAL */
839 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
841 uint32_t old_rmo = redirect_max_outs;
843 if (!_session.engine().connected()) {
848 Glib::RWLock::WriterLock lm (redirect_lock);
850 RedirectList::iterator existing_end = _redirects.end();
853 uint32_t potential_max_streams = 0;
855 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
859 if ((pi = dynamic_cast<PluginInsert*>(*i)) != 0) {
862 uint32_t m = max(pi->input_streams(), pi->output_streams());
863 if (m > potential_max_streams)
864 potential_max_streams = m;
867 // Ensure peak vector sizes before the plugin is activated
868 while (_peak_power.size() < potential_max_streams) {
869 _peak_power.push_back(0);
871 while (_visible_peak_power.size() < potential_max_streams) {
872 _visible_peak_power.push_back(0);
875 _redirects.push_back (*i);
877 if (_reset_plugin_counts (err_streams)) {
879 _redirects.erase (existing_end, _redirects.end());
880 _reset_plugin_counts (0); // it worked before we tried to add it ...
885 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
889 if (redirect_max_outs != old_rmo || old_rmo == 0) {
893 redirects_changed (src); /* EMIT SIGNAL */
898 Route::clear_redirects (void *src)
900 uint32_t old_rmo = redirect_max_outs;
902 if (!_session.engine().connected()) {
907 Glib::RWLock::WriterLock lm (redirect_lock);
909 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
916 if (redirect_max_outs != old_rmo) {
920 redirect_max_outs = 0;
921 _have_internal_generator = false;
922 redirects_changed (src); /* EMIT SIGNAL */
926 Route::remove_redirect (Redirect *redirect, void *src, uint32_t* err_streams)
928 uint32_t old_rmo = redirect_max_outs;
930 if (!_session.engine().connected()) {
934 redirect_max_outs = 0;
937 Glib::RWLock::WriterLock lm (redirect_lock);
938 RedirectList::iterator i;
939 bool removed = false;
941 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
942 if (*i == redirect) {
944 RedirectList::iterator tmp;
946 /* move along, see failure case for reset_plugin_counts()
947 where we may need to reinsert the redirect.
953 /* stop redirects that send signals to JACK ports
954 from causing noise as a result of no longer being
959 PortInsert* port_insert;
961 if ((send = dynamic_cast<Send*> (*i)) != 0) {
962 send->disconnect_inputs (this);
963 send->disconnect_outputs (this);
964 } else if ((port_insert = dynamic_cast<PortInsert*> (*i)) != 0) {
965 port_insert->disconnect_inputs (this);
966 port_insert->disconnect_outputs (this);
969 _redirects.erase (i);
982 if (_reset_plugin_counts (err_streams)) {
983 /* get back to where we where */
984 _redirects.insert (i, redirect);
985 /* we know this will work, because it worked before :) */
986 _reset_plugin_counts (0);
992 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
995 if ((pi = dynamic_cast<PluginInsert*>(*i)) != 0) {
996 if (pi->is_generator()) {
1002 _have_internal_generator = foo;
1005 if (old_rmo != redirect_max_outs) {
1009 redirects_changed (src); /* EMIT SIGNAL */
1014 Route::reset_plugin_counts (uint32_t* lpc)
1016 Glib::RWLock::WriterLock lm (redirect_lock);
1017 return _reset_plugin_counts (lpc);
1022 Route::_reset_plugin_counts (uint32_t* err_streams)
1024 RedirectList::iterator r;
1027 map<Placement,list<InsertCount> > insert_map;
1028 jack_nframes_t initial_streams;
1030 redirect_max_outs = 0;
1034 /* divide inserts up by placement so we get the signal flow
1035 properly modelled. we need to do this because the _redirects
1036 list is not sorted by placement, and because other reasons may
1037 exist now or in the future for this separate treatment.
1040 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1044 /* do this here in case we bomb out before we get to the end of
1048 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1050 if ((insert = dynamic_cast<Insert*>(*r)) != 0) {
1052 insert_map[insert->placement()].push_back (InsertCount (*insert));
1054 /* reset plugin counts back to one for now so
1055 that we have a predictable, controlled
1056 state to try to configure.
1061 if ((pi = dynamic_cast<PluginInsert*>(insert)) != 0) {
1065 } else if (dynamic_cast<Send*> (*r) != 0) {
1078 /* Now process each placement in order, checking to see if we
1079 can really do what has been requested.
1084 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1088 /* figure out the streams that will feed into PreFader */
1090 if (!insert_map[PreFader].empty()) {
1091 InsertCount& ic (insert_map[PreFader].back());
1092 initial_streams = ic.insert.compute_output_streams (ic.cnt);
1094 initial_streams = n_inputs ();
1099 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1103 /* OK, everything can be set up correctly, so lets do it */
1105 apply_some_plugin_counts (insert_map[PreFader]);
1106 apply_some_plugin_counts (insert_map[PostFader]);
1108 /* recompute max outs of any redirect */
1112 redirect_max_outs = 0;
1113 RedirectList::iterator prev = _redirects.end();
1115 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1118 if ((s = dynamic_cast<Send*> (*r)) != 0) {
1119 if (r == _redirects.begin()) {
1120 s->expect_inputs (n_inputs());
1122 s->expect_inputs ((*prev)->output_streams());
1126 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1135 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1137 list<InsertCount>::iterator i;
1139 for (i = iclist.begin(); i != iclist.end(); ++i) {
1141 if ((*i).insert.configure_io ((*i).cnt, (*i).in, (*i).out)) {
1144 /* make sure that however many we have, they are all active */
1145 (*i).insert.activate ();
1152 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1154 list<InsertCount>::iterator i;
1156 for (i = iclist.begin(); i != iclist.end(); ++i) {
1158 if (((*i).cnt = (*i).insert.can_support_input_configuration (required_inputs)) < 0) {
1160 *err_streams = required_inputs;
1165 (*i).in = required_inputs;
1166 (*i).out = (*i).insert.compute_output_streams ((*i).cnt);
1168 required_inputs = (*i).out;
1175 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1177 uint32_t old_rmo = redirect_max_outs;
1183 RedirectList to_be_deleted;
1186 Glib::RWLock::WriterLock lm (redirect_lock);
1187 RedirectList::iterator tmp;
1188 RedirectList the_copy;
1190 the_copy = _redirects;
1192 /* remove all relevant redirects */
1194 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1198 if ((*i)->placement() == placement) {
1199 to_be_deleted.push_back (*i);
1200 _redirects.erase (i);
1206 /* now copy the relevant ones from "other" */
1208 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1209 if ((*i)->placement() == placement) {
1210 _redirects.push_back (Redirect::clone (**i));
1214 /* reset plugin stream handling */
1216 if (_reset_plugin_counts (err_streams)) {
1218 /* FAILED COPY ATTEMPT: we have to restore order */
1220 /* delete all cloned redirects */
1222 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1227 if ((*i)->placement() == placement) {
1229 _redirects.erase (i);
1235 /* restore the natural order */
1237 _redirects = the_copy;
1238 redirect_max_outs = old_rmo;
1240 /* we failed, even though things are OK again */
1246 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1248 for (RedirectList::iterator i = to_be_deleted.begin(); i != to_be_deleted.end(); ++i) {
1254 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1258 redirects_changed (this); /* EMIT SIGNAL */
1263 Route::all_redirects_flip ()
1265 Glib::RWLock::ReaderLock lm (redirect_lock);
1267 if (_redirects.empty()) {
1271 bool first_is_on = _redirects.front()->active();
1273 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1274 (*i)->set_active (!first_is_on, this);
1279 Route::all_redirects_active (bool state)
1281 Glib::RWLock::ReaderLock lm (redirect_lock);
1283 if (_redirects.empty()) {
1287 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1288 (*i)->set_active (state, this);
1292 struct RedirectSorter {
1293 bool operator() (const Redirect *a, const Redirect *b) {
1294 return a->sort_key() < b->sort_key();
1299 Route::sort_redirects (uint32_t* err_streams)
1302 RedirectSorter comparator;
1303 Glib::RWLock::WriterLock lm (redirect_lock);
1304 uint32_t old_rmo = redirect_max_outs;
1306 /* the sweet power of C++ ... */
1308 RedirectList as_it_was_before = _redirects;
1310 _redirects.sort (comparator);
1312 if (_reset_plugin_counts (err_streams)) {
1313 _redirects = as_it_was_before;
1314 redirect_max_outs = old_rmo;
1320 redirects_changed (this); /* EMIT SIGNAL */
1332 Route::get_template()
1334 return state(false);
1338 Route::state(bool full_state)
1340 XMLNode *node = new XMLNode("Route");
1342 RedirectList:: iterator i;
1346 snprintf (buf, sizeof (buf), "0x%x", _flags);
1347 node->add_property("flags", buf);
1349 node->add_property("active", _active?"yes":"no");
1350 node->add_property("muted", _muted?"yes":"no");
1351 node->add_property("soloed", _soloed?"yes":"no");
1352 node->add_property("phase-invert", _phase_invert?"yes":"no");
1353 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1354 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1355 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1356 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1359 node->add_property("edit-group", _edit_group->name());
1362 node->add_property("mix-group", _mix_group->name());
1367 MIDI::channel_t chn;
1369 MIDI::byte additional;
1370 XMLNode* midi_node = 0;
1373 midi_node = node->add_child ("MIDI");
1375 if (_midi_mute_control.get_control_info (chn, ev, additional)) {
1376 child = midi_node->add_child ("mute");
1377 set_midi_node_info (child, ev, chn, additional);
1379 if (_midi_solo_control.get_control_info (chn, ev, additional)) {
1380 child = midi_node->add_child ("solo");
1381 set_midi_node_info (child, ev, chn, additional);
1385 string order_string;
1386 OrderKeys::iterator x = order_keys.begin();
1388 while (x != order_keys.end()) {
1389 order_string += (*x).first;
1390 order_string += '=';
1391 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1392 order_string += buf;
1396 if (x == order_keys.end()) {
1400 order_string += ':';
1402 node->add_property ("order-keys", order_string);
1404 node->add_child_nocopy (IO::state (full_state));
1406 if (_control_outs) {
1407 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1408 cnode->add_child_nocopy (_control_outs->state (full_state));
1409 node->add_child_nocopy (*cnode);
1412 if (_comment.length()) {
1413 XMLNode *cmt = node->add_child ("Comment");
1414 cmt->add_content (_comment);
1420 path = _session.snap_name();
1422 path += legalize_for_path (_name);
1423 path += ".automation";
1425 /* XXX we didn't ask for a state save, we asked for the current state.
1429 if (save_automation (path)) {
1430 error << _("Could not get state of route. Problem with save_automation") << endmsg;
1433 aevents = node->add_child ("Automation");
1434 aevents->add_property ("path", path);
1437 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1438 node->add_child_nocopy((*i)->state (full_state));
1442 node->add_child_copy (*_extra_xml);
1449 Route::set_deferred_state ()
1452 XMLNodeConstIterator niter;
1454 if (!deferred_state) {
1458 nlist = deferred_state->children();
1460 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1461 add_redirect_from_xml (**niter);
1464 delete deferred_state;
1469 Route::add_redirect_from_xml (const XMLNode& node)
1471 const XMLProperty *prop;
1475 if (node.name() == "Send") {
1478 send = new Send (_session, node);
1481 catch (failed_constructor &err) {
1482 error << _("Send construction failed") << endmsg;
1486 add_redirect (send, this);
1488 } else if (node.name() == "Insert") {
1491 if ((prop = node.property ("type")) != 0) {
1493 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1495 insert = new PluginInsert(_session, node);
1497 } else if (prop->value() == "port") {
1500 insert = new PortInsert (_session, node);
1504 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1507 add_redirect (insert, this);
1510 error << _("Insert XML node has no type property") << endmsg;
1514 catch (failed_constructor &err) {
1515 warning << _("insert could not be created. Ignored.") << endmsg;
1522 Route::set_state (const XMLNode& node)
1525 XMLNodeConstIterator niter;
1527 XMLPropertyList plist;
1528 const XMLProperty *prop;
1529 XMLNodeList midi_kids;
1532 if (node.name() != "Route"){
1533 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1537 if ((prop = node.property ("flags")) != 0) {
1539 sscanf (prop->value().c_str(), "0x%x", &x);
1545 if ((prop = node.property ("phase-invert")) != 0) {
1546 set_phase_invert(prop->value()=="yes"?true:false, this);
1549 if ((prop = node.property ("active")) != 0) {
1550 set_active (prop->value() == "yes");
1553 if ((prop = node.property ("muted")) != 0) {
1554 bool yn = prop->value()=="yes"?true:false;
1556 /* force reset of mute status */
1560 mute_gain = desired_mute_gain;
1563 if ((prop = node.property ("soloed")) != 0) {
1564 bool yn = prop->value()=="yes"?true:false;
1566 /* force reset of solo status */
1569 set_solo (yn, this);
1570 solo_gain = desired_solo_gain;
1573 if ((prop = node.property ("mute-affects-pre-fader")) != 0) {
1574 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1577 if ((prop = node.property ("mute-affects-post-fader")) != 0) {
1578 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1581 if ((prop = node.property ("mute-affects-control-outs")) != 0) {
1582 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1585 if ((prop = node.property ("mute-affects-main-outs")) != 0) {
1586 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1589 if ((prop = node.property ("edit-group")) != 0) {
1590 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1591 if(edit_group == 0) {
1592 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1594 set_edit_group(edit_group, this);
1598 if ((prop = node.property ("order-keys")) != 0) {
1602 string::size_type colon, equal;
1603 string remaining = prop->value();
1605 while (remaining.length()) {
1607 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1608 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1611 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1612 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1615 set_order_key (remaining.substr (0, equal), n);
1619 colon = remaining.find_first_of (':');
1621 if (colon != string::npos) {
1622 remaining = remaining.substr (colon+1);
1629 nlist = node.children();
1631 if (deferred_state) {
1632 delete deferred_state;
1635 deferred_state = new XMLNode("deferred state");
1637 /* set parent class properties before anything else */
1639 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1643 if (child->name() == IO::state_node_name) {
1645 IO::set_state (*child);
1650 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1654 if (child->name() == "Send") {
1657 if (!IO::ports_legal) {
1659 deferred_state->add_child_copy (*child);
1662 add_redirect_from_xml (*child);
1665 } else if (child->name() == "Insert") {
1667 if (!IO::ports_legal) {
1669 deferred_state->add_child_copy (*child);
1673 add_redirect_from_xml (*child);
1676 } else if (child->name() == "Automation") {
1678 XMLPropertyList plist;
1679 XMLPropertyConstIterator piter;
1682 plist = child->properties();
1683 for (piter = plist.begin(); piter != plist.end(); ++piter) {
1685 if (prop->name() == "path") {
1686 load_automation (prop->value());
1690 } else if (child->name() == "ControlOuts") {
1692 string coutname = _name;
1693 coutname += _("[control]");
1695 _control_outs = new IO (_session, coutname);
1696 _control_outs->set_state (**(child->children().begin()));
1698 } else if (child->name() == "Comment") {
1700 /* XXX this is a terrible API design in libxml++ */
1702 XMLNode *cmt = *(child->children().begin());
1703 _comment = cmt->content();
1705 } else if (child->name() == "extra") {
1706 _extra_xml = new XMLNode (*child);
1710 if ((prop = node.property ("mix-group")) != 0) {
1711 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1712 if (mix_group == 0) {
1713 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1715 set_mix_group(mix_group, this);
1719 midi_kids = node.children ("MIDI");
1721 for (niter = midi_kids.begin(); niter != midi_kids.end(); ++niter) {
1724 XMLNodeConstIterator miter;
1727 kids = (*niter)->children ();
1729 for (miter = kids.begin(); miter != kids.end(); ++miter) {
1733 MIDI::eventType ev = MIDI::on; /* initialize to keep gcc happy */
1734 MIDI::byte additional = 0; /* ditto */
1735 MIDI::channel_t chn = 0; /* ditto */
1737 if (child->name() == "mute") {
1739 if (get_midi_node_info (child, ev, chn, additional)) {
1740 _midi_mute_control.set_control_type (chn, ev, additional);
1742 error << string_compose(_("MIDI mute control specification for %1 is incomplete, so it has been ignored"), _name) << endmsg;
1745 else if (child->name() == "solo") {
1747 if (get_midi_node_info (child, ev, chn, additional)) {
1748 _midi_solo_control.set_control_type (chn, ev, additional);
1750 error << string_compose(_("MIDI mute control specification for %1 is incomplete, so it has been ignored"), _name) << endmsg;
1762 Route::curve_reallocate ()
1764 // _gain_automation_curve.finish_resize ();
1765 // _pan_automation_curve.finish_resize ();
1769 Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
1773 // reset_peak_meters ();
1775 IO::silence (nframes, offset);
1777 if (_control_outs) {
1778 _control_outs->silence (nframes, offset);
1782 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1785 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1787 if (!_active && (pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
1788 // skip plugins, they don't need anything when we're not active
1792 (*i)->silence (nframes, offset);
1795 if (nframes == _session.get_block_size() && offset == 0) {
1805 Route::set_control_outs (const vector<string>& ports)
1807 Glib::Mutex::Lock lm (control_outs_lock);
1808 vector<string>::const_iterator i;
1810 if (_control_outs) {
1811 delete _control_outs;
1815 if (ports.empty()) {
1819 string coutname = _name;
1820 coutname += _("[control]");
1822 _control_outs = new IO (_session, coutname);
1824 /* our control outs need as many outputs as we
1825 have outputs. we track the changes in ::output_change_handler().
1828 _control_outs->ensure_io (0, n_outputs(), true, this);
1834 Route::set_edit_group (RouteGroup *eg, void *src)
1837 if (eg == _edit_group) {
1842 _edit_group->remove (this);
1845 if ((_edit_group = eg) != 0) {
1846 _edit_group->add (this);
1849 _session.set_dirty ();
1850 edit_group_changed (src); /* EMIT SIGNAL */
1854 Route::drop_edit_group (void *src)
1857 _session.set_dirty ();
1858 edit_group_changed (src); /* EMIT SIGNAL */
1862 Route::set_mix_group (RouteGroup *mg, void *src)
1865 if (mg == _mix_group) {
1870 _mix_group->remove (this);
1873 if ((_mix_group = mg) != 0) {
1874 _mix_group->add (this);
1877 _session.set_dirty ();
1878 mix_group_changed (src); /* EMIT SIGNAL */
1882 Route::drop_mix_group (void *src)
1885 _session.set_dirty ();
1886 mix_group_changed (src); /* EMIT SIGNAL */
1890 Route::set_comment (string cmt, void *src)
1893 comment_changed (src);
1894 _session.set_dirty ();
1898 Route::feeds (Route *o)
1904 uint32_t no = self.n_outputs();
1905 uint32_t ni = other.n_inputs ();
1907 for (i = 0; i < no; ++i) {
1908 for (j = 0; j < ni; ++j) {
1909 if (self.output(i)->connected_to (other.input(j)->name())) {
1915 /* check Redirects which may also interconnect Routes */
1917 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1919 no = (*r)->n_outputs();
1921 for (i = 0; i < no; ++i) {
1922 for (j = 0; j < ni; ++j) {
1923 if ((*r)->output(i)->connected_to (other.input (j)->name())) {
1930 /* check for control room outputs which may also interconnect Routes */
1932 if (_control_outs) {
1934 no = _control_outs->n_outputs();
1936 for (i = 0; i < no; ++i) {
1937 for (j = 0; j < ni; ++j) {
1938 if (_control_outs->output(i)->connected_to (other.input (j)->name())) {
1949 Route::set_mute_config (mute_type t, bool onoff, void *src)
1953 _mute_affects_pre_fader = onoff;
1954 pre_fader_changed(src); /* EMIT SIGNAL */
1958 _mute_affects_post_fader = onoff;
1959 post_fader_changed(src); /* EMIT SIGNAL */
1963 _mute_affects_control_outs = onoff;
1964 control_outs_changed(src); /* EMIT SIGNAL */
1968 _mute_affects_main_outs = onoff;
1969 main_outs_changed(src); /* EMIT SIGNAL */
1975 Route::get_mute_config (mute_type t)
1981 onoff = _mute_affects_pre_fader;
1984 onoff = _mute_affects_post_fader;
1987 onoff = _mute_affects_control_outs;
1990 onoff = _mute_affects_main_outs;
1998 Route::set_active (bool yn)
2001 active_changed(); /* EMIT SIGNAL */
2005 Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2007 jack_nframes_t now = _session.transport_frame();
2010 Glib::RWLock::ReaderLock lm (redirect_lock);
2013 automation_snapshot (now);
2016 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2018 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2019 (*i)->deactivate ();
2023 (*i)->transport_stopped (now);
2027 IO::transport_stopped (now);
2029 _roll_delay = _initial_delay;
2033 Route::get_memento() const
2035 void (Route::*pmf)(state_id_t) = &Route::set_state;
2036 return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id);
2040 Route::set_state (state_id_t id)
2046 Route::input_change_handler (IOChange change, void *ignored)
2048 if (change & ConfigurationChanged) {
2049 reset_plugin_counts (0);
2054 Route::output_change_handler (IOChange change, void *ignored)
2056 if (change & ConfigurationChanged) {
2057 if (_control_outs) {
2058 _control_outs->ensure_io (0, n_outputs(), true, this);
2061 reset_plugin_counts (0);
2066 Route::pans_required () const
2068 if (n_outputs() < 2) {
2072 return max (n_inputs (), redirect_max_outs);
2076 Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2077 bool session_state_changing, bool can_record, bool rec_monitors_input)
2079 if (n_outputs() == 0) {
2083 if (session_state_changing || !_active) {
2084 silence (nframes, offset);
2088 apply_gain_automation = false;
2091 passthru (start_frame, end_frame, nframes, offset, 0, false);
2093 silence (nframes, offset);
2100 Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack_nframes_t& transport_frame)
2102 if (_roll_delay > nframes) {
2104 _roll_delay -= nframes;
2105 silence (nframes, offset);
2106 /* transport frame is not legal for caller to use */
2109 } else if (_roll_delay > 0) {
2111 nframes -= _roll_delay;
2113 silence (_roll_delay, offset);
2115 offset += _roll_delay;
2116 transport_frame += _roll_delay;
2125 Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, int declick,
2126 bool can_record, bool rec_monitors_input)
2129 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2131 // automation snapshot can also be called from the non-rt context
2132 // and it uses the redirect list, so we take the lock out here
2133 automation_snapshot (_session.transport_frame());
2137 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2138 silence (nframes, offset);
2142 jack_nframes_t unused = 0;
2144 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2150 apply_gain_automation = false;
2153 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2155 if (am.locked() && _session.transport_rolling()) {
2157 jack_nframes_t start_frame = end_frame - nframes;
2159 if (gain_automation_playback()) {
2160 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2165 passthru (start_frame, end_frame, nframes, offset, declick, false);
2171 Route::silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2172 bool can_record, bool rec_monitors_input)
2174 silence (nframes, offset);
2179 Route::toggle_monitor_input ()
2181 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2182 (*i)->request_monitor_input(!(*i)->monitoring_input());
2187 Route::has_external_redirects () const
2189 const PortInsert* pi;
2191 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2192 if ((pi = dynamic_cast<const PortInsert*>(*i)) != 0) {
2194 uint32_t no = pi->n_outputs();
2196 for (uint32_t n = 0; n < no; ++n) {
2198 string port_name = pi->output(n)->name();
2199 string client_name = port_name.substr (0, port_name.find(':'));
2201 /* only say "yes" if the redirect is actually in use */
2203 if (client_name != "ardour" && pi->active()) {
2214 Route::reset_midi_control (MIDI::Port* port, bool on)
2216 MIDI::channel_t chn;
2220 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2221 (*i)->reset_midi_control (port, on);
2224 IO::reset_midi_control (port, on);
2226 _midi_solo_control.get_control_info (chn, ev, extra);
2230 _midi_solo_control.midi_rebind (port, chn);
2232 _midi_mute_control.get_control_info (chn, ev, extra);
2236 _midi_mute_control.midi_rebind (port, chn);
2240 Route::send_all_midi_feedback ()
2242 if (_session.get_midi_feedback()) {
2245 Glib::RWLock::ReaderLock lm (redirect_lock);
2246 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2247 (*i)->send_all_midi_feedback ();
2251 IO::send_all_midi_feedback();
2253 _midi_solo_control.send_feedback (_soloed);
2254 _midi_mute_control.send_feedback (_muted);
2259 Route::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize)
2261 buf = _midi_solo_control.write_feedback (buf, bufsize, _soloed);
2262 buf = _midi_mute_control.write_feedback (buf, bufsize, _muted);
2265 Glib::RWLock::ReaderLock lm (redirect_lock);
2266 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2267 buf = (*i)->write_midi_feedback (buf, bufsize);
2271 return IO::write_midi_feedback (buf, bufsize);
2275 Route::flush_redirects ()
2277 /* XXX shouldn't really try to take this lock, since
2278 this is called from the RT audio thread.
2281 Glib::RWLock::ReaderLock lm (redirect_lock);
2283 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2284 (*i)->deactivate ();
2290 Route::set_meter_point (MeterPoint p, void *src)
2292 if (_meter_point != p) {
2294 meter_change (src); /* EMIT SIGNAL */
2295 _session.set_dirty ();
2300 Route::update_total_latency ()
2304 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2305 if ((*i)->active ()) {
2306 _own_latency += (*i)->latency ();
2310 set_port_latency (_own_latency);
2312 /* this (virtual) function is used for pure Routes,
2313 not derived classes like AudioTrack. this means
2314 that the data processed here comes from an input
2315 port, not prerecorded material, and therefore we
2316 have to take into account any input latency.
2319 _own_latency += input_latency ();
2321 return _own_latency;
2325 Route::set_latency_delay (jack_nframes_t longest_session_latency)
2327 _initial_delay = longest_session_latency - _own_latency;
2329 if (_session.transport_stopped()) {
2330 _roll_delay = _initial_delay;
2335 Route::automation_snapshot (jack_nframes_t now)
2337 IO::automation_snapshot (now);
2339 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2340 (*i)->automation_snapshot (now);
2344 Route::MIDIToggleControl::MIDIToggleControl (Route& s, ToggleType tp, MIDI::Port* port)
2345 : MIDI::Controllable (port, true), route (s), type(tp), setting(false)
2347 last_written = false; /* XXX need a good out-of-bound-value */
2351 Route::MIDIToggleControl::set_value (float val)
2354 MIDI::channel_t chn;
2355 MIDI::byte additional;
2357 get_control_info (chn, et, additional);
2361 #ifdef HOLD_TOGGLE_VALUES
2362 if (et == MIDI::off || et == MIDI::on) {
2364 /* literal toggle */
2368 route.set_mute (!route.muted(), this);
2371 route.set_solo (!route.soloed(), this);
2380 /* map full control range to a boolean */
2382 bool bval = ((val >= 0.5f) ? true: false);
2386 route.set_mute (bval, this);
2389 route.set_solo (bval, this);
2395 #ifdef HOLD_TOGGLE_VALUES
2403 Route::MIDIToggleControl::send_feedback (bool value)
2406 if (!setting && get_midi_feedback()) {
2407 MIDI::byte val = (MIDI::byte) (value ? 127: 0);
2408 MIDI::channel_t ch = 0;
2409 MIDI::eventType ev = MIDI::none;
2410 MIDI::byte additional = 0;
2411 MIDI::EventTwoBytes data;
2413 if (get_control_info (ch, ev, additional)) {
2414 data.controller_number = additional;
2416 last_written = value;
2418 route._session.send_midi_message (get_port(), ev, ch, data);
2425 Route::MIDIToggleControl::write_feedback (MIDI::byte* buf, int32_t& bufsize, bool val, bool force)
2427 if (get_midi_feedback() && bufsize > 2) {
2428 MIDI::channel_t ch = 0;
2429 MIDI::eventType ev = MIDI::none;
2430 MIDI::byte additional = 0;
2432 if (get_control_info (ch, ev, additional)) {
2433 if (val != last_written || force) {
2434 *buf++ = (0xF0 & ev) | (0xF & ch);
2435 *buf++ = additional; /* controller number */
2436 *buf++ = (MIDI::byte) (val ? 127 : 0);
2447 Route::set_block_size (jack_nframes_t nframes)
2449 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2450 (*i)->set_block_size (nframes);
2455 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2457 _session.update_latency_compensation (false, false);
2461 Route::protect_automation ()
2463 switch (gain_automation_state()) {
2466 set_gain_automation_state (Off);
2472 switch (panner().automation_state ()) {
2475 panner().set_automation_state (Off);
2481 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2483 if ((pi = dynamic_cast<PluginInsert*> (*i)) != 0) {
2484 pi->protect_automation ();
2490 Route::set_pending_declick (int declick)
2493 /* this call is not allowed to turn off a pending declick unless "force" is true */
2495 _pending_declick = declick;
2497 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2499 _pending_declick = 0;