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>
27 #include <pbd/stacktrace.h>
29 #include <ardour/timestamps.h>
30 #include <ardour/buffer.h>
31 #include <ardour/audioengine.h>
32 #include <ardour/route.h>
33 #include <ardour/insert.h>
34 #include <ardour/send.h>
35 #include <ardour/session.h>
36 #include <ardour/utils.h>
37 #include <ardour/configuration.h>
38 #include <ardour/cycle_timer.h>
39 #include <ardour/route_group.h>
40 #include <ardour/port.h>
41 #include <ardour/ladspa_plugin.h>
42 #include <ardour/panner.h>
43 #include <ardour/dB.h>
44 #include <ardour/mix.h>
45 #include <ardour/profile.h>
50 using namespace ARDOUR;
53 uint32_t Route::order_key_cnt = 0;
54 sigc::signal<void> Route::SyncOrderKeys;
56 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
57 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
59 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
60 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
65 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
66 : IO (sess, *node.child ("IO"), default_type),
67 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
68 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
71 _set_state (node, false);
77 redirect_max_outs = 0;
81 _phase_invert = false;
82 _denormal_protection = false;
83 order_keys[strdup (N_("signal"))] = order_key_cnt++;
85 _meter_point = MeterPostFader;
89 _have_internal_generator = false;
91 _pending_declick = true;
92 _remote_control_id = 0;
93 _ignore_gain_on_deliver = true;
98 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
99 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
100 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
101 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
104 desired_solo_gain = 1.0;
106 desired_mute_gain = 1.0;
110 input_changed.connect (mem_fun (this, &Route::input_change_handler));
111 output_changed.connect (mem_fun (this, &Route::output_change_handler));
116 clear_redirects (PreFader, this);
117 clear_redirects (PostFader, this);
119 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
120 free ((void*)(i->first));
124 delete _control_outs;
129 Route::set_remote_control_id (uint32_t id)
131 if (id != _remote_control_id) {
132 _remote_control_id = id;
133 RemoteControlIDChanged ();
138 Route::remote_control_id() const
140 return _remote_control_id;
144 Route::order_key (const char* name) const
146 OrderKeys::const_iterator i;
148 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
149 if (!strcmp (name, i->first)) {
158 Route::set_order_key (const char* name, long n)
160 order_keys[strdup(name)] = n;
162 if (Config->get_sync_all_route_ordering()) {
163 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
168 _session.set_dirty ();
172 Route::sync_order_keys ()
176 if (order_keys.empty()) {
180 OrderKeys::iterator x = order_keys.begin();
184 for (; x != order_keys.end(); ++x) {
190 Route::ensure_track_or_route_name(string name, Session &session)
192 string newname = name;
194 while (session.route_by_name (newname)!=NULL)
196 newname = bump_name_once (newname);
204 Route::inc_gain (gain_t fraction, void *src)
206 IO::inc_gain (fraction, src);
210 Route::set_gain (gain_t val, void *src)
212 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
214 if (_mix_group->is_relative()) {
217 gain_t usable_gain = gain();
218 if (usable_gain < 0.000001f) {
219 usable_gain=0.000001f;
223 if (delta < 0.000001f) {
227 delta -= usable_gain;
229 if (delta == 0.0f) return;
231 gain_t factor = delta / usable_gain;
234 factor = _mix_group->get_max_factor(factor);
235 if (factor == 0.0f) {
240 factor = _mix_group->get_min_factor(factor);
241 if (factor == 0.0f) {
247 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
251 _mix_group->apply (&Route::set_gain, val, _mix_group);
261 IO::set_gain (val, src);
265 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
266 nframes_t start_frame, nframes_t end_frame,
267 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
271 RedirectList::iterator i;
272 bool post_fader_work = false;
273 bool mute_declick_applied = false;
275 vector<Sample*>::iterator bufiter;
280 gain_t* gab = _session.gain_automation_buffer();
282 switch (Config->get_monitoring_model()) {
283 case HardwareMonitoring:
284 case ExternalMonitoring:
291 declick = _pending_declick;
294 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
304 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
307 dmg = desired_mute_gain;
308 dsg = desired_solo_gain;
317 /* ----------------------------------------------------------------------------------------------------
318 GLOBAL DECLICK (for transport changes etc.)
319 -------------------------------------------------------------------------------------------------- */
322 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, false);
323 _pending_declick = 0;
324 } else if (declick < 0) {
325 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, false);
326 _pending_declick = 0;
329 /* no global declick */
331 if (solo_gain != dsg) {
332 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, false);
338 /* ----------------------------------------------------------------------------------------------------
339 INPUT METERING & MONITORING
340 -------------------------------------------------------------------------------------------------- */
342 if (meter && (_meter_point == MeterInput)) {
343 for (n = 0; n < nbufs; ++n) {
344 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
348 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
349 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
351 mute_declick_applied = true;
354 if ((_meter_point == MeterInput) && co) {
356 solo_audible = dsg > 0;
357 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
359 if ( // muted by solo of another track
363 // muted by mute of this track
367 // rec-enabled but not s/w monitoring
369 // TODO: this is probably wrong
371 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
375 co->silence (nframes, offset);
379 co->deliver_output (bufs, nbufs, nframes, offset);
384 /* -----------------------------------------------------------------------------------------------------
386 -------------------------------------------------------------------------------------------------- */
388 if (_denormal_protection || Config->get_denormal_protection()) {
390 for (n = 0; n < nbufs; ++n) {
391 Sample *sp = bufs[n];
393 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
400 /* ----------------------------------------------------------------------------------------------------
402 -------------------------------------------------------------------------------------------------- */
404 if (with_redirects) {
405 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
407 if (mute_gain > 0 || !_mute_affects_pre_fader) {
408 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
409 switch ((*i)->placement()) {
412 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
413 (*i)->silence (nframes, offset);
416 (*i)->run (bufs, nbufs, nframes, offset);
420 post_fader_work = true;
425 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
426 switch ((*i)->placement()) {
428 (*i)->silence (nframes, offset);
431 post_fader_work = true;
440 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
441 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
443 mute_declick_applied = true;
446 /* ----------------------------------------------------------------------------------------------------
447 PRE-FADER METERING & MONITORING
448 -------------------------------------------------------------------------------------------------- */
450 if (meter && (_meter_point == MeterPreFader)) {
451 for (n = 0; n < nbufs; ++n) {
452 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
457 if ((_meter_point == MeterPreFader) && co) {
459 solo_audible = dsg > 0;
460 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
462 if ( // muted by solo of another track
466 // muted by mute of this track
470 // rec-enabled but not s/w monitoring
472 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
476 co->silence (nframes, offset);
480 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
485 /* ----------------------------------------------------------------------------------------------------
487 -------------------------------------------------------------------------------------------------- */
489 /* if not recording or recording and requiring any monitor signal, then apply gain */
491 if ( // not recording
493 !(record_enabled() && _session.actively_recording()) ||
497 // AND software monitoring required
499 (Config->get_monitoring_model() == SoftwareMonitoring)) {
501 if (apply_gain_automation) {
504 for (n = 0; n < nbufs; ++n) {
505 Sample *sp = bufs[n];
507 for (nframes_t nx = 0; nx < nframes; ++nx) {
512 for (n = 0; n < nbufs; ++n) {
513 Sample *sp = bufs[n];
515 for (nframes_t nx = 0; nx < nframes; ++nx) {
521 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
522 _effective_gain = gab[nframes-1];
527 /* manual (scalar) gain */
531 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
534 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
536 /* no need to interpolate current gain value,
537 but its non-unity, so apply it. if the gain
538 is zero, do nothing because we'll ship silence
550 for (n = 0; n < nbufs; ++n) {
551 Sample *sp = bufs[n];
552 Session::apply_gain_to_buffer(sp,nframes,this_gain);
555 } else if (_gain == 0) {
556 for (n = 0; n < nbufs; ++n) {
557 memset (bufs[n], 0, sizeof (Sample) * nframes);
564 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
568 /* ----------------------------------------------------------------------------------------------------
570 -------------------------------------------------------------------------------------------------- */
572 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
574 if (post_fader_work) {
576 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
578 if (mute_gain > 0 || !_mute_affects_post_fader) {
579 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
580 switch ((*i)->placement()) {
585 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
586 (*i)->silence (nframes, offset);
589 (*i)->run (bufs, nbufs, nframes, offset);
595 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
596 switch ((*i)->placement()) {
600 (*i)->silence (nframes, offset);
608 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
609 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
611 mute_declick_applied = true;
614 /* ----------------------------------------------------------------------------------------------------
616 -------------------------------------------------------------------------------------------------- */
618 if ((_meter_point == MeterPostFader) && co) {
620 solo_audible = solo_gain > 0;
621 mute_audible = dmg > 0 || !_mute_affects_control_outs;
623 if ( // silent anyway
625 (_gain == 0 && !apply_gain_automation) ||
627 // muted by solo of another track
631 // muted by mute of this track
635 // recording but not s/w monitoring
637 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
641 co->silence (nframes, offset);
645 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
649 /* ----------------------------------------------------------------------
651 ----------------------------------------------------------------------*/
653 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
654 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
656 mute_declick_applied = true;
659 /* ----------------------------------------------------------------------------------------------------
661 -------------------------------------------------------------------------------------------------- */
663 solo_audible = dsg > 0;
664 mute_audible = dmg > 0 || !_mute_affects_main_outs;
666 if (n_outputs() == 0) {
670 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
672 IO::silence (nframes, offset);
676 if ( // silent anyway
678 (_gain == 0 && !apply_gain_automation) ||
680 // muted by solo of another track, but not using control outs for solo
682 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
684 // muted by mute of this track
690 /* don't use Route::silence() here, because that causes
691 all outputs (sends, port inserts, etc. to be silent).
694 if (_meter_point == MeterPostFader) {
695 reset_peak_meters ();
698 IO::silence (nframes, offset);
702 if ((_session.transport_speed() > 1.5f ||
703 _session.transport_speed() < -1.5f) &&
704 Config->get_quieten_at_speed()) {
705 pan (bufs, nbufs, nframes, offset, speed_quietning);
707 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
708 if (!_panner->empty() &&
709 (_panner->automation_state() & Play ||
710 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
711 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
713 pan (bufs, nbufs, nframes, offset, 1.0);
720 /* ----------------------------------------------------------------------------------------------------
722 -------------------------------------------------------------------------------------------------- */
724 if (meter && (_meter_point == MeterPostFader)) {
726 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
727 uint32_t no = n_outputs();
728 for (n = 0; n < no; ++n) {
732 uint32_t no = n_outputs();
733 for (n = 0; n < no; ++n) {
734 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
741 Route::n_process_buffers ()
743 return max (n_inputs(), redirect_max_outs);
748 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
750 vector<Sample*>& bufs = _session.get_passthru_buffers();
751 uint32_t limit = n_process_buffers ();
755 collect_input (bufs, limit, nframes, offset);
757 #define meter_stream meter_first
760 for (uint32_t n = 0; n < limit; ++n) {
761 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
763 meter_stream = false;
768 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
774 Route::set_phase_invert (bool yn, void *src)
776 if (_phase_invert != yn) {
778 // phase_invert_changed (src); /* EMIT SIGNAL */
783 Route::set_denormal_protection (bool yn, void *src)
785 if (_denormal_protection != yn) {
786 _denormal_protection = yn;
787 // denormal_protection_changed (src); /* EMIT SIGNAL */
792 Route::set_solo (bool yn, void *src)
798 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
799 _mix_group->apply (&Route::set_solo, yn, _mix_group);
805 solo_changed (src); /* EMIT SIGNAL */
806 _solo_control.Changed (); /* EMIT SIGNAL */
811 Route::set_solo_mute (bool yn)
813 Glib::Mutex::Lock lm (declick_lock);
815 /* Called by Session in response to another Route being soloed.
818 desired_solo_gain = (yn?0.0:1.0);
822 Route::set_solo_safe (bool yn, void *src)
824 if (_solo_safe != yn) {
826 solo_safe_changed (src); /* EMIT SIGNAL */
831 Route::set_mute (bool yn, void *src)
834 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
835 _mix_group->apply (&Route::set_mute, yn, _mix_group);
841 mute_changed (src); /* EMIT SIGNAL */
843 _mute_control.Changed (); /* EMIT SIGNAL */
845 Glib::Mutex::Lock lm (declick_lock);
846 desired_mute_gain = (yn?0.0f:1.0f);
851 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
853 uint32_t old_rmo = redirect_max_outs;
855 if (!_session.engine().connected()) {
860 Glib::RWLock::WriterLock lm (redirect_lock);
862 boost::shared_ptr<PluginInsert> pi;
863 boost::shared_ptr<PortInsert> porti;
865 _redirects.push_back (redirect);
867 if (_reset_plugin_counts (err_streams)) {
868 _redirects.pop_back ();
869 _reset_plugin_counts (0); // it worked before we tried to add it ...
873 uint32_t potential_max_streams = 0;
875 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
877 if (pi->input_streams() == 0) {
878 /* instrument plugin */
879 _have_internal_generator = true;
882 potential_max_streams = max(pi->input_streams(), pi->output_streams());
884 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
886 /* force new port inserts to start out with an i/o configuration
887 that matches this route's i/o configuration.
889 the "inputs" for the port are supposed to match the output
892 the "outputs" of the route should match the inputs of this
893 route. XXX shouldn't they match the number of active signal
894 streams at the point of insertion?
898 porti->ensure_io (n_outputs (), n_inputs(), false, this);
901 // Ensure peak vector sizes before the plugin is activated
902 while (_peak_power.size() < potential_max_streams) {
903 _peak_power.push_back(0);
905 while (_visible_peak_power.size() < potential_max_streams) {
906 _visible_peak_power.push_back(-INFINITY);
908 while (_max_peak_power.size() < potential_max_streams) {
909 _max_peak_power.push_back(-INFINITY);
912 redirect->activate ();
913 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
916 if (redirect_max_outs != old_rmo || old_rmo == 0) {
920 redirects_changed (src); /* EMIT SIGNAL */
926 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
928 uint32_t old_rmo = redirect_max_outs;
930 assert (ports_legal);
932 if (!_session.engine().connected()) {
937 Glib::RWLock::WriterLock lm (redirect_lock);
939 RedirectList::iterator existing_end = _redirects.end();
942 uint32_t potential_max_streams = 0;
944 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
946 boost::shared_ptr<PluginInsert> pi;
948 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
951 uint32_t m = max(pi->input_streams(), pi->output_streams());
952 if (m > potential_max_streams)
953 potential_max_streams = m;
956 // Ensure peak vector sizes before the plugin is activated
957 while (_peak_power.size() < potential_max_streams) {
958 _peak_power.push_back(0);
960 while (_visible_peak_power.size() < potential_max_streams) {
961 _visible_peak_power.push_back(-INFINITY);
963 while (_max_peak_power.size() < potential_max_streams) {
964 _max_peak_power.push_back(-INFINITY);
967 _redirects.push_back (*i);
969 if (_reset_plugin_counts (err_streams)) {
971 _redirects.erase (existing_end, _redirects.end());
972 _reset_plugin_counts (0); // it worked before we tried to add it ...
977 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
981 if (redirect_max_outs != old_rmo || old_rmo == 0) {
985 redirects_changed (src); /* EMIT SIGNAL */
989 /** Remove redirects with a given placement.
990 * @param p Placement of redirects to remove.
993 Route::clear_redirects (Placement p, void *src)
995 const uint32_t old_rmo = redirect_max_outs;
997 if (!_session.engine().connected()) {
1002 Glib::RWLock::WriterLock lm (redirect_lock);
1003 RedirectList new_list;
1005 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1006 if ((*i)->placement() == p) {
1007 /* it's the placement we want to get rid of */
1008 (*i)->drop_references ();
1010 /* it's a different placement, so keep it */
1011 new_list.push_back (*i);
1015 _redirects = new_list;
1018 /* FIXME: can't see how this test can ever fire */
1019 if (redirect_max_outs != old_rmo) {
1023 redirect_max_outs = 0;
1024 _have_internal_generator = false;
1025 redirects_changed (src); /* EMIT SIGNAL */
1029 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
1031 uint32_t old_rmo = redirect_max_outs;
1033 assert (ports_legal);
1035 if (!_session.engine().connected()) {
1039 redirect_max_outs = 0;
1042 Glib::RWLock::WriterLock lm (redirect_lock);
1043 RedirectList::iterator i;
1044 bool removed = false;
1046 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1047 if (*i == redirect) {
1049 RedirectList::iterator tmp;
1051 /* move along, see failure case for reset_plugin_counts()
1052 where we may need to reinsert the redirect.
1058 /* stop redirects that send signals to JACK ports
1059 from causing noise as a result of no longer being
1063 boost::shared_ptr<Send> send;
1064 boost::shared_ptr<PortInsert> port_insert;
1066 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
1067 send->disconnect_inputs (this);
1068 send->disconnect_outputs (this);
1069 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
1070 port_insert->disconnect_inputs (this);
1071 port_insert->disconnect_outputs (this);
1074 _redirects.erase (i);
1087 if (_reset_plugin_counts (err_streams)) {
1088 /* get back to where we where */
1089 _redirects.insert (i, redirect);
1090 /* we know this will work, because it worked before :) */
1091 _reset_plugin_counts (0);
1097 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1098 boost::shared_ptr<PluginInsert> pi;
1100 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1101 if (pi->is_generator()) {
1107 _have_internal_generator = foo;
1110 if (old_rmo != redirect_max_outs) {
1114 redirect->drop_references ();
1116 redirects_changed (src); /* EMIT SIGNAL */
1121 Route::reset_plugin_counts (uint32_t* lpc)
1123 Glib::RWLock::WriterLock lm (redirect_lock);
1124 return _reset_plugin_counts (lpc);
1129 Route::_reset_plugin_counts (uint32_t* err_streams)
1131 RedirectList::iterator r;
1132 uint32_t insert_cnt = 0;
1133 uint32_t send_cnt = 0;
1134 map<Placement,list<InsertCount> > insert_map;
1135 RedirectList::iterator prev;
1136 int32_t initial_streams;
1139 redirect_max_outs = 0;
1141 /* Step 1: build a map that links each insert to an in/out channel count
1143 Divide inserts up by placement so we get the signal flow
1144 properly modelled. we need to do this because the _redirects
1145 list is not sorted by placement, and because other reasons may
1146 exist now or in the future for this separate treatment.
1149 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1151 boost::shared_ptr<Insert> insert;
1153 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1155 insert_map[insert->placement()].push_back (InsertCount (insert));
1157 /* reset plugin counts back to one for now so
1158 that we have a predictable, controlled
1159 state to try to configure.
1162 boost::shared_ptr<PluginInsert> pi;
1164 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1168 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1173 if (insert_cnt == 0) {
1182 /* Now process each placement in order, checking to see if we
1183 can really do what has been requested.
1188 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1189 cerr << "Pre -- going to streamcount, err_streams = " << *err_streams << endl;//DEBUG
1193 /* figure out the streams that will feed into PreFader */
1195 if (!insert_map[PreFader].empty()) {
1196 InsertCount& ic (insert_map[PreFader].back());
1197 initial_streams = ic.insert->output_streams ();
1199 initial_streams = n_inputs ();
1204 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1205 cerr << "Post -- going to streamcount, err_streams = " << *err_streams << endl;//DEBUG
1209 /* OK, everything can be set up correctly, so lets do it */
1211 apply_some_plugin_counts (insert_map[PreFader]);
1212 apply_some_plugin_counts (insert_map[PostFader]);
1214 /* recompute max outs of any redirect */
1218 redirect_max_outs = 0;
1219 prev = _redirects.end();
1221 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1222 boost::shared_ptr<Send> s;
1224 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1225 if (r == _redirects.begin()) {
1226 s->expect_inputs (n_inputs());
1228 s->expect_inputs ((*prev)->output_streams());
1233 /* don't pay any attention to send output configuration, since it doesn't
1237 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1246 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1247 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1253 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1255 list<InsertCount>::iterator i;
1257 for (i = iclist.begin(); i != iclist.end(); ++i) {
1259 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1262 /* make sure that however many we have, they are all active */
1263 (*i).insert->activate ();
1270 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1272 list<InsertCount>::iterator i;
1274 for (i = iclist.begin(); i != iclist.end(); ++i) {
1276 if (((*i).cnt = (*i).insert->can_do (required_inputs, (*i).out)) < 0) {
1278 *err_streams = required_inputs;
1283 (*i).in = required_inputs;
1284 required_inputs = (*i).out;
1291 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1293 uint32_t old_rmo = redirect_max_outs;
1299 RedirectList to_be_deleted;
1302 Glib::RWLock::WriterLock lm (redirect_lock);
1303 RedirectList::iterator tmp;
1304 RedirectList the_copy;
1306 the_copy = _redirects;
1308 /* remove all relevant redirects */
1310 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1314 if ((*i)->placement() == placement) {
1315 to_be_deleted.push_back (*i);
1316 _redirects.erase (i);
1322 /* now copy the relevant ones from "other" */
1324 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1325 if ((*i)->placement() == placement) {
1326 _redirects.push_back (Redirect::clone (*i));
1330 /* reset plugin stream handling */
1332 if (_reset_plugin_counts (err_streams)) {
1334 /* FAILED COPY ATTEMPT: we have to restore order */
1336 /* delete all cloned redirects */
1338 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1343 if ((*i)->placement() == placement) {
1344 _redirects.erase (i);
1350 /* restore the natural order */
1352 _redirects = the_copy;
1353 redirect_max_outs = old_rmo;
1355 /* we failed, even though things are OK again */
1361 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1362 to_be_deleted.clear ();
1366 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1370 redirects_changed (this); /* EMIT SIGNAL */
1375 Route::all_redirects_flip ()
1377 Glib::RWLock::ReaderLock lm (redirect_lock);
1379 if (_redirects.empty()) {
1383 bool first_is_on = _redirects.front()->active();
1385 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1386 (*i)->set_active (!first_is_on, this);
1390 /** Set all redirects with a given placement to a given active state.
1391 * @param p Placement of redirects to change.
1392 * @param state New active state for those redirects.
1395 Route::all_redirects_active (Placement p, bool state)
1397 Glib::RWLock::ReaderLock lm (redirect_lock);
1399 if (_redirects.empty()) {
1403 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1404 if ((*i)->placement() == p) {
1405 (*i)->set_active (state, this);
1410 struct RedirectSorter {
1411 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1412 return a->sort_key() < b->sort_key();
1417 Route::sort_redirects (uint32_t* err_streams)
1420 RedirectSorter comparator;
1421 Glib::RWLock::WriterLock lm (redirect_lock);
1422 uint32_t old_rmo = redirect_max_outs;
1424 /* the sweet power of C++ ... */
1426 RedirectList as_it_was_before = _redirects;
1428 _redirects.sort (comparator);
1430 if (_reset_plugin_counts (err_streams)) {
1431 _redirects = as_it_was_before;
1432 redirect_max_outs = old_rmo;
1438 redirects_changed (this); /* EMIT SIGNAL */
1450 Route::get_template()
1452 return state(false);
1456 Route::state(bool full_state)
1458 XMLNode *node = new XMLNode("Route");
1459 RedirectList:: iterator i;
1463 node->add_property("flags", enum_2_string (_flags));
1466 node->add_property("default-type", _default_type.to_string());
1468 node->add_property("muted", _muted?"yes":"no");
1469 node->add_property("soloed", _soloed?"yes":"no");
1470 node->add_property("phase-invert", _phase_invert?"yes":"no");
1471 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1472 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1473 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1474 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1475 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1478 node->add_property("edit-group", _edit_group->name());
1481 node->add_property("mix-group", _mix_group->name());
1484 string order_string;
1485 OrderKeys::iterator x = order_keys.begin();
1487 while (x != order_keys.end()) {
1488 order_string += string ((*x).first);
1489 order_string += '=';
1490 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1491 order_string += buf;
1495 if (x == order_keys.end()) {
1499 order_string += ':';
1501 node->add_property ("order-keys", order_string);
1503 node->add_child_nocopy (IO::state (full_state));
1504 node->add_child_nocopy (_solo_control.get_state ());
1505 node->add_child_nocopy (_mute_control.get_state ());
1507 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1508 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1509 remote_control_node->add_property (X_("id"), buf);
1510 node->add_child_nocopy (*remote_control_node);
1512 if (_control_outs) {
1513 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1514 cnode->add_child_nocopy (_control_outs->state (full_state));
1515 node->add_child_nocopy (*cnode);
1518 if (_comment.length()) {
1519 XMLNode *cmt = node->add_child ("Comment");
1520 cmt->add_content (_comment);
1523 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1524 node->add_child_nocopy((*i)->state (full_state));
1528 node->add_child_copy (*_extra_xml);
1535 Route::set_deferred_state ()
1538 XMLNodeConstIterator niter;
1540 if (!deferred_state) {
1544 nlist = deferred_state->children();
1546 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1547 add_redirect_from_xml (**niter);
1550 delete deferred_state;
1555 Route::add_redirect_from_xml (const XMLNode& node)
1557 const XMLProperty *prop;
1559 if (node.name() == "Send") {
1563 boost::shared_ptr<Send> send (new Send (_session, node));
1564 add_redirect (send, this);
1567 catch (failed_constructor &err) {
1568 error << _("Send construction failed") << endmsg;
1572 } else if (node.name() == "Insert") {
1575 if ((prop = node.property ("type")) != 0) {
1577 boost::shared_ptr<Insert> insert;
1578 bool have_insert = false;
1580 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1581 prop->value() == "lv2" ||
1582 prop->value() == "vst" ||
1583 prop->value() == "audiounit") {
1585 insert.reset (new PluginInsert(_session, node));
1588 } else if (prop->value() == "port") {
1591 insert.reset (new PortInsert (_session, node));
1596 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1600 add_redirect (insert, this);
1604 error << _("Insert XML node has no type property") << endmsg;
1608 catch (failed_constructor &err) {
1609 warning << _("insert could not be created. Ignored.") << endmsg;
1616 Route::set_state (const XMLNode& node)
1618 return _set_state (node, true);
1622 Route::_set_state (const XMLNode& node, bool call_base)
1625 XMLNodeConstIterator niter;
1627 XMLPropertyList plist;
1628 const XMLProperty *prop;
1630 if (node.name() != "Route"){
1631 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1635 if ((prop = node.property (X_("flags"))) != 0) {
1636 _flags = Flag (string_2_enum (prop->value(), _flags));
1641 if ((prop = node.property (X_("default-type"))) != 0) {
1642 _default_type = DataType(prop->value());
1643 assert(_default_type != DataType::NIL);
1646 if ((prop = node.property (X_("phase-invert"))) != 0) {
1647 set_phase_invert (prop->value()=="yes"?true:false, this);
1650 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1651 set_denormal_protection (prop->value()=="yes"?true:false, this);
1654 if ((prop = node.property (X_("muted"))) != 0) {
1655 bool yn = prop->value()=="yes"?true:false;
1657 /* force reset of mute status */
1661 mute_gain = desired_mute_gain;
1664 if ((prop = node.property (X_("soloed"))) != 0) {
1665 bool yn = prop->value()=="yes"?true:false;
1667 /* force reset of solo status */
1670 set_solo (yn, this);
1671 solo_gain = desired_solo_gain;
1674 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1675 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1678 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1679 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1682 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1683 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1686 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1687 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1690 if ((prop = node.property (X_("edit-group"))) != 0) {
1691 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1692 if(edit_group == 0) {
1693 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1695 set_edit_group(edit_group, this);
1699 if ((prop = node.property (X_("order-keys"))) != 0) {
1703 string::size_type colon, equal;
1704 string remaining = prop->value();
1706 while (remaining.length()) {
1708 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1709 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1712 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1713 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1716 set_order_key (remaining.substr (0, equal).c_str(), n);
1720 colon = remaining.find_first_of (':');
1722 if (colon != string::npos) {
1723 remaining = remaining.substr (colon+1);
1730 nlist = node.children();
1732 if (deferred_state) {
1733 delete deferred_state;
1736 deferred_state = new XMLNode(X_("deferred state"));
1738 /* set parent class properties before anything else */
1740 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1744 if (child->name() == IO::state_node_name && call_base) {
1746 IO::set_state (*child);
1752 XMLNodeList redirect_nodes;
1754 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1758 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
1759 redirect_nodes.push_back(child);
1764 _set_redirect_states (redirect_nodes);
1766 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1768 // All redirects (sends and inserts) have been applied already
1770 if (child->name() == X_("Automation")) {
1772 if ((prop = child->property (X_("path"))) != 0) {
1773 load_automation (prop->value());
1776 } else if (child->name() == X_("ControlOuts")) {
1778 string coutname = _name;
1779 coutname += _("[control]");
1781 _control_outs = new IO (_session, coutname);
1782 _control_outs->set_state (**(child->children().begin()));
1784 } else if (child->name() == X_("Comment")) {
1786 /* XXX this is a terrible API design in libxml++ */
1788 XMLNode *cmt = *(child->children().begin());
1789 _comment = cmt->content();
1791 } else if (child->name() == X_("extra")) {
1793 _extra_xml = new XMLNode (*child);
1795 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1797 if (prop->value() == "solo") {
1798 _solo_control.set_state (*child);
1799 _session.add_controllable (&_solo_control);
1801 else if (prop->value() == "mute") {
1802 _mute_control.set_state (*child);
1803 _session.add_controllable (&_mute_control);
1806 else if (child->name() == X_("remote_control")) {
1807 if ((prop = child->property (X_("id"))) != 0) {
1809 sscanf (prop->value().c_str(), "%d", &x);
1810 set_remote_control_id (x);
1815 if ((prop = node.property (X_("mix-group"))) != 0) {
1816 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1817 if (mix_group == 0) {
1818 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1820 set_mix_group(mix_group, this);
1828 Route::_set_redirect_states(const XMLNodeList &nlist)
1830 XMLNodeConstIterator niter;
1833 RedirectList::iterator i, o;
1837 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1838 deferred_state->add_child_copy (**niter);
1844 // Iterate through existing redirects, remove those which are not in the state list
1845 for (i = _redirects.begin(); i != _redirects.end(); ) {
1846 RedirectList::iterator tmp = i;
1849 bool redirectInStateList = false;
1851 (*i)->id().print (buf, sizeof (buf));
1853 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1855 if (strncmp (buf,(*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1856 redirectInStateList = true;
1861 if (!redirectInStateList) {
1862 remove_redirect ( *i, this);
1870 // Iterate through state list and make sure all redirects are on the track and in the correct order,
1871 // set the state of existing redirects according to the new state on the same go
1872 i = _redirects.begin();
1873 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1875 // Check whether the next redirect in the list
1878 while (o != _redirects.end()) {
1879 (*o)->id().print (buf, sizeof (buf));
1880 if ( strncmp(buf, (*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1885 if (o == _redirects.end()) {
1886 // If the redirect (*niter) is not on the route, we need to create it
1887 // and move it to the correct location
1889 RedirectList::iterator prev_last = _redirects.end();
1890 --prev_last; // We need this to check whether adding succeeded
1892 add_redirect_from_xml (**niter);
1894 RedirectList::iterator last = _redirects.end();
1897 if (prev_last == last) {
1898 warning << _name << ": could not fully restore state as some redirects were not possible to create" << endmsg;
1903 boost::shared_ptr<Redirect> tmp = (*last);
1904 // remove the redirect from the wrong location
1905 _redirects.erase(last);
1906 // insert the new redirect at the current location
1907 _redirects.insert(i, tmp);
1909 --i; // move pointer to the newly inserted redirect
1913 // We found the redirect (*niter) on the route, first we must make sure the redirect
1914 // is at the location provided in the XML state
1916 boost::shared_ptr<Redirect> tmp = (*o);
1917 // remove the old copy
1918 _redirects.erase(o);
1919 // insert the redirect at the correct location
1920 _redirects.insert(i, tmp);
1922 --i; // move pointer so it points to the right redirect
1925 (*i)->set_state( (**niter) );
1928 redirects_changed(this);
1932 Route::curve_reallocate ()
1934 // _gain_automation_curve.finish_resize ();
1935 // _pan_automation_curve.finish_resize ();
1939 Route::silence (nframes_t nframes, nframes_t offset)
1943 // reset_peak_meters ();
1945 IO::silence (nframes, offset);
1947 if (_control_outs) {
1948 _control_outs->silence (nframes, offset);
1952 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1955 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1956 boost::shared_ptr<PluginInsert> pi;
1957 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1958 // skip plugins, they don't need anything when we're not active
1962 (*i)->silence (nframes, offset);
1965 if (nframes == _session.get_block_size() && offset == 0) {
1975 Route::set_control_outs (const vector<string>& ports)
1977 Glib::Mutex::Lock lm (control_outs_lock);
1978 vector<string>::const_iterator i;
1981 if (_control_outs) {
1982 delete _control_outs;
1986 if (control() || master()) {
1987 /* no control outs for these two special busses */
1991 if (ports.empty()) {
1995 string coutname = _name;
1996 coutname += _("[control]");
1998 _control_outs = new IO (_session, coutname);
2000 /* our control outs need as many outputs as we
2001 have outputs. we track the changes in ::output_change_handler().
2004 limit = n_outputs ();
2006 if (_control_outs->ensure_io (0, limit, true, this)) {
2010 /* now connect to the named ports */
2012 for (uint32_t n = 0; n < limit; ++n) {
2013 if (_control_outs->connect_output (_control_outs->output (n), ports[n % ports.size()], this)) {
2014 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2023 Route::set_edit_group (RouteGroup *eg, void *src)
2026 if (eg == _edit_group) {
2031 _edit_group->remove (this);
2034 if ((_edit_group = eg) != 0) {
2035 _edit_group->add (this);
2038 _session.set_dirty ();
2039 edit_group_changed (src); /* EMIT SIGNAL */
2043 Route::drop_edit_group (void *src)
2046 _session.set_dirty ();
2047 edit_group_changed (src); /* EMIT SIGNAL */
2051 Route::set_mix_group (RouteGroup *mg, void *src)
2054 if (mg == _mix_group) {
2059 _mix_group->remove (this);
2062 if ((_mix_group = mg) != 0) {
2063 _mix_group->add (this);
2066 _session.set_dirty ();
2067 mix_group_changed (src); /* EMIT SIGNAL */
2071 Route::drop_mix_group (void *src)
2074 _session.set_dirty ();
2075 mix_group_changed (src); /* EMIT SIGNAL */
2079 Route::set_comment (string cmt, void *src)
2082 comment_changed (src);
2083 _session.set_dirty ();
2087 Route::feeds (boost::shared_ptr<Route> other)
2092 uint32_t no = self.n_outputs();
2093 uint32_t ni = other->n_inputs ();
2095 for (i = 0; i < no; ++i) {
2096 for (j = 0; j < ni; ++j) {
2097 if (self.output(i)->connected_to (other->input(j)->name())) {
2103 /* check Redirects which may also interconnect Routes */
2105 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2107 no = (*r)->n_outputs();
2109 for (i = 0; i < no; ++i) {
2110 for (j = 0; j < ni; ++j) {
2111 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2118 /* check for control room outputs which may also interconnect Routes */
2120 if (_control_outs) {
2122 no = _control_outs->n_outputs();
2124 for (i = 0; i < no; ++i) {
2125 for (j = 0; j < ni; ++j) {
2126 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2137 Route::set_mute_config (mute_type t, bool onoff, void *src)
2141 _mute_affects_pre_fader = onoff;
2142 pre_fader_changed(src); /* EMIT SIGNAL */
2146 _mute_affects_post_fader = onoff;
2147 post_fader_changed(src); /* EMIT SIGNAL */
2151 _mute_affects_control_outs = onoff;
2152 control_outs_changed(src); /* EMIT SIGNAL */
2156 _mute_affects_main_outs = onoff;
2157 main_outs_changed(src); /* EMIT SIGNAL */
2163 Route::get_mute_config (mute_type t)
2169 onoff = _mute_affects_pre_fader;
2172 onoff = _mute_affects_post_fader;
2175 onoff = _mute_affects_control_outs;
2178 onoff = _mute_affects_main_outs;
2186 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2188 nframes_t now = _session.transport_frame();
2191 Glib::RWLock::ReaderLock lm (redirect_lock);
2194 automation_snapshot (now, true);
2197 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2199 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2200 (*i)->deactivate ();
2204 (*i)->transport_stopped (now);
2208 IO::transport_stopped (now);
2210 _roll_delay = _initial_delay;
2214 Route::input_change_handler (IOChange change, void *ignored)
2216 if (change & ConfigurationChanged) {
2217 reset_plugin_counts (0);
2222 Route::output_change_handler (IOChange change, void *ignored)
2224 if (change & ConfigurationChanged) {
2225 if (_control_outs) {
2226 _control_outs->ensure_io (0, n_outputs(), true, this);
2229 reset_plugin_counts (0);
2234 Route::pans_required () const
2236 if (n_outputs() < 2) {
2240 return max (n_inputs (), redirect_max_outs);
2244 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2245 bool session_state_changing, bool can_record, bool rec_monitors_input)
2247 if (n_outputs() == 0) {
2251 if (session_state_changing || !_active) {
2252 silence (nframes, offset);
2256 apply_gain_automation = false;
2259 passthru (start_frame, end_frame, nframes, offset, 0, false);
2261 silence (nframes, offset);
2268 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2270 if (_roll_delay > nframes) {
2272 _roll_delay -= nframes;
2273 silence (nframes, offset);
2274 /* transport frame is not legal for caller to use */
2277 } else if (_roll_delay > 0) {
2279 nframes -= _roll_delay;
2281 silence (_roll_delay, offset);
2283 offset += _roll_delay;
2284 transport_frame += _roll_delay;
2293 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2294 bool can_record, bool rec_monitors_input)
2297 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2299 // automation snapshot can also be called from the non-rt context
2300 // and it uses the redirect list, so we take the lock out here
2301 automation_snapshot (_session.transport_frame(), false);
2305 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2306 silence (nframes, offset);
2310 nframes_t unused = 0;
2312 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2318 apply_gain_automation = false;
2321 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2323 if (am.locked() && _session.transport_rolling()) {
2325 nframes_t start_frame = end_frame - nframes;
2327 if (gain_automation_playback()) {
2328 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2333 passthru (start_frame, end_frame, nframes, offset, declick, false);
2339 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2340 bool can_record, bool rec_monitors_input)
2342 silence (nframes, offset);
2347 Route::toggle_monitor_input ()
2349 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2350 (*i)->ensure_monitor_input(!(*i)->monitoring_input());
2355 Route::has_external_redirects () const
2357 boost::shared_ptr<const PortInsert> pi;
2359 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2360 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2362 uint32_t no = pi->n_outputs();
2364 for (uint32_t n = 0; n < no; ++n) {
2366 string port_name = pi->output(n)->name();
2367 string client_name = port_name.substr (0, port_name.find(':'));
2369 /* only say "yes" if the redirect is actually in use */
2371 if (client_name != "ardour" && pi->active()) {
2382 Route::flush_redirects ()
2384 /* XXX shouldn't really try to take this lock, since
2385 this is called from the RT audio thread.
2388 Glib::RWLock::ReaderLock lm (redirect_lock);
2390 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2391 (*i)->deactivate ();
2397 Route::set_meter_point (MeterPoint p, void *src)
2399 if (_meter_point != p) {
2401 meter_change (src); /* EMIT SIGNAL */
2402 _session.set_dirty ();
2407 Route::update_total_latency ()
2411 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2412 if ((*i)->active ()) {
2413 _own_latency += (*i)->latency ();
2417 #undef DEBUG_LATENCY
2418 #ifdef DEBUG_LATENCY
2419 cerr << _name << ": internal redirect latency = " << _own_latency << endl;
2422 set_port_latency (_own_latency);
2424 /* this (virtual) function is used for pure Routes,
2425 not derived classes like AudioTrack. this means
2426 that the data processed here comes from an input
2427 port, not prerecorded material, and therefore we
2428 have to take into account any input latency.
2431 _own_latency += input_latency ();
2433 #ifdef DEBUG_LATENCY
2434 cerr << _name << ": input latency = " << input_latency() << " total = "
2435 << _own_latency << endl;
2438 return _own_latency;
2442 Route::set_latency_delay (nframes_t longest_session_latency)
2444 _initial_delay = longest_session_latency - _own_latency;
2446 if (_session.transport_stopped()) {
2447 _roll_delay = _initial_delay;
2452 Route::automation_snapshot (nframes_t now, bool force)
2454 if (!force && !should_snapshot(now)) {
2458 IO::automation_snapshot (now, force);
2460 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2461 (*i)->automation_snapshot (now, force);
2465 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2466 : Controllable (name), route (s), type(tp)
2472 Route::ToggleControllable::set_value (float val)
2474 bool bval = ((val >= 0.5f) ? true: false);
2478 route.set_mute (bval, this);
2481 route.set_solo (bval, this);
2489 Route::ToggleControllable::get_value (void) const
2495 val = route.muted() ? 1.0f : 0.0f;
2498 val = route.soloed() ? 1.0f : 0.0f;
2508 Route::set_block_size (nframes_t nframes)
2510 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2511 (*i)->set_block_size (nframes);
2516 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2518 _session.update_latency_compensation (false, false);
2522 Route::protect_automation ()
2524 switch (gain_automation_state()) {
2526 set_gain_automation_state (Off);
2528 set_gain_automation_state (Play);
2534 switch (panner().automation_state ()) {
2536 panner().set_automation_state (Off);
2539 panner().set_automation_state (Play);
2545 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2546 boost::shared_ptr<PluginInsert> pi;
2547 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2548 pi->protect_automation ();
2554 Route::set_pending_declick (int declick)
2557 /* this call is not allowed to turn off a pending declick unless "force" is true */
2559 _pending_declick = declick;
2561 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2563 _pending_declick = 0;