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;
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 _solo_control (*this, ToggleControllable::SoloControl),
57 _mute_control (*this, ToggleControllable::MuteControl)
62 Route::Route (Session& sess, const XMLNode& node)
64 _solo_control (*this, ToggleControllable::SoloControl),
65 _mute_control (*this, ToggleControllable::MuteControl)
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));
112 GoingAway (); /* EMIT SIGNAL */
113 clear_redirects (this);
116 delete _control_outs;
121 Route::set_remote_control_id (uint32_t id)
123 if (id != _remote_control_id) {
124 _remote_control_id = id;
125 RemoteControlIDChanged ();
130 Route::remote_control_id() const
132 return _remote_control_id;
136 Route::order_key (string name) const
138 OrderKeys::const_iterator i;
140 if ((i = order_keys.find (name)) == order_keys.end()) {
148 Route::set_order_key (string name, long n)
150 order_keys[name] = n;
151 _session.set_dirty ();
155 Route::inc_gain (gain_t fraction, void *src)
157 IO::inc_gain (fraction, src);
161 Route::set_gain (gain_t val, void *src)
163 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
165 if (_mix_group->is_relative()) {
168 gain_t usable_gain = gain();
169 if (usable_gain < 0.000001f) {
170 usable_gain=0.000001f;
174 if (delta < 0.000001f) {
178 delta -= usable_gain;
180 if (delta == 0.0f) return;
182 gain_t factor = delta / usable_gain;
185 factor = _mix_group->get_max_factor(factor);
186 if (factor == 0.0f) {
191 factor = _mix_group->get_min_factor(factor);
192 if (factor == 0.0f) {
198 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
202 _mix_group->apply (&Route::set_gain, val, _mix_group);
212 IO::set_gain (val, src);
216 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
217 jack_nframes_t start_frame, jack_nframes_t end_frame,
218 jack_nframes_t nframes, jack_nframes_t offset, bool with_redirects, int declick,
222 RedirectList::iterator i;
223 bool post_fader_work = false;
224 bool mute_declick_applied = false;
226 vector<Sample*>::iterator bufiter;
230 bool no_monitor = (Config->get_use_hardware_monitoring() || !Config->get_use_sw_monitoring ());
231 gain_t* gab = _session.gain_automation_buffer();
233 declick = _pending_declick;
236 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
246 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
249 dmg = desired_mute_gain;
250 dsg = desired_solo_gain;
259 /* ----------------------------------------------------------------------------------------------------
260 GLOBAL DECLICK (for transport changes etc.)
261 -------------------------------------------------------------------------------------------------- */
264 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, _phase_invert);
265 _pending_declick = 0;
266 } else if (declick < 0) {
267 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, _phase_invert);
268 _pending_declick = 0;
271 /* no global declick */
273 if (solo_gain != dsg) {
274 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, _phase_invert);
280 /* ----------------------------------------------------------------------------------------------------
281 INPUT METERING & MONITORING
282 -------------------------------------------------------------------------------------------------- */
284 if (meter && (_meter_point == MeterInput)) {
285 for (n = 0; n < nbufs; ++n) {
286 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
290 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
291 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
293 mute_declick_applied = true;
296 if ((_meter_point == MeterInput) && co) {
298 solo_audible = dsg > 0;
299 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
301 if ( // muted by solo of another track
305 // muted by mute of this track
309 // rec-enabled but not s/w monitoring
311 // TODO: this is probably wrong
313 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
317 co->silence (nframes, offset);
321 co->deliver_output (bufs, nbufs, nframes, offset);
326 /* ----------------------------------------------------------------------------------------------------
328 -------------------------------------------------------------------------------------------------- */
330 if (with_redirects) {
331 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
333 if (mute_gain > 0 || !_mute_affects_pre_fader) {
334 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
335 switch ((*i)->placement()) {
337 (*i)->run (bufs, nbufs, nframes, offset);
340 post_fader_work = true;
345 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
346 switch ((*i)->placement()) {
348 (*i)->silence (nframes, offset);
351 post_fader_work = true;
360 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
361 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
363 mute_declick_applied = true;
366 /* ----------------------------------------------------------------------------------------------------
367 PRE-FADER METERING & MONITORING
368 -------------------------------------------------------------------------------------------------- */
370 if (meter && (_meter_point == MeterPreFader)) {
371 for (n = 0; n < nbufs; ++n) {
372 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
377 if ((_meter_point == MeterPreFader) && co) {
379 solo_audible = dsg > 0;
380 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
382 if ( // muted by solo of another track
386 // muted by mute of this track
390 // rec-enabled but not s/w monitoring
392 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
396 co->silence (nframes, offset);
400 co->deliver_output (bufs, nbufs, nframes, offset);
405 /* ----------------------------------------------------------------------------------------------------
407 -------------------------------------------------------------------------------------------------- */
409 /* if not recording or recording and requiring any monitor signal, then apply gain */
411 if ( // not recording
413 !(record_enabled() && _session.actively_recording()) ||
417 // h/w monitoring not in use
419 (!Config->get_use_hardware_monitoring() &&
421 // AND software monitoring required
423 Config->get_use_sw_monitoring())) {
425 if (apply_gain_automation) {
428 for (n = 0; n < nbufs; ++n) {
429 Sample *sp = bufs[n];
431 for (jack_nframes_t nx = 0; nx < nframes; ++nx) {
436 for (n = 0; n < nbufs; ++n) {
437 Sample *sp = bufs[n];
439 for (jack_nframes_t nx = 0; nx < nframes; ++nx) {
445 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
446 _effective_gain = gab[nframes-1];
451 /* manual (scalar) gain */
455 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
458 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
460 /* no need to interpolate current gain value,
461 but its non-unity, so apply it. if the gain
462 is zero, do nothing because we'll ship silence
474 for (n = 0; n < nbufs; ++n) {
475 Sample *sp = bufs[n];
476 apply_gain_to_buffer(sp,nframes,this_gain);
479 } else if (_gain == 0) {
480 for (n = 0; n < nbufs; ++n) {
481 memset (bufs[n], 0, sizeof (Sample) * nframes);
488 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
492 /* ----------------------------------------------------------------------------------------------------
494 -------------------------------------------------------------------------------------------------- */
496 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
498 if (post_fader_work) {
500 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
502 if (mute_gain > 0 || !_mute_affects_post_fader) {
503 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
504 switch ((*i)->placement()) {
508 (*i)->run (bufs, nbufs, nframes, offset);
513 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
514 switch ((*i)->placement()) {
518 (*i)->silence (nframes, offset);
526 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
527 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
529 mute_declick_applied = true;
532 /* ----------------------------------------------------------------------------------------------------
534 -------------------------------------------------------------------------------------------------- */
536 if ((_meter_point == MeterPostFader) && co) {
538 solo_audible = solo_gain > 0;
539 mute_audible = dmg > 0 || !_mute_affects_control_outs;
541 if ( // silent anyway
543 (_gain == 0 && !apply_gain_automation) ||
545 // muted by solo of another track
549 // muted by mute of this track
553 // recording but not s/w monitoring
555 (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
559 co->silence (nframes, offset);
563 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
567 /* ----------------------------------------------------------------------
569 ----------------------------------------------------------------------*/
571 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
572 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
574 mute_declick_applied = true;
577 /* ----------------------------------------------------------------------------------------------------
579 -------------------------------------------------------------------------------------------------- */
581 solo_audible = dsg > 0;
582 mute_audible = dmg > 0 || !_mute_affects_main_outs;
584 if (n_outputs() == 0) {
588 } else if (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording())) {
590 IO::silence (nframes, offset);
594 if ( // silent anyway
596 (_gain == 0 && !apply_gain_automation) ||
598 // muted by solo of another track, but not using control outs for solo
600 (!solo_audible && (_session.solo_model() != Session::SoloBus)) ||
602 // muted by mute of this track
608 /* don't use Route::silence() here, because that causes
609 all outputs (sends, port inserts, etc. to be silent).
612 if (_meter_point == MeterPostFader) {
613 reset_peak_meters ();
616 IO::silence (nframes, offset);
620 if (_session.transport_speed() > 1.5f || _session.transport_speed() < -1.5f) {
621 pan (bufs, nbufs, nframes, offset, speed_quietning);
623 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
624 if (!_panner->empty() &&
625 (_panner->automation_state() & Play ||
626 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
627 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
629 pan (bufs, nbufs, nframes, offset, 1.0);
636 /* ----------------------------------------------------------------------------------------------------
638 -------------------------------------------------------------------------------------------------- */
640 if (meter && (_meter_point == MeterPostFader)) {
641 // cerr << "meter post" << endl;
643 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
644 uint32_t no = n_outputs();
645 for (n = 0; n < no; ++n) {
649 uint32_t no = n_outputs();
650 for (n = 0; n < no; ++n) {
651 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
658 Route::n_process_buffers ()
660 return max (n_inputs(), redirect_max_outs);
665 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)
667 vector<Sample*>& bufs = _session.get_passthru_buffers();
668 uint32_t limit = n_process_buffers ();
672 collect_input (bufs, limit, nframes, offset);
674 #define meter_stream meter_first
677 for (uint32_t n = 0; n < limit; ++n) {
678 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
680 meter_stream = false;
685 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
691 Route::set_phase_invert (bool yn, void *src)
693 if (_phase_invert != yn) {
696 // phase_invert_changed (src); /* EMIT SIGNAL */
700 Route::set_solo (bool yn, void *src)
706 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
707 _mix_group->apply (&Route::set_solo, yn, _mix_group);
713 solo_changed (src); /* EMIT SIGNAL */
714 _solo_control.Changed (); /* EMIT SIGNAL */
719 Route::set_solo_mute (bool yn)
721 Glib::Mutex::Lock lm (declick_lock);
723 /* Called by Session in response to another Route being soloed.
726 desired_solo_gain = (yn?0.0:1.0);
730 Route::set_solo_safe (bool yn, void *src)
732 if (_solo_safe != yn) {
734 solo_safe_changed (src); /* EMIT SIGNAL */
739 Route::set_mute (bool yn, void *src)
742 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
743 _mix_group->apply (&Route::set_mute, yn, _mix_group);
749 mute_changed (src); /* EMIT SIGNAL */
751 _mute_control.Changed (); /* EMIT SIGNAL */
753 Glib::Mutex::Lock lm (declick_lock);
754 desired_mute_gain = (yn?0.0f:1.0f);
759 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
761 uint32_t old_rmo = redirect_max_outs;
763 if (!_session.engine().connected()) {
768 Glib::RWLock::WriterLock lm (redirect_lock);
770 boost::shared_ptr<PluginInsert> pi;
771 boost::shared_ptr<PortInsert> porti;
773 uint32_t potential_max_streams = 0;
775 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
778 if (pi->input_streams() == 0) {
779 /* instrument plugin */
780 _have_internal_generator = true;
783 potential_max_streams = max(pi->input_streams(), pi->output_streams());
785 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
787 /* force new port inserts to start out with an i/o configuration
788 that matches this route's i/o configuration.
790 the "inputs" for the port are supposed to match the output
793 the "outputs" of the route should match the inputs of this
794 route. XXX shouldn't they match the number of active signal
795 streams at the point of insertion?
799 porti->ensure_io (n_outputs (), n_inputs(), false, this);
802 // Ensure peak vector sizes before the plugin is activated
803 while (_peak_power.size() < potential_max_streams) {
804 _peak_power.push_back(0);
806 while (_visible_peak_power.size() < potential_max_streams) {
807 _visible_peak_power.push_back(0);
810 _redirects.push_back (redirect);
812 if (_reset_plugin_counts (err_streams)) {
813 _redirects.pop_back ();
814 _reset_plugin_counts (0); // it worked before we tried to add it ...
818 redirect->activate ();
819 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
822 if (redirect_max_outs != old_rmo || old_rmo == 0) {
827 redirects_changed (src); /* EMIT SIGNAL */
832 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
834 uint32_t old_rmo = redirect_max_outs;
836 if (!_session.engine().connected()) {
841 Glib::RWLock::WriterLock lm (redirect_lock);
843 RedirectList::iterator existing_end = _redirects.end();
846 uint32_t potential_max_streams = 0;
848 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
850 boost::shared_ptr<PluginInsert> pi;
852 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
855 uint32_t m = max(pi->input_streams(), pi->output_streams());
856 if (m > potential_max_streams)
857 potential_max_streams = m;
860 // Ensure peak vector sizes before the plugin is activated
861 while (_peak_power.size() < potential_max_streams) {
862 _peak_power.push_back(0);
864 while (_visible_peak_power.size() < potential_max_streams) {
865 _visible_peak_power.push_back(0);
868 _redirects.push_back (*i);
870 if (_reset_plugin_counts (err_streams)) {
872 _redirects.erase (existing_end, _redirects.end());
873 _reset_plugin_counts (0); // it worked before we tried to add it ...
878 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
882 if (redirect_max_outs != old_rmo || old_rmo == 0) {
886 redirects_changed (src); /* EMIT SIGNAL */
891 Route::clear_redirects (void *src)
893 uint32_t old_rmo = redirect_max_outs;
895 if (!_session.engine().connected()) {
900 Glib::RWLock::WriterLock lm (redirect_lock);
904 if (redirect_max_outs != old_rmo) {
908 redirect_max_outs = 0;
909 _have_internal_generator = false;
910 redirects_changed (src); /* EMIT SIGNAL */
914 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
916 uint32_t old_rmo = redirect_max_outs;
918 if (!_session.engine().connected()) {
922 redirect_max_outs = 0;
925 Glib::RWLock::WriterLock lm (redirect_lock);
926 RedirectList::iterator i;
927 bool removed = false;
929 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
930 if (*i == redirect) {
932 RedirectList::iterator tmp;
934 /* move along, see failure case for reset_plugin_counts()
935 where we may need to reinsert the redirect.
941 /* stop redirects that send signals to JACK ports
942 from causing noise as a result of no longer being
946 boost::shared_ptr<Send> send;
947 boost::shared_ptr<PortInsert> port_insert;
949 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
950 send->disconnect_inputs (this);
951 send->disconnect_outputs (this);
952 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
953 port_insert->disconnect_inputs (this);
954 port_insert->disconnect_outputs (this);
957 _redirects.erase (i);
970 if (_reset_plugin_counts (err_streams)) {
971 /* get back to where we where */
972 _redirects.insert (i, redirect);
973 /* we know this will work, because it worked before :) */
974 _reset_plugin_counts (0);
980 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
981 boost::shared_ptr<PluginInsert> pi;
983 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
984 if (pi->is_generator()) {
990 _have_internal_generator = foo;
993 if (old_rmo != redirect_max_outs) {
997 redirects_changed (src); /* EMIT SIGNAL */
1002 Route::reset_plugin_counts (uint32_t* lpc)
1004 Glib::RWLock::WriterLock lm (redirect_lock);
1005 return _reset_plugin_counts (lpc);
1010 Route::_reset_plugin_counts (uint32_t* err_streams)
1012 RedirectList::iterator r;
1015 map<Placement,list<InsertCount> > insert_map;
1016 jack_nframes_t initial_streams;
1018 redirect_max_outs = 0;
1022 /* divide inserts up by placement so we get the signal flow
1023 properly modelled. we need to do this because the _redirects
1024 list is not sorted by placement, and because other reasons may
1025 exist now or in the future for this separate treatment.
1028 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1030 boost::shared_ptr<Insert> insert;
1032 /* do this here in case we bomb out before we get to the end of
1036 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1038 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1040 insert_map[insert->placement()].push_back (InsertCount (insert));
1042 /* reset plugin counts back to one for now so
1043 that we have a predictable, controlled
1044 state to try to configure.
1047 boost::shared_ptr<PluginInsert> pi;
1049 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1053 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1066 /* Now process each placement in order, checking to see if we
1067 can really do what has been requested.
1072 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1076 /* figure out the streams that will feed into PreFader */
1078 if (!insert_map[PreFader].empty()) {
1079 InsertCount& ic (insert_map[PreFader].back());
1080 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1082 initial_streams = n_inputs ();
1087 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1091 /* OK, everything can be set up correctly, so lets do it */
1093 apply_some_plugin_counts (insert_map[PreFader]);
1094 apply_some_plugin_counts (insert_map[PostFader]);
1096 /* recompute max outs of any redirect */
1100 redirect_max_outs = 0;
1101 RedirectList::iterator prev = _redirects.end();
1103 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1104 boost::shared_ptr<Send> s;
1106 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1107 if (r == _redirects.begin()) {
1108 s->expect_inputs (n_inputs());
1110 s->expect_inputs ((*prev)->output_streams());
1114 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1123 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1125 list<InsertCount>::iterator i;
1127 for (i = iclist.begin(); i != iclist.end(); ++i) {
1129 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1132 /* make sure that however many we have, they are all active */
1133 (*i).insert->activate ();
1140 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1142 list<InsertCount>::iterator i;
1144 for (i = iclist.begin(); i != iclist.end(); ++i) {
1146 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1148 *err_streams = required_inputs;
1153 (*i).in = required_inputs;
1154 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1156 required_inputs = (*i).out;
1163 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1165 uint32_t old_rmo = redirect_max_outs;
1171 RedirectList to_be_deleted;
1174 Glib::RWLock::WriterLock lm (redirect_lock);
1175 RedirectList::iterator tmp;
1176 RedirectList the_copy;
1178 the_copy = _redirects;
1180 /* remove all relevant redirects */
1182 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1186 if ((*i)->placement() == placement) {
1187 to_be_deleted.push_back (*i);
1188 _redirects.erase (i);
1194 /* now copy the relevant ones from "other" */
1196 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1197 if ((*i)->placement() == placement) {
1198 _redirects.push_back (Redirect::clone (*i));
1202 /* reset plugin stream handling */
1204 if (_reset_plugin_counts (err_streams)) {
1206 /* FAILED COPY ATTEMPT: we have to restore order */
1208 /* delete all cloned redirects */
1210 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1215 if ((*i)->placement() == placement) {
1216 _redirects.erase (i);
1222 /* restore the natural order */
1224 _redirects = the_copy;
1225 redirect_max_outs = old_rmo;
1227 /* we failed, even though things are OK again */
1233 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1234 to_be_deleted.clear ();
1238 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1242 redirects_changed (this); /* EMIT SIGNAL */
1247 Route::all_redirects_flip ()
1249 Glib::RWLock::ReaderLock lm (redirect_lock);
1251 if (_redirects.empty()) {
1255 bool first_is_on = _redirects.front()->active();
1257 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1258 (*i)->set_active (!first_is_on, this);
1263 Route::all_redirects_active (bool state)
1265 Glib::RWLock::ReaderLock lm (redirect_lock);
1267 if (_redirects.empty()) {
1271 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1272 (*i)->set_active (state, this);
1276 struct RedirectSorter {
1277 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1278 return a->sort_key() < b->sort_key();
1283 Route::sort_redirects (uint32_t* err_streams)
1286 RedirectSorter comparator;
1287 Glib::RWLock::WriterLock lm (redirect_lock);
1288 uint32_t old_rmo = redirect_max_outs;
1290 /* the sweet power of C++ ... */
1292 RedirectList as_it_was_before = _redirects;
1294 _redirects.sort (comparator);
1296 if (_reset_plugin_counts (err_streams)) {
1297 _redirects = as_it_was_before;
1298 redirect_max_outs = old_rmo;
1304 redirects_changed (this); /* EMIT SIGNAL */
1316 Route::get_template()
1318 return state(false);
1322 Route::state(bool full_state)
1324 XMLNode *node = new XMLNode("Route");
1326 RedirectList:: iterator i;
1330 snprintf (buf, sizeof (buf), "0x%x", _flags);
1331 node->add_property("flags", buf);
1333 node->add_property("active", _active?"yes":"no");
1334 node->add_property("muted", _muted?"yes":"no");
1335 node->add_property("soloed", _soloed?"yes":"no");
1336 node->add_property("phase-invert", _phase_invert?"yes":"no");
1337 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1338 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1339 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1340 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1343 node->add_property("edit-group", _edit_group->name());
1346 node->add_property("mix-group", _mix_group->name());
1349 string order_string;
1350 OrderKeys::iterator x = order_keys.begin();
1352 while (x != order_keys.end()) {
1353 order_string += (*x).first;
1354 order_string += '=';
1355 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1356 order_string += buf;
1360 if (x == order_keys.end()) {
1364 order_string += ':';
1366 node->add_property ("order-keys", order_string);
1368 node->add_child_nocopy (IO::state (full_state));
1370 if (_control_outs) {
1371 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1372 cnode->add_child_nocopy (_control_outs->state (full_state));
1373 node->add_child_nocopy (*cnode);
1376 if (_comment.length()) {
1377 XMLNode *cmt = node->add_child ("Comment");
1378 cmt->add_content (_comment);
1384 path = _session.snap_name();
1386 path += legalize_for_path (_name);
1387 path += ".automation";
1389 /* XXX we didn't ask for a state save, we asked for the current state.
1393 if (save_automation (path)) {
1394 error << _("Could not get state of route. Problem with save_automation") << endmsg;
1397 aevents = node->add_child ("Automation");
1398 aevents->add_property ("path", path);
1401 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1402 node->add_child_nocopy((*i)->state (full_state));
1406 node->add_child_copy (*_extra_xml);
1413 Route::set_deferred_state ()
1416 XMLNodeConstIterator niter;
1418 if (!deferred_state) {
1422 nlist = deferred_state->children();
1424 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1425 add_redirect_from_xml (**niter);
1428 delete deferred_state;
1433 Route::add_redirect_from_xml (const XMLNode& node)
1435 const XMLProperty *prop;
1437 if (node.name() == "Send") {
1441 boost::shared_ptr<Send> send (new Send (_session, node));
1442 add_redirect (send, this);
1445 catch (failed_constructor &err) {
1446 error << _("Send construction failed") << endmsg;
1450 } else if (node.name() == "Insert") {
1453 if ((prop = node.property ("type")) != 0) {
1455 boost::shared_ptr<Insert> insert;
1457 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1459 insert.reset (new PluginInsert(_session, node));
1461 } else if (prop->value() == "port") {
1464 insert.reset (new PortInsert (_session, node));
1468 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1471 add_redirect (insert, this);
1474 error << _("Insert XML node has no type property") << endmsg;
1478 catch (failed_constructor &err) {
1479 warning << _("insert could not be created. Ignored.") << endmsg;
1486 Route::set_state (const XMLNode& node)
1489 XMLNodeConstIterator niter;
1491 XMLPropertyList plist;
1492 const XMLProperty *prop;
1494 if (node.name() != "Route"){
1495 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1499 if ((prop = node.property ("flags")) != 0) {
1501 sscanf (prop->value().c_str(), "0x%x", &x);
1507 if ((prop = node.property ("phase-invert")) != 0) {
1508 set_phase_invert(prop->value()=="yes"?true:false, this);
1511 if ((prop = node.property ("active")) != 0) {
1512 set_active (prop->value() == "yes");
1515 if ((prop = node.property ("muted")) != 0) {
1516 bool yn = prop->value()=="yes"?true:false;
1518 /* force reset of mute status */
1522 mute_gain = desired_mute_gain;
1525 if ((prop = node.property ("soloed")) != 0) {
1526 bool yn = prop->value()=="yes"?true:false;
1528 /* force reset of solo status */
1531 set_solo (yn, this);
1532 solo_gain = desired_solo_gain;
1535 if ((prop = node.property ("mute-affects-pre-fader")) != 0) {
1536 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1539 if ((prop = node.property ("mute-affects-post-fader")) != 0) {
1540 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1543 if ((prop = node.property ("mute-affects-control-outs")) != 0) {
1544 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1547 if ((prop = node.property ("mute-affects-main-outs")) != 0) {
1548 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1551 if ((prop = node.property ("edit-group")) != 0) {
1552 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1553 if(edit_group == 0) {
1554 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1556 set_edit_group(edit_group, this);
1560 if ((prop = node.property ("order-keys")) != 0) {
1564 string::size_type colon, equal;
1565 string remaining = prop->value();
1567 while (remaining.length()) {
1569 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1570 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1573 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1574 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1577 set_order_key (remaining.substr (0, equal), n);
1581 colon = remaining.find_first_of (':');
1583 if (colon != string::npos) {
1584 remaining = remaining.substr (colon+1);
1591 nlist = node.children();
1593 if (deferred_state) {
1594 delete deferred_state;
1597 deferred_state = new XMLNode("deferred state");
1599 /* set parent class properties before anything else */
1601 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1605 if (child->name() == IO::state_node_name) {
1607 IO::set_state (*child);
1612 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1616 if (child->name() == "Send") {
1619 if (!IO::ports_legal) {
1621 deferred_state->add_child_copy (*child);
1624 add_redirect_from_xml (*child);
1627 } else if (child->name() == "Insert") {
1629 if (!IO::ports_legal) {
1631 deferred_state->add_child_copy (*child);
1635 add_redirect_from_xml (*child);
1638 } else if (child->name() == "Automation") {
1640 XMLPropertyList plist;
1641 XMLPropertyConstIterator piter;
1644 plist = child->properties();
1645 for (piter = plist.begin(); piter != plist.end(); ++piter) {
1647 if (prop->name() == "path") {
1648 load_automation (prop->value());
1652 } else if (child->name() == "ControlOuts") {
1654 string coutname = _name;
1655 coutname += _("[control]");
1657 _control_outs = new IO (_session, coutname);
1658 _control_outs->set_state (**(child->children().begin()));
1660 } else if (child->name() == "Comment") {
1662 /* XXX this is a terrible API design in libxml++ */
1664 XMLNode *cmt = *(child->children().begin());
1665 _comment = cmt->content();
1667 } else if (child->name() == "extra") {
1668 _extra_xml = new XMLNode (*child);
1672 if ((prop = node.property ("mix-group")) != 0) {
1673 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1674 if (mix_group == 0) {
1675 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1677 set_mix_group(mix_group, this);
1685 Route::curve_reallocate ()
1687 // _gain_automation_curve.finish_resize ();
1688 // _pan_automation_curve.finish_resize ();
1692 Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
1696 // reset_peak_meters ();
1698 IO::silence (nframes, offset);
1700 if (_control_outs) {
1701 _control_outs->silence (nframes, offset);
1705 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1708 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1709 boost::shared_ptr<PluginInsert> pi;
1710 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1711 // skip plugins, they don't need anything when we're not active
1715 (*i)->silence (nframes, offset);
1718 if (nframes == _session.get_block_size() && offset == 0) {
1728 Route::set_control_outs (const vector<string>& ports)
1730 Glib::Mutex::Lock lm (control_outs_lock);
1731 vector<string>::const_iterator i;
1733 if (_control_outs) {
1734 delete _control_outs;
1738 if (ports.empty()) {
1742 string coutname = _name;
1743 coutname += _("[control]");
1745 _control_outs = new IO (_session, coutname);
1747 /* our control outs need as many outputs as we
1748 have outputs. we track the changes in ::output_change_handler().
1751 _control_outs->ensure_io (0, n_outputs(), true, this);
1757 Route::set_edit_group (RouteGroup *eg, void *src)
1760 if (eg == _edit_group) {
1765 _edit_group->remove (this);
1768 if ((_edit_group = eg) != 0) {
1769 _edit_group->add (this);
1772 _session.set_dirty ();
1773 edit_group_changed (src); /* EMIT SIGNAL */
1777 Route::drop_edit_group (void *src)
1780 _session.set_dirty ();
1781 edit_group_changed (src); /* EMIT SIGNAL */
1785 Route::set_mix_group (RouteGroup *mg, void *src)
1788 if (mg == _mix_group) {
1793 _mix_group->remove (this);
1796 if ((_mix_group = mg) != 0) {
1797 _mix_group->add (this);
1800 _session.set_dirty ();
1801 mix_group_changed (src); /* EMIT SIGNAL */
1805 Route::drop_mix_group (void *src)
1808 _session.set_dirty ();
1809 mix_group_changed (src); /* EMIT SIGNAL */
1813 Route::set_comment (string cmt, void *src)
1816 comment_changed (src);
1817 _session.set_dirty ();
1821 Route::feeds (boost::shared_ptr<Route> other)
1826 uint32_t no = self.n_outputs();
1827 uint32_t ni = other->n_inputs ();
1829 for (i = 0; i < no; ++i) {
1830 for (j = 0; j < ni; ++j) {
1831 if (self.output(i)->connected_to (other->input(j)->name())) {
1837 /* check Redirects which may also interconnect Routes */
1839 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
1841 no = (*r)->n_outputs();
1843 for (i = 0; i < no; ++i) {
1844 for (j = 0; j < ni; ++j) {
1845 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
1852 /* check for control room outputs which may also interconnect Routes */
1854 if (_control_outs) {
1856 no = _control_outs->n_outputs();
1858 for (i = 0; i < no; ++i) {
1859 for (j = 0; j < ni; ++j) {
1860 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
1871 Route::set_mute_config (mute_type t, bool onoff, void *src)
1875 _mute_affects_pre_fader = onoff;
1876 pre_fader_changed(src); /* EMIT SIGNAL */
1880 _mute_affects_post_fader = onoff;
1881 post_fader_changed(src); /* EMIT SIGNAL */
1885 _mute_affects_control_outs = onoff;
1886 control_outs_changed(src); /* EMIT SIGNAL */
1890 _mute_affects_main_outs = onoff;
1891 main_outs_changed(src); /* EMIT SIGNAL */
1897 Route::get_mute_config (mute_type t)
1903 onoff = _mute_affects_pre_fader;
1906 onoff = _mute_affects_post_fader;
1909 onoff = _mute_affects_control_outs;
1912 onoff = _mute_affects_main_outs;
1920 Route::set_active (bool yn)
1923 active_changed(); /* EMIT SIGNAL */
1927 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
1929 jack_nframes_t now = _session.transport_frame();
1932 Glib::RWLock::ReaderLock lm (redirect_lock);
1935 automation_snapshot (now);
1938 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1940 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
1941 (*i)->deactivate ();
1945 (*i)->transport_stopped (now);
1949 IO::transport_stopped (now);
1951 _roll_delay = _initial_delay;
1955 Route::get_memento() const
1957 void (Route::*pmf)(state_id_t) = &Route::set_state;
1958 return sigc::bind (mem_fun (*(const_cast<Route *>(this)), pmf), _current_state_id);
1962 Route::set_state (state_id_t id)
1968 Route::input_change_handler (IOChange change, void *ignored)
1970 if (change & ConfigurationChanged) {
1971 reset_plugin_counts (0);
1976 Route::output_change_handler (IOChange change, void *ignored)
1978 if (change & ConfigurationChanged) {
1979 if (_control_outs) {
1980 _control_outs->ensure_io (0, n_outputs(), true, this);
1983 reset_plugin_counts (0);
1988 Route::pans_required () const
1990 if (n_outputs() < 2) {
1994 return max (n_inputs (), redirect_max_outs);
1998 Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
1999 bool session_state_changing, bool can_record, bool rec_monitors_input)
2001 if (n_outputs() == 0) {
2005 if (session_state_changing || !_active) {
2006 silence (nframes, offset);
2010 apply_gain_automation = false;
2013 passthru (start_frame, end_frame, nframes, offset, 0, false);
2015 silence (nframes, offset);
2022 Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack_nframes_t& transport_frame)
2024 if (_roll_delay > nframes) {
2026 _roll_delay -= nframes;
2027 silence (nframes, offset);
2028 /* transport frame is not legal for caller to use */
2031 } else if (_roll_delay > 0) {
2033 nframes -= _roll_delay;
2035 silence (_roll_delay, offset);
2037 offset += _roll_delay;
2038 transport_frame += _roll_delay;
2047 Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, int declick,
2048 bool can_record, bool rec_monitors_input)
2051 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2053 // automation snapshot can also be called from the non-rt context
2054 // and it uses the redirect list, so we take the lock out here
2055 automation_snapshot (_session.transport_frame());
2059 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2060 silence (nframes, offset);
2064 jack_nframes_t unused = 0;
2066 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2072 apply_gain_automation = false;
2075 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2077 if (am.locked() && _session.transport_rolling()) {
2079 jack_nframes_t start_frame = end_frame - nframes;
2081 if (gain_automation_playback()) {
2082 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2087 passthru (start_frame, end_frame, nframes, offset, declick, false);
2093 Route::silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset,
2094 bool can_record, bool rec_monitors_input)
2096 silence (nframes, offset);
2101 Route::toggle_monitor_input ()
2103 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2104 (*i)->request_monitor_input(!(*i)->monitoring_input());
2109 Route::has_external_redirects () const
2111 boost::shared_ptr<const PortInsert> pi;
2113 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2114 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2116 uint32_t no = pi->n_outputs();
2118 for (uint32_t n = 0; n < no; ++n) {
2120 string port_name = pi->output(n)->name();
2121 string client_name = port_name.substr (0, port_name.find(':'));
2123 /* only say "yes" if the redirect is actually in use */
2125 if (client_name != "ardour" && pi->active()) {
2136 Route::flush_redirects ()
2138 /* XXX shouldn't really try to take this lock, since
2139 this is called from the RT audio thread.
2142 Glib::RWLock::ReaderLock lm (redirect_lock);
2144 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2145 (*i)->deactivate ();
2151 Route::set_meter_point (MeterPoint p, void *src)
2153 if (_meter_point != p) {
2155 meter_change (src); /* EMIT SIGNAL */
2156 _session.set_dirty ();
2161 Route::update_total_latency ()
2165 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2166 if ((*i)->active ()) {
2167 _own_latency += (*i)->latency ();
2171 set_port_latency (_own_latency);
2173 /* this (virtual) function is used for pure Routes,
2174 not derived classes like AudioTrack. this means
2175 that the data processed here comes from an input
2176 port, not prerecorded material, and therefore we
2177 have to take into account any input latency.
2180 _own_latency += input_latency ();
2182 return _own_latency;
2186 Route::set_latency_delay (jack_nframes_t longest_session_latency)
2188 _initial_delay = longest_session_latency - _own_latency;
2190 if (_session.transport_stopped()) {
2191 _roll_delay = _initial_delay;
2196 Route::automation_snapshot (jack_nframes_t now)
2198 IO::automation_snapshot (now);
2200 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2201 (*i)->automation_snapshot (now);
2205 Route::ToggleControllable::ToggleControllable (Route& s, ToggleType tp)
2206 : route (s), type(tp)
2212 Route::ToggleControllable::set_value (float val)
2214 bool bval = ((val >= 0.5f) ? true: false);
2218 route.set_mute (bval, this);
2221 route.set_solo (bval, this);
2229 Route::ToggleControllable::get_value (void) const
2235 val = route.muted() ? 1.0f : 0.0f;
2238 val = route.soloed() ? 1.0f : 0.0f;
2248 Route::set_block_size (jack_nframes_t nframes)
2250 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2251 (*i)->set_block_size (nframes);
2256 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2258 _session.update_latency_compensation (false, false);
2262 Route::protect_automation ()
2264 switch (gain_automation_state()) {
2267 set_gain_automation_state (Off);
2273 switch (panner().automation_state ()) {
2276 panner().set_automation_state (Off);
2282 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2283 boost::shared_ptr<PluginInsert> pi;
2284 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2285 pi->protect_automation ();
2291 Route::set_pending_declick (int declick)
2294 /* this call is not allowed to turn off a pending declick unless "force" is true */
2296 _pending_declick = declick;
2298 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2300 _pending_declick = 0;