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>
26 #include <pbd/enumwriter.h>
28 #include <ardour/timestamps.h>
29 #include <ardour/buffer.h>
30 #include <ardour/audioengine.h>
31 #include <ardour/route.h>
32 #include <ardour/insert.h>
33 #include <ardour/send.h>
34 #include <ardour/session.h>
35 #include <ardour/utils.h>
36 #include <ardour/configuration.h>
37 #include <ardour/cycle_timer.h>
38 #include <ardour/route_group.h>
39 #include <ardour/port.h>
40 #include <ardour/ladspa_plugin.h>
41 #include <ardour/panner.h>
42 #include <ardour/dB.h>
43 #include <ardour/mix.h>
48 using namespace ARDOUR;
51 uint32_t Route::order_key_cnt = 0;
52 sigc::signal<void> Route::SyncOrderKeys;
54 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
55 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
57 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
58 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
63 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
64 : IO (sess, *node.child ("IO"), default_type),
65 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
66 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
69 _set_state (node, false);
75 redirect_max_outs = 0;
79 _phase_invert = false;
80 _denormal_protection = false;
81 order_keys[strdup (N_("signal"))] = order_key_cnt++;
84 _meter_point = MeterPostFader;
88 _have_internal_generator = false;
90 _pending_declick = true;
91 _remote_control_id = 0;
92 _ignore_gain_on_deliver = true;
97 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
98 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
99 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
100 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
103 desired_solo_gain = 1.0;
105 desired_mute_gain = 1.0;
109 input_changed.connect (mem_fun (this, &Route::input_change_handler));
110 output_changed.connect (mem_fun (this, &Route::output_change_handler));
115 clear_redirects (PreFader, this);
116 clear_redirects (PostFader, this);
118 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
119 free ((void*)(i->first));
123 delete _control_outs;
128 Route::set_remote_control_id (uint32_t id)
130 if (id != _remote_control_id) {
131 _remote_control_id = id;
132 RemoteControlIDChanged ();
137 Route::remote_control_id() const
139 return _remote_control_id;
143 Route::order_key (const char* name) const
145 OrderKeys::const_iterator i;
147 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
148 if (!strcmp (name, i->first)) {
157 Route::set_order_key (const char* name, long n)
159 order_keys[strdup(name)] = n;
161 if (Config->get_sync_all_route_ordering()) {
162 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
167 _session.set_dirty ();
171 Route::sync_order_keys ()
175 if (order_keys.empty()) {
179 OrderKeys::iterator x = order_keys.begin();
183 for (; x != order_keys.end(); ++x) {
189 Route::inc_gain (gain_t fraction, void *src)
191 IO::inc_gain (fraction, src);
195 Route::set_gain (gain_t val, void *src)
197 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
199 if (_mix_group->is_relative()) {
202 gain_t usable_gain = gain();
203 if (usable_gain < 0.000001f) {
204 usable_gain=0.000001f;
208 if (delta < 0.000001f) {
212 delta -= usable_gain;
214 if (delta == 0.0f) return;
216 gain_t factor = delta / usable_gain;
219 factor = _mix_group->get_max_factor(factor);
220 if (factor == 0.0f) {
225 factor = _mix_group->get_min_factor(factor);
226 if (factor == 0.0f) {
232 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
236 _mix_group->apply (&Route::set_gain, val, _mix_group);
246 IO::set_gain (val, src);
250 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
251 nframes_t start_frame, nframes_t end_frame,
252 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
256 RedirectList::iterator i;
257 bool post_fader_work = false;
258 bool mute_declick_applied = false;
260 vector<Sample*>::iterator bufiter;
265 gain_t* gab = _session.gain_automation_buffer();
267 switch (Config->get_monitoring_model()) {
268 case HardwareMonitoring:
269 case ExternalMonitoring:
276 declick = _pending_declick;
279 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
289 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
292 dmg = desired_mute_gain;
293 dsg = desired_solo_gain;
302 /* ----------------------------------------------------------------------------------------------------
303 GLOBAL DECLICK (for transport changes etc.)
304 -------------------------------------------------------------------------------------------------- */
307 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, false);
308 _pending_declick = 0;
309 } else if (declick < 0) {
310 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, false);
311 _pending_declick = 0;
314 /* no global declick */
316 if (solo_gain != dsg) {
317 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, false);
323 /* ----------------------------------------------------------------------------------------------------
324 INPUT METERING & MONITORING
325 -------------------------------------------------------------------------------------------------- */
327 if (meter && (_meter_point == MeterInput)) {
328 for (n = 0; n < nbufs; ++n) {
329 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
333 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
334 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
336 mute_declick_applied = true;
339 if ((_meter_point == MeterInput) && co) {
341 solo_audible = dsg > 0;
342 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
344 if ( // muted by solo of another track
348 // muted by mute of this track
352 // rec-enabled but not s/w monitoring
354 // TODO: this is probably wrong
356 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
360 co->silence (nframes, offset);
364 co->deliver_output (bufs, nbufs, nframes, offset);
369 /* -----------------------------------------------------------------------------------------------------
371 -------------------------------------------------------------------------------------------------- */
373 if (_denormal_protection || Config->get_denormal_protection()) {
375 for (n = 0; n < nbufs; ++n) {
376 Sample *sp = bufs[n];
378 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
385 /* ----------------------------------------------------------------------------------------------------
387 -------------------------------------------------------------------------------------------------- */
389 if (with_redirects) {
390 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
392 if (mute_gain > 0 || !_mute_affects_pre_fader) {
393 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
394 switch ((*i)->placement()) {
397 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
398 (*i)->silence (nframes, offset);
401 (*i)->run (bufs, nbufs, nframes, offset);
405 post_fader_work = true;
410 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
411 switch ((*i)->placement()) {
413 (*i)->silence (nframes, offset);
416 post_fader_work = true;
425 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
426 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
428 mute_declick_applied = true;
431 /* ----------------------------------------------------------------------------------------------------
432 PRE-FADER METERING & MONITORING
433 -------------------------------------------------------------------------------------------------- */
435 if (meter && (_meter_point == MeterPreFader)) {
436 for (n = 0; n < nbufs; ++n) {
437 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
442 if ((_meter_point == MeterPreFader) && co) {
444 solo_audible = dsg > 0;
445 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
447 if ( // muted by solo of another track
451 // muted by mute of this track
455 // rec-enabled but not s/w monitoring
457 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
461 co->silence (nframes, offset);
465 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
470 /* ----------------------------------------------------------------------------------------------------
472 -------------------------------------------------------------------------------------------------- */
474 /* if not recording or recording and requiring any monitor signal, then apply gain */
476 if ( // not recording
478 !(record_enabled() && _session.actively_recording()) ||
482 // h/w monitoring not in use
484 (!Config->get_monitoring_model() == HardwareMonitoring &&
486 // AND software monitoring required
488 Config->get_monitoring_model() == SoftwareMonitoring)) {
490 if (apply_gain_automation) {
493 for (n = 0; n < nbufs; ++n) {
494 Sample *sp = bufs[n];
496 for (nframes_t nx = 0; nx < nframes; ++nx) {
501 for (n = 0; n < nbufs; ++n) {
502 Sample *sp = bufs[n];
504 for (nframes_t nx = 0; nx < nframes; ++nx) {
510 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
511 _effective_gain = gab[nframes-1];
516 /* manual (scalar) gain */
520 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
523 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
525 /* no need to interpolate current gain value,
526 but its non-unity, so apply it. if the gain
527 is zero, do nothing because we'll ship silence
539 for (n = 0; n < nbufs; ++n) {
540 Sample *sp = bufs[n];
541 Session::apply_gain_to_buffer(sp,nframes,this_gain);
544 } else if (_gain == 0) {
545 for (n = 0; n < nbufs; ++n) {
546 memset (bufs[n], 0, sizeof (Sample) * nframes);
553 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
557 /* ----------------------------------------------------------------------------------------------------
559 -------------------------------------------------------------------------------------------------- */
561 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
563 if (post_fader_work) {
565 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
567 if (mute_gain > 0 || !_mute_affects_post_fader) {
568 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
569 switch ((*i)->placement()) {
574 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
575 (*i)->silence (nframes, offset);
578 (*i)->run (bufs, nbufs, nframes, offset);
584 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
585 switch ((*i)->placement()) {
589 (*i)->silence (nframes, offset);
597 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
598 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
600 mute_declick_applied = true;
603 /* ----------------------------------------------------------------------------------------------------
605 -------------------------------------------------------------------------------------------------- */
607 if ((_meter_point == MeterPostFader) && co) {
609 solo_audible = solo_gain > 0;
610 mute_audible = dmg > 0 || !_mute_affects_control_outs;
612 if ( // silent anyway
614 (_gain == 0 && !apply_gain_automation) ||
616 // muted by solo of another track
620 // muted by mute of this track
624 // recording but not s/w monitoring
626 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
630 co->silence (nframes, offset);
634 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
638 /* ----------------------------------------------------------------------
640 ----------------------------------------------------------------------*/
642 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
643 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
645 mute_declick_applied = true;
648 /* ----------------------------------------------------------------------------------------------------
650 -------------------------------------------------------------------------------------------------- */
652 solo_audible = dsg > 0;
653 mute_audible = dmg > 0 || !_mute_affects_main_outs;
655 if (n_outputs() == 0) {
659 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
661 IO::silence (nframes, offset);
665 if ( // silent anyway
667 (_gain == 0 && !apply_gain_automation) ||
669 // muted by solo of another track, but not using control outs for solo
671 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
673 // muted by mute of this track
679 /* don't use Route::silence() here, because that causes
680 all outputs (sends, port inserts, etc. to be silent).
683 if (_meter_point == MeterPostFader) {
684 reset_peak_meters ();
687 IO::silence (nframes, offset);
691 if ((_session.transport_speed() > 1.5f ||
692 _session.transport_speed() < -1.5f) &&
693 Config->get_quieten_at_speed()) {
694 pan (bufs, nbufs, nframes, offset, speed_quietning);
696 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
697 if (!_panner->empty() &&
698 (_panner->automation_state() & Play ||
699 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
700 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
702 pan (bufs, nbufs, nframes, offset, 1.0);
709 /* ----------------------------------------------------------------------------------------------------
711 -------------------------------------------------------------------------------------------------- */
713 if (meter && (_meter_point == MeterPostFader)) {
714 // cerr << "meter post" << endl;
716 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
717 uint32_t no = n_outputs();
718 for (n = 0; n < no; ++n) {
722 uint32_t no = n_outputs();
723 for (n = 0; n < no; ++n) {
724 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
731 Route::n_process_buffers ()
733 return max (n_inputs(), redirect_max_outs);
738 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
740 vector<Sample*>& bufs = _session.get_passthru_buffers();
741 uint32_t limit = n_process_buffers ();
745 collect_input (bufs, limit, nframes, offset);
747 #define meter_stream meter_first
750 for (uint32_t n = 0; n < limit; ++n) {
751 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
753 meter_stream = false;
758 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
764 Route::set_phase_invert (bool yn, void *src)
766 if (_phase_invert != yn) {
768 // phase_invert_changed (src); /* EMIT SIGNAL */
773 Route::set_denormal_protection (bool yn, void *src)
775 if (_denormal_protection != yn) {
776 _denormal_protection = yn;
777 // denormal_protection_changed (src); /* EMIT SIGNAL */
782 Route::set_solo (bool yn, void *src)
788 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
789 _mix_group->apply (&Route::set_solo, yn, _mix_group);
795 solo_changed (src); /* EMIT SIGNAL */
796 _solo_control.Changed (); /* EMIT SIGNAL */
801 Route::set_solo_mute (bool yn)
803 Glib::Mutex::Lock lm (declick_lock);
805 /* Called by Session in response to another Route being soloed.
808 desired_solo_gain = (yn?0.0:1.0);
812 Route::set_solo_safe (bool yn, void *src)
814 if (_solo_safe != yn) {
816 solo_safe_changed (src); /* EMIT SIGNAL */
821 Route::set_mute (bool yn, void *src)
824 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
825 _mix_group->apply (&Route::set_mute, yn, _mix_group);
831 mute_changed (src); /* EMIT SIGNAL */
833 _mute_control.Changed (); /* EMIT SIGNAL */
835 Glib::Mutex::Lock lm (declick_lock);
836 desired_mute_gain = (yn?0.0f:1.0f);
841 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
843 uint32_t old_rmo = redirect_max_outs;
845 if (!_session.engine().connected()) {
850 Glib::RWLock::WriterLock lm (redirect_lock);
852 boost::shared_ptr<PluginInsert> pi;
853 boost::shared_ptr<PortInsert> porti;
855 uint32_t potential_max_streams = 0;
857 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
860 if (pi->input_streams() == 0) {
861 /* instrument plugin */
862 _have_internal_generator = true;
865 potential_max_streams = max(pi->input_streams(), pi->output_streams());
867 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
869 /* force new port inserts to start out with an i/o configuration
870 that matches this route's i/o configuration.
872 the "inputs" for the port are supposed to match the output
875 the "outputs" of the route should match the inputs of this
876 route. XXX shouldn't they match the number of active signal
877 streams at the point of insertion?
881 porti->ensure_io (n_outputs (), n_inputs(), false, this);
884 // Ensure peak vector sizes before the plugin is activated
885 while (_peak_power.size() < potential_max_streams) {
886 _peak_power.push_back(0);
888 while (_visible_peak_power.size() < potential_max_streams) {
889 _visible_peak_power.push_back(-INFINITY);
891 while (_max_peak_power.size() < potential_max_streams) {
892 _max_peak_power.push_back(-INFINITY);
895 _redirects.push_back (redirect);
897 if (_reset_plugin_counts (err_streams)) {
898 _redirects.pop_back ();
899 _reset_plugin_counts (0); // it worked before we tried to add it ...
903 redirect->activate ();
904 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
907 if (redirect_max_outs != old_rmo || old_rmo == 0) {
912 redirects_changed (src); /* EMIT SIGNAL */
917 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
919 uint32_t old_rmo = redirect_max_outs;
921 assert (ports_legal);
923 if (!_session.engine().connected()) {
928 Glib::RWLock::WriterLock lm (redirect_lock);
930 RedirectList::iterator existing_end = _redirects.end();
933 uint32_t potential_max_streams = 0;
935 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
937 boost::shared_ptr<PluginInsert> pi;
939 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
942 uint32_t m = max(pi->input_streams(), pi->output_streams());
943 if (m > potential_max_streams)
944 potential_max_streams = m;
947 // Ensure peak vector sizes before the plugin is activated
948 while (_peak_power.size() < potential_max_streams) {
949 _peak_power.push_back(0);
951 while (_visible_peak_power.size() < potential_max_streams) {
952 _visible_peak_power.push_back(-INFINITY);
954 while (_max_peak_power.size() < potential_max_streams) {
955 _max_peak_power.push_back(-INFINITY);
958 _redirects.push_back (*i);
960 if (_reset_plugin_counts (err_streams)) {
962 _redirects.erase (existing_end, _redirects.end());
963 _reset_plugin_counts (0); // it worked before we tried to add it ...
968 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
972 if (redirect_max_outs != old_rmo || old_rmo == 0) {
976 redirects_changed (src); /* EMIT SIGNAL */
980 /** Remove redirects with a given placement.
981 * @param p Placement of redirects to remove.
984 Route::clear_redirects (Placement p, void *src)
986 const uint32_t old_rmo = redirect_max_outs;
988 if (!_session.engine().connected()) {
993 Glib::RWLock::WriterLock lm (redirect_lock);
994 RedirectList new_list;
996 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
997 if ((*i)->placement() == p) {
998 /* it's the placement we want to get rid of */
999 (*i)->drop_references ();
1001 /* it's a different placement, so keep it */
1002 new_list.push_back (*i);
1006 _redirects = new_list;
1009 /* FIXME: can't see how this test can ever fire */
1010 if (redirect_max_outs != old_rmo) {
1014 redirect_max_outs = 0;
1015 _have_internal_generator = false;
1016 redirects_changed (src); /* EMIT SIGNAL */
1020 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
1022 uint32_t old_rmo = redirect_max_outs;
1024 assert (ports_legal);
1026 if (!_session.engine().connected()) {
1030 redirect_max_outs = 0;
1033 Glib::RWLock::WriterLock lm (redirect_lock);
1034 RedirectList::iterator i;
1035 bool removed = false;
1037 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1038 if (*i == redirect) {
1040 RedirectList::iterator tmp;
1042 /* move along, see failure case for reset_plugin_counts()
1043 where we may need to reinsert the redirect.
1049 /* stop redirects that send signals to JACK ports
1050 from causing noise as a result of no longer being
1054 boost::shared_ptr<Send> send;
1055 boost::shared_ptr<PortInsert> port_insert;
1057 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
1058 send->disconnect_inputs (this);
1059 send->disconnect_outputs (this);
1060 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
1061 port_insert->disconnect_inputs (this);
1062 port_insert->disconnect_outputs (this);
1065 _redirects.erase (i);
1078 if (_reset_plugin_counts (err_streams)) {
1079 /* get back to where we where */
1080 _redirects.insert (i, redirect);
1081 /* we know this will work, because it worked before :) */
1082 _reset_plugin_counts (0);
1088 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1089 boost::shared_ptr<PluginInsert> pi;
1091 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1092 if (pi->is_generator()) {
1098 _have_internal_generator = foo;
1101 if (old_rmo != redirect_max_outs) {
1105 redirect->drop_references ();
1107 redirects_changed (src); /* EMIT SIGNAL */
1112 Route::reset_plugin_counts (uint32_t* lpc)
1114 Glib::RWLock::WriterLock lm (redirect_lock);
1115 return _reset_plugin_counts (lpc);
1120 Route::_reset_plugin_counts (uint32_t* err_streams)
1122 RedirectList::iterator r;
1125 map<Placement,list<InsertCount> > insert_map;
1126 nframes_t initial_streams;
1128 redirect_max_outs = 0;
1132 /* divide inserts up by placement so we get the signal flow
1133 properly modelled. we need to do this because the _redirects
1134 list is not sorted by placement, and because other reasons may
1135 exist now or in the future for this separate treatment.
1138 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1140 boost::shared_ptr<Insert> insert;
1142 /* do this here in case we bomb out before we get to the end of
1146 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1148 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1150 insert_map[insert->placement()].push_back (InsertCount (insert));
1152 /* reset plugin counts back to one for now so
1153 that we have a predictable, controlled
1154 state to try to configure.
1157 boost::shared_ptr<PluginInsert> pi;
1159 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1163 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1176 /* Now process each placement in order, checking to see if we
1177 can really do what has been requested.
1182 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1186 /* figure out the streams that will feed into PreFader */
1188 if (!insert_map[PreFader].empty()) {
1189 InsertCount& ic (insert_map[PreFader].back());
1190 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1192 initial_streams = n_inputs ();
1197 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1201 /* OK, everything can be set up correctly, so lets do it */
1203 apply_some_plugin_counts (insert_map[PreFader]);
1204 apply_some_plugin_counts (insert_map[PostFader]);
1206 /* recompute max outs of any redirect */
1210 redirect_max_outs = 0;
1211 RedirectList::iterator prev = _redirects.end();
1213 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1214 boost::shared_ptr<Send> s;
1216 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1217 if (r == _redirects.begin()) {
1218 s->expect_inputs (n_inputs());
1220 s->expect_inputs ((*prev)->output_streams());
1225 /* don't pay any attention to send output configuration, since it doesn't
1229 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1240 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1242 list<InsertCount>::iterator i;
1244 for (i = iclist.begin(); i != iclist.end(); ++i) {
1246 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1249 /* make sure that however many we have, they are all active */
1250 (*i).insert->activate ();
1257 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1259 list<InsertCount>::iterator i;
1261 for (i = iclist.begin(); i != iclist.end(); ++i) {
1263 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1265 *err_streams = required_inputs;
1270 (*i).in = required_inputs;
1271 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1273 required_inputs = (*i).out;
1280 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1282 uint32_t old_rmo = redirect_max_outs;
1288 RedirectList to_be_deleted;
1291 Glib::RWLock::WriterLock lm (redirect_lock);
1292 RedirectList::iterator tmp;
1293 RedirectList the_copy;
1295 the_copy = _redirects;
1297 /* remove all relevant redirects */
1299 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1303 if ((*i)->placement() == placement) {
1304 to_be_deleted.push_back (*i);
1305 _redirects.erase (i);
1311 /* now copy the relevant ones from "other" */
1313 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1314 if ((*i)->placement() == placement) {
1315 _redirects.push_back (Redirect::clone (*i));
1319 /* reset plugin stream handling */
1321 if (_reset_plugin_counts (err_streams)) {
1323 /* FAILED COPY ATTEMPT: we have to restore order */
1325 /* delete all cloned redirects */
1327 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1332 if ((*i)->placement() == placement) {
1333 _redirects.erase (i);
1339 /* restore the natural order */
1341 _redirects = the_copy;
1342 redirect_max_outs = old_rmo;
1344 /* we failed, even though things are OK again */
1350 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1351 to_be_deleted.clear ();
1355 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1359 redirects_changed (this); /* EMIT SIGNAL */
1364 Route::all_redirects_flip ()
1366 Glib::RWLock::ReaderLock lm (redirect_lock);
1368 if (_redirects.empty()) {
1372 bool first_is_on = _redirects.front()->active();
1374 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1375 (*i)->set_active (!first_is_on, this);
1379 /** Set all redirects with a given placement to a given active state.
1380 * @param p Placement of redirects to change.
1381 * @param state New active state for those redirects.
1384 Route::all_redirects_active (Placement p, bool state)
1386 Glib::RWLock::ReaderLock lm (redirect_lock);
1388 if (_redirects.empty()) {
1392 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1393 if ((*i)->placement() == p) {
1394 (*i)->set_active (state, this);
1399 struct RedirectSorter {
1400 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1401 return a->sort_key() < b->sort_key();
1406 Route::sort_redirects (uint32_t* err_streams)
1409 RedirectSorter comparator;
1410 Glib::RWLock::WriterLock lm (redirect_lock);
1411 uint32_t old_rmo = redirect_max_outs;
1413 /* the sweet power of C++ ... */
1415 RedirectList as_it_was_before = _redirects;
1417 _redirects.sort (comparator);
1419 if (_reset_plugin_counts (err_streams)) {
1420 _redirects = as_it_was_before;
1421 redirect_max_outs = old_rmo;
1427 redirects_changed (this); /* EMIT SIGNAL */
1439 Route::get_template()
1441 return state(false);
1445 Route::state(bool full_state)
1447 XMLNode *node = new XMLNode("Route");
1448 RedirectList:: iterator i;
1452 node->add_property("flags", enum_2_string (_flags));
1455 node->add_property("default-type", _default_type.to_string());
1457 node->add_property("active", _active?"yes":"no");
1458 node->add_property("muted", _muted?"yes":"no");
1459 node->add_property("soloed", _soloed?"yes":"no");
1460 node->add_property("phase-invert", _phase_invert?"yes":"no");
1461 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1462 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1463 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1464 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1465 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1468 node->add_property("edit-group", _edit_group->name());
1471 node->add_property("mix-group", _mix_group->name());
1474 string order_string;
1475 OrderKeys::iterator x = order_keys.begin();
1477 while (x != order_keys.end()) {
1478 order_string += string ((*x).first);
1479 order_string += '=';
1480 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1481 order_string += buf;
1485 if (x == order_keys.end()) {
1489 order_string += ':';
1491 node->add_property ("order-keys", order_string);
1493 node->add_child_nocopy (IO::state (full_state));
1494 node->add_child_nocopy (_solo_control.get_state ());
1495 node->add_child_nocopy (_mute_control.get_state ());
1497 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1498 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1499 remote_control_node->add_property (X_("id"), buf);
1500 node->add_child_nocopy (*remote_control_node);
1502 if (_control_outs) {
1503 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1504 cnode->add_child_nocopy (_control_outs->state (full_state));
1505 node->add_child_nocopy (*cnode);
1508 if (_comment.length()) {
1509 XMLNode *cmt = node->add_child ("Comment");
1510 cmt->add_content (_comment);
1513 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1514 node->add_child_nocopy((*i)->state (full_state));
1518 node->add_child_copy (*_extra_xml);
1525 Route::set_deferred_state ()
1528 XMLNodeConstIterator niter;
1530 if (!deferred_state) {
1534 nlist = deferred_state->children();
1536 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1537 add_redirect_from_xml (**niter);
1540 delete deferred_state;
1545 Route::add_redirect_from_xml (const XMLNode& node)
1547 const XMLProperty *prop;
1549 if (node.name() == "Send") {
1553 boost::shared_ptr<Send> send (new Send (_session, node));
1554 add_redirect (send, this);
1557 catch (failed_constructor &err) {
1558 error << _("Send construction failed") << endmsg;
1562 } else if (node.name() == "Insert") {
1565 if ((prop = node.property ("type")) != 0) {
1567 boost::shared_ptr<Insert> insert;
1569 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1571 insert.reset (new PluginInsert(_session, node));
1573 } else if (prop->value() == "port") {
1576 insert.reset (new PortInsert (_session, node));
1580 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1583 add_redirect (insert, this);
1586 error << _("Insert XML node has no type property") << endmsg;
1590 catch (failed_constructor &err) {
1591 warning << _("insert could not be created. Ignored.") << endmsg;
1598 Route::set_state (const XMLNode& node)
1600 return _set_state (node, true);
1604 Route::_set_state (const XMLNode& node, bool call_base)
1607 XMLNodeConstIterator niter;
1609 XMLPropertyList plist;
1610 const XMLProperty *prop;
1612 if (node.name() != "Route"){
1613 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1617 if ((prop = node.property (X_("flags"))) != 0) {
1618 _flags = Flag (string_2_enum (prop->value(), _flags));
1623 if ((prop = node.property (X_("default-type"))) != 0) {
1624 _default_type = DataType(prop->value());
1625 assert(_default_type != DataType::NIL);
1628 if ((prop = node.property (X_("phase-invert"))) != 0) {
1629 set_phase_invert (prop->value()=="yes"?true:false, this);
1632 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1633 set_denormal_protection (prop->value()=="yes"?true:false, this);
1636 if ((prop = node.property (X_("active"))) != 0) {
1637 set_active (prop->value() == "yes");
1640 if ((prop = node.property (X_("muted"))) != 0) {
1641 bool yn = prop->value()=="yes"?true:false;
1643 /* force reset of mute status */
1647 mute_gain = desired_mute_gain;
1650 if ((prop = node.property (X_("soloed"))) != 0) {
1651 bool yn = prop->value()=="yes"?true:false;
1653 /* force reset of solo status */
1656 set_solo (yn, this);
1657 solo_gain = desired_solo_gain;
1660 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1661 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1664 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1665 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1668 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1669 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1672 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1673 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1676 if ((prop = node.property (X_("edit-group"))) != 0) {
1677 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1678 if(edit_group == 0) {
1679 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1681 set_edit_group(edit_group, this);
1685 if ((prop = node.property (X_("order-keys"))) != 0) {
1689 string::size_type colon, equal;
1690 string remaining = prop->value();
1692 while (remaining.length()) {
1694 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1695 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1698 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1699 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1702 set_order_key (remaining.substr (0, equal).c_str(), n);
1706 colon = remaining.find_first_of (':');
1708 if (colon != string::npos) {
1709 remaining = remaining.substr (colon+1);
1716 nlist = node.children();
1718 if (deferred_state) {
1719 delete deferred_state;
1722 deferred_state = new XMLNode(X_("deferred state"));
1724 /* set parent class properties before anything else */
1726 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1730 if (child->name() == IO::state_node_name && call_base) {
1732 IO::set_state (*child);
1738 XMLNodeList redirect_nodes;
1740 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1744 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
1745 redirect_nodes.push_back(child);
1750 _set_redirect_states (redirect_nodes);
1752 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1754 // All redirects (sends and inserts) have been applied already
1756 if (child->name() == X_("Automation")) {
1758 if ((prop = child->property (X_("path"))) != 0) {
1759 load_automation (prop->value());
1762 } else if (child->name() == X_("ControlOuts")) {
1764 string coutname = _name;
1765 coutname += _("[control]");
1767 _control_outs = new IO (_session, coutname);
1768 _control_outs->set_state (**(child->children().begin()));
1770 } else if (child->name() == X_("Comment")) {
1772 /* XXX this is a terrible API design in libxml++ */
1774 XMLNode *cmt = *(child->children().begin());
1775 _comment = cmt->content();
1777 } else if (child->name() == X_("extra")) {
1779 _extra_xml = new XMLNode (*child);
1781 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1783 if (prop->value() == "solo") {
1784 _solo_control.set_state (*child);
1785 _session.add_controllable (&_solo_control);
1787 else if (prop->value() == "mute") {
1788 _mute_control.set_state (*child);
1789 _session.add_controllable (&_mute_control);
1792 else if (child->name() == X_("remote_control")) {
1793 if ((prop = child->property (X_("id"))) != 0) {
1795 sscanf (prop->value().c_str(), "%d", &x);
1796 set_remote_control_id (x);
1801 if ((prop = node.property (X_("mix-group"))) != 0) {
1802 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1803 if (mix_group == 0) {
1804 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1806 set_mix_group(mix_group, this);
1814 Route::_set_redirect_states(const XMLNodeList &nlist)
1816 XMLNodeConstIterator niter;
1819 RedirectList::iterator i, o;
1823 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1824 deferred_state->add_child_copy (**niter);
1830 // Iterate through existing redirects, remove those which are not in the state list
1831 for (i = _redirects.begin(); i != _redirects.end(); ) {
1832 RedirectList::iterator tmp = i;
1835 bool redirectInStateList = false;
1837 (*i)->id().print (buf, sizeof (buf));
1839 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1841 if (strncmp (buf,(*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1842 redirectInStateList = true;
1847 if (!redirectInStateList) {
1848 remove_redirect ( *i, this);
1856 // Iterate through state list and make sure all redirects are on the track and in the correct order,
1857 // set the state of existing redirects according to the new state on the same go
1858 i = _redirects.begin();
1859 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1861 // Check whether the next redirect in the list
1864 while (o != _redirects.end()) {
1865 (*o)->id().print (buf, sizeof (buf));
1866 if ( strncmp(buf, (*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1871 if (o == _redirects.end()) {
1872 // If the redirect (*niter) is not on the route, we need to create it
1873 // and move it to the correct location
1875 RedirectList::iterator prev_last = _redirects.end();
1876 --prev_last; // We need this to check whether adding succeeded
1878 add_redirect_from_xml (**niter);
1880 RedirectList::iterator last = _redirects.end();
1883 if (prev_last == last) {
1884 warning << _name << ": could not fully restore state as some redirects were not possible to create" << endmsg;
1889 boost::shared_ptr<Redirect> tmp = (*last);
1890 // remove the redirect from the wrong location
1891 _redirects.erase(last);
1892 // insert the new redirect at the current location
1893 _redirects.insert(i, tmp);
1895 --i; // move pointer to the newly inserted redirect
1899 // We found the redirect (*niter) on the route, first we must make sure the redirect
1900 // is at the location provided in the XML state
1902 boost::shared_ptr<Redirect> tmp = (*o);
1903 // remove the old copy
1904 _redirects.erase(o);
1905 // insert the redirect at the correct location
1906 _redirects.insert(i, tmp);
1908 --i; // move pointer so it points to the right redirect
1911 (*i)->set_state( (**niter) );
1914 redirects_changed(this);
1918 Route::curve_reallocate ()
1920 // _gain_automation_curve.finish_resize ();
1921 // _pan_automation_curve.finish_resize ();
1925 Route::silence (nframes_t nframes, nframes_t offset)
1929 // reset_peak_meters ();
1931 IO::silence (nframes, offset);
1933 if (_control_outs) {
1934 _control_outs->silence (nframes, offset);
1938 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1941 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1942 boost::shared_ptr<PluginInsert> pi;
1943 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1944 // skip plugins, they don't need anything when we're not active
1948 (*i)->silence (nframes, offset);
1951 if (nframes == _session.get_block_size() && offset == 0) {
1961 Route::set_control_outs (const vector<string>& ports)
1963 Glib::Mutex::Lock lm (control_outs_lock);
1964 vector<string>::const_iterator i;
1967 if (_control_outs) {
1968 delete _control_outs;
1972 if (control() || master()) {
1973 /* no control outs for these two special busses */
1977 if (ports.empty()) {
1981 string coutname = _name;
1982 coutname += _("[control]");
1984 _control_outs = new IO (_session, coutname);
1986 /* our control outs need as many outputs as we
1987 have outputs. we track the changes in ::output_change_handler().
1990 limit = n_outputs ();
1992 if (_control_outs->ensure_io (0, limit, true, this)) {
1996 /* now connect to the named ports */
1998 for (uint32_t n = 0; n < limit; ++n) {
1999 if (_control_outs->connect_output (_control_outs->output (n), ports[n], this)) {
2000 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2009 Route::set_edit_group (RouteGroup *eg, void *src)
2012 if (eg == _edit_group) {
2017 _edit_group->remove (this);
2020 if ((_edit_group = eg) != 0) {
2021 _edit_group->add (this);
2024 _session.set_dirty ();
2025 edit_group_changed (src); /* EMIT SIGNAL */
2029 Route::drop_edit_group (void *src)
2032 _session.set_dirty ();
2033 edit_group_changed (src); /* EMIT SIGNAL */
2037 Route::set_mix_group (RouteGroup *mg, void *src)
2040 if (mg == _mix_group) {
2045 _mix_group->remove (this);
2048 if ((_mix_group = mg) != 0) {
2049 _mix_group->add (this);
2052 _session.set_dirty ();
2053 mix_group_changed (src); /* EMIT SIGNAL */
2057 Route::drop_mix_group (void *src)
2060 _session.set_dirty ();
2061 mix_group_changed (src); /* EMIT SIGNAL */
2065 Route::set_comment (string cmt, void *src)
2068 comment_changed (src);
2069 _session.set_dirty ();
2073 Route::feeds (boost::shared_ptr<Route> other)
2078 uint32_t no = self.n_outputs();
2079 uint32_t ni = other->n_inputs ();
2081 for (i = 0; i < no; ++i) {
2082 for (j = 0; j < ni; ++j) {
2083 if (self.output(i)->connected_to (other->input(j)->name())) {
2089 /* check Redirects which may also interconnect Routes */
2091 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2093 no = (*r)->n_outputs();
2095 for (i = 0; i < no; ++i) {
2096 for (j = 0; j < ni; ++j) {
2097 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2104 /* check for control room outputs which may also interconnect Routes */
2106 if (_control_outs) {
2108 no = _control_outs->n_outputs();
2110 for (i = 0; i < no; ++i) {
2111 for (j = 0; j < ni; ++j) {
2112 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2123 Route::set_mute_config (mute_type t, bool onoff, void *src)
2127 _mute_affects_pre_fader = onoff;
2128 pre_fader_changed(src); /* EMIT SIGNAL */
2132 _mute_affects_post_fader = onoff;
2133 post_fader_changed(src); /* EMIT SIGNAL */
2137 _mute_affects_control_outs = onoff;
2138 control_outs_changed(src); /* EMIT SIGNAL */
2142 _mute_affects_main_outs = onoff;
2143 main_outs_changed(src); /* EMIT SIGNAL */
2149 Route::get_mute_config (mute_type t)
2155 onoff = _mute_affects_pre_fader;
2158 onoff = _mute_affects_post_fader;
2161 onoff = _mute_affects_control_outs;
2164 onoff = _mute_affects_main_outs;
2172 Route::set_active (bool yn)
2175 active_changed(); /* EMIT SIGNAL */
2179 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2181 nframes_t now = _session.transport_frame();
2184 Glib::RWLock::ReaderLock lm (redirect_lock);
2187 automation_snapshot (now);
2190 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2192 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2193 (*i)->deactivate ();
2197 (*i)->transport_stopped (now);
2201 IO::transport_stopped (now);
2203 _roll_delay = _initial_delay;
2207 Route::input_change_handler (IOChange change, void *ignored)
2209 if (change & ConfigurationChanged) {
2210 reset_plugin_counts (0);
2215 Route::output_change_handler (IOChange change, void *ignored)
2217 if (change & ConfigurationChanged) {
2218 if (_control_outs) {
2219 _control_outs->ensure_io (0, n_outputs(), true, this);
2222 reset_plugin_counts (0);
2227 Route::pans_required () const
2229 if (n_outputs() < 2) {
2233 return max (n_inputs (), redirect_max_outs);
2237 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2238 bool session_state_changing, bool can_record, bool rec_monitors_input)
2240 if (n_outputs() == 0) {
2244 if (session_state_changing || !_active) {
2245 silence (nframes, offset);
2249 apply_gain_automation = false;
2252 passthru (start_frame, end_frame, nframes, offset, 0, false);
2254 silence (nframes, offset);
2261 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2263 if (_roll_delay > nframes) {
2265 _roll_delay -= nframes;
2266 silence (nframes, offset);
2267 /* transport frame is not legal for caller to use */
2270 } else if (_roll_delay > 0) {
2272 nframes -= _roll_delay;
2274 silence (_roll_delay, offset);
2276 offset += _roll_delay;
2277 transport_frame += _roll_delay;
2286 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2287 bool can_record, bool rec_monitors_input)
2290 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2292 // automation snapshot can also be called from the non-rt context
2293 // and it uses the redirect list, so we take the lock out here
2294 automation_snapshot (_session.transport_frame());
2298 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2299 silence (nframes, offset);
2303 nframes_t unused = 0;
2305 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2311 apply_gain_automation = false;
2314 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2316 if (am.locked() && _session.transport_rolling()) {
2318 nframes_t start_frame = end_frame - nframes;
2320 if (gain_automation_playback()) {
2321 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2326 passthru (start_frame, end_frame, nframes, offset, declick, false);
2332 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2333 bool can_record, bool rec_monitors_input)
2335 silence (nframes, offset);
2340 Route::toggle_monitor_input ()
2342 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2343 (*i)->ensure_monitor_input(!(*i)->monitoring_input());
2348 Route::has_external_redirects () const
2350 boost::shared_ptr<const PortInsert> pi;
2352 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2353 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2355 uint32_t no = pi->n_outputs();
2357 for (uint32_t n = 0; n < no; ++n) {
2359 string port_name = pi->output(n)->name();
2360 string client_name = port_name.substr (0, port_name.find(':'));
2362 /* only say "yes" if the redirect is actually in use */
2364 if (client_name != "ardour" && pi->active()) {
2375 Route::flush_redirects ()
2377 /* XXX shouldn't really try to take this lock, since
2378 this is called from the RT audio thread.
2381 Glib::RWLock::ReaderLock lm (redirect_lock);
2383 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2384 (*i)->deactivate ();
2390 Route::set_meter_point (MeterPoint p, void *src)
2392 if (_meter_point != p) {
2394 meter_change (src); /* EMIT SIGNAL */
2395 _session.set_dirty ();
2400 Route::update_total_latency ()
2404 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2405 if ((*i)->active ()) {
2406 _own_latency += (*i)->latency ();
2410 set_port_latency (_own_latency);
2412 /* this (virtual) function is used for pure Routes,
2413 not derived classes like AudioTrack. this means
2414 that the data processed here comes from an input
2415 port, not prerecorded material, and therefore we
2416 have to take into account any input latency.
2419 _own_latency += input_latency ();
2421 return _own_latency;
2425 Route::set_latency_delay (nframes_t longest_session_latency)
2427 _initial_delay = longest_session_latency - _own_latency;
2429 if (_session.transport_stopped()) {
2430 _roll_delay = _initial_delay;
2435 Route::automation_snapshot (nframes_t now)
2437 IO::automation_snapshot (now);
2439 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2440 (*i)->automation_snapshot (now);
2444 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2445 : Controllable (name), route (s), type(tp)
2451 Route::ToggleControllable::set_value (float val)
2453 bool bval = ((val >= 0.5f) ? true: false);
2457 route.set_mute (bval, this);
2460 route.set_solo (bval, this);
2468 Route::ToggleControllable::get_value (void) const
2474 val = route.muted() ? 1.0f : 0.0f;
2477 val = route.soloed() ? 1.0f : 0.0f;
2487 Route::set_block_size (nframes_t nframes)
2489 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2490 (*i)->set_block_size (nframes);
2495 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2497 _session.update_latency_compensation (false, false);
2501 Route::protect_automation ()
2503 switch (gain_automation_state()) {
2505 set_gain_automation_state (Off);
2507 set_gain_automation_state (Play);
2513 switch (panner().automation_state ()) {
2515 panner().set_automation_state (Off);
2518 panner().set_automation_state (Play);
2524 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2525 boost::shared_ptr<PluginInsert> pi;
2526 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2527 pi->protect_automation ();
2533 Route::set_pending_declick (int declick)
2536 /* this call is not allowed to turn off a pending declick unless "force" is true */
2538 _pending_declick = declick;
2540 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2542 _pending_declick = 0;