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/audioengine.h>
30 #include <ardour/route.h>
31 #include <ardour/buffer.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/audio_port.h>
41 #include <ardour/ladspa_plugin.h>
42 #include <ardour/panner.h>
43 #include <ardour/dB.h>
44 #include <ardour/amp.h>
45 #include <ardour/meter.h>
46 #include <ardour/buffer_set.h>
50 using namespace ARDOUR;
53 uint32_t Route::order_key_cnt = 0;
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.reset();
81 _phase_invert = false;
82 _denormal_protection = false;
83 order_keys[strdup (N_("signal"))] = order_key_cnt++;
86 _meter_point = MeterPostFader;
90 _have_internal_generator = false;
92 _pending_declick = true;
93 _remote_control_id = 0;
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;
161 _session.set_dirty ();
165 Route::inc_gain (gain_t fraction, void *src)
167 IO::inc_gain (fraction, src);
171 Route::set_gain (gain_t val, void *src)
173 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
175 if (_mix_group->is_relative()) {
178 gain_t usable_gain = gain();
179 if (usable_gain < 0.000001f) {
180 usable_gain=0.000001f;
184 if (delta < 0.000001f) {
188 delta -= usable_gain;
190 if (delta == 0.0f) return;
192 gain_t factor = delta / usable_gain;
195 factor = _mix_group->get_max_factor(factor);
196 if (factor == 0.0f) {
201 factor = _mix_group->get_min_factor(factor);
202 if (factor == 0.0f) {
208 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
212 _mix_group->apply (&Route::set_gain, val, _mix_group);
222 IO::set_gain (val, src);
225 /** Process this route for one (sub) cycle (process thread)
227 * @param bufs Scratch buffers to use for the signal path
228 * @param start_frame Initial transport frame
229 * @param end_frame Final transport frame
230 * @param nframes Number of frames to output (to ports)
231 * @param offset Output offset (of port buffers, for split cycles)
233 * Note that (end_frame - start_frame) may not be equal to nframes when the
234 * transport speed isn't 1.0 (eg varispeed).
237 Route::process_output_buffers (BufferSet& bufs,
238 nframes_t start_frame, nframes_t end_frame,
239 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
242 // This is definitely very audio-only for now
243 assert(_default_type == DataType::AUDIO);
245 RedirectList::iterator i;
246 bool post_fader_work = false;
247 bool mute_declick_applied = false;
253 gain_t* gab = _session.gain_automation_buffer();
255 switch (Config->get_monitoring_model()) {
256 case HardwareMonitoring:
257 case ExternalMonitoring:
264 declick = _pending_declick;
267 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
277 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
280 dmg = desired_mute_gain;
281 dsg = desired_solo_gain;
290 /* ----------------------------------------------------------------------------------------------------
291 GLOBAL DECLICK (for transport changes etc.)
292 -------------------------------------------------------------------------------------------------- */
295 Amp::run (bufs, nframes, 0.0, 1.0, false);
296 _pending_declick = 0;
297 } else if (declick < 0) {
298 Amp::run (bufs, nframes, 1.0, 0.0, false);
299 _pending_declick = 0;
302 /* no global declick */
304 if (solo_gain != dsg) {
305 Amp::run (bufs, nframes, solo_gain, dsg, false);
311 /* ----------------------------------------------------------------------------------------------------
312 INPUT METERING & MONITORING
313 -------------------------------------------------------------------------------------------------- */
315 if (meter && (_meter_point == MeterInput)) {
316 _meter->run(bufs, nframes);
319 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
320 Amp::run (bufs, nframes, mute_gain, dmg, false);
322 mute_declick_applied = true;
325 if ((_meter_point == MeterInput) && co) {
327 solo_audible = dsg > 0;
328 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
330 if ( // muted by solo of another track
334 // muted by mute of this track
338 // rec-enabled but not s/w monitoring
340 // TODO: this is probably wrong
342 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
346 co->silence (nframes, offset);
350 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
355 /* -----------------------------------------------------------------------------------------------------
357 -------------------------------------------------------------------------------------------------- */
359 if (_denormal_protection || Config->get_denormal_protection()) {
361 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
362 Sample* const sp = i->data();
364 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
370 /* ----------------------------------------------------------------------------------------------------
372 -------------------------------------------------------------------------------------------------- */
374 /* FIXME: Somewhere in these loops is where bufs.count() should go from n_inputs() to redirect_max_outs()
375 * (if they differ). Something explicit needs to be done here to make sure the list of redirects will
376 * give us what we need (possibly by inserting transparent 'translators' into the list to make it work) */
378 if (with_redirects) {
379 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
381 if (mute_gain > 0 || !_mute_affects_pre_fader) {
382 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
383 switch ((*i)->placement()) {
385 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
388 post_fader_work = true;
393 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
394 switch ((*i)->placement()) {
396 (*i)->silence (nframes, offset);
399 post_fader_work = true;
407 // FIXME: for now, just hope the redirects list did what it was supposed to
408 bufs.set_count(n_process_buffers());
411 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
412 Amp::run (bufs, nframes, mute_gain, dmg, false);
414 mute_declick_applied = true;
417 /* ----------------------------------------------------------------------------------------------------
418 PRE-FADER METERING & MONITORING
419 -------------------------------------------------------------------------------------------------- */
421 if (meter && (_meter_point == MeterPreFader)) {
422 _meter->run(bufs, nframes);
426 if ((_meter_point == MeterPreFader) && co) {
428 solo_audible = dsg > 0;
429 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
431 if ( // muted by solo of another track
435 // muted by mute of this track
439 // rec-enabled but not s/w monitoring
441 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
445 co->silence (nframes, offset);
449 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
453 /* ----------------------------------------------------------------------------------------------------
455 -------------------------------------------------------------------------------------------------- */
457 /* if not recording or recording and requiring any monitor signal, then apply gain */
459 if ( // not recording
461 !(record_enabled() && _session.actively_recording()) ||
465 // h/w monitoring not in use
467 (!Config->get_monitoring_model() == HardwareMonitoring &&
469 // AND software monitoring required
471 Config->get_monitoring_model() == SoftwareMonitoring)) {
473 if (apply_gain_automation) {
476 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
477 Sample* const sp = i->data();
479 for (nframes_t nx = 0; nx < nframes; ++nx) {
484 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
485 Sample* const sp = i->data();
487 for (nframes_t nx = 0; nx < nframes; ++nx) {
493 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
494 _effective_gain = gab[nframes-1];
499 /* manual (scalar) gain */
503 Amp::run (bufs, nframes, _gain, dg, _phase_invert);
506 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
508 /* no need to interpolate current gain value,
509 but its non-unity, so apply it. if the gain
510 is zero, do nothing because we'll ship silence
522 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
523 Sample* const sp = i->data();
524 apply_gain_to_buffer(sp,nframes,this_gain);
527 } else if (_gain == 0) {
528 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
536 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
540 /* ----------------------------------------------------------------------------------------------------
542 -------------------------------------------------------------------------------------------------- */
544 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
546 if (post_fader_work) {
548 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
550 if (mute_gain > 0 || !_mute_affects_post_fader) {
551 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
552 switch ((*i)->placement()) {
556 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
561 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
562 switch ((*i)->placement()) {
566 (*i)->silence (nframes, offset);
574 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
575 Amp::run (bufs, nframes, mute_gain, dmg, false);
577 mute_declick_applied = true;
580 /* ----------------------------------------------------------------------------------------------------
582 -------------------------------------------------------------------------------------------------- */
584 if ((_meter_point == MeterPostFader) && co) {
586 solo_audible = solo_gain > 0;
587 mute_audible = dmg > 0 || !_mute_affects_control_outs;
589 if ( // silent anyway
591 (_gain == 0 && !apply_gain_automation) ||
593 // muted by solo of another track
597 // muted by mute of this track
601 // recording but not s/w monitoring
603 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
607 co->silence (nframes, offset);
611 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
615 /* ----------------------------------------------------------------------
617 ----------------------------------------------------------------------*/
619 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
620 Amp::run (bufs, nframes, mute_gain, dmg, false);
622 mute_declick_applied = true;
625 /* ----------------------------------------------------------------------------------------------------
627 -------------------------------------------------------------------------------------------------- */
629 solo_audible = dsg > 0;
630 mute_audible = dmg > 0 || !_mute_affects_main_outs;
632 if (n_outputs().get(_default_type) == 0) {
636 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
638 IO::silence (nframes, offset);
642 if ( // silent anyway
644 (_gain == 0 && !apply_gain_automation) ||
646 // muted by solo of another track, but not using control outs for solo
648 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
650 // muted by mute of this track
656 /* don't use Route::silence() here, because that causes
657 all outputs (sends, port inserts, etc. to be silent).
660 if (_meter_point == MeterPostFader) {
661 peak_meter().reset();
664 IO::silence (nframes, offset);
668 deliver_output(bufs, start_frame, end_frame, nframes, offset);
674 /* ----------------------------------------------------------------------------------------------------
676 -------------------------------------------------------------------------------------------------- */
678 if (meter && (_meter_point == MeterPostFader)) {
679 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
682 _meter->run(output_buffers(), nframes, offset);
688 Route::n_process_buffers ()
690 return max (n_inputs(), redirect_max_outs);
694 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
696 BufferSet& bufs = _session.get_scratch_buffers(n_process_buffers());
700 collect_input (bufs, nframes, offset);
703 _meter->run(bufs, nframes);
707 process_output_buffers (bufs, start_frame, end_frame, nframes, offset, true, declick, meter_first);
711 Route::passthru_silence (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter)
713 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, offset, true, declick, meter);
717 Route::set_solo (bool yn, void *src)
723 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
724 _mix_group->apply (&Route::set_solo, yn, _mix_group);
730 solo_changed (src); /* EMIT SIGNAL */
731 _solo_control.Changed (); /* EMIT SIGNAL */
736 Route::set_solo_mute (bool yn)
738 Glib::Mutex::Lock lm (declick_lock);
740 /* Called by Session in response to another Route being soloed.
743 desired_solo_gain = (yn?0.0:1.0);
747 Route::set_solo_safe (bool yn, void *src)
749 if (_solo_safe != yn) {
751 solo_safe_changed (src); /* EMIT SIGNAL */
756 Route::set_mute (bool yn, void *src)
759 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
760 _mix_group->apply (&Route::set_mute, yn, _mix_group);
766 mute_changed (src); /* EMIT SIGNAL */
768 _mute_control.Changed (); /* EMIT SIGNAL */
770 Glib::Mutex::Lock lm (declick_lock);
771 desired_mute_gain = (yn?0.0f:1.0f);
776 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, InsertStreams* err)
778 ChanCount old_rmo = redirect_max_outs;
780 if (!_session.engine().connected()) {
785 Glib::RWLock::WriterLock lm (redirect_lock);
787 boost::shared_ptr<PluginInsert> pi;
788 boost::shared_ptr<PortInsert> porti;
790 redirect->set_default_type(_default_type);
792 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
795 if (pi->natural_input_streams() == ChanCount::ZERO) {
796 /* generator plugin */
797 _have_internal_generator = true;
800 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
802 /* force new port inserts to start out with an i/o configuration
803 that matches this route's i/o configuration.
805 the "inputs" for the port are supposed to match the output
808 the "outputs" of the route should match the inputs of this
809 route. XXX shouldn't they match the number of active signal
810 streams at the point of insertion?
812 // FIXME: (yes, they should)
814 porti->ensure_io (n_outputs (), n_inputs(), false, this);
817 _redirects.push_back (redirect);
819 // Set up redirect list channels. This will set redirect->[input|output]_streams()
820 if (_reset_plugin_counts (err)) {
821 _redirects.pop_back ();
822 _reset_plugin_counts (0); // it worked before we tried to add it ...
826 // Ensure peak vector sizes before the plugin is activated
827 ChanCount potential_max_streams = max(redirect->input_streams(), redirect->output_streams());
828 _meter->setup(potential_max_streams);
830 redirect->activate ();
831 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
834 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
839 redirects_changed (src); /* EMIT SIGNAL */
844 Route::add_redirects (const RedirectList& others, void *src, InsertStreams* err)
846 ChanCount old_rmo = redirect_max_outs;
848 if (!_session.engine().connected()) {
853 Glib::RWLock::WriterLock lm (redirect_lock);
855 RedirectList::iterator existing_end = _redirects.end();
858 ChanCount potential_max_streams;
860 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
862 boost::shared_ptr<PluginInsert> pi;
864 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
867 ChanCount m = max(pi->input_streams(), pi->output_streams());
868 if (m > potential_max_streams)
869 potential_max_streams = m;
872 // Ensure peak vector sizes before the plugin is activated
873 _meter->setup(potential_max_streams);
875 _redirects.push_back (*i);
877 if (_reset_plugin_counts (err)) {
879 _redirects.erase (existing_end, _redirects.end());
880 _reset_plugin_counts (0); // it worked before we tried to add it ...
885 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
889 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
893 redirects_changed (src); /* EMIT SIGNAL */
897 /** Turn off all redirects with a given placement
898 * @param p Placement of redirects to disable
902 Route::disable_redirects (Placement p)
904 Glib::RWLock::ReaderLock lm (redirect_lock);
906 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
907 if ((*i)->placement() == p) {
908 (*i)->set_active (false, this);
913 /** Turn off all redirects
917 Route::disable_redirects ()
919 Glib::RWLock::ReaderLock lm (redirect_lock);
921 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
922 (*i)->set_active (false, this);
926 /** Turn off all redirects with a given placement
927 * @param p Placement of redirects to disable
931 Route::disable_plugins (Placement p)
933 Glib::RWLock::ReaderLock lm (redirect_lock);
935 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
936 if (boost::dynamic_pointer_cast<PluginInsert> (*i) && (*i)->placement() == p) {
937 (*i)->set_active (false, this);
942 /** Turn off all plugins
946 Route::disable_plugins ()
948 Glib::RWLock::ReaderLock lm (redirect_lock);
950 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
951 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
952 (*i)->set_active (false, this);
959 Route::ab_plugins (bool forward)
961 Glib::RWLock::ReaderLock lm (redirect_lock);
965 /* forward = turn off all active redirects, and mark them so that the next time
966 we go the other way, we will revert them
969 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
970 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
974 if ((*i)->active()) {
975 (*i)->set_active (false, this);
976 (*i)->set_next_ab_is_active (true);
978 (*i)->set_next_ab_is_active (false);
984 /* backward = if the redirect was marked to go active on the next ab, do so */
986 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
988 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
992 if ((*i)->get_next_ab_is_active()) {
993 (*i)->set_active (true, this);
995 (*i)->set_active (false, this);
1002 /* Figure out the streams that will feed into PreFader */
1004 Route::pre_fader_streams() const
1006 boost::shared_ptr<Redirect> redirect;
1008 // Find the last pre-fader redirect
1009 for (RedirectList::const_iterator r = _redirects.begin(); r != _redirects.end(); ++r) {
1010 if ((*r)->placement() == PreFader) {
1016 return redirect->output_streams();
1023 /** Remove redirects with a given placement.
1024 * @param p Placement of redirects to remove.
1027 Route::clear_redirects (Placement p, void *src)
1029 const ChanCount old_rmo = redirect_max_outs;
1031 if (!_session.engine().connected()) {
1036 Glib::RWLock::WriterLock lm (redirect_lock);
1037 RedirectList new_list;
1039 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1040 if ((*i)->placement() == p) {
1041 /* it's the placement we want to get rid of */
1042 (*i)->drop_references ();
1044 /* it's a different placement, so keep it */
1045 new_list.push_back (*i);
1049 _redirects = new_list;
1052 /* FIXME: can't see how this test can ever fire */
1053 if (redirect_max_outs != old_rmo) {
1057 redirect_max_outs.reset();
1058 _have_internal_generator = false;
1059 redirects_changed (src); /* EMIT SIGNAL */
1063 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, InsertStreams* err)
1065 ChanCount old_rmo = redirect_max_outs;
1067 if (!_session.engine().connected()) {
1071 redirect_max_outs.reset();
1074 Glib::RWLock::WriterLock lm (redirect_lock);
1075 RedirectList::iterator i;
1076 bool removed = false;
1078 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1079 if (*i == redirect) {
1081 RedirectList::iterator tmp;
1083 /* move along, see failure case for reset_plugin_counts()
1084 where we may need to reinsert the redirect.
1090 /* stop redirects that send signals to JACK ports
1091 from causing noise as a result of no longer being
1095 boost::shared_ptr<Send> send;
1096 boost::shared_ptr<PortInsert> port_insert;
1098 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
1099 send->disconnect_inputs (this);
1100 send->disconnect_outputs (this);
1101 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
1102 port_insert->disconnect_inputs (this);
1103 port_insert->disconnect_outputs (this);
1106 _redirects.erase (i);
1119 if (_reset_plugin_counts (err)) {
1120 /* get back to where we where */
1121 _redirects.insert (i, redirect);
1122 /* we know this will work, because it worked before :) */
1123 _reset_plugin_counts (0);
1129 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1130 boost::shared_ptr<PluginInsert> pi;
1132 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1133 if (pi->is_generator()) {
1139 _have_internal_generator = foo;
1142 if (old_rmo != redirect_max_outs) {
1146 redirect->drop_references ();
1148 redirects_changed (src); /* EMIT SIGNAL */
1153 Route::reset_plugin_counts (InsertStreams* err)
1155 Glib::RWLock::WriterLock lm (redirect_lock);
1156 return _reset_plugin_counts (err);
1161 Route::_reset_plugin_counts (InsertStreams* err)
1163 RedirectList::iterator r;
1164 map<Placement,list<InsertCount> > insert_map;
1165 ChanCount initial_streams;
1167 /* Process each placement in order, checking to see if we
1168 can really do what has been requested.
1171 /* divide inserts up by placement so we get the signal flow
1172 properly modelled. we need to do this because the _redirects
1173 list is not sorted by placement
1176 /* ... but it should/will be... */
1178 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1180 boost::shared_ptr<Insert> insert;
1182 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1183 insert_map[insert->placement()].push_back (InsertCount (insert));
1190 if ( ! check_some_plugin_counts (insert_map[PreFader], n_inputs (), err)) {
1194 ChanCount post_fader_input = (err ? err->count : n_inputs());
1198 if ( ! check_some_plugin_counts (insert_map[PostFader], post_fader_input, err)) {
1202 /* OK, everything can be set up correctly, so lets do it */
1204 apply_some_plugin_counts (insert_map[PreFader]);
1205 apply_some_plugin_counts (insert_map[PostFader]);
1207 /* recompute max outs of any redirect */
1209 redirect_max_outs.reset();
1210 RedirectList::iterator prev = _redirects.end();
1212 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1213 boost::shared_ptr<Send> s;
1215 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1216 if (r == _redirects.begin()) {
1217 s->expect_inputs (n_inputs());
1219 s->expect_inputs ((*prev)->output_streams());
1224 /* don't pay any attention to send output configuration, since it doesn't
1228 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1239 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1241 list<InsertCount>::iterator i;
1243 for (i = iclist.begin(); i != iclist.end(); ++i) {
1245 if ((*i).insert->configure_io ((*i).in, (*i).out)) {
1248 /* make sure that however many we have, they are all active */
1249 (*i).insert->activate ();
1255 /** Returns whether \a iclist can be configured and run starting with
1256 * \a required_inputs at the first insert's inputs.
1257 * If false is returned, \a iclist can not be run with \a required_inputs, and \a err is set.
1258 * Otherwise, \a err is set to the output of the list.
1261 Route::check_some_plugin_counts (list<InsertCount>& iclist, ChanCount required_inputs, InsertStreams* err)
1263 list<InsertCount>::iterator i;
1268 err->count = required_inputs;
1271 for (i = iclist.begin(); i != iclist.end(); ++i) {
1273 if ((*i).insert->can_support_input_configuration (required_inputs) < 0) {
1276 err->count = required_inputs;
1281 (*i).in = required_inputs;
1282 (*i).out = (*i).insert->output_for_input_configuration (required_inputs);
1284 required_inputs = (*i).out;
1290 if (!iclist.empty()) {
1292 err->count = iclist.back().insert->output_for_input_configuration(required_inputs);
1300 Route::copy_redirects (const Route& other, Placement placement, InsertStreams* err)
1302 ChanCount old_rmo = redirect_max_outs;
1304 RedirectList to_be_deleted;
1307 Glib::RWLock::WriterLock lm (redirect_lock);
1308 RedirectList::iterator tmp;
1309 RedirectList the_copy;
1311 the_copy = _redirects;
1313 /* remove all relevant redirects */
1315 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1319 if ((*i)->placement() == placement) {
1320 to_be_deleted.push_back (*i);
1321 _redirects.erase (i);
1327 /* now copy the relevant ones from "other" */
1329 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1330 if ((*i)->placement() == placement) {
1331 _redirects.push_back (Redirect::clone (*i));
1335 /* reset plugin stream handling */
1337 if (_reset_plugin_counts (err)) {
1339 /* FAILED COPY ATTEMPT: we have to restore order */
1341 /* delete all cloned redirects */
1343 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1348 if ((*i)->placement() == placement) {
1349 _redirects.erase (i);
1355 /* restore the natural order */
1357 _redirects = the_copy;
1358 redirect_max_outs = old_rmo;
1360 /* we failed, even though things are OK again */
1366 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1367 to_be_deleted.clear ();
1371 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
1375 redirects_changed (this); /* EMIT SIGNAL */
1380 Route::all_redirects_flip ()
1382 Glib::RWLock::ReaderLock lm (redirect_lock);
1384 if (_redirects.empty()) {
1388 bool first_is_on = _redirects.front()->active();
1390 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1391 (*i)->set_active (!first_is_on, this);
1395 /** Set all redirects with a given placement to a given active state.
1396 * @param p Placement of redirects to change.
1397 * @param state New active state for those redirects.
1400 Route::all_redirects_active (Placement p, bool state)
1402 Glib::RWLock::ReaderLock lm (redirect_lock);
1404 if (_redirects.empty()) {
1408 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1409 if ((*i)->placement() == p) {
1410 (*i)->set_active (state, this);
1415 struct RedirectSorter {
1416 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1417 return a->sort_key() < b->sort_key();
1422 Route::sort_redirects (InsertStreams* err)
1425 RedirectSorter comparator;
1426 Glib::RWLock::WriterLock lm (redirect_lock);
1427 ChanCount old_rmo = redirect_max_outs;
1429 /* the sweet power of C++ ... */
1431 RedirectList as_it_was_before = _redirects;
1433 _redirects.sort (comparator);
1435 if (_reset_plugin_counts (err)) {
1436 _redirects = as_it_was_before;
1437 redirect_max_outs = old_rmo;
1443 redirects_changed (this); /* EMIT SIGNAL */
1455 Route::get_template()
1457 return state(false);
1461 Route::state(bool full_state)
1463 XMLNode *node = new XMLNode("Route");
1464 RedirectList:: iterator i;
1468 node->add_property("flags", enum_2_string (_flags));
1471 node->add_property("default-type", _default_type.to_string());
1473 node->add_property("active", _active?"yes":"no");
1474 node->add_property("muted", _muted?"yes":"no");
1475 node->add_property("soloed", _soloed?"yes":"no");
1476 node->add_property("phase-invert", _phase_invert?"yes":"no");
1477 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1478 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1479 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1480 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1481 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1484 node->add_property("edit-group", _edit_group->name());
1487 node->add_property("mix-group", _mix_group->name());
1490 string order_string;
1491 OrderKeys::iterator x = order_keys.begin();
1493 while (x != order_keys.end()) {
1494 order_string += string ((*x).first);
1495 order_string += '=';
1496 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1497 order_string += buf;
1501 if (x == order_keys.end()) {
1505 order_string += ':';
1507 node->add_property ("order-keys", order_string);
1509 node->add_child_nocopy (IO::state (full_state));
1510 node->add_child_nocopy (_solo_control.get_state ());
1511 node->add_child_nocopy (_mute_control.get_state ());
1513 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1514 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1515 remote_control_node->add_property (X_("id"), buf);
1516 node->add_child_nocopy (*remote_control_node);
1518 if (_control_outs) {
1519 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1520 cnode->add_child_nocopy (_control_outs->state (full_state));
1521 node->add_child_nocopy (*cnode);
1524 if (_comment.length()) {
1525 XMLNode *cmt = node->add_child ("Comment");
1526 cmt->add_content (_comment);
1529 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1530 node->add_child_nocopy((*i)->state (full_state));
1534 node->add_child_copy (*_extra_xml);
1541 Route::get_redirect_state ()
1543 XMLNode* root = new XMLNode (X_("redirects"));
1544 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1545 root->add_child_nocopy ((*i)->state (true));
1552 Route::set_redirect_state (const XMLNode& root)
1554 if (root.name() != X_("redirects")) {
1560 XMLNodeConstIterator iter;
1561 XMLNodeConstIterator niter;
1562 Glib::RWLock::ReaderLock lm (redirect_lock);
1564 nlist = root.children();
1566 for (iter = nlist.begin(); iter != nlist.end(); ++iter){
1568 /* iter now points to a Redirect state node */
1570 nnlist = (*iter)->children ();
1572 for (niter = nnlist.begin(); niter != nnlist.end(); ++niter) {
1574 /* find the IO child node, since it contains the ID we need */
1576 /* XXX OOP encapsulation violation, ugh */
1578 if ((*niter)->name() == IO::state_node_name) {
1580 XMLProperty* prop = (*niter)->property (X_("id"));
1583 warning << _("Redirect node has no ID, ignored") << endmsg;
1587 ID id = prop->value ();
1589 /* now look for a redirect with that ID */
1591 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1592 if ((*i)->id() == id) {
1593 (*i)->set_state (**iter);
1609 Route::set_deferred_state ()
1612 XMLNodeConstIterator niter;
1614 if (!deferred_state) {
1618 nlist = deferred_state->children();
1620 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1621 add_redirect_from_xml (**niter);
1624 delete deferred_state;
1629 Route::add_redirect_from_xml (const XMLNode& node)
1631 const XMLProperty *prop;
1633 if (node.name() == "Send") {
1637 boost::shared_ptr<Send> send (new Send (_session, node));
1638 add_redirect (send, this);
1641 catch (failed_constructor &err) {
1642 error << _("Send construction failed") << endmsg;
1646 } else if (node.name() == "Insert") {
1649 if ((prop = node.property ("type")) != 0) {
1651 boost::shared_ptr<Insert> insert;
1653 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1655 insert.reset (new PluginInsert(_session, node));
1657 } else if (prop->value() == "port") {
1660 insert.reset (new PortInsert (_session, node));
1664 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1667 add_redirect (insert, this);
1670 error << _("Insert XML node has no type property") << endmsg;
1674 catch (failed_constructor &err) {
1675 warning << _("insert could not be created. Ignored.") << endmsg;
1682 Route::set_state (const XMLNode& node)
1684 return _set_state (node, true);
1688 Route::_set_state (const XMLNode& node, bool call_base)
1691 XMLNodeConstIterator niter;
1693 XMLPropertyList plist;
1694 const XMLProperty *prop;
1696 if (node.name() != "Route"){
1697 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1701 if ((prop = node.property (X_("flags"))) != 0) {
1702 _flags = Flag (string_2_enum (prop->value(), _flags));
1707 if ((prop = node.property (X_("default-type"))) != 0) {
1708 _default_type = DataType(prop->value());
1709 assert(_default_type != DataType::NIL);
1712 if ((prop = node.property (X_("phase-invert"))) != 0) {
1713 set_phase_invert (prop->value()=="yes"?true:false, this);
1716 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1717 set_denormal_protection (prop->value()=="yes"?true:false, this);
1720 if ((prop = node.property (X_("active"))) != 0) {
1721 set_active (prop->value() == "yes");
1724 if ((prop = node.property (X_("muted"))) != 0) {
1725 bool yn = prop->value()=="yes"?true:false;
1727 /* force reset of mute status */
1731 mute_gain = desired_mute_gain;
1734 if ((prop = node.property (X_("soloed"))) != 0) {
1735 bool yn = prop->value()=="yes"?true:false;
1737 /* force reset of solo status */
1740 set_solo (yn, this);
1741 solo_gain = desired_solo_gain;
1744 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1745 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1748 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1749 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1752 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1753 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1756 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1757 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1760 if ((prop = node.property (X_("edit-group"))) != 0) {
1761 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1762 if(edit_group == 0) {
1763 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1765 set_edit_group(edit_group, this);
1769 if ((prop = node.property (X_("order-keys"))) != 0) {
1773 string::size_type colon, equal;
1774 string remaining = prop->value();
1776 while (remaining.length()) {
1778 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1779 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1782 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1783 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1786 set_order_key (remaining.substr (0, equal).c_str(), n);
1790 colon = remaining.find_first_of (':');
1792 if (colon != string::npos) {
1793 remaining = remaining.substr (colon+1);
1800 nlist = node.children();
1802 if (deferred_state) {
1803 delete deferred_state;
1806 deferred_state = new XMLNode(X_("deferred state"));
1808 /* set parent class properties before anything else */
1810 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1814 if (child->name() == IO::state_node_name && call_base) {
1816 IO::set_state (*child);
1821 XMLNodeList redirect_nodes;
1823 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1827 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
1828 redirect_nodes.push_back(child);
1833 _set_redirect_states(redirect_nodes);
1836 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1838 // All redirects (sends and inserts) have been applied already
1840 if (child->name() == X_("Automation")) {
1842 if ((prop = child->property (X_("path"))) != 0) {
1843 load_automation (prop->value());
1846 } else if (child->name() == X_("ControlOuts")) {
1848 string coutname = _name;
1849 coutname += _("[control]");
1851 _control_outs = new IO (_session, coutname);
1852 _control_outs->set_state (**(child->children().begin()));
1854 } else if (child->name() == X_("Comment")) {
1856 /* XXX this is a terrible API design in libxml++ */
1858 XMLNode *cmt = *(child->children().begin());
1859 _comment = cmt->content();
1861 } else if (child->name() == X_("extra")) {
1863 _extra_xml = new XMLNode (*child);
1865 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1867 if (prop->value() == "solo") {
1868 _solo_control.set_state (*child);
1869 _session.add_controllable (&_solo_control);
1871 else if (prop->value() == "mute") {
1872 _mute_control.set_state (*child);
1873 _session.add_controllable (&_mute_control);
1876 else if (child->name() == X_("remote_control")) {
1877 if ((prop = child->property (X_("id"))) != 0) {
1879 sscanf (prop->value().c_str(), "%d", &x);
1880 set_remote_control_id (x);
1885 if ((prop = node.property (X_("mix-group"))) != 0) {
1886 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1887 if (mix_group == 0) {
1888 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1890 set_mix_group(mix_group, this);
1898 Route::_set_redirect_states(const XMLNodeList &nlist)
1900 XMLNodeConstIterator niter;
1903 RedirectList::iterator i, o;
1905 // Iterate through existing redirects, remove those which are not in the state list
1906 for (i = _redirects.begin(); i != _redirects.end(); ) {
1907 RedirectList::iterator tmp = i;
1910 bool redirectInStateList = false;
1912 (*i)->id().print (buf, sizeof (buf));
1915 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1917 if (strncmp(buf,(*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1918 redirectInStateList = true;
1923 if (!redirectInStateList) {
1924 remove_redirect ( *i, this);
1932 // Iterate through state list and make sure all redirects are on the track and in the correct order,
1933 // set the state of existing redirects according to the new state on the same go
1934 i = _redirects.begin();
1935 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1937 // Check whether the next redirect in the list
1940 while (o != _redirects.end()) {
1941 (*o)->id().print (buf, sizeof (buf));
1942 if ( strncmp(buf, (*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1947 if (o == _redirects.end()) {
1948 // If the redirect (*niter) is not on the route, we need to create it
1949 // and move it to the correct location
1951 RedirectList::iterator prev_last = _redirects.end();
1952 --prev_last; // We need this to check whether adding succeeded
1954 add_redirect_from_xml (**niter);
1956 RedirectList::iterator last = _redirects.end();
1959 if (prev_last == last) {
1960 cerr << "Could not fully restore state as some redirects were not possible to create" << endl;
1965 boost::shared_ptr<Redirect> tmp = (*last);
1966 // remove the redirect from the wrong location
1967 _redirects.erase(last);
1968 // insert the new redirect at the current location
1969 _redirects.insert(i, tmp);
1971 --i; // move pointer to the newly inserted redirect
1975 // We found the redirect (*niter) on the route, first we must make sure the redirect
1976 // is at the location provided in the XML state
1978 boost::shared_ptr<Redirect> tmp = (*o);
1979 // remove the old copy
1980 _redirects.erase(o);
1981 // insert the redirect at the correct location
1982 _redirects.insert(i, tmp);
1984 --i; // move pointer so it points to the right redirect
1987 (*i)->set_state( (**niter) );
1990 redirects_changed(this);
1994 Route::curve_reallocate ()
1996 // _gain_automation_curve.finish_resize ();
1997 // _pan_automation_curve.finish_resize ();
2001 Route::silence (nframes_t nframes, nframes_t offset)
2005 IO::silence (nframes, offset);
2007 if (_control_outs) {
2008 _control_outs->silence (nframes, offset);
2012 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2015 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2016 boost::shared_ptr<PluginInsert> pi;
2017 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2018 // skip plugins, they don't need anything when we're not active
2022 (*i)->silence (nframes, offset);
2025 if (nframes == _session.get_block_size() && offset == 0) {
2035 Route::set_control_outs (const vector<string>& ports)
2037 Glib::Mutex::Lock lm (control_outs_lock);
2038 vector<string>::const_iterator i;
2041 if (_control_outs) {
2042 delete _control_outs;
2046 if (control() || master()) {
2047 /* no control outs for these two special busses */
2051 if (ports.empty()) {
2055 string coutname = _name;
2056 coutname += _("[control]");
2058 _control_outs = new IO (_session, coutname);
2060 /* our control outs need as many outputs as we
2061 have audio outputs. we track the changes in ::output_change_handler().
2064 // XXX its stupid that we have to get this value twice
2066 limit = n_outputs().n_audio();
2068 if (_control_outs->ensure_io (ChanCount::ZERO, ChanCount (DataType::AUDIO, n_outputs().get (DataType::AUDIO)), true, this)) {
2072 /* now connect to the named ports */
2074 for (size_t n = 0; n < limit; ++n) {
2075 if (_control_outs->connect_output (_control_outs->output (n), ports[n], this)) {
2076 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2085 Route::set_edit_group (RouteGroup *eg, void *src)
2088 if (eg == _edit_group) {
2093 _edit_group->remove (this);
2096 if ((_edit_group = eg) != 0) {
2097 _edit_group->add (this);
2100 _session.set_dirty ();
2101 edit_group_changed (src); /* EMIT SIGNAL */
2105 Route::drop_edit_group (void *src)
2108 _session.set_dirty ();
2109 edit_group_changed (src); /* EMIT SIGNAL */
2113 Route::set_mix_group (RouteGroup *mg, void *src)
2116 if (mg == _mix_group) {
2121 _mix_group->remove (this);
2124 if ((_mix_group = mg) != 0) {
2125 _mix_group->add (this);
2128 _session.set_dirty ();
2129 mix_group_changed (src); /* EMIT SIGNAL */
2133 Route::drop_mix_group (void *src)
2136 _session.set_dirty ();
2137 mix_group_changed (src); /* EMIT SIGNAL */
2141 Route::set_comment (string cmt, void *src)
2144 comment_changed (src);
2145 _session.set_dirty ();
2149 Route::feeds (boost::shared_ptr<Route> other)
2154 uint32_t no = self.n_outputs().n_total();
2155 uint32_t ni = other->n_inputs ().n_total();
2157 for (i = 0; i < no; ++i) {
2158 for (j = 0; j < ni; ++j) {
2159 if (self.output(i)->connected_to (other->input(j)->name())) {
2165 /* check Redirects which may also interconnect Routes */
2167 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2169 no = (*r)->n_outputs().n_total();
2171 for (i = 0; i < no; ++i) {
2172 for (j = 0; j < ni; ++j) {
2173 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2180 /* check for control room outputs which may also interconnect Routes */
2182 if (_control_outs) {
2184 no = _control_outs->n_outputs().n_total();
2186 for (i = 0; i < no; ++i) {
2187 for (j = 0; j < ni; ++j) {
2188 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2199 Route::set_mute_config (mute_type t, bool onoff, void *src)
2203 _mute_affects_pre_fader = onoff;
2204 pre_fader_changed(src); /* EMIT SIGNAL */
2208 _mute_affects_post_fader = onoff;
2209 post_fader_changed(src); /* EMIT SIGNAL */
2213 _mute_affects_control_outs = onoff;
2214 control_outs_changed(src); /* EMIT SIGNAL */
2218 _mute_affects_main_outs = onoff;
2219 main_outs_changed(src); /* EMIT SIGNAL */
2225 Route::get_mute_config (mute_type t)
2231 onoff = _mute_affects_pre_fader;
2234 onoff = _mute_affects_post_fader;
2237 onoff = _mute_affects_control_outs;
2240 onoff = _mute_affects_main_outs;
2248 Route::set_active (bool yn)
2251 active_changed(); /* EMIT SIGNAL */
2255 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2257 nframes_t now = _session.transport_frame();
2260 Glib::RWLock::ReaderLock lm (redirect_lock);
2263 automation_snapshot (now);
2266 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2268 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2269 (*i)->deactivate ();
2273 (*i)->transport_stopped (now);
2277 IO::transport_stopped (now);
2279 _roll_delay = _initial_delay;
2283 Route::input_change_handler (IOChange change, void *ignored)
2285 if (change & ConfigurationChanged) {
2286 reset_plugin_counts (0);
2291 Route::output_change_handler (IOChange change, void *ignored)
2293 if (change & ConfigurationChanged) {
2294 if (_control_outs) {
2295 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().n_audio()), true, this);
2298 reset_plugin_counts (0);
2303 Route::pans_required () const
2305 if (n_outputs().n_audio() < 2) {
2309 return max (n_inputs ().n_audio(), static_cast<size_t>(redirect_max_outs.n_audio()));
2313 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2314 bool session_state_changing, bool can_record, bool rec_monitors_input)
2316 if (n_outputs().n_total() == 0) {
2320 if (session_state_changing || !_active) {
2321 silence (nframes, offset);
2325 apply_gain_automation = false;
2327 if (n_inputs().n_total()) {
2328 passthru (start_frame, end_frame, nframes, offset, 0, false);
2330 silence (nframes, offset);
2337 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2339 if (_roll_delay > nframes) {
2341 _roll_delay -= nframes;
2342 silence (nframes, offset);
2343 /* transport frame is not legal for caller to use */
2346 } else if (_roll_delay > 0) {
2348 nframes -= _roll_delay;
2350 silence (_roll_delay, offset);
2352 offset += _roll_delay;
2353 transport_frame += _roll_delay;
2362 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2363 bool can_record, bool rec_monitors_input)
2366 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2368 // automation snapshot can also be called from the non-rt context
2369 // and it uses the redirect list, so we take the lock out here
2370 automation_snapshot (_session.transport_frame());
2374 if ((n_outputs().n_total() == 0 && _redirects.empty()) || n_inputs().n_total() == 0 || !_active) {
2375 silence (nframes, offset);
2379 nframes_t unused = 0;
2381 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2387 apply_gain_automation = false;
2390 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2392 if (am.locked() && _session.transport_rolling()) {
2394 if (gain_automation_playback()) {
2395 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2400 passthru (start_frame, end_frame, nframes, offset, declick, false);
2406 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2407 bool can_record, bool rec_monitors_input)
2409 silence (nframes, offset);
2414 Route::toggle_monitor_input ()
2416 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2417 i->ensure_monitor_input( ! i->monitoring_input());
2422 Route::has_external_redirects () const
2424 boost::shared_ptr<const PortInsert> pi;
2426 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2427 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2429 for (PortSet::const_iterator port = pi->outputs().begin();
2430 port != pi->outputs().end(); ++port) {
2432 string port_name = port->name();
2433 string client_name = port_name.substr (0, port_name.find(':'));
2435 /* only say "yes" if the redirect is actually in use */
2437 if (client_name != "ardour" && pi->active()) {
2448 Route::flush_redirects ()
2450 /* XXX shouldn't really try to take this lock, since
2451 this is called from the RT audio thread.
2454 Glib::RWLock::ReaderLock lm (redirect_lock);
2456 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2457 (*i)->deactivate ();
2463 Route::set_meter_point (MeterPoint p, void *src)
2465 if (_meter_point != p) {
2467 meter_change (src); /* EMIT SIGNAL */
2468 _session.set_dirty ();
2473 Route::update_total_latency ()
2477 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2478 if ((*i)->active ()) {
2479 _own_latency += (*i)->latency ();
2483 set_port_latency (_own_latency);
2485 /* this (virtual) function is used for pure Routes,
2486 not derived classes like AudioTrack. this means
2487 that the data processed here comes from an input
2488 port, not prerecorded material, and therefore we
2489 have to take into account any input latency.
2492 _own_latency += input_latency ();
2494 return _own_latency;
2498 Route::set_latency_delay (nframes_t longest_session_latency)
2500 _initial_delay = longest_session_latency - _own_latency;
2502 if (_session.transport_stopped()) {
2503 _roll_delay = _initial_delay;
2508 Route::automation_snapshot (nframes_t now)
2510 IO::automation_snapshot (now);
2512 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2513 (*i)->automation_snapshot (now);
2517 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2518 : Controllable (name), route (s), type(tp)
2524 Route::ToggleControllable::set_value (float val)
2526 bool bval = ((val >= 0.5f) ? true: false);
2530 route.set_mute (bval, this);
2533 route.set_solo (bval, this);
2541 Route::ToggleControllable::get_value (void) const
2547 val = route.muted() ? 1.0f : 0.0f;
2550 val = route.soloed() ? 1.0f : 0.0f;
2560 Route::set_block_size (nframes_t nframes)
2562 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2563 (*i)->set_block_size (nframes);
2568 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2570 _session.update_latency_compensation (false, false);
2574 Route::protect_automation ()
2576 switch (gain_automation_state()) {
2578 set_gain_automation_state (Off);
2580 set_gain_automation_state (Play);
2586 switch (panner().automation_state ()) {
2588 panner().set_automation_state (Off);
2591 panner().set_automation_state (Play);
2597 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2598 boost::shared_ptr<PluginInsert> pi;
2599 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2600 pi->protect_automation ();
2606 Route::set_pending_declick (int declick)
2609 /* this call is not allowed to turn off a pending declick unless "force" is true */
2611 _pending_declick = declick;
2613 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2615 _pending_declick = 0;