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, uint32_t* err_streams)
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->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 // Ensure peak vector sizes before the plugin is activated
818 ChanCount potential_max_streams = max(redirect->input_streams(), redirect->output_streams());
819 _meter->setup(potential_max_streams);
821 _redirects.push_back (redirect);
823 if (_reset_plugin_counts (err_streams)) {
824 _redirects.pop_back ();
825 _reset_plugin_counts (0); // it worked before we tried to add it ...
829 redirect->activate ();
830 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
833 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
838 redirects_changed (src); /* EMIT SIGNAL */
843 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
845 ChanCount old_rmo = redirect_max_outs;
847 if (!_session.engine().connected()) {
852 Glib::RWLock::WriterLock lm (redirect_lock);
854 RedirectList::iterator existing_end = _redirects.end();
857 ChanCount potential_max_streams;
859 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
861 boost::shared_ptr<PluginInsert> pi;
863 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
866 ChanCount m = max(pi->input_streams(), pi->output_streams());
867 if (m > potential_max_streams)
868 potential_max_streams = m;
871 // Ensure peak vector sizes before the plugin is activated
872 _meter->setup(potential_max_streams);
874 _redirects.push_back (*i);
876 if (_reset_plugin_counts (err_streams)) {
878 _redirects.erase (existing_end, _redirects.end());
879 _reset_plugin_counts (0); // it worked before we tried to add it ...
884 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
888 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
892 redirects_changed (src); /* EMIT SIGNAL */
896 /** Turn off all redirects with a given placement
897 * @param p Placement of redirects to disable
901 Route::disable_redirects (Placement p)
903 Glib::RWLock::ReaderLock lm (redirect_lock);
905 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
906 if ((*i)->placement() == p) {
907 (*i)->set_active (false, this);
912 /** Turn off all redirects
916 Route::disable_redirects ()
918 Glib::RWLock::ReaderLock lm (redirect_lock);
920 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
921 (*i)->set_active (false, this);
925 /** Turn off all redirects with a given placement
926 * @param p Placement of redirects to disable
930 Route::disable_plugins (Placement p)
932 Glib::RWLock::ReaderLock lm (redirect_lock);
934 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
935 if (boost::dynamic_pointer_cast<PluginInsert> (*i) && (*i)->placement() == p) {
936 (*i)->set_active (false, this);
941 /** Turn off all plugins
945 Route::disable_plugins ()
947 Glib::RWLock::ReaderLock lm (redirect_lock);
949 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
950 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
951 (*i)->set_active (false, this);
958 Route::ab_plugins (bool forward)
960 Glib::RWLock::ReaderLock lm (redirect_lock);
964 /* forward = turn off all active redirects, and mark them so that the next time
965 we go the other way, we will revert them
968 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
969 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
973 if ((*i)->active()) {
974 (*i)->set_active (false, this);
975 (*i)->set_next_ab_is_active (true);
977 (*i)->set_next_ab_is_active (false);
983 /* backward = if the redirect was marked to go active on the next ab, do so */
985 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
987 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
991 if ((*i)->get_next_ab_is_active()) {
992 (*i)->set_active (true, this);
994 (*i)->set_active (false, this);
1000 /** Remove redirects with a given placement.
1001 * @param p Placement of redirects to remove.
1004 Route::clear_redirects (Placement p, void *src)
1006 const ChanCount old_rmo = redirect_max_outs;
1008 if (!_session.engine().connected()) {
1013 Glib::RWLock::WriterLock lm (redirect_lock);
1014 RedirectList new_list;
1016 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1017 if ((*i)->placement() == p) {
1018 /* it's the placement we want to get rid of */
1019 (*i)->drop_references ();
1021 /* it's a different placement, so keep it */
1022 new_list.push_back (*i);
1026 _redirects = new_list;
1029 /* FIXME: can't see how this test can ever fire */
1030 if (redirect_max_outs != old_rmo) {
1034 redirect_max_outs.reset();
1035 _have_internal_generator = false;
1036 redirects_changed (src); /* EMIT SIGNAL */
1040 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
1042 ChanCount old_rmo = redirect_max_outs;
1044 if (!_session.engine().connected()) {
1048 redirect_max_outs.reset();
1051 Glib::RWLock::WriterLock lm (redirect_lock);
1052 RedirectList::iterator i;
1053 bool removed = false;
1055 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1056 if (*i == redirect) {
1058 RedirectList::iterator tmp;
1060 /* move along, see failure case for reset_plugin_counts()
1061 where we may need to reinsert the redirect.
1067 /* stop redirects that send signals to JACK ports
1068 from causing noise as a result of no longer being
1072 boost::shared_ptr<Send> send;
1073 boost::shared_ptr<PortInsert> port_insert;
1075 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
1076 send->disconnect_inputs (this);
1077 send->disconnect_outputs (this);
1078 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
1079 port_insert->disconnect_inputs (this);
1080 port_insert->disconnect_outputs (this);
1083 _redirects.erase (i);
1096 if (_reset_plugin_counts (err_streams)) {
1097 /* get back to where we where */
1098 _redirects.insert (i, redirect);
1099 /* we know this will work, because it worked before :) */
1100 _reset_plugin_counts (0);
1106 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1107 boost::shared_ptr<PluginInsert> pi;
1109 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1110 if (pi->is_generator()) {
1116 _have_internal_generator = foo;
1119 if (old_rmo != redirect_max_outs) {
1123 redirect->drop_references ();
1125 redirects_changed (src); /* EMIT SIGNAL */
1130 Route::reset_plugin_counts (uint32_t* lpc)
1132 Glib::RWLock::WriterLock lm (redirect_lock);
1133 return _reset_plugin_counts (lpc);
1138 Route::_reset_plugin_counts (uint32_t* err_streams)
1140 RedirectList::iterator r;
1143 map<Placement,list<InsertCount> > insert_map;
1144 nframes_t initial_streams;
1146 redirect_max_outs.reset();
1150 /* divide inserts up by placement so we get the signal flow
1151 properly modelled. we need to do this because the _redirects
1152 list is not sorted by placement, and because other reasons may
1153 exist now or in the future for this separate treatment.
1156 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1158 boost::shared_ptr<Insert> insert;
1160 /* do this here in case we bomb out before we get to the end of
1164 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1166 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1168 insert_map[insert->placement()].push_back (InsertCount (insert));
1170 /* reset plugin counts back to one for now so
1171 that we have a predictable, controlled
1172 state to try to configure.
1175 boost::shared_ptr<PluginInsert> pi;
1177 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1181 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1194 /* Now process each placement in order, checking to see if we
1195 can really do what has been requested.
1200 if (check_some_plugin_counts (insert_map[PreFader], n_inputs ().get(_default_type), err_streams)) {
1204 /* figure out the streams that will feed into PreFader */
1206 if (!insert_map[PreFader].empty()) {
1207 InsertCount& ic (insert_map[PreFader].back());
1208 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1210 initial_streams = n_inputs ().get(_default_type);
1215 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1219 /* OK, everything can be set up correctly, so lets do it */
1221 apply_some_plugin_counts (insert_map[PreFader]);
1222 apply_some_plugin_counts (insert_map[PostFader]);
1224 /* recompute max outs of any redirect */
1228 redirect_max_outs.reset();
1229 RedirectList::iterator prev = _redirects.end();
1231 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1232 boost::shared_ptr<Send> s;
1234 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1235 if (r == _redirects.begin()) {
1236 s->expect_inputs (n_inputs());
1238 s->expect_inputs ((*prev)->output_streams());
1243 /* don't pay any attention to send output configuration, since it doesn't
1247 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1258 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1260 list<InsertCount>::iterator i;
1262 for (i = iclist.begin(); i != iclist.end(); ++i) {
1264 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1267 /* make sure that however many we have, they are all active */
1268 (*i).insert->activate ();
1275 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1277 list<InsertCount>::iterator i;
1279 for (i = iclist.begin(); i != iclist.end(); ++i) {
1281 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1283 *err_streams = required_inputs;
1288 (*i).in = required_inputs;
1289 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1291 required_inputs = (*i).out;
1298 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1300 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_streams)) {
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 (uint32_t* err_streams)
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_streams)) {
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;