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>
44 #include <ardour/profile.h>
49 using namespace ARDOUR;
52 uint32_t Route::order_key_cnt = 0;
53 sigc::signal<void> Route::SyncOrderKeys;
55 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
56 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
58 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
59 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
64 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
65 : IO (sess, *node.child ("IO"), default_type),
66 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
67 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
70 _set_state (node, false);
76 redirect_max_outs = 0;
80 _phase_invert = false;
81 _denormal_protection = false;
82 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::ensure_track_or_route_name(string name, Session &session)
191 string newname = name;
193 while (session.route_by_name (newname)!=NULL)
195 newname = bump_name_once (newname);
203 Route::inc_gain (gain_t fraction, void *src)
205 IO::inc_gain (fraction, src);
209 Route::set_gain (gain_t val, void *src)
211 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
213 if (_mix_group->is_relative()) {
216 gain_t usable_gain = gain();
217 if (usable_gain < 0.000001f) {
218 usable_gain=0.000001f;
222 if (delta < 0.000001f) {
226 delta -= usable_gain;
228 if (delta == 0.0f) return;
230 gain_t factor = delta / usable_gain;
233 factor = _mix_group->get_max_factor(factor);
234 if (factor == 0.0f) {
239 factor = _mix_group->get_min_factor(factor);
240 if (factor == 0.0f) {
246 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
250 _mix_group->apply (&Route::set_gain, val, _mix_group);
260 IO::set_gain (val, src);
264 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
265 nframes_t start_frame, nframes_t end_frame,
266 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
270 RedirectList::iterator i;
271 bool post_fader_work = false;
272 bool mute_declick_applied = false;
274 vector<Sample*>::iterator bufiter;
279 gain_t* gab = _session.gain_automation_buffer();
281 switch (Config->get_monitoring_model()) {
282 case HardwareMonitoring:
283 case ExternalMonitoring:
290 declick = _pending_declick;
293 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
303 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
306 dmg = desired_mute_gain;
307 dsg = desired_solo_gain;
316 /* ----------------------------------------------------------------------------------------------------
317 GLOBAL DECLICK (for transport changes etc.)
318 -------------------------------------------------------------------------------------------------- */
321 apply_declick (bufs, nbufs, nframes, 0.0, 1.0, false);
322 _pending_declick = 0;
323 } else if (declick < 0) {
324 apply_declick (bufs, nbufs, nframes, 1.0, 0.0, false);
325 _pending_declick = 0;
328 /* no global declick */
330 if (solo_gain != dsg) {
331 apply_declick (bufs, nbufs, nframes, solo_gain, dsg, false);
337 /* ----------------------------------------------------------------------------------------------------
338 INPUT METERING & MONITORING
339 -------------------------------------------------------------------------------------------------- */
341 if (meter && (_meter_point == MeterInput)) {
342 for (n = 0; n < nbufs; ++n) {
343 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
347 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
348 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
350 mute_declick_applied = true;
353 if ((_meter_point == MeterInput) && co) {
355 solo_audible = dsg > 0;
356 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
358 if ( // muted by solo of another track
362 // muted by mute of this track
366 // rec-enabled but not s/w monitoring
368 // TODO: this is probably wrong
370 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
374 co->silence (nframes, offset);
378 co->deliver_output (bufs, nbufs, nframes, offset);
383 /* -----------------------------------------------------------------------------------------------------
385 -------------------------------------------------------------------------------------------------- */
387 if (_denormal_protection || Config->get_denormal_protection()) {
389 for (n = 0; n < nbufs; ++n) {
390 Sample *sp = bufs[n];
392 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
399 /* ----------------------------------------------------------------------------------------------------
401 -------------------------------------------------------------------------------------------------- */
403 if (with_redirects) {
404 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
406 if (mute_gain > 0 || !_mute_affects_pre_fader) {
407 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
408 switch ((*i)->placement()) {
411 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
412 (*i)->silence (nframes, offset);
415 (*i)->run (bufs, nbufs, nframes, offset);
419 post_fader_work = true;
424 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
425 switch ((*i)->placement()) {
427 (*i)->silence (nframes, offset);
430 post_fader_work = true;
439 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
440 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
442 mute_declick_applied = true;
445 /* ----------------------------------------------------------------------------------------------------
446 PRE-FADER METERING & MONITORING
447 -------------------------------------------------------------------------------------------------- */
449 if (meter && (_meter_point == MeterPreFader)) {
450 for (n = 0; n < nbufs; ++n) {
451 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
456 if ((_meter_point == MeterPreFader) && co) {
458 solo_audible = dsg > 0;
459 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
461 if ( // muted by solo of another track
465 // muted by mute of this track
469 // rec-enabled but not s/w monitoring
471 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
475 co->silence (nframes, offset);
479 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
484 /* ----------------------------------------------------------------------------------------------------
486 -------------------------------------------------------------------------------------------------- */
488 /* if not recording or recording and requiring any monitor signal, then apply gain */
490 if ( // not recording
492 !(record_enabled() && _session.actively_recording()) ||
496 // AND software monitoring required
498 (Config->get_monitoring_model() == SoftwareMonitoring)) {
500 if (apply_gain_automation) {
503 for (n = 0; n < nbufs; ++n) {
504 Sample *sp = bufs[n];
506 for (nframes_t nx = 0; nx < nframes; ++nx) {
511 for (n = 0; n < nbufs; ++n) {
512 Sample *sp = bufs[n];
514 for (nframes_t nx = 0; nx < nframes; ++nx) {
520 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
521 _effective_gain = gab[nframes-1];
526 /* manual (scalar) gain */
530 apply_declick (bufs, nbufs, nframes, _gain, dg, _phase_invert);
533 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
535 /* no need to interpolate current gain value,
536 but its non-unity, so apply it. if the gain
537 is zero, do nothing because we'll ship silence
549 for (n = 0; n < nbufs; ++n) {
550 Sample *sp = bufs[n];
551 Session::apply_gain_to_buffer(sp,nframes,this_gain);
554 } else if (_gain == 0) {
555 for (n = 0; n < nbufs; ++n) {
556 memset (bufs[n], 0, sizeof (Sample) * nframes);
563 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
567 /* ----------------------------------------------------------------------------------------------------
569 -------------------------------------------------------------------------------------------------- */
571 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
573 if (post_fader_work) {
575 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
577 if (mute_gain > 0 || !_mute_affects_post_fader) {
578 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
579 switch ((*i)->placement()) {
584 if (boost::dynamic_pointer_cast<Send>(*i) || boost::dynamic_pointer_cast<PortInsert>(*i)) {
585 (*i)->silence (nframes, offset);
588 (*i)->run (bufs, nbufs, nframes, offset);
594 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
595 switch ((*i)->placement()) {
599 (*i)->silence (nframes, offset);
607 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
608 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
610 mute_declick_applied = true;
613 /* ----------------------------------------------------------------------------------------------------
615 -------------------------------------------------------------------------------------------------- */
617 if ((_meter_point == MeterPostFader) && co) {
619 solo_audible = solo_gain > 0;
620 mute_audible = dmg > 0 || !_mute_affects_control_outs;
622 if ( // silent anyway
624 (_gain == 0 && !apply_gain_automation) ||
626 // muted by solo of another track
630 // muted by mute of this track
634 // recording but not s/w monitoring
636 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
640 co->silence (nframes, offset);
644 co->deliver_output_no_pan (bufs, nbufs, nframes, offset);
648 /* ----------------------------------------------------------------------
650 ----------------------------------------------------------------------*/
652 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
653 apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
655 mute_declick_applied = true;
658 /* ----------------------------------------------------------------------------------------------------
660 -------------------------------------------------------------------------------------------------- */
662 solo_audible = dsg > 0;
663 mute_audible = dmg > 0 || !_mute_affects_main_outs;
665 if (n_outputs() == 0) {
669 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
671 IO::silence (nframes, offset);
675 if ( // silent anyway
677 (_gain == 0 && !apply_gain_automation) ||
679 // muted by solo of another track, but not using control outs for solo
681 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
683 // muted by mute of this track
689 /* don't use Route::silence() here, because that causes
690 all outputs (sends, port inserts, etc. to be silent).
693 if (_meter_point == MeterPostFader) {
694 reset_peak_meters ();
697 IO::silence (nframes, offset);
701 if ((_session.transport_speed() > 1.5f ||
702 _session.transport_speed() < -1.5f) &&
703 Config->get_quieten_at_speed()) {
704 pan (bufs, nbufs, nframes, offset, speed_quietning);
706 // cerr << _name << " panner state = " << _panner->automation_state() << endl;
707 if (!_panner->empty() &&
708 (_panner->automation_state() & Play ||
709 ((_panner->automation_state() & Touch) && !_panner->touching()))) {
710 pan_automated (bufs, nbufs, start_frame, end_frame, nframes, offset);
712 pan (bufs, nbufs, nframes, offset, 1.0);
719 /* ----------------------------------------------------------------------------------------------------
721 -------------------------------------------------------------------------------------------------- */
723 if (meter && (_meter_point == MeterPostFader)) {
725 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
726 uint32_t no = n_outputs();
727 for (n = 0; n < no; ++n) {
731 uint32_t no = n_outputs();
732 for (n = 0; n < no; ++n) {
733 _peak_power[n] = Session::compute_peak (output(n)->get_buffer (nframes) + offset, nframes, _peak_power[n]);
740 Route::n_process_buffers ()
742 return max (n_inputs(), redirect_max_outs);
747 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
749 vector<Sample*>& bufs = _session.get_passthru_buffers();
750 uint32_t limit = n_process_buffers ();
754 collect_input (bufs, limit, nframes, offset);
756 #define meter_stream meter_first
759 for (uint32_t n = 0; n < limit; ++n) {
760 _peak_power[n] = Session::compute_peak (bufs[n], nframes, _peak_power[n]);
762 meter_stream = false;
767 process_output_buffers (bufs, limit, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
773 Route::set_phase_invert (bool yn, void *src)
775 if (_phase_invert != yn) {
777 // phase_invert_changed (src); /* EMIT SIGNAL */
782 Route::set_denormal_protection (bool yn, void *src)
784 if (_denormal_protection != yn) {
785 _denormal_protection = yn;
786 // denormal_protection_changed (src); /* EMIT SIGNAL */
791 Route::set_solo (bool yn, void *src)
797 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
798 _mix_group->apply (&Route::set_solo, yn, _mix_group);
804 solo_changed (src); /* EMIT SIGNAL */
805 _solo_control.Changed (); /* EMIT SIGNAL */
810 Route::set_solo_mute (bool yn)
812 Glib::Mutex::Lock lm (declick_lock);
814 /* Called by Session in response to another Route being soloed.
817 desired_solo_gain = (yn?0.0:1.0);
821 Route::set_solo_safe (bool yn, void *src)
823 if (_solo_safe != yn) {
825 solo_safe_changed (src); /* EMIT SIGNAL */
830 Route::set_mute (bool yn, void *src)
833 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
834 _mix_group->apply (&Route::set_mute, yn, _mix_group);
840 mute_changed (src); /* EMIT SIGNAL */
842 _mute_control.Changed (); /* EMIT SIGNAL */
844 Glib::Mutex::Lock lm (declick_lock);
845 desired_mute_gain = (yn?0.0f:1.0f);
850 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
852 uint32_t old_rmo = redirect_max_outs;
854 if (!_session.engine().connected()) {
859 Glib::RWLock::WriterLock lm (redirect_lock);
861 boost::shared_ptr<PluginInsert> pi;
862 boost::shared_ptr<PortInsert> porti;
864 uint32_t potential_max_streams = 0;
866 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
869 if (pi->input_streams() == 0) {
870 /* instrument plugin */
871 _have_internal_generator = true;
874 potential_max_streams = max(pi->input_streams(), pi->output_streams());
876 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
878 /* force new port inserts to start out with an i/o configuration
879 that matches this route's i/o configuration.
881 the "inputs" for the port are supposed to match the output
884 the "outputs" of the route should match the inputs of this
885 route. XXX shouldn't they match the number of active signal
886 streams at the point of insertion?
890 porti->ensure_io (n_outputs (), n_inputs(), false, this);
893 // Ensure peak vector sizes before the plugin is activated
894 while (_peak_power.size() < potential_max_streams) {
895 _peak_power.push_back(0);
897 while (_visible_peak_power.size() < potential_max_streams) {
898 _visible_peak_power.push_back(-INFINITY);
900 while (_max_peak_power.size() < potential_max_streams) {
901 _max_peak_power.push_back(-INFINITY);
904 _redirects.push_back (redirect);
906 if (_reset_plugin_counts (err_streams)) {
907 _redirects.pop_back ();
908 _reset_plugin_counts (0); // it worked before we tried to add it ...
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;
1134 map<Placement,list<InsertCount> > insert_map;
1135 nframes_t initial_streams;
1137 redirect_max_outs = 0;
1141 /* divide inserts up by placement so we get the signal flow
1142 properly modelled. we need to do this because the _redirects
1143 list is not sorted by placement, and because other reasons may
1144 exist now or in the future for this separate treatment.
1147 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1149 boost::shared_ptr<Insert> insert;
1151 /* do this here in case we bomb out before we get to the end of
1155 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1157 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1159 insert_map[insert->placement()].push_back (InsertCount (insert));
1161 /* reset plugin counts back to one for now so
1162 that we have a predictable, controlled
1163 state to try to configure.
1166 boost::shared_ptr<PluginInsert> pi;
1168 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1172 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1185 /* Now process each placement in order, checking to see if we
1186 can really do what has been requested.
1191 if (check_some_plugin_counts (insert_map[PreFader], n_inputs (), err_streams)) {
1195 /* figure out the streams that will feed into PreFader */
1197 if (!insert_map[PreFader].empty()) {
1198 InsertCount& ic (insert_map[PreFader].back());
1199 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1201 initial_streams = n_inputs ();
1206 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1210 /* OK, everything can be set up correctly, so lets do it */
1212 apply_some_plugin_counts (insert_map[PreFader]);
1213 apply_some_plugin_counts (insert_map[PostFader]);
1215 /* recompute max outs of any redirect */
1219 redirect_max_outs = 0;
1220 RedirectList::iterator prev = _redirects.end();
1222 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1223 boost::shared_ptr<Send> s;
1225 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1226 if (r == _redirects.begin()) {
1227 s->expect_inputs (n_inputs());
1229 s->expect_inputs ((*prev)->output_streams());
1234 /* don't pay any attention to send output configuration, since it doesn't
1238 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1249 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1251 list<InsertCount>::iterator i;
1253 for (i = iclist.begin(); i != iclist.end(); ++i) {
1255 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1258 /* make sure that however many we have, they are all active */
1259 (*i).insert->activate ();
1266 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1268 list<InsertCount>::iterator i;
1270 for (i = iclist.begin(); i != iclist.end(); ++i) {
1272 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1274 *err_streams = required_inputs;
1279 (*i).in = required_inputs;
1281 if (((*i).out = (*i).insert->compute_output_streams ((*i).cnt)) < 0) {
1283 *err_streams = required_inputs;
1288 required_inputs = (*i).out;
1295 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1297 uint32_t old_rmo = redirect_max_outs;
1303 RedirectList to_be_deleted;
1306 Glib::RWLock::WriterLock lm (redirect_lock);
1307 RedirectList::iterator tmp;
1308 RedirectList the_copy;
1310 the_copy = _redirects;
1312 /* remove all relevant redirects */
1314 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1318 if ((*i)->placement() == placement) {
1319 to_be_deleted.push_back (*i);
1320 _redirects.erase (i);
1326 /* now copy the relevant ones from "other" */
1328 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1329 if ((*i)->placement() == placement) {
1330 _redirects.push_back (Redirect::clone (*i));
1334 /* reset plugin stream handling */
1336 if (_reset_plugin_counts (err_streams)) {
1338 /* FAILED COPY ATTEMPT: we have to restore order */
1340 /* delete all cloned redirects */
1342 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1347 if ((*i)->placement() == placement) {
1348 _redirects.erase (i);
1354 /* restore the natural order */
1356 _redirects = the_copy;
1357 redirect_max_outs = old_rmo;
1359 /* we failed, even though things are OK again */
1365 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1366 to_be_deleted.clear ();
1370 if (redirect_max_outs != old_rmo || old_rmo == 0) {
1374 redirects_changed (this); /* EMIT SIGNAL */
1379 Route::all_redirects_flip ()
1381 Glib::RWLock::ReaderLock lm (redirect_lock);
1383 if (_redirects.empty()) {
1387 bool first_is_on = _redirects.front()->active();
1389 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1390 (*i)->set_active (!first_is_on, this);
1394 /** Set all redirects with a given placement to a given active state.
1395 * @param p Placement of redirects to change.
1396 * @param state New active state for those redirects.
1399 Route::all_redirects_active (Placement p, bool state)
1401 Glib::RWLock::ReaderLock lm (redirect_lock);
1403 if (_redirects.empty()) {
1407 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1408 if ((*i)->placement() == p) {
1409 (*i)->set_active (state, this);
1414 struct RedirectSorter {
1415 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1416 return a->sort_key() < b->sort_key();
1421 Route::sort_redirects (uint32_t* err_streams)
1424 RedirectSorter comparator;
1425 Glib::RWLock::WriterLock lm (redirect_lock);
1426 uint32_t old_rmo = redirect_max_outs;
1428 /* the sweet power of C++ ... */
1430 RedirectList as_it_was_before = _redirects;
1432 _redirects.sort (comparator);
1434 if (_reset_plugin_counts (err_streams)) {
1435 _redirects = as_it_was_before;
1436 redirect_max_outs = old_rmo;
1442 redirects_changed (this); /* EMIT SIGNAL */
1454 Route::get_template()
1456 return state(false);
1460 Route::state(bool full_state)
1462 XMLNode *node = new XMLNode("Route");
1463 RedirectList:: iterator i;
1467 node->add_property("flags", enum_2_string (_flags));
1470 node->add_property("default-type", _default_type.to_string());
1472 node->add_property("muted", _muted?"yes":"no");
1473 node->add_property("soloed", _soloed?"yes":"no");
1474 node->add_property("phase-invert", _phase_invert?"yes":"no");
1475 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1476 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1477 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1478 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1479 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1482 node->add_property("edit-group", _edit_group->name());
1485 node->add_property("mix-group", _mix_group->name());
1488 string order_string;
1489 OrderKeys::iterator x = order_keys.begin();
1491 while (x != order_keys.end()) {
1492 order_string += string ((*x).first);
1493 order_string += '=';
1494 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1495 order_string += buf;
1499 if (x == order_keys.end()) {
1503 order_string += ':';
1505 node->add_property ("order-keys", order_string);
1507 node->add_child_nocopy (IO::state (full_state));
1508 node->add_child_nocopy (_solo_control.get_state ());
1509 node->add_child_nocopy (_mute_control.get_state ());
1511 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1512 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1513 remote_control_node->add_property (X_("id"), buf);
1514 node->add_child_nocopy (*remote_control_node);
1516 if (_control_outs) {
1517 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1518 cnode->add_child_nocopy (_control_outs->state (full_state));
1519 node->add_child_nocopy (*cnode);
1522 if (_comment.length()) {
1523 XMLNode *cmt = node->add_child ("Comment");
1524 cmt->add_content (_comment);
1527 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1528 node->add_child_nocopy((*i)->state (full_state));
1532 node->add_child_copy (*_extra_xml);
1539 Route::set_deferred_state ()
1542 XMLNodeConstIterator niter;
1544 if (!deferred_state) {
1548 nlist = deferred_state->children();
1550 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1551 add_redirect_from_xml (**niter);
1554 delete deferred_state;
1559 Route::add_redirect_from_xml (const XMLNode& node)
1561 const XMLProperty *prop;
1563 if (node.name() == "Send") {
1567 boost::shared_ptr<Send> send (new Send (_session, node));
1568 add_redirect (send, this);
1571 catch (failed_constructor &err) {
1572 error << _("Send construction failed") << endmsg;
1576 } else if (node.name() == "Insert") {
1579 if ((prop = node.property ("type")) != 0) {
1581 boost::shared_ptr<Insert> insert;
1582 bool have_insert = false;
1584 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1585 prop->value() == "lv2" ||
1586 prop->value() == "vst" ||
1587 prop->value() == "audiounit") {
1589 insert.reset (new PluginInsert(_session, node));
1592 } else if (prop->value() == "port") {
1595 insert.reset (new PortInsert (_session, node));
1600 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1604 add_redirect (insert, this);
1608 error << _("Insert XML node has no type property") << endmsg;
1612 catch (failed_constructor &err) {
1613 warning << _("insert could not be created. Ignored.") << endmsg;
1620 Route::set_state (const XMLNode& node)
1622 return _set_state (node, true);
1626 Route::_set_state (const XMLNode& node, bool call_base)
1629 XMLNodeConstIterator niter;
1631 XMLPropertyList plist;
1632 const XMLProperty *prop;
1634 if (node.name() != "Route"){
1635 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1639 if ((prop = node.property (X_("flags"))) != 0) {
1640 _flags = Flag (string_2_enum (prop->value(), _flags));
1645 if ((prop = node.property (X_("default-type"))) != 0) {
1646 _default_type = DataType(prop->value());
1647 assert(_default_type != DataType::NIL);
1650 if ((prop = node.property (X_("phase-invert"))) != 0) {
1651 set_phase_invert (prop->value()=="yes"?true:false, this);
1654 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1655 set_denormal_protection (prop->value()=="yes"?true:false, this);
1658 if ((prop = node.property (X_("muted"))) != 0) {
1659 bool yn = prop->value()=="yes"?true:false;
1661 /* force reset of mute status */
1665 mute_gain = desired_mute_gain;
1668 if ((prop = node.property (X_("soloed"))) != 0) {
1669 bool yn = prop->value()=="yes"?true:false;
1671 /* force reset of solo status */
1674 set_solo (yn, this);
1675 solo_gain = desired_solo_gain;
1678 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1679 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1682 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1683 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1686 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1687 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1690 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1691 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1694 if ((prop = node.property (X_("edit-group"))) != 0) {
1695 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1696 if(edit_group == 0) {
1697 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1699 set_edit_group(edit_group, this);
1703 if ((prop = node.property (X_("order-keys"))) != 0) {
1707 string::size_type colon, equal;
1708 string remaining = prop->value();
1710 while (remaining.length()) {
1712 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1713 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1716 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1717 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1720 set_order_key (remaining.substr (0, equal).c_str(), n);
1724 colon = remaining.find_first_of (':');
1726 if (colon != string::npos) {
1727 remaining = remaining.substr (colon+1);
1734 nlist = node.children();
1736 if (deferred_state) {
1737 delete deferred_state;
1740 deferred_state = new XMLNode(X_("deferred state"));
1742 /* set parent class properties before anything else */
1744 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1748 if (child->name() == IO::state_node_name && call_base) {
1750 IO::set_state (*child);
1756 XMLNodeList redirect_nodes;
1758 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1762 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
1763 redirect_nodes.push_back(child);
1768 _set_redirect_states (redirect_nodes);
1770 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1772 // All redirects (sends and inserts) have been applied already
1774 if (child->name() == X_("Automation")) {
1776 if ((prop = child->property (X_("path"))) != 0) {
1777 load_automation (prop->value());
1780 } else if (child->name() == X_("ControlOuts")) {
1782 string coutname = _name;
1783 coutname += _("[control]");
1785 _control_outs = new IO (_session, coutname);
1786 _control_outs->set_state (**(child->children().begin()));
1788 } else if (child->name() == X_("Comment")) {
1790 /* XXX this is a terrible API design in libxml++ */
1792 XMLNode *cmt = *(child->children().begin());
1793 _comment = cmt->content();
1795 } else if (child->name() == X_("extra")) {
1797 _extra_xml = new XMLNode (*child);
1799 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1801 if (prop->value() == "solo") {
1802 _solo_control.set_state (*child);
1803 _session.add_controllable (&_solo_control);
1805 else if (prop->value() == "mute") {
1806 _mute_control.set_state (*child);
1807 _session.add_controllable (&_mute_control);
1810 else if (child->name() == X_("remote_control")) {
1811 if ((prop = child->property (X_("id"))) != 0) {
1813 sscanf (prop->value().c_str(), "%d", &x);
1814 set_remote_control_id (x);
1819 if ((prop = node.property (X_("mix-group"))) != 0) {
1820 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1821 if (mix_group == 0) {
1822 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1824 set_mix_group(mix_group, this);
1832 Route::_set_redirect_states(const XMLNodeList &nlist)
1834 XMLNodeConstIterator niter;
1837 RedirectList::iterator i, o;
1841 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1842 deferred_state->add_child_copy (**niter);
1848 // Iterate through existing redirects, remove those which are not in the state list
1849 for (i = _redirects.begin(); i != _redirects.end(); ) {
1850 RedirectList::iterator tmp = i;
1853 bool redirectInStateList = false;
1855 (*i)->id().print (buf, sizeof (buf));
1857 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1859 if (strncmp (buf,(*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1860 redirectInStateList = true;
1865 if (!redirectInStateList) {
1866 remove_redirect ( *i, this);
1874 // Iterate through state list and make sure all redirects are on the track and in the correct order,
1875 // set the state of existing redirects according to the new state on the same go
1876 i = _redirects.begin();
1877 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1879 // Check whether the next redirect in the list
1882 while (o != _redirects.end()) {
1883 (*o)->id().print (buf, sizeof (buf));
1884 if ( strncmp(buf, (*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1889 if (o == _redirects.end()) {
1890 // If the redirect (*niter) is not on the route, we need to create it
1891 // and move it to the correct location
1893 RedirectList::iterator prev_last = _redirects.end();
1894 --prev_last; // We need this to check whether adding succeeded
1896 add_redirect_from_xml (**niter);
1898 RedirectList::iterator last = _redirects.end();
1901 if (prev_last == last) {
1902 warning << _name << ": could not fully restore state as some redirects were not possible to create" << endmsg;
1907 boost::shared_ptr<Redirect> tmp = (*last);
1908 // remove the redirect from the wrong location
1909 _redirects.erase(last);
1910 // insert the new redirect at the current location
1911 _redirects.insert(i, tmp);
1913 --i; // move pointer to the newly inserted redirect
1917 // We found the redirect (*niter) on the route, first we must make sure the redirect
1918 // is at the location provided in the XML state
1920 boost::shared_ptr<Redirect> tmp = (*o);
1921 // remove the old copy
1922 _redirects.erase(o);
1923 // insert the redirect at the correct location
1924 _redirects.insert(i, tmp);
1926 --i; // move pointer so it points to the right redirect
1929 (*i)->set_state( (**niter) );
1932 redirects_changed(this);
1936 Route::curve_reallocate ()
1938 // _gain_automation_curve.finish_resize ();
1939 // _pan_automation_curve.finish_resize ();
1943 Route::silence (nframes_t nframes, nframes_t offset)
1947 // reset_peak_meters ();
1949 IO::silence (nframes, offset);
1951 if (_control_outs) {
1952 _control_outs->silence (nframes, offset);
1956 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1959 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1960 boost::shared_ptr<PluginInsert> pi;
1961 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1962 // skip plugins, they don't need anything when we're not active
1966 (*i)->silence (nframes, offset);
1969 if (nframes == _session.get_block_size() && offset == 0) {
1979 Route::set_control_outs (const vector<string>& ports)
1981 Glib::Mutex::Lock lm (control_outs_lock);
1982 vector<string>::const_iterator i;
1985 if (_control_outs) {
1986 delete _control_outs;
1990 if (control() || master()) {
1991 /* no control outs for these two special busses */
1995 if (ports.empty()) {
1999 string coutname = _name;
2000 coutname += _("[control]");
2002 _control_outs = new IO (_session, coutname);
2004 /* our control outs need as many outputs as we
2005 have outputs. we track the changes in ::output_change_handler().
2008 limit = n_outputs ();
2010 if (_control_outs->ensure_io (0, limit, true, this)) {
2014 /* now connect to the named ports */
2016 for (uint32_t n = 0; n < limit; ++n) {
2017 if (_control_outs->connect_output (_control_outs->output (n), ports[n % ports.size()], this)) {
2018 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2027 Route::set_edit_group (RouteGroup *eg, void *src)
2030 if (eg == _edit_group) {
2035 _edit_group->remove (this);
2038 if ((_edit_group = eg) != 0) {
2039 _edit_group->add (this);
2042 _session.set_dirty ();
2043 edit_group_changed (src); /* EMIT SIGNAL */
2047 Route::drop_edit_group (void *src)
2050 _session.set_dirty ();
2051 edit_group_changed (src); /* EMIT SIGNAL */
2055 Route::set_mix_group (RouteGroup *mg, void *src)
2058 if (mg == _mix_group) {
2063 _mix_group->remove (this);
2066 if ((_mix_group = mg) != 0) {
2067 _mix_group->add (this);
2070 _session.set_dirty ();
2071 mix_group_changed (src); /* EMIT SIGNAL */
2075 Route::drop_mix_group (void *src)
2078 _session.set_dirty ();
2079 mix_group_changed (src); /* EMIT SIGNAL */
2083 Route::set_comment (string cmt, void *src)
2086 comment_changed (src);
2087 _session.set_dirty ();
2091 Route::feeds (boost::shared_ptr<Route> other)
2096 uint32_t no = self.n_outputs();
2097 uint32_t ni = other->n_inputs ();
2099 for (i = 0; i < no; ++i) {
2100 for (j = 0; j < ni; ++j) {
2101 if (self.output(i)->connected_to (other->input(j)->name())) {
2107 /* check Redirects which may also interconnect Routes */
2109 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2111 no = (*r)->n_outputs();
2113 for (i = 0; i < no; ++i) {
2114 for (j = 0; j < ni; ++j) {
2115 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2122 /* check for control room outputs which may also interconnect Routes */
2124 if (_control_outs) {
2126 no = _control_outs->n_outputs();
2128 for (i = 0; i < no; ++i) {
2129 for (j = 0; j < ni; ++j) {
2130 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2141 Route::set_mute_config (mute_type t, bool onoff, void *src)
2145 _mute_affects_pre_fader = onoff;
2146 pre_fader_changed(src); /* EMIT SIGNAL */
2150 _mute_affects_post_fader = onoff;
2151 post_fader_changed(src); /* EMIT SIGNAL */
2155 _mute_affects_control_outs = onoff;
2156 control_outs_changed(src); /* EMIT SIGNAL */
2160 _mute_affects_main_outs = onoff;
2161 main_outs_changed(src); /* EMIT SIGNAL */
2167 Route::get_mute_config (mute_type t)
2173 onoff = _mute_affects_pre_fader;
2176 onoff = _mute_affects_post_fader;
2179 onoff = _mute_affects_control_outs;
2182 onoff = _mute_affects_main_outs;
2190 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2192 nframes_t now = _session.transport_frame();
2195 Glib::RWLock::ReaderLock lm (redirect_lock);
2198 automation_snapshot (now, true);
2201 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2203 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2204 (*i)->deactivate ();
2208 (*i)->transport_stopped (now);
2212 IO::transport_stopped (now);
2214 _roll_delay = _initial_delay;
2218 Route::input_change_handler (IOChange change, void *ignored)
2220 if (change & ConfigurationChanged) {
2221 reset_plugin_counts (0);
2226 Route::output_change_handler (IOChange change, void *ignored)
2228 if (change & ConfigurationChanged) {
2229 if (_control_outs) {
2230 _control_outs->ensure_io (0, n_outputs(), true, this);
2233 reset_plugin_counts (0);
2238 Route::pans_required () const
2240 if (n_outputs() < 2) {
2244 return max (n_inputs (), redirect_max_outs);
2248 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2249 bool session_state_changing, bool can_record, bool rec_monitors_input)
2251 if (n_outputs() == 0) {
2255 if (session_state_changing || !_active) {
2256 silence (nframes, offset);
2260 apply_gain_automation = false;
2263 passthru (start_frame, end_frame, nframes, offset, 0, false);
2265 silence (nframes, offset);
2272 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2274 if (_roll_delay > nframes) {
2276 _roll_delay -= nframes;
2277 silence (nframes, offset);
2278 /* transport frame is not legal for caller to use */
2281 } else if (_roll_delay > 0) {
2283 nframes -= _roll_delay;
2285 silence (_roll_delay, offset);
2287 offset += _roll_delay;
2288 transport_frame += _roll_delay;
2297 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2298 bool can_record, bool rec_monitors_input)
2301 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2303 // automation snapshot can also be called from the non-rt context
2304 // and it uses the redirect list, so we take the lock out here
2305 automation_snapshot (_session.transport_frame(), false);
2309 if ((n_outputs() == 0 && _redirects.empty()) || n_inputs() == 0 || !_active) {
2310 silence (nframes, offset);
2314 nframes_t unused = 0;
2316 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2322 apply_gain_automation = false;
2325 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2327 if (am.locked() && _session.transport_rolling()) {
2329 nframes_t start_frame = end_frame - nframes;
2331 if (gain_automation_playback()) {
2332 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2337 passthru (start_frame, end_frame, nframes, offset, declick, false);
2343 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2344 bool can_record, bool rec_monitors_input)
2346 silence (nframes, offset);
2351 Route::toggle_monitor_input ()
2353 for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2354 (*i)->ensure_monitor_input(!(*i)->monitoring_input());
2359 Route::has_external_redirects () const
2361 boost::shared_ptr<const PortInsert> pi;
2363 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2364 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2366 uint32_t no = pi->n_outputs();
2368 for (uint32_t n = 0; n < no; ++n) {
2370 string port_name = pi->output(n)->name();
2371 string client_name = port_name.substr (0, port_name.find(':'));
2373 /* only say "yes" if the redirect is actually in use */
2375 if (client_name != "ardour" && pi->active()) {
2386 Route::flush_redirects ()
2388 /* XXX shouldn't really try to take this lock, since
2389 this is called from the RT audio thread.
2392 Glib::RWLock::ReaderLock lm (redirect_lock);
2394 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2395 (*i)->deactivate ();
2401 Route::set_meter_point (MeterPoint p, void *src)
2403 if (_meter_point != p) {
2405 meter_change (src); /* EMIT SIGNAL */
2406 _session.set_dirty ();
2411 Route::update_total_latency ()
2415 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2416 if ((*i)->active ()) {
2417 _own_latency += (*i)->latency ();
2421 set_port_latency (_own_latency);
2423 /* this (virtual) function is used for pure Routes,
2424 not derived classes like AudioTrack. this means
2425 that the data processed here comes from an input
2426 port, not prerecorded material, and therefore we
2427 have to take into account any input latency.
2430 _own_latency += input_latency ();
2432 return _own_latency;
2436 Route::set_latency_delay (nframes_t longest_session_latency)
2438 _initial_delay = longest_session_latency - _own_latency;
2440 if (_session.transport_stopped()) {
2441 _roll_delay = _initial_delay;
2446 Route::automation_snapshot (nframes_t now, bool force)
2448 if (!force && !should_snapshot(now)) {
2452 IO::automation_snapshot (now, force);
2454 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2455 (*i)->automation_snapshot (now, force);
2459 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2460 : Controllable (name), route (s), type(tp)
2466 Route::ToggleControllable::set_value (float val)
2468 bool bval = ((val >= 0.5f) ? true: false);
2472 route.set_mute (bval, this);
2475 route.set_solo (bval, this);
2483 Route::ToggleControllable::get_value (void) const
2489 val = route.muted() ? 1.0f : 0.0f;
2492 val = route.soloed() ? 1.0f : 0.0f;
2502 Route::set_block_size (nframes_t nframes)
2504 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2505 (*i)->set_block_size (nframes);
2510 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2512 _session.update_latency_compensation (false, false);
2516 Route::protect_automation ()
2518 switch (gain_automation_state()) {
2520 set_gain_automation_state (Off);
2522 set_gain_automation_state (Play);
2528 switch (panner().automation_state ()) {
2530 panner().set_automation_state (Off);
2533 panner().set_automation_state (Play);
2539 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2540 boost::shared_ptr<PluginInsert> pi;
2541 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2542 pi->protect_automation ();
2548 Route::set_pending_declick (int declick)
2551 /* this call is not allowed to turn off a pending declick unless "force" is true */
2553 _pending_declick = declick;
2555 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2557 _pending_declick = 0;