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/plugin_insert.h>
34 #include <ardour/port_insert.h>
35 #include <ardour/send.h>
36 #include <ardour/session.h>
37 #include <ardour/utils.h>
38 #include <ardour/configuration.h>
39 #include <ardour/cycle_timer.h>
40 #include <ardour/route_group.h>
41 #include <ardour/port.h>
42 #include <ardour/audio_port.h>
43 #include <ardour/ladspa_plugin.h>
44 #include <ardour/panner.h>
45 #include <ardour/dB.h>
46 #include <ardour/amp.h>
47 #include <ardour/meter.h>
48 #include <ardour/buffer_set.h>
52 using namespace ARDOUR;
55 uint32_t Route::order_key_cnt = 0;
58 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
59 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
61 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
62 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
67 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
68 : IO (sess, *node.child ("IO"), default_type),
69 _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
70 _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
73 _set_state (node, false);
79 redirect_max_outs.reset();
83 _phase_invert = false;
84 _denormal_protection = false;
85 order_keys[strdup (N_("signal"))] = order_key_cnt++;
88 _meter_point = MeterPostFader;
92 _have_internal_generator = false;
94 _pending_declick = true;
95 _remote_control_id = 0;
100 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
101 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
102 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
103 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
106 desired_solo_gain = 1.0;
108 desired_mute_gain = 1.0;
112 input_changed.connect (mem_fun (this, &Route::input_change_handler));
113 output_changed.connect (mem_fun (this, &Route::output_change_handler));
118 clear_redirects (PreFader, this);
119 clear_redirects (PostFader, this);
121 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
122 free ((void*)(i->first));
126 delete _control_outs;
131 Route::set_remote_control_id (uint32_t id)
133 if (id != _remote_control_id) {
134 _remote_control_id = id;
135 RemoteControlIDChanged ();
140 Route::remote_control_id() const
142 return _remote_control_id;
146 Route::order_key (const char* name) const
148 OrderKeys::const_iterator i;
150 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
151 if (!strcmp (name, i->first)) {
160 Route::set_order_key (const char* name, long n)
162 order_keys[strdup(name)] = n;
163 _session.set_dirty ();
167 Route::inc_gain (gain_t fraction, void *src)
169 IO::inc_gain (fraction, src);
173 Route::set_gain (gain_t val, void *src)
175 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
177 if (_mix_group->is_relative()) {
180 gain_t usable_gain = gain();
181 if (usable_gain < 0.000001f) {
182 usable_gain=0.000001f;
186 if (delta < 0.000001f) {
190 delta -= usable_gain;
192 if (delta == 0.0f) return;
194 gain_t factor = delta / usable_gain;
197 factor = _mix_group->get_max_factor(factor);
198 if (factor == 0.0f) {
203 factor = _mix_group->get_min_factor(factor);
204 if (factor == 0.0f) {
210 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
214 _mix_group->apply (&Route::set_gain, val, _mix_group);
224 IO::set_gain (val, src);
227 /** Process this route for one (sub) cycle (process thread)
229 * @param bufs Scratch buffers to use for the signal path
230 * @param start_frame Initial transport frame
231 * @param end_frame Final transport frame
232 * @param nframes Number of frames to output (to ports)
233 * @param offset Output offset (of port buffers, for split cycles)
235 * Note that (end_frame - start_frame) may not be equal to nframes when the
236 * transport speed isn't 1.0 (eg varispeed).
239 Route::process_output_buffers (BufferSet& bufs,
240 nframes_t start_frame, nframes_t end_frame,
241 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
244 // This is definitely very audio-only for now
245 assert(_default_type == DataType::AUDIO);
247 RedirectList::iterator i;
248 bool post_fader_work = false;
249 bool mute_declick_applied = false;
255 gain_t* gab = _session.gain_automation_buffer();
257 switch (Config->get_monitoring_model()) {
258 case HardwareMonitoring:
259 case ExternalMonitoring:
266 declick = _pending_declick;
269 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
279 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
282 dmg = desired_mute_gain;
283 dsg = desired_solo_gain;
292 /* ----------------------------------------------------------------------------------------------------
293 GLOBAL DECLICK (for transport changes etc.)
294 -------------------------------------------------------------------------------------------------- */
297 Amp::run (bufs, nframes, 0.0, 1.0, false);
298 _pending_declick = 0;
299 } else if (declick < 0) {
300 Amp::run (bufs, nframes, 1.0, 0.0, false);
301 _pending_declick = 0;
304 /* no global declick */
306 if (solo_gain != dsg) {
307 Amp::run (bufs, nframes, solo_gain, dsg, false);
313 /* ----------------------------------------------------------------------------------------------------
314 INPUT METERING & MONITORING
315 -------------------------------------------------------------------------------------------------- */
317 if (meter && (_meter_point == MeterInput)) {
318 _meter->run(bufs, nframes);
321 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
322 Amp::run (bufs, nframes, mute_gain, dmg, false);
324 mute_declick_applied = true;
327 if ((_meter_point == MeterInput) && co) {
329 solo_audible = dsg > 0;
330 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
332 if ( // muted by solo of another track
336 // muted by mute of this track
340 // rec-enabled but not s/w monitoring
342 // TODO: this is probably wrong
344 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
348 co->silence (nframes, offset);
352 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
357 /* -----------------------------------------------------------------------------------------------------
359 -------------------------------------------------------------------------------------------------- */
361 if (_denormal_protection || Config->get_denormal_protection()) {
363 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
364 Sample* const sp = i->data();
366 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
372 /* ----------------------------------------------------------------------------------------------------
374 -------------------------------------------------------------------------------------------------- */
376 /* FIXME: Somewhere in these loops is where bufs.count() should go from n_inputs() to redirect_max_outs()
377 * (if they differ). Something explicit needs to be done here to make sure the list of redirects will
378 * give us what we need (possibly by inserting transparent 'translators' into the list to make it work) */
380 if (with_redirects) {
381 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
383 if (mute_gain > 0 || !_mute_affects_pre_fader) {
384 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
385 switch ((*i)->placement()) {
387 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
390 post_fader_work = true;
395 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
396 switch ((*i)->placement()) {
398 (*i)->silence (nframes, offset);
401 post_fader_work = true;
409 // FIXME: for now, just hope the redirects list did what it was supposed to
410 bufs.set_count(n_process_buffers());
413 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
414 Amp::run (bufs, nframes, mute_gain, dmg, false);
416 mute_declick_applied = true;
419 /* ----------------------------------------------------------------------------------------------------
420 PRE-FADER METERING & MONITORING
421 -------------------------------------------------------------------------------------------------- */
423 if (meter && (_meter_point == MeterPreFader)) {
424 _meter->run(bufs, nframes);
428 if ((_meter_point == MeterPreFader) && co) {
430 solo_audible = dsg > 0;
431 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
433 if ( // muted by solo of another track
437 // muted by mute of this track
441 // rec-enabled but not s/w monitoring
443 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
447 co->silence (nframes, offset);
451 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
455 /* ----------------------------------------------------------------------------------------------------
457 -------------------------------------------------------------------------------------------------- */
459 /* if not recording or recording and requiring any monitor signal, then apply gain */
461 if ( // not recording
463 !(record_enabled() && _session.actively_recording()) ||
467 // h/w monitoring not in use
469 (!Config->get_monitoring_model() == HardwareMonitoring &&
471 // AND software monitoring required
473 Config->get_monitoring_model() == SoftwareMonitoring)) {
475 if (apply_gain_automation) {
478 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
479 Sample* const sp = i->data();
481 for (nframes_t nx = 0; nx < nframes; ++nx) {
486 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
487 Sample* const sp = i->data();
489 for (nframes_t nx = 0; nx < nframes; ++nx) {
495 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
496 _effective_gain = gab[nframes-1];
501 /* manual (scalar) gain */
505 Amp::run (bufs, nframes, _gain, dg, _phase_invert);
508 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
510 /* no need to interpolate current gain value,
511 but its non-unity, so apply it. if the gain
512 is zero, do nothing because we'll ship silence
524 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
525 Sample* const sp = i->data();
526 apply_gain_to_buffer(sp,nframes,this_gain);
529 } else if (_gain == 0) {
530 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
538 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
542 /* ----------------------------------------------------------------------------------------------------
544 -------------------------------------------------------------------------------------------------- */
546 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
548 if (post_fader_work) {
550 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
552 if (mute_gain > 0 || !_mute_affects_post_fader) {
553 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
554 switch ((*i)->placement()) {
558 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
563 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
564 switch ((*i)->placement()) {
568 (*i)->silence (nframes, offset);
576 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
577 Amp::run (bufs, nframes, mute_gain, dmg, false);
579 mute_declick_applied = true;
582 /* ----------------------------------------------------------------------------------------------------
584 -------------------------------------------------------------------------------------------------- */
586 if ((_meter_point == MeterPostFader) && co) {
588 solo_audible = solo_gain > 0;
589 mute_audible = dmg > 0 || !_mute_affects_control_outs;
591 if ( // silent anyway
593 (_gain == 0 && !apply_gain_automation) ||
595 // muted by solo of another track
599 // muted by mute of this track
603 // recording but not s/w monitoring
605 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
609 co->silence (nframes, offset);
613 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
617 /* ----------------------------------------------------------------------
619 ----------------------------------------------------------------------*/
621 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
622 Amp::run (bufs, nframes, mute_gain, dmg, false);
624 mute_declick_applied = true;
627 /* ----------------------------------------------------------------------------------------------------
629 -------------------------------------------------------------------------------------------------- */
631 solo_audible = dsg > 0;
632 mute_audible = dmg > 0 || !_mute_affects_main_outs;
634 if (n_outputs().get(_default_type) == 0) {
638 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
640 IO::silence (nframes, offset);
644 if ( // silent anyway
646 (_gain == 0 && !apply_gain_automation) ||
648 // muted by solo of another track, but not using control outs for solo
650 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
652 // muted by mute of this track
658 /* don't use Route::silence() here, because that causes
659 all outputs (sends, port inserts, etc. to be silent).
662 if (_meter_point == MeterPostFader) {
663 peak_meter().reset();
666 IO::silence (nframes, offset);
670 deliver_output(bufs, start_frame, end_frame, nframes, offset);
676 /* ----------------------------------------------------------------------------------------------------
678 -------------------------------------------------------------------------------------------------- */
680 if (meter && (_meter_point == MeterPostFader)) {
681 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
684 _meter->run(output_buffers(), nframes, offset);
690 Route::n_process_buffers ()
692 return max (n_inputs(), redirect_max_outs);
696 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
698 BufferSet& bufs = _session.get_scratch_buffers(n_process_buffers());
702 collect_input (bufs, nframes, offset);
705 _meter->run(bufs, nframes);
709 process_output_buffers (bufs, start_frame, end_frame, nframes, offset, true, declick, meter_first);
713 Route::passthru_silence (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter)
715 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, offset, true, declick, meter);
719 Route::set_solo (bool yn, void *src)
725 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
726 _mix_group->apply (&Route::set_solo, yn, _mix_group);
732 solo_changed (src); /* EMIT SIGNAL */
733 _solo_control.Changed (); /* EMIT SIGNAL */
738 Route::set_solo_mute (bool yn)
740 Glib::Mutex::Lock lm (declick_lock);
742 /* Called by Session in response to another Route being soloed.
745 desired_solo_gain = (yn?0.0:1.0);
749 Route::set_solo_safe (bool yn, void *src)
751 if (_solo_safe != yn) {
753 solo_safe_changed (src); /* EMIT SIGNAL */
758 Route::set_mute (bool yn, void *src)
761 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
762 _mix_group->apply (&Route::set_mute, yn, _mix_group);
768 mute_changed (src); /* EMIT SIGNAL */
770 _mute_control.Changed (); /* EMIT SIGNAL */
772 Glib::Mutex::Lock lm (declick_lock);
773 desired_mute_gain = (yn?0.0f:1.0f);
778 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, InsertStreams* err)
780 ChanCount old_rmo = redirect_max_outs;
782 if (!_session.engine().connected()) {
787 Glib::RWLock::WriterLock lm (redirect_lock);
789 boost::shared_ptr<PluginInsert> pi;
790 boost::shared_ptr<PortInsert> porti;
792 redirect->set_default_type(_default_type);
794 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
797 if (pi->natural_input_streams() == ChanCount::ZERO) {
798 /* generator plugin */
799 _have_internal_generator = true;
802 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
804 /* force new port inserts to start out with an i/o configuration
805 that matches this route's i/o configuration.
807 the "inputs" for the port are supposed to match the output
810 the "outputs" of the route should match the inputs of this
811 route. XXX shouldn't they match the number of active signal
812 streams at the point of insertion?
814 // FIXME: (yes, they should)
816 porti->ensure_io (n_outputs (), n_inputs(), false, this);
819 _redirects.push_back (redirect);
821 // Set up redirect list channels. This will set redirect->[input|output]_streams()
822 if (_reset_plugin_counts (err)) {
823 _redirects.pop_back ();
824 _reset_plugin_counts (0); // it worked before we tried to add it ...
828 // Ensure peak vector sizes before the plugin is activated
829 ChanCount potential_max_streams = max(redirect->input_streams(), redirect->output_streams());
830 _meter->setup(potential_max_streams);
832 redirect->activate ();
833 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
836 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
841 redirects_changed (src); /* EMIT SIGNAL */
846 Route::add_redirects (const RedirectList& others, void *src, InsertStreams* err)
848 ChanCount old_rmo = redirect_max_outs;
850 if (!_session.engine().connected()) {
855 Glib::RWLock::WriterLock lm (redirect_lock);
857 RedirectList::iterator existing_end = _redirects.end();
860 ChanCount potential_max_streams;
862 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
864 boost::shared_ptr<PluginInsert> pi;
866 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
869 ChanCount m = max(pi->input_streams(), pi->output_streams());
870 if (m > potential_max_streams)
871 potential_max_streams = m;
874 // Ensure peak vector sizes before the plugin is activated
875 _meter->setup(potential_max_streams);
877 _redirects.push_back (*i);
879 if (_reset_plugin_counts (err)) {
881 _redirects.erase (existing_end, _redirects.end());
882 _reset_plugin_counts (0); // it worked before we tried to add it ...
887 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
891 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
895 redirects_changed (src); /* EMIT SIGNAL */
899 /** Turn off all redirects with a given placement
900 * @param p Placement of redirects to disable
904 Route::disable_redirects (Placement p)
906 Glib::RWLock::ReaderLock lm (redirect_lock);
908 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
909 if ((*i)->placement() == p) {
910 (*i)->set_active (false, this);
915 /** Turn off all redirects
919 Route::disable_redirects ()
921 Glib::RWLock::ReaderLock lm (redirect_lock);
923 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
924 (*i)->set_active (false, this);
928 /** Turn off all redirects with a given placement
929 * @param p Placement of redirects to disable
933 Route::disable_plugins (Placement p)
935 Glib::RWLock::ReaderLock lm (redirect_lock);
937 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
938 if (boost::dynamic_pointer_cast<PluginInsert> (*i) && (*i)->placement() == p) {
939 (*i)->set_active (false, this);
944 /** Turn off all plugins
948 Route::disable_plugins ()
950 Glib::RWLock::ReaderLock lm (redirect_lock);
952 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
953 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
954 (*i)->set_active (false, this);
961 Route::ab_plugins (bool forward)
963 Glib::RWLock::ReaderLock lm (redirect_lock);
967 /* forward = turn off all active redirects, and mark them so that the next time
968 we go the other way, we will revert them
971 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
972 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
976 if ((*i)->active()) {
977 (*i)->set_active (false, this);
978 (*i)->set_next_ab_is_active (true);
980 (*i)->set_next_ab_is_active (false);
986 /* backward = if the redirect was marked to go active on the next ab, do so */
988 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
990 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
994 if ((*i)->get_next_ab_is_active()) {
995 (*i)->set_active (true, this);
997 (*i)->set_active (false, this);
1004 /* Figure out the streams that will feed into PreFader */
1006 Route::pre_fader_streams() const
1008 boost::shared_ptr<Redirect> redirect;
1010 // Find the last pre-fader redirect
1011 for (RedirectList::const_iterator r = _redirects.begin(); r != _redirects.end(); ++r) {
1012 if ((*r)->placement() == PreFader) {
1018 return redirect->output_streams();
1025 /** Remove redirects with a given placement.
1026 * @param p Placement of redirects to remove.
1029 Route::clear_redirects (Placement p, void *src)
1031 const ChanCount old_rmo = redirect_max_outs;
1033 if (!_session.engine().connected()) {
1038 Glib::RWLock::WriterLock lm (redirect_lock);
1039 RedirectList new_list;
1041 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1042 if ((*i)->placement() == p) {
1043 /* it's the placement we want to get rid of */
1044 (*i)->drop_references ();
1046 /* it's a different placement, so keep it */
1047 new_list.push_back (*i);
1051 _redirects = new_list;
1054 /* FIXME: can't see how this test can ever fire */
1055 if (redirect_max_outs != old_rmo) {
1059 redirect_max_outs.reset();
1060 _have_internal_generator = false;
1061 redirects_changed (src); /* EMIT SIGNAL */
1065 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, InsertStreams* err)
1067 ChanCount old_rmo = redirect_max_outs;
1069 if (!_session.engine().connected()) {
1073 redirect_max_outs.reset();
1076 Glib::RWLock::WriterLock lm (redirect_lock);
1077 RedirectList::iterator i;
1078 bool removed = false;
1080 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1081 if (*i == redirect) {
1083 RedirectList::iterator tmp;
1085 /* move along, see failure case for reset_plugin_counts()
1086 where we may need to reinsert the redirect.
1092 /* stop redirects that send signals to JACK ports
1093 from causing noise as a result of no longer being
1097 boost::shared_ptr<Send> send;
1098 boost::shared_ptr<PortInsert> port_insert;
1100 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
1101 send->disconnect_inputs (this);
1102 send->disconnect_outputs (this);
1103 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
1104 port_insert->disconnect_inputs (this);
1105 port_insert->disconnect_outputs (this);
1108 _redirects.erase (i);
1121 if (_reset_plugin_counts (err)) {
1122 /* get back to where we where */
1123 _redirects.insert (i, redirect);
1124 /* we know this will work, because it worked before :) */
1125 _reset_plugin_counts (0);
1131 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1132 boost::shared_ptr<PluginInsert> pi;
1134 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1135 if (pi->is_generator()) {
1141 _have_internal_generator = foo;
1144 if (old_rmo != redirect_max_outs) {
1148 redirect->drop_references ();
1150 redirects_changed (src); /* EMIT SIGNAL */
1155 Route::reset_plugin_counts (InsertStreams* err)
1157 Glib::RWLock::WriterLock lm (redirect_lock);
1158 return _reset_plugin_counts (err);
1163 Route::_reset_plugin_counts (InsertStreams* err)
1165 RedirectList::iterator r;
1166 map<Placement,list<InsertCount> > insert_map;
1167 ChanCount initial_streams;
1169 /* Process each placement in order, checking to see if we
1170 can really do what has been requested.
1173 /* divide inserts up by placement so we get the signal flow
1174 properly modelled. we need to do this because the _redirects
1175 list is not sorted by placement
1178 /* ... but it should/will be... */
1180 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1182 boost::shared_ptr<Insert> insert;
1184 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1185 insert_map[insert->placement()].push_back (InsertCount (insert));
1192 if ( ! check_some_plugin_counts (insert_map[PreFader], n_inputs (), err)) {
1196 ChanCount post_fader_input = (err ? err->count : n_inputs());
1200 if ( ! check_some_plugin_counts (insert_map[PostFader], post_fader_input, err)) {
1204 /* OK, everything can be set up correctly, so lets do it */
1206 apply_some_plugin_counts (insert_map[PreFader]);
1207 apply_some_plugin_counts (insert_map[PostFader]);
1209 /* recompute max outs of any redirect */
1211 redirect_max_outs.reset();
1212 RedirectList::iterator prev = _redirects.end();
1214 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1215 boost::shared_ptr<Send> s;
1217 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1218 if (r == _redirects.begin()) {
1219 s->expect_inputs (n_inputs());
1221 s->expect_inputs ((*prev)->output_streams());
1226 /* don't pay any attention to send output configuration, since it doesn't
1230 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1241 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1243 list<InsertCount>::iterator i;
1245 for (i = iclist.begin(); i != iclist.end(); ++i) {
1247 if ((*i).insert->configure_io ((*i).in, (*i).out)) {
1250 /* make sure that however many we have, they are all active */
1251 (*i).insert->activate ();
1257 /** Returns whether \a iclist can be configured and run starting with
1258 * \a required_inputs at the first insert's inputs.
1259 * If false is returned, \a iclist can not be run with \a required_inputs, and \a err is set.
1260 * Otherwise, \a err is set to the output of the list.
1263 Route::check_some_plugin_counts (list<InsertCount>& iclist, ChanCount required_inputs, InsertStreams* err)
1265 list<InsertCount>::iterator i;
1270 err->count = required_inputs;
1273 for (i = iclist.begin(); i != iclist.end(); ++i) {
1275 if ((*i).insert->can_support_input_configuration (required_inputs) < 0) {
1278 err->count = required_inputs;
1283 (*i).in = required_inputs;
1284 (*i).out = (*i).insert->output_for_input_configuration (required_inputs);
1286 required_inputs = (*i).out;
1292 if (!iclist.empty()) {
1294 err->count = iclist.back().insert->output_for_input_configuration(required_inputs);
1302 Route::copy_redirects (const Route& other, Placement placement, InsertStreams* err)
1304 ChanCount old_rmo = redirect_max_outs;
1306 RedirectList to_be_deleted;
1309 Glib::RWLock::WriterLock lm (redirect_lock);
1310 RedirectList::iterator tmp;
1311 RedirectList the_copy;
1313 the_copy = _redirects;
1315 /* remove all relevant redirects */
1317 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1321 if ((*i)->placement() == placement) {
1322 to_be_deleted.push_back (*i);
1323 _redirects.erase (i);
1329 /* now copy the relevant ones from "other" */
1331 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1332 if ((*i)->placement() == placement) {
1333 _redirects.push_back (Redirect::clone (*i));
1337 /* reset plugin stream handling */
1339 if (_reset_plugin_counts (err)) {
1341 /* FAILED COPY ATTEMPT: we have to restore order */
1343 /* delete all cloned redirects */
1345 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1350 if ((*i)->placement() == placement) {
1351 _redirects.erase (i);
1357 /* restore the natural order */
1359 _redirects = the_copy;
1360 redirect_max_outs = old_rmo;
1362 /* we failed, even though things are OK again */
1368 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1369 to_be_deleted.clear ();
1373 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
1377 redirects_changed (this); /* EMIT SIGNAL */
1382 Route::all_redirects_flip ()
1384 Glib::RWLock::ReaderLock lm (redirect_lock);
1386 if (_redirects.empty()) {
1390 bool first_is_on = _redirects.front()->active();
1392 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1393 (*i)->set_active (!first_is_on, this);
1397 /** Set all redirects with a given placement to a given active state.
1398 * @param p Placement of redirects to change.
1399 * @param state New active state for those redirects.
1402 Route::all_redirects_active (Placement p, bool state)
1404 Glib::RWLock::ReaderLock lm (redirect_lock);
1406 if (_redirects.empty()) {
1410 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1411 if ((*i)->placement() == p) {
1412 (*i)->set_active (state, this);
1417 struct RedirectSorter {
1418 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1419 return a->sort_key() < b->sort_key();
1424 Route::sort_redirects (InsertStreams* err)
1427 RedirectSorter comparator;
1428 Glib::RWLock::WriterLock lm (redirect_lock);
1429 ChanCount old_rmo = redirect_max_outs;
1431 /* the sweet power of C++ ... */
1433 RedirectList as_it_was_before = _redirects;
1435 _redirects.sort (comparator);
1437 if (_reset_plugin_counts (err)) {
1438 _redirects = as_it_was_before;
1439 redirect_max_outs = old_rmo;
1445 redirects_changed (this); /* EMIT SIGNAL */
1457 Route::get_template()
1459 return state(false);
1463 Route::state(bool full_state)
1465 XMLNode *node = new XMLNode("Route");
1466 RedirectList:: iterator i;
1470 node->add_property("flags", enum_2_string (_flags));
1473 node->add_property("default-type", _default_type.to_string());
1475 node->add_property("active", _active?"yes":"no");
1476 node->add_property("muted", _muted?"yes":"no");
1477 node->add_property("soloed", _soloed?"yes":"no");
1478 node->add_property("phase-invert", _phase_invert?"yes":"no");
1479 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1480 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1481 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1482 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1483 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1486 node->add_property("edit-group", _edit_group->name());
1489 node->add_property("mix-group", _mix_group->name());
1492 string order_string;
1493 OrderKeys::iterator x = order_keys.begin();
1495 while (x != order_keys.end()) {
1496 order_string += string ((*x).first);
1497 order_string += '=';
1498 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1499 order_string += buf;
1503 if (x == order_keys.end()) {
1507 order_string += ':';
1509 node->add_property ("order-keys", order_string);
1511 node->add_child_nocopy (IO::state (full_state));
1512 node->add_child_nocopy (_solo_control.get_state ());
1513 node->add_child_nocopy (_mute_control.get_state ());
1515 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1516 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1517 remote_control_node->add_property (X_("id"), buf);
1518 node->add_child_nocopy (*remote_control_node);
1520 if (_control_outs) {
1521 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1522 cnode->add_child_nocopy (_control_outs->state (full_state));
1523 node->add_child_nocopy (*cnode);
1526 if (_comment.length()) {
1527 XMLNode *cmt = node->add_child ("Comment");
1528 cmt->add_content (_comment);
1531 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1532 node->add_child_nocopy((*i)->state (full_state));
1536 node->add_child_copy (*_extra_xml);
1543 Route::get_redirect_state ()
1545 XMLNode* root = new XMLNode (X_("redirects"));
1546 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1547 root->add_child_nocopy ((*i)->state (true));
1554 Route::set_redirect_state (const XMLNode& root)
1556 if (root.name() != X_("redirects")) {
1562 XMLNodeConstIterator iter;
1563 XMLNodeConstIterator niter;
1564 Glib::RWLock::ReaderLock lm (redirect_lock);
1566 nlist = root.children();
1568 for (iter = nlist.begin(); iter != nlist.end(); ++iter){
1570 /* iter now points to a Redirect state node */
1572 nnlist = (*iter)->children ();
1574 for (niter = nnlist.begin(); niter != nnlist.end(); ++niter) {
1576 /* find the IO child node, since it contains the ID we need */
1578 /* XXX OOP encapsulation violation, ugh */
1580 if ((*niter)->name() == IO::state_node_name) {
1582 XMLProperty* prop = (*niter)->property (X_("id"));
1585 warning << _("Redirect node has no ID, ignored") << endmsg;
1589 ID id = prop->value ();
1591 /* now look for a redirect with that ID */
1593 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1594 if ((*i)->id() == id) {
1595 (*i)->set_state (**iter);
1611 Route::set_deferred_state ()
1614 XMLNodeConstIterator niter;
1616 if (!deferred_state) {
1620 nlist = deferred_state->children();
1622 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1623 add_redirect_from_xml (**niter);
1626 delete deferred_state;
1631 Route::add_redirect_from_xml (const XMLNode& node)
1633 const XMLProperty *prop;
1635 if (node.name() == "Send") {
1639 boost::shared_ptr<Send> send (new Send (_session, node));
1640 add_redirect (send, this);
1643 catch (failed_constructor &err) {
1644 error << _("Send construction failed") << endmsg;
1648 } else if (node.name() == "Insert") {
1651 if ((prop = node.property ("type")) != 0) {
1653 boost::shared_ptr<Insert> insert;
1655 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1657 insert.reset (new PluginInsert(_session, node));
1659 } else if (prop->value() == "port") {
1662 insert.reset (new PortInsert (_session, node));
1666 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1669 add_redirect (insert, this);
1672 error << _("Insert XML node has no type property") << endmsg;
1676 catch (failed_constructor &err) {
1677 warning << _("insert could not be created. Ignored.") << endmsg;
1684 Route::set_state (const XMLNode& node)
1686 return _set_state (node, true);
1690 Route::_set_state (const XMLNode& node, bool call_base)
1693 XMLNodeConstIterator niter;
1695 XMLPropertyList plist;
1696 const XMLProperty *prop;
1698 if (node.name() != "Route"){
1699 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1703 if ((prop = node.property (X_("flags"))) != 0) {
1704 _flags = Flag (string_2_enum (prop->value(), _flags));
1709 if ((prop = node.property (X_("default-type"))) != 0) {
1710 _default_type = DataType(prop->value());
1711 assert(_default_type != DataType::NIL);
1714 if ((prop = node.property (X_("phase-invert"))) != 0) {
1715 set_phase_invert (prop->value()=="yes"?true:false, this);
1718 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1719 set_denormal_protection (prop->value()=="yes"?true:false, this);
1722 if ((prop = node.property (X_("active"))) != 0) {
1723 set_active (prop->value() == "yes");
1726 if ((prop = node.property (X_("muted"))) != 0) {
1727 bool yn = prop->value()=="yes"?true:false;
1729 /* force reset of mute status */
1733 mute_gain = desired_mute_gain;
1736 if ((prop = node.property (X_("soloed"))) != 0) {
1737 bool yn = prop->value()=="yes"?true:false;
1739 /* force reset of solo status */
1742 set_solo (yn, this);
1743 solo_gain = desired_solo_gain;
1746 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1747 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1750 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1751 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1754 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1755 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1758 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1759 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1762 if ((prop = node.property (X_("edit-group"))) != 0) {
1763 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1764 if(edit_group == 0) {
1765 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1767 set_edit_group(edit_group, this);
1771 if ((prop = node.property (X_("order-keys"))) != 0) {
1775 string::size_type colon, equal;
1776 string remaining = prop->value();
1778 while (remaining.length()) {
1780 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1781 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1784 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1785 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1788 set_order_key (remaining.substr (0, equal).c_str(), n);
1792 colon = remaining.find_first_of (':');
1794 if (colon != string::npos) {
1795 remaining = remaining.substr (colon+1);
1802 nlist = node.children();
1804 if (deferred_state) {
1805 delete deferred_state;
1808 deferred_state = new XMLNode(X_("deferred state"));
1810 /* set parent class properties before anything else */
1812 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1816 if (child->name() == IO::state_node_name && call_base) {
1818 IO::set_state (*child);
1823 XMLNodeList redirect_nodes;
1825 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1829 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
1830 redirect_nodes.push_back(child);
1835 _set_redirect_states(redirect_nodes);
1838 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1840 // All redirects (sends and inserts) have been applied already
1842 if (child->name() == X_("Automation")) {
1844 if ((prop = child->property (X_("path"))) != 0) {
1845 load_automation (prop->value());
1848 } else if (child->name() == X_("ControlOuts")) {
1850 string coutname = _name;
1851 coutname += _("[control]");
1853 _control_outs = new IO (_session, coutname);
1854 _control_outs->set_state (**(child->children().begin()));
1856 } else if (child->name() == X_("Comment")) {
1858 /* XXX this is a terrible API design in libxml++ */
1860 XMLNode *cmt = *(child->children().begin());
1861 _comment = cmt->content();
1863 } else if (child->name() == X_("extra")) {
1865 _extra_xml = new XMLNode (*child);
1867 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1869 if (prop->value() == "solo") {
1870 _solo_control.set_state (*child);
1871 _session.add_controllable (&_solo_control);
1873 else if (prop->value() == "mute") {
1874 _mute_control.set_state (*child);
1875 _session.add_controllable (&_mute_control);
1878 else if (child->name() == X_("remote_control")) {
1879 if ((prop = child->property (X_("id"))) != 0) {
1881 sscanf (prop->value().c_str(), "%d", &x);
1882 set_remote_control_id (x);
1887 if ((prop = node.property (X_("mix-group"))) != 0) {
1888 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1889 if (mix_group == 0) {
1890 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1892 set_mix_group(mix_group, this);
1900 Route::_set_redirect_states(const XMLNodeList &nlist)
1902 XMLNodeConstIterator niter;
1905 RedirectList::iterator i, o;
1907 // Iterate through existing redirects, remove those which are not in the state list
1908 for (i = _redirects.begin(); i != _redirects.end(); ) {
1909 RedirectList::iterator tmp = i;
1912 bool redirectInStateList = false;
1914 (*i)->id().print (buf, sizeof (buf));
1917 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1919 if (strncmp(buf,(*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1920 redirectInStateList = true;
1925 if (!redirectInStateList) {
1926 remove_redirect ( *i, this);
1934 // Iterate through state list and make sure all redirects are on the track and in the correct order,
1935 // set the state of existing redirects according to the new state on the same go
1936 i = _redirects.begin();
1937 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1939 // Check whether the next redirect in the list
1942 while (o != _redirects.end()) {
1943 (*o)->id().print (buf, sizeof (buf));
1944 if ( strncmp(buf, (*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1949 if (o == _redirects.end()) {
1950 // If the redirect (*niter) is not on the route, we need to create it
1951 // and move it to the correct location
1953 RedirectList::iterator prev_last = _redirects.end();
1954 --prev_last; // We need this to check whether adding succeeded
1956 add_redirect_from_xml (**niter);
1958 RedirectList::iterator last = _redirects.end();
1961 if (prev_last == last) {
1962 cerr << "Could not fully restore state as some redirects were not possible to create" << endl;
1967 boost::shared_ptr<Redirect> tmp = (*last);
1968 // remove the redirect from the wrong location
1969 _redirects.erase(last);
1970 // insert the new redirect at the current location
1971 _redirects.insert(i, tmp);
1973 --i; // move pointer to the newly inserted redirect
1977 // We found the redirect (*niter) on the route, first we must make sure the redirect
1978 // is at the location provided in the XML state
1980 boost::shared_ptr<Redirect> tmp = (*o);
1981 // remove the old copy
1982 _redirects.erase(o);
1983 // insert the redirect at the correct location
1984 _redirects.insert(i, tmp);
1986 --i; // move pointer so it points to the right redirect
1989 (*i)->set_state( (**niter) );
1992 redirects_changed(this);
1996 Route::curve_reallocate ()
1998 // _gain_automation_curve.finish_resize ();
1999 // _pan_automation_curve.finish_resize ();
2003 Route::silence (nframes_t nframes, nframes_t offset)
2007 IO::silence (nframes, offset);
2009 if (_control_outs) {
2010 _control_outs->silence (nframes, offset);
2014 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2017 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2018 boost::shared_ptr<PluginInsert> pi;
2019 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2020 // skip plugins, they don't need anything when we're not active
2024 (*i)->silence (nframes, offset);
2027 if (nframes == _session.get_block_size() && offset == 0) {
2037 Route::set_control_outs (const vector<string>& ports)
2039 Glib::Mutex::Lock lm (control_outs_lock);
2040 vector<string>::const_iterator i;
2043 if (_control_outs) {
2044 delete _control_outs;
2048 if (control() || master()) {
2049 /* no control outs for these two special busses */
2053 if (ports.empty()) {
2057 string coutname = _name;
2058 coutname += _("[control]");
2060 _control_outs = new IO (_session, coutname);
2062 /* our control outs need as many outputs as we
2063 have audio outputs. we track the changes in ::output_change_handler().
2066 // XXX its stupid that we have to get this value twice
2068 limit = n_outputs().n_audio();
2070 if (_control_outs->ensure_io (ChanCount::ZERO, ChanCount (DataType::AUDIO, n_outputs().get (DataType::AUDIO)), true, this)) {
2074 /* now connect to the named ports */
2076 for (size_t n = 0; n < limit; ++n) {
2077 if (_control_outs->connect_output (_control_outs->output (n), ports[n], this)) {
2078 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2087 Route::set_edit_group (RouteGroup *eg, void *src)
2090 if (eg == _edit_group) {
2095 _edit_group->remove (this);
2098 if ((_edit_group = eg) != 0) {
2099 _edit_group->add (this);
2102 _session.set_dirty ();
2103 edit_group_changed (src); /* EMIT SIGNAL */
2107 Route::drop_edit_group (void *src)
2110 _session.set_dirty ();
2111 edit_group_changed (src); /* EMIT SIGNAL */
2115 Route::set_mix_group (RouteGroup *mg, void *src)
2118 if (mg == _mix_group) {
2123 _mix_group->remove (this);
2126 if ((_mix_group = mg) != 0) {
2127 _mix_group->add (this);
2130 _session.set_dirty ();
2131 mix_group_changed (src); /* EMIT SIGNAL */
2135 Route::drop_mix_group (void *src)
2138 _session.set_dirty ();
2139 mix_group_changed (src); /* EMIT SIGNAL */
2143 Route::set_comment (string cmt, void *src)
2146 comment_changed (src);
2147 _session.set_dirty ();
2151 Route::feeds (boost::shared_ptr<Route> other)
2156 uint32_t no = self.n_outputs().n_total();
2157 uint32_t ni = other->n_inputs ().n_total();
2159 for (i = 0; i < no; ++i) {
2160 for (j = 0; j < ni; ++j) {
2161 if (self.output(i)->connected_to (other->input(j)->name())) {
2167 /* check Redirects which may also interconnect Routes */
2169 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2171 no = (*r)->n_outputs().n_total();
2173 for (i = 0; i < no; ++i) {
2174 for (j = 0; j < ni; ++j) {
2175 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2182 /* check for control room outputs which may also interconnect Routes */
2184 if (_control_outs) {
2186 no = _control_outs->n_outputs().n_total();
2188 for (i = 0; i < no; ++i) {
2189 for (j = 0; j < ni; ++j) {
2190 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2201 Route::set_mute_config (mute_type t, bool onoff, void *src)
2205 _mute_affects_pre_fader = onoff;
2206 pre_fader_changed(src); /* EMIT SIGNAL */
2210 _mute_affects_post_fader = onoff;
2211 post_fader_changed(src); /* EMIT SIGNAL */
2215 _mute_affects_control_outs = onoff;
2216 control_outs_changed(src); /* EMIT SIGNAL */
2220 _mute_affects_main_outs = onoff;
2221 main_outs_changed(src); /* EMIT SIGNAL */
2227 Route::get_mute_config (mute_type t)
2233 onoff = _mute_affects_pre_fader;
2236 onoff = _mute_affects_post_fader;
2239 onoff = _mute_affects_control_outs;
2242 onoff = _mute_affects_main_outs;
2250 Route::set_active (bool yn)
2253 active_changed(); /* EMIT SIGNAL */
2257 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2259 nframes_t now = _session.transport_frame();
2262 Glib::RWLock::ReaderLock lm (redirect_lock);
2265 automation_snapshot (now);
2268 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2270 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2271 (*i)->deactivate ();
2275 (*i)->transport_stopped (now);
2279 IO::transport_stopped (now);
2281 _roll_delay = _initial_delay;
2285 Route::input_change_handler (IOChange change, void *ignored)
2287 if (change & ConfigurationChanged) {
2288 reset_plugin_counts (0);
2293 Route::output_change_handler (IOChange change, void *ignored)
2295 if (change & ConfigurationChanged) {
2296 if (_control_outs) {
2297 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().n_audio()), true, this);
2300 reset_plugin_counts (0);
2305 Route::pans_required () const
2307 if (n_outputs().n_audio() < 2) {
2311 return max (n_inputs ().n_audio(), static_cast<size_t>(redirect_max_outs.n_audio()));
2315 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2316 bool session_state_changing, bool can_record, bool rec_monitors_input)
2318 if (n_outputs().n_total() == 0) {
2322 if (session_state_changing || !_active) {
2323 silence (nframes, offset);
2327 apply_gain_automation = false;
2329 if (n_inputs().n_total()) {
2330 passthru (start_frame, end_frame, nframes, offset, 0, false);
2332 silence (nframes, offset);
2339 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2341 if (_roll_delay > nframes) {
2343 _roll_delay -= nframes;
2344 silence (nframes, offset);
2345 /* transport frame is not legal for caller to use */
2348 } else if (_roll_delay > 0) {
2350 nframes -= _roll_delay;
2352 silence (_roll_delay, offset);
2354 offset += _roll_delay;
2355 transport_frame += _roll_delay;
2364 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2365 bool can_record, bool rec_monitors_input)
2368 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2370 // automation snapshot can also be called from the non-rt context
2371 // and it uses the redirect list, so we take the lock out here
2372 automation_snapshot (_session.transport_frame());
2376 if ((n_outputs().n_total() == 0 && _redirects.empty()) || n_inputs().n_total() == 0 || !_active) {
2377 silence (nframes, offset);
2381 nframes_t unused = 0;
2383 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2389 apply_gain_automation = false;
2392 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2394 if (am.locked() && _session.transport_rolling()) {
2396 if (gain_automation_playback()) {
2397 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2402 passthru (start_frame, end_frame, nframes, offset, declick, false);
2408 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2409 bool can_record, bool rec_monitors_input)
2411 silence (nframes, offset);
2416 Route::toggle_monitor_input ()
2418 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2419 i->ensure_monitor_input( ! i->monitoring_input());
2424 Route::has_external_redirects () const
2426 boost::shared_ptr<const PortInsert> pi;
2428 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2429 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2431 for (PortSet::const_iterator port = pi->outputs().begin();
2432 port != pi->outputs().end(); ++port) {
2434 string port_name = port->name();
2435 string client_name = port_name.substr (0, port_name.find(':'));
2437 /* only say "yes" if the redirect is actually in use */
2439 if (client_name != "ardour" && pi->active()) {
2450 Route::flush_redirects ()
2452 /* XXX shouldn't really try to take this lock, since
2453 this is called from the RT audio thread.
2456 Glib::RWLock::ReaderLock lm (redirect_lock);
2458 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2459 (*i)->deactivate ();
2465 Route::set_meter_point (MeterPoint p, void *src)
2467 if (_meter_point != p) {
2469 meter_change (src); /* EMIT SIGNAL */
2470 _session.set_dirty ();
2475 Route::update_total_latency ()
2479 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2480 if ((*i)->active ()) {
2481 _own_latency += (*i)->latency ();
2485 set_port_latency (_own_latency);
2487 /* this (virtual) function is used for pure Routes,
2488 not derived classes like AudioTrack. this means
2489 that the data processed here comes from an input
2490 port, not prerecorded material, and therefore we
2491 have to take into account any input latency.
2494 _own_latency += input_latency ();
2496 return _own_latency;
2500 Route::set_latency_delay (nframes_t longest_session_latency)
2502 _initial_delay = longest_session_latency - _own_latency;
2504 if (_session.transport_stopped()) {
2505 _roll_delay = _initial_delay;
2510 Route::automation_snapshot (nframes_t now)
2512 IO::automation_snapshot (now);
2514 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2515 (*i)->automation_snapshot (now);
2519 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2520 : Controllable (name), route (s), type(tp)
2526 Route::ToggleControllable::set_value (float val)
2528 bool bval = ((val >= 0.5f) ? true: false);
2532 route.set_mute (bval, this);
2535 route.set_solo (bval, this);
2543 Route::ToggleControllable::get_value (void) const
2549 val = route.muted() ? 1.0f : 0.0f;
2552 val = route.soloed() ? 1.0f : 0.0f;
2562 Route::set_block_size (nframes_t nframes)
2564 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2565 (*i)->set_block_size (nframes);
2570 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2572 _session.update_latency_compensation (false, false);
2576 Route::protect_automation ()
2578 switch (gain_automation_state()) {
2580 set_gain_automation_state (Off);
2582 set_gain_automation_state (Play);
2588 switch (panner().automation_state ()) {
2590 panner().set_automation_state (Off);
2593 panner().set_automation_state (Play);
2599 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2600 boost::shared_ptr<PluginInsert> pi;
2601 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2602 pi->protect_automation ();
2608 Route::set_pending_declick (int declick)
2611 /* this call is not allowed to turn off a pending declick unless "force" is true */
2613 _pending_declick = declick;
2615 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2617 _pending_declick = 0;