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 order_keys[strdup (N_("signal"))] = order_key_cnt++;
85 _meter_point = MeterPostFader;
89 _have_internal_generator = false;
91 _pending_declick = true;
92 _remote_control_id = 0;
97 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
98 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
99 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
100 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
103 desired_solo_gain = 1.0;
105 desired_mute_gain = 1.0;
109 input_changed.connect (mem_fun (this, &Route::input_change_handler));
110 output_changed.connect (mem_fun (this, &Route::output_change_handler));
115 clear_redirects (PreFader, this);
116 clear_redirects (PostFader, this);
118 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
119 free ((void*)(i->first));
123 delete _control_outs;
128 Route::set_remote_control_id (uint32_t id)
130 if (id != _remote_control_id) {
131 _remote_control_id = id;
132 RemoteControlIDChanged ();
137 Route::remote_control_id() const
139 return _remote_control_id;
143 Route::order_key (const char* name) const
145 OrderKeys::const_iterator i;
147 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
148 if (!strcmp (name, i->first)) {
157 Route::set_order_key (const char* name, long n)
159 order_keys[strdup(name)] = n;
160 _session.set_dirty ();
164 Route::inc_gain (gain_t fraction, void *src)
166 IO::inc_gain (fraction, src);
170 Route::set_gain (gain_t val, void *src)
172 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
174 if (_mix_group->is_relative()) {
177 gain_t usable_gain = gain();
178 if (usable_gain < 0.000001f) {
179 usable_gain=0.000001f;
183 if (delta < 0.000001f) {
187 delta -= usable_gain;
189 if (delta == 0.0f) return;
191 gain_t factor = delta / usable_gain;
194 factor = _mix_group->get_max_factor(factor);
195 if (factor == 0.0f) {
200 factor = _mix_group->get_min_factor(factor);
201 if (factor == 0.0f) {
207 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
211 _mix_group->apply (&Route::set_gain, val, _mix_group);
221 IO::set_gain (val, src);
224 /** Process this route for one (sub) cycle (process thread)
226 * @param bufs Scratch buffers to use for the signal path
227 * @param start_frame Initial transport frame
228 * @param end_frame Final transport frame
229 * @param nframes Number of frames to output (to ports)
230 * @param offset Output offset (of port buffers, for split cycles)
232 * Note that (end_frame - start_frame) may not be equal to nframes when the
233 * transport speed isn't 1.0 (eg varispeed).
236 Route::process_output_buffers (BufferSet& bufs,
237 nframes_t start_frame, nframes_t end_frame,
238 nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
241 // This is definitely very audio-only for now
242 assert(_default_type == DataType::AUDIO);
244 RedirectList::iterator i;
245 bool post_fader_work = false;
246 bool mute_declick_applied = false;
252 gain_t* gab = _session.gain_automation_buffer();
254 switch (Config->get_monitoring_model()) {
255 case HardwareMonitoring:
256 case ExternalMonitoring:
263 declick = _pending_declick;
266 Glib::Mutex::Lock cm (control_outs_lock, Glib::TRY_LOCK);
276 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
279 dmg = desired_mute_gain;
280 dsg = desired_solo_gain;
289 /* ----------------------------------------------------------------------------------------------------
290 GLOBAL DECLICK (for transport changes etc.)
291 -------------------------------------------------------------------------------------------------- */
294 Amp::run (bufs, nframes, 0.0, 1.0, false);
295 _pending_declick = 0;
296 } else if (declick < 0) {
297 Amp::run (bufs, nframes, 1.0, 0.0, false);
298 _pending_declick = 0;
301 /* no global declick */
303 if (solo_gain != dsg) {
304 Amp::run (bufs, nframes, solo_gain, dsg, false);
310 /* ----------------------------------------------------------------------------------------------------
311 INPUT METERING & MONITORING
312 -------------------------------------------------------------------------------------------------- */
314 if (meter && (_meter_point == MeterInput)) {
315 _meter->run(bufs, nframes);
318 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
319 Amp::run (bufs, nframes, mute_gain, dmg, false);
321 mute_declick_applied = true;
324 if ((_meter_point == MeterInput) && co) {
326 solo_audible = dsg > 0;
327 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
329 if ( // muted by solo of another track
333 // muted by mute of this track
337 // rec-enabled but not s/w monitoring
339 // TODO: this is probably wrong
341 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
345 co->silence (nframes, offset);
349 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
354 /* ---------------------------------------------------------------------------------------------------
356 -------------------------------------------------------------------------------------------------- */
358 /* FIXME: Somewhere in these loops is where bufs.count() should go from n_inputs() to redirect_max_outs()
359 * (if they differ). Something explicit needs to be done here to make sure the list of redirects will
360 * give us what we need (possibly by inserting transparent 'translators' into the list to make it work) */
362 if (with_redirects) {
363 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
365 if (mute_gain > 0 || !_mute_affects_pre_fader) {
366 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
367 switch ((*i)->placement()) {
369 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
372 post_fader_work = true;
377 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
378 switch ((*i)->placement()) {
380 (*i)->silence (nframes, offset);
383 post_fader_work = true;
391 // FIXME: for now, just hope the redirects list did what it was supposed to
392 bufs.set_count(n_process_buffers());
395 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
396 Amp::run (bufs, nframes, mute_gain, dmg, false);
398 mute_declick_applied = true;
401 /* ----------------------------------------------------------------------------------------------------
402 PRE-FADER METERING & MONITORING
403 -------------------------------------------------------------------------------------------------- */
405 if (meter && (_meter_point == MeterPreFader)) {
406 _meter->run(bufs, nframes);
410 if ((_meter_point == MeterPreFader) && co) {
412 solo_audible = dsg > 0;
413 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
415 if ( // muted by solo of another track
419 // muted by mute of this track
423 // rec-enabled but not s/w monitoring
425 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
429 co->silence (nframes, offset);
433 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
437 /* ----------------------------------------------------------------------------------------------------
439 -------------------------------------------------------------------------------------------------- */
441 /* if not recording or recording and requiring any monitor signal, then apply gain */
443 if ( // not recording
445 !(record_enabled() && _session.actively_recording()) ||
449 // h/w monitoring not in use
451 (!Config->get_monitoring_model() == HardwareMonitoring &&
453 // AND software monitoring required
455 Config->get_monitoring_model() == SoftwareMonitoring)) {
457 if (apply_gain_automation) {
460 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
461 Sample* const sp = i->data();
463 for (nframes_t nx = 0; nx < nframes; ++nx) {
468 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
469 Sample* const sp = i->data();
471 for (nframes_t nx = 0; nx < nframes; ++nx) {
477 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
478 _effective_gain = gab[nframes-1];
483 /* manual (scalar) gain */
487 Amp::run (bufs, nframes, _gain, dg, _phase_invert);
490 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
492 /* no need to interpolate current gain value,
493 but its non-unity, so apply it. if the gain
494 is zero, do nothing because we'll ship silence
506 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
507 Sample* const sp = i->data();
508 apply_gain_to_buffer(sp,nframes,this_gain);
511 } else if (_gain == 0) {
512 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
520 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
524 /* ----------------------------------------------------------------------------------------------------
526 -------------------------------------------------------------------------------------------------- */
528 /* note that post_fader_work cannot be true unless with_redirects was also true, so don't test both */
530 if (post_fader_work) {
532 Glib::RWLock::ReaderLock rm (redirect_lock, Glib::TRY_LOCK);
534 if (mute_gain > 0 || !_mute_affects_post_fader) {
535 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
536 switch ((*i)->placement()) {
540 (*i)->run (bufs, start_frame, end_frame, nframes, offset);
545 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
546 switch ((*i)->placement()) {
550 (*i)->silence (nframes, offset);
558 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
559 Amp::run (bufs, nframes, mute_gain, dmg, false);
561 mute_declick_applied = true;
564 /* ----------------------------------------------------------------------------------------------------
566 -------------------------------------------------------------------------------------------------- */
568 if ((_meter_point == MeterPostFader) && co) {
570 solo_audible = solo_gain > 0;
571 mute_audible = dmg > 0 || !_mute_affects_control_outs;
573 if ( // silent anyway
575 (_gain == 0 && !apply_gain_automation) ||
577 // muted by solo of another track
581 // muted by mute of this track
585 // recording but not s/w monitoring
587 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
591 co->silence (nframes, offset);
595 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
599 /* ----------------------------------------------------------------------
601 ----------------------------------------------------------------------*/
603 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
604 Amp::run (bufs, nframes, mute_gain, dmg, false);
606 mute_declick_applied = true;
609 /* ----------------------------------------------------------------------------------------------------
611 -------------------------------------------------------------------------------------------------- */
613 solo_audible = dsg > 0;
614 mute_audible = dmg > 0 || !_mute_affects_main_outs;
616 if (n_outputs().get(_default_type) == 0) {
620 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
622 IO::silence (nframes, offset);
626 if ( // silent anyway
628 (_gain == 0 && !apply_gain_automation) ||
630 // muted by solo of another track, but not using control outs for solo
632 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
634 // muted by mute of this track
640 /* don't use Route::silence() here, because that causes
641 all outputs (sends, port inserts, etc. to be silent).
644 if (_meter_point == MeterPostFader) {
645 peak_meter().reset();
648 IO::silence (nframes, offset);
652 deliver_output(bufs, start_frame, end_frame, nframes, offset);
658 /* ----------------------------------------------------------------------------------------------------
660 -------------------------------------------------------------------------------------------------- */
662 if (meter && (_meter_point == MeterPostFader)) {
663 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
666 _meter->run(output_buffers(), nframes, offset);
672 Route::n_process_buffers ()
674 return max (n_inputs(), redirect_max_outs);
678 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
680 BufferSet& bufs = _session.get_scratch_buffers(n_process_buffers());
684 collect_input (bufs, nframes, offset);
686 #define meter_stream meter_first
689 _meter->run(bufs, nframes);
690 meter_stream = false;
695 process_output_buffers (bufs, start_frame, end_frame, nframes, offset, true, declick, meter_stream);
701 Route::passthru_silence (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter)
703 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, offset, true, declick, meter);
707 Route::set_solo (bool yn, void *src)
713 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
714 _mix_group->apply (&Route::set_solo, yn, _mix_group);
720 solo_changed (src); /* EMIT SIGNAL */
721 _solo_control.Changed (); /* EMIT SIGNAL */
726 Route::set_solo_mute (bool yn)
728 Glib::Mutex::Lock lm (declick_lock);
730 /* Called by Session in response to another Route being soloed.
733 desired_solo_gain = (yn?0.0:1.0);
737 Route::set_solo_safe (bool yn, void *src)
739 if (_solo_safe != yn) {
741 solo_safe_changed (src); /* EMIT SIGNAL */
746 Route::set_mute (bool yn, void *src)
749 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
750 _mix_group->apply (&Route::set_mute, yn, _mix_group);
756 mute_changed (src); /* EMIT SIGNAL */
758 _mute_control.Changed (); /* EMIT SIGNAL */
760 Glib::Mutex::Lock lm (declick_lock);
761 desired_mute_gain = (yn?0.0f:1.0f);
766 Route::add_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
768 ChanCount old_rmo = redirect_max_outs;
770 if (!_session.engine().connected()) {
775 Glib::RWLock::WriterLock lm (redirect_lock);
777 boost::shared_ptr<PluginInsert> pi;
778 boost::shared_ptr<PortInsert> porti;
780 redirect->set_default_type(_default_type);
782 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(redirect)) != 0) {
785 if (pi->input_streams() == ChanCount::ZERO) {
786 /* generator plugin */
787 _have_internal_generator = true;
790 } else if ((porti = boost::dynamic_pointer_cast<PortInsert>(redirect)) != 0) {
792 /* force new port inserts to start out with an i/o configuration
793 that matches this route's i/o configuration.
795 the "inputs" for the port are supposed to match the output
798 the "outputs" of the route should match the inputs of this
799 route. XXX shouldn't they match the number of active signal
800 streams at the point of insertion?
802 // FIXME: (yes, they should)
804 porti->ensure_io (n_outputs (), n_inputs(), false, this);
807 // Ensure peak vector sizes before the plugin is activated
808 ChanCount potential_max_streams = max(redirect->input_streams(), redirect->output_streams());
809 _meter->setup(potential_max_streams);
811 _redirects.push_back (redirect);
813 if (_reset_plugin_counts (err_streams)) {
814 _redirects.pop_back ();
815 _reset_plugin_counts (0); // it worked before we tried to add it ...
819 redirect->activate ();
820 redirect->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
823 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
828 redirects_changed (src); /* EMIT SIGNAL */
833 Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_streams)
835 ChanCount old_rmo = redirect_max_outs;
837 if (!_session.engine().connected()) {
842 Glib::RWLock::WriterLock lm (redirect_lock);
844 RedirectList::iterator existing_end = _redirects.end();
847 ChanCount potential_max_streams;
849 for (RedirectList::const_iterator i = others.begin(); i != others.end(); ++i) {
851 boost::shared_ptr<PluginInsert> pi;
853 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
856 ChanCount m = max(pi->input_streams(), pi->output_streams());
857 if (m > potential_max_streams)
858 potential_max_streams = m;
861 // Ensure peak vector sizes before the plugin is activated
862 _meter->setup(potential_max_streams);
864 _redirects.push_back (*i);
866 if (_reset_plugin_counts (err_streams)) {
868 _redirects.erase (existing_end, _redirects.end());
869 _reset_plugin_counts (0); // it worked before we tried to add it ...
874 (*i)->active_changed.connect (mem_fun (*this, &Route::redirect_active_proxy));
878 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
882 redirects_changed (src); /* EMIT SIGNAL */
886 /** Turn off all redirects with a given placement
887 * @param p Placement of redirects to disable
891 Route::disable_redirects (Placement p)
893 Glib::RWLock::ReaderLock lm (redirect_lock);
895 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
896 if ((*i)->placement() == p) {
897 (*i)->set_active (false, this);
902 /** Turn off all redirects
906 Route::disable_redirects ()
908 Glib::RWLock::ReaderLock lm (redirect_lock);
910 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
911 (*i)->set_active (false, this);
915 /** Turn off all redirects with a given placement
916 * @param p Placement of redirects to disable
920 Route::disable_plugins (Placement p)
922 Glib::RWLock::ReaderLock lm (redirect_lock);
924 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
925 if (boost::dynamic_pointer_cast<PluginInsert> (*i) && (*i)->placement() == p) {
926 (*i)->set_active (false, this);
931 /** Turn off all plugins
935 Route::disable_plugins ()
937 Glib::RWLock::ReaderLock lm (redirect_lock);
939 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
940 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
941 (*i)->set_active (false, this);
948 Route::ab_plugins (bool forward)
950 Glib::RWLock::ReaderLock lm (redirect_lock);
954 /* forward = turn off all active redirects, and mark them so that the next time
955 we go the other way, we will revert them
958 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
959 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
963 if ((*i)->active()) {
964 (*i)->set_active (false, this);
965 (*i)->set_next_ab_is_active (true);
967 (*i)->set_next_ab_is_active (false);
973 /* backward = if the redirect was marked to go active on the next ab, do so */
975 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
977 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
981 if ((*i)->get_next_ab_is_active()) {
982 (*i)->set_active (true, this);
984 (*i)->set_active (false, this);
990 /** Remove redirects with a given placement.
991 * @param p Placement of redirects to remove.
994 Route::clear_redirects (Placement p, void *src)
996 const ChanCount old_rmo = redirect_max_outs;
998 if (!_session.engine().connected()) {
1003 Glib::RWLock::WriterLock lm (redirect_lock);
1004 RedirectList new_list;
1006 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1007 if ((*i)->placement() == p) {
1008 /* it's the placement we want to get rid of */
1009 (*i)->drop_references ();
1011 /* it's a different placement, so keep it */
1012 new_list.push_back (*i);
1016 _redirects = new_list;
1019 /* FIXME: can't see how this test can ever fire */
1020 if (redirect_max_outs != old_rmo) {
1024 redirect_max_outs.reset();
1025 _have_internal_generator = false;
1026 redirects_changed (src); /* EMIT SIGNAL */
1030 Route::remove_redirect (boost::shared_ptr<Redirect> redirect, void *src, uint32_t* err_streams)
1032 ChanCount old_rmo = redirect_max_outs;
1034 if (!_session.engine().connected()) {
1038 redirect_max_outs.reset();
1041 Glib::RWLock::WriterLock lm (redirect_lock);
1042 RedirectList::iterator i;
1043 bool removed = false;
1045 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1046 if (*i == redirect) {
1048 RedirectList::iterator tmp;
1050 /* move along, see failure case for reset_plugin_counts()
1051 where we may need to reinsert the redirect.
1057 /* stop redirects that send signals to JACK ports
1058 from causing noise as a result of no longer being
1062 boost::shared_ptr<Send> send;
1063 boost::shared_ptr<PortInsert> port_insert;
1065 if ((send = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
1066 send->disconnect_inputs (this);
1067 send->disconnect_outputs (this);
1068 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (*i)) != 0) {
1069 port_insert->disconnect_inputs (this);
1070 port_insert->disconnect_outputs (this);
1073 _redirects.erase (i);
1086 if (_reset_plugin_counts (err_streams)) {
1087 /* get back to where we where */
1088 _redirects.insert (i, redirect);
1089 /* we know this will work, because it worked before :) */
1090 _reset_plugin_counts (0);
1096 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1097 boost::shared_ptr<PluginInsert> pi;
1099 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1100 if (pi->is_generator()) {
1106 _have_internal_generator = foo;
1109 if (old_rmo != redirect_max_outs) {
1113 redirect->drop_references ();
1115 redirects_changed (src); /* EMIT SIGNAL */
1120 Route::reset_plugin_counts (uint32_t* lpc)
1122 Glib::RWLock::WriterLock lm (redirect_lock);
1123 return _reset_plugin_counts (lpc);
1128 Route::_reset_plugin_counts (uint32_t* err_streams)
1130 RedirectList::iterator r;
1133 map<Placement,list<InsertCount> > insert_map;
1134 nframes_t initial_streams;
1136 redirect_max_outs.reset();
1140 /* divide inserts up by placement so we get the signal flow
1141 properly modelled. we need to do this because the _redirects
1142 list is not sorted by placement, and because other reasons may
1143 exist now or in the future for this separate treatment.
1146 for (r = _redirects.begin(); r != _redirects.end(); ++r) {
1148 boost::shared_ptr<Insert> insert;
1150 /* do this here in case we bomb out before we get to the end of
1154 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1156 if ((insert = boost::dynamic_pointer_cast<Insert>(*r)) != 0) {
1158 insert_map[insert->placement()].push_back (InsertCount (insert));
1160 /* reset plugin counts back to one for now so
1161 that we have a predictable, controlled
1162 state to try to configure.
1165 boost::shared_ptr<PluginInsert> pi;
1167 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(insert)) != 0) {
1171 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1184 /* Now process each placement in order, checking to see if we
1185 can really do what has been requested.
1190 if (check_some_plugin_counts (insert_map[PreFader], n_inputs ().get(_default_type), err_streams)) {
1194 /* figure out the streams that will feed into PreFader */
1196 if (!insert_map[PreFader].empty()) {
1197 InsertCount& ic (insert_map[PreFader].back());
1198 initial_streams = ic.insert->compute_output_streams (ic.cnt);
1200 initial_streams = n_inputs ().get(_default_type);
1205 if (check_some_plugin_counts (insert_map[PostFader], initial_streams, err_streams)) {
1209 /* OK, everything can be set up correctly, so lets do it */
1211 apply_some_plugin_counts (insert_map[PreFader]);
1212 apply_some_plugin_counts (insert_map[PostFader]);
1214 /* recompute max outs of any redirect */
1218 redirect_max_outs.reset();
1219 RedirectList::iterator prev = _redirects.end();
1221 for (r = _redirects.begin(); r != _redirects.end(); prev = r, ++r) {
1222 boost::shared_ptr<Send> s;
1224 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1225 if (r == _redirects.begin()) {
1226 s->expect_inputs (n_inputs());
1228 s->expect_inputs ((*prev)->output_streams());
1233 /* don't pay any attention to send output configuration, since it doesn't
1237 redirect_max_outs = max ((*r)->output_streams (), redirect_max_outs);
1248 Route::apply_some_plugin_counts (list<InsertCount>& iclist)
1250 list<InsertCount>::iterator i;
1252 for (i = iclist.begin(); i != iclist.end(); ++i) {
1254 if ((*i).insert->configure_io ((*i).cnt, (*i).in, (*i).out)) {
1257 /* make sure that however many we have, they are all active */
1258 (*i).insert->activate ();
1265 Route::check_some_plugin_counts (list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams)
1267 list<InsertCount>::iterator i;
1269 for (i = iclist.begin(); i != iclist.end(); ++i) {
1271 if (((*i).cnt = (*i).insert->can_support_input_configuration (required_inputs)) < 0) {
1273 *err_streams = required_inputs;
1278 (*i).in = required_inputs;
1279 (*i).out = (*i).insert->compute_output_streams ((*i).cnt);
1281 required_inputs = (*i).out;
1288 Route::copy_redirects (const Route& other, Placement placement, uint32_t* err_streams)
1290 ChanCount old_rmo = redirect_max_outs;
1296 RedirectList to_be_deleted;
1299 Glib::RWLock::WriterLock lm (redirect_lock);
1300 RedirectList::iterator tmp;
1301 RedirectList the_copy;
1303 the_copy = _redirects;
1305 /* remove all relevant redirects */
1307 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1311 if ((*i)->placement() == placement) {
1312 to_be_deleted.push_back (*i);
1313 _redirects.erase (i);
1319 /* now copy the relevant ones from "other" */
1321 for (RedirectList::const_iterator i = other._redirects.begin(); i != other._redirects.end(); ++i) {
1322 if ((*i)->placement() == placement) {
1323 _redirects.push_back (Redirect::clone (*i));
1327 /* reset plugin stream handling */
1329 if (_reset_plugin_counts (err_streams)) {
1331 /* FAILED COPY ATTEMPT: we have to restore order */
1333 /* delete all cloned redirects */
1335 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ) {
1340 if ((*i)->placement() == placement) {
1341 _redirects.erase (i);
1347 /* restore the natural order */
1349 _redirects = the_copy;
1350 redirect_max_outs = old_rmo;
1352 /* we failed, even though things are OK again */
1358 /* SUCCESSFUL COPY ATTEMPT: delete the redirects we removed pre-copy */
1359 to_be_deleted.clear ();
1363 if (redirect_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
1367 redirects_changed (this); /* EMIT SIGNAL */
1372 Route::all_redirects_flip ()
1374 Glib::RWLock::ReaderLock lm (redirect_lock);
1376 if (_redirects.empty()) {
1380 bool first_is_on = _redirects.front()->active();
1382 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1383 (*i)->set_active (!first_is_on, this);
1387 /** Set all redirects with a given placement to a given active state.
1388 * @param p Placement of redirects to change.
1389 * @param state New active state for those redirects.
1392 Route::all_redirects_active (Placement p, bool state)
1394 Glib::RWLock::ReaderLock lm (redirect_lock);
1396 if (_redirects.empty()) {
1400 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1401 if ((*i)->placement() == p) {
1402 (*i)->set_active (state, this);
1407 struct RedirectSorter {
1408 bool operator() (boost::shared_ptr<const Redirect> a, boost::shared_ptr<const Redirect> b) {
1409 return a->sort_key() < b->sort_key();
1414 Route::sort_redirects (uint32_t* err_streams)
1417 RedirectSorter comparator;
1418 Glib::RWLock::WriterLock lm (redirect_lock);
1419 ChanCount old_rmo = redirect_max_outs;
1421 /* the sweet power of C++ ... */
1423 RedirectList as_it_was_before = _redirects;
1425 _redirects.sort (comparator);
1427 if (_reset_plugin_counts (err_streams)) {
1428 _redirects = as_it_was_before;
1429 redirect_max_outs = old_rmo;
1435 redirects_changed (this); /* EMIT SIGNAL */
1447 Route::get_template()
1449 return state(false);
1453 Route::state(bool full_state)
1455 XMLNode *node = new XMLNode("Route");
1456 RedirectList:: iterator i;
1460 node->add_property("flags", enum_2_string (_flags));
1463 node->add_property("default-type", _default_type.to_string());
1465 node->add_property("active", _active?"yes":"no");
1466 node->add_property("muted", _muted?"yes":"no");
1467 node->add_property("soloed", _soloed?"yes":"no");
1468 node->add_property("phase-invert", _phase_invert?"yes":"no");
1469 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1470 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1471 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1472 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1475 node->add_property("edit-group", _edit_group->name());
1478 node->add_property("mix-group", _mix_group->name());
1481 string order_string;
1482 OrderKeys::iterator x = order_keys.begin();
1484 while (x != order_keys.end()) {
1485 order_string += string ((*x).first);
1486 order_string += '=';
1487 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1488 order_string += buf;
1492 if (x == order_keys.end()) {
1496 order_string += ':';
1498 node->add_property ("order-keys", order_string);
1500 node->add_child_nocopy (IO::state (full_state));
1501 node->add_child_nocopy (_solo_control.get_state ());
1502 node->add_child_nocopy (_mute_control.get_state ());
1504 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1505 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1506 remote_control_node->add_property (X_("id"), buf);
1507 node->add_child_nocopy (*remote_control_node);
1509 if (_control_outs) {
1510 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1511 cnode->add_child_nocopy (_control_outs->state (full_state));
1512 node->add_child_nocopy (*cnode);
1515 if (_comment.length()) {
1516 XMLNode *cmt = node->add_child ("Comment");
1517 cmt->add_content (_comment);
1520 for (i = _redirects.begin(); i != _redirects.end(); ++i) {
1521 node->add_child_nocopy((*i)->state (full_state));
1525 node->add_child_copy (*_extra_xml);
1532 Route::get_redirect_state ()
1534 XMLNode* root = new XMLNode (X_("redirects"));
1535 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1536 root->add_child_nocopy ((*i)->state (true));
1543 Route::set_redirect_state (const XMLNode& root)
1545 if (root.name() != X_("redirects")) {
1551 XMLNodeConstIterator iter;
1552 XMLNodeConstIterator niter;
1553 Glib::RWLock::ReaderLock lm (redirect_lock);
1555 nlist = root.children();
1557 for (iter = nlist.begin(); iter != nlist.end(); ++iter){
1559 /* iter now points to a Redirect state node */
1561 nnlist = (*iter)->children ();
1563 for (niter = nnlist.begin(); niter != nnlist.end(); ++niter) {
1565 /* find the IO child node, since it contains the ID we need */
1567 /* XXX OOP encapsulation violation, ugh */
1569 if ((*niter)->name() == IO::state_node_name) {
1571 XMLProperty* prop = (*niter)->property (X_("id"));
1574 warning << _("Redirect node has no ID, ignored") << endmsg;
1578 ID id = prop->value ();
1580 /* now look for a redirect with that ID */
1582 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1583 if ((*i)->id() == id) {
1584 (*i)->set_state (**iter);
1600 Route::set_deferred_state ()
1603 XMLNodeConstIterator niter;
1605 if (!deferred_state) {
1609 nlist = deferred_state->children();
1611 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1612 add_redirect_from_xml (**niter);
1615 delete deferred_state;
1620 Route::add_redirect_from_xml (const XMLNode& node)
1622 const XMLProperty *prop;
1624 if (node.name() == "Send") {
1628 boost::shared_ptr<Send> send (new Send (_session, node));
1629 add_redirect (send, this);
1632 catch (failed_constructor &err) {
1633 error << _("Send construction failed") << endmsg;
1637 } else if (node.name() == "Insert") {
1640 if ((prop = node.property ("type")) != 0) {
1642 boost::shared_ptr<Insert> insert;
1644 if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
1646 insert.reset (new PluginInsert(_session, node));
1648 } else if (prop->value() == "port") {
1651 insert.reset (new PortInsert (_session, node));
1655 error << string_compose(_("unknown Insert type \"%1\"; ignored"), prop->value()) << endmsg;
1658 add_redirect (insert, this);
1661 error << _("Insert XML node has no type property") << endmsg;
1665 catch (failed_constructor &err) {
1666 warning << _("insert could not be created. Ignored.") << endmsg;
1673 Route::set_state (const XMLNode& node)
1675 return _set_state (node, true);
1679 Route::_set_state (const XMLNode& node, bool call_base)
1682 XMLNodeConstIterator niter;
1684 XMLPropertyList plist;
1685 const XMLProperty *prop;
1687 if (node.name() != "Route"){
1688 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1692 if ((prop = node.property (X_("flags"))) != 0) {
1693 _flags = Flag (string_2_enum (prop->value(), _flags));
1698 if ((prop = node.property (X_("default-type"))) != 0) {
1699 _default_type = DataType(prop->value());
1700 assert(_default_type != DataType::NIL);
1703 if ((prop = node.property (X_("phase-invert"))) != 0) {
1704 set_phase_invert(prop->value()=="yes"?true:false, this);
1707 if ((prop = node.property (X_("active"))) != 0) {
1708 set_active (prop->value() == "yes");
1711 if ((prop = node.property (X_("muted"))) != 0) {
1712 bool yn = prop->value()=="yes"?true:false;
1714 /* force reset of mute status */
1718 mute_gain = desired_mute_gain;
1721 if ((prop = node.property (X_("soloed"))) != 0) {
1722 bool yn = prop->value()=="yes"?true:false;
1724 /* force reset of solo status */
1727 set_solo (yn, this);
1728 solo_gain = desired_solo_gain;
1731 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1732 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1735 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1736 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1739 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1740 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1743 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1744 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1747 if ((prop = node.property (X_("edit-group"))) != 0) {
1748 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1749 if(edit_group == 0) {
1750 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1752 set_edit_group(edit_group, this);
1756 if ((prop = node.property (X_("order-keys"))) != 0) {
1760 string::size_type colon, equal;
1761 string remaining = prop->value();
1763 while (remaining.length()) {
1765 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1766 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1769 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1770 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1773 set_order_key (remaining.substr (0, equal).c_str(), n);
1777 colon = remaining.find_first_of (':');
1779 if (colon != string::npos) {
1780 remaining = remaining.substr (colon+1);
1787 nlist = node.children();
1789 if (deferred_state) {
1790 delete deferred_state;
1793 deferred_state = new XMLNode(X_("deferred state"));
1795 /* set parent class properties before anything else */
1797 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1801 if (child->name() == IO::state_node_name && call_base) {
1803 IO::set_state (*child);
1808 XMLNodeList redirect_nodes;
1810 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1814 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
1815 redirect_nodes.push_back(child);
1820 _set_redirect_states(redirect_nodes);
1823 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1825 // All redirects (sends and inserts) have been applied already
1827 if (child->name() == X_("Automation")) {
1829 if ((prop = child->property (X_("path"))) != 0) {
1830 load_automation (prop->value());
1833 } else if (child->name() == X_("ControlOuts")) {
1835 string coutname = _name;
1836 coutname += _("[control]");
1838 _control_outs = new IO (_session, coutname);
1839 _control_outs->set_state (**(child->children().begin()));
1841 } else if (child->name() == X_("Comment")) {
1843 /* XXX this is a terrible API design in libxml++ */
1845 XMLNode *cmt = *(child->children().begin());
1846 _comment = cmt->content();
1848 } else if (child->name() == X_("extra")) {
1850 _extra_xml = new XMLNode (*child);
1852 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1854 if (prop->value() == "solo") {
1855 _solo_control.set_state (*child);
1856 _session.add_controllable (&_solo_control);
1858 else if (prop->value() == "mute") {
1859 _mute_control.set_state (*child);
1860 _session.add_controllable (&_mute_control);
1863 else if (child->name() == X_("remote_control")) {
1864 if ((prop = child->property (X_("id"))) != 0) {
1866 sscanf (prop->value().c_str(), "%d", &x);
1867 set_remote_control_id (x);
1872 if ((prop = node.property (X_("mix-group"))) != 0) {
1873 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1874 if (mix_group == 0) {
1875 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1877 set_mix_group(mix_group, this);
1885 Route::_set_redirect_states(const XMLNodeList &nlist)
1887 XMLNodeConstIterator niter;
1890 RedirectList::iterator i, o;
1892 // Iterate through existing redirects, remove those which are not in the state list
1893 for (i = _redirects.begin(); i != _redirects.end(); ) {
1894 RedirectList::iterator tmp = i;
1897 bool redirectInStateList = false;
1899 (*i)->id().print (buf, sizeof (buf));
1902 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1904 if (strncmp(buf,(*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1905 redirectInStateList = true;
1910 if (!redirectInStateList) {
1911 remove_redirect ( *i, this);
1919 // Iterate through state list and make sure all redirects are on the track and in the correct order,
1920 // set the state of existing redirects according to the new state on the same go
1921 i = _redirects.begin();
1922 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1924 // Check whether the next redirect in the list
1927 while (o != _redirects.end()) {
1928 (*o)->id().print (buf, sizeof (buf));
1929 if ( strncmp(buf, (*niter)->child(X_("Redirect"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1934 if (o == _redirects.end()) {
1935 // If the redirect (*niter) is not on the route, we need to create it
1936 // and move it to the correct location
1938 RedirectList::iterator prev_last = _redirects.end();
1939 --prev_last; // We need this to check whether adding succeeded
1941 add_redirect_from_xml (**niter);
1943 RedirectList::iterator last = _redirects.end();
1946 if (prev_last == last) {
1947 cerr << "Could not fully restore state as some redirects were not possible to create" << endl;
1952 boost::shared_ptr<Redirect> tmp = (*last);
1953 // remove the redirect from the wrong location
1954 _redirects.erase(last);
1955 // insert the new redirect at the current location
1956 _redirects.insert(i, tmp);
1958 --i; // move pointer to the newly inserted redirect
1962 // We found the redirect (*niter) on the route, first we must make sure the redirect
1963 // is at the location provided in the XML state
1965 boost::shared_ptr<Redirect> tmp = (*o);
1966 // remove the old copy
1967 _redirects.erase(o);
1968 // insert the redirect at the correct location
1969 _redirects.insert(i, tmp);
1971 --i; // move pointer so it points to the right redirect
1974 (*i)->set_state( (**niter) );
1977 redirects_changed(this);
1981 Route::curve_reallocate ()
1983 // _gain_automation_curve.finish_resize ();
1984 // _pan_automation_curve.finish_resize ();
1988 Route::silence (nframes_t nframes, nframes_t offset)
1992 IO::silence (nframes, offset);
1994 if (_control_outs) {
1995 _control_outs->silence (nframes, offset);
1999 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2002 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2003 boost::shared_ptr<PluginInsert> pi;
2004 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2005 // skip plugins, they don't need anything when we're not active
2009 (*i)->silence (nframes, offset);
2012 if (nframes == _session.get_block_size() && offset == 0) {
2022 Route::set_control_outs (const vector<string>& ports)
2024 Glib::Mutex::Lock lm (control_outs_lock);
2025 vector<string>::const_iterator i;
2028 if (_control_outs) {
2029 delete _control_outs;
2033 if (control() || master()) {
2034 /* no control outs for these two special busses */
2038 if (ports.empty()) {
2042 string coutname = _name;
2043 coutname += _("[control]");
2045 _control_outs = new IO (_session, coutname);
2047 /* our control outs need as many outputs as we
2048 have audio outputs. we track the changes in ::output_change_handler().
2051 // XXX its stupid that we have to get this value twice
2053 limit = n_outputs().n_audio();
2055 if (_control_outs->ensure_io (ChanCount::ZERO, ChanCount (DataType::AUDIO, n_outputs().get (DataType::AUDIO)), true, this)) {
2059 /* now connect to the named ports */
2061 for (size_t n = 0; n < limit; ++n) {
2062 if (_control_outs->connect_output (_control_outs->output (n), ports[n], this)) {
2063 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2072 Route::set_edit_group (RouteGroup *eg, void *src)
2075 if (eg == _edit_group) {
2080 _edit_group->remove (this);
2083 if ((_edit_group = eg) != 0) {
2084 _edit_group->add (this);
2087 _session.set_dirty ();
2088 edit_group_changed (src); /* EMIT SIGNAL */
2092 Route::drop_edit_group (void *src)
2095 _session.set_dirty ();
2096 edit_group_changed (src); /* EMIT SIGNAL */
2100 Route::set_mix_group (RouteGroup *mg, void *src)
2103 if (mg == _mix_group) {
2108 _mix_group->remove (this);
2111 if ((_mix_group = mg) != 0) {
2112 _mix_group->add (this);
2115 _session.set_dirty ();
2116 mix_group_changed (src); /* EMIT SIGNAL */
2120 Route::drop_mix_group (void *src)
2123 _session.set_dirty ();
2124 mix_group_changed (src); /* EMIT SIGNAL */
2128 Route::set_comment (string cmt, void *src)
2131 comment_changed (src);
2132 _session.set_dirty ();
2136 Route::feeds (boost::shared_ptr<Route> other)
2141 uint32_t no = self.n_outputs().get_total();
2142 uint32_t ni = other->n_inputs ().get_total();
2144 for (i = 0; i < no; ++i) {
2145 for (j = 0; j < ni; ++j) {
2146 if (self.output(i)->connected_to (other->input(j)->name())) {
2152 /* check Redirects which may also interconnect Routes */
2154 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2156 no = (*r)->n_outputs().get_total();
2158 for (i = 0; i < no; ++i) {
2159 for (j = 0; j < ni; ++j) {
2160 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2167 /* check for control room outputs which may also interconnect Routes */
2169 if (_control_outs) {
2171 no = _control_outs->n_outputs().get_total();
2173 for (i = 0; i < no; ++i) {
2174 for (j = 0; j < ni; ++j) {
2175 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2186 Route::set_mute_config (mute_type t, bool onoff, void *src)
2190 _mute_affects_pre_fader = onoff;
2191 pre_fader_changed(src); /* EMIT SIGNAL */
2195 _mute_affects_post_fader = onoff;
2196 post_fader_changed(src); /* EMIT SIGNAL */
2200 _mute_affects_control_outs = onoff;
2201 control_outs_changed(src); /* EMIT SIGNAL */
2205 _mute_affects_main_outs = onoff;
2206 main_outs_changed(src); /* EMIT SIGNAL */
2212 Route::get_mute_config (mute_type t)
2218 onoff = _mute_affects_pre_fader;
2221 onoff = _mute_affects_post_fader;
2224 onoff = _mute_affects_control_outs;
2227 onoff = _mute_affects_main_outs;
2235 Route::set_active (bool yn)
2238 active_changed(); /* EMIT SIGNAL */
2242 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2244 nframes_t now = _session.transport_frame();
2247 Glib::RWLock::ReaderLock lm (redirect_lock);
2250 automation_snapshot (now);
2253 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2255 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2256 (*i)->deactivate ();
2260 (*i)->transport_stopped (now);
2264 IO::transport_stopped (now);
2266 _roll_delay = _initial_delay;
2270 Route::input_change_handler (IOChange change, void *ignored)
2272 if (change & ConfigurationChanged) {
2273 reset_plugin_counts (0);
2278 Route::output_change_handler (IOChange change, void *ignored)
2280 if (change & ConfigurationChanged) {
2281 if (_control_outs) {
2282 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().n_audio()), true, this);
2285 reset_plugin_counts (0);
2290 Route::pans_required () const
2292 if (n_outputs().n_audio() < 2) {
2296 return max (n_inputs ().n_audio(), static_cast<size_t>(redirect_max_outs.n_audio()));
2300 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2301 bool session_state_changing, bool can_record, bool rec_monitors_input)
2303 if (n_outputs().get_total() == 0) {
2307 if (session_state_changing || !_active) {
2308 silence (nframes, offset);
2312 apply_gain_automation = false;
2314 if (n_inputs().get_total()) {
2315 passthru (start_frame, end_frame, nframes, offset, 0, false);
2317 silence (nframes, offset);
2324 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2326 if (_roll_delay > nframes) {
2328 _roll_delay -= nframes;
2329 silence (nframes, offset);
2330 /* transport frame is not legal for caller to use */
2333 } else if (_roll_delay > 0) {
2335 nframes -= _roll_delay;
2337 silence (_roll_delay, offset);
2339 offset += _roll_delay;
2340 transport_frame += _roll_delay;
2349 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2350 bool can_record, bool rec_monitors_input)
2353 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2355 // automation snapshot can also be called from the non-rt context
2356 // and it uses the redirect list, so we take the lock out here
2357 automation_snapshot (_session.transport_frame());
2361 if ((n_outputs().get_total() == 0 && _redirects.empty()) || n_inputs().get_total() == 0 || !_active) {
2362 silence (nframes, offset);
2366 nframes_t unused = 0;
2368 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2374 apply_gain_automation = false;
2377 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2379 if (am.locked() && _session.transport_rolling()) {
2381 if (gain_automation_playback()) {
2382 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2387 passthru (start_frame, end_frame, nframes, offset, declick, false);
2393 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2394 bool can_record, bool rec_monitors_input)
2396 silence (nframes, offset);
2401 Route::toggle_monitor_input ()
2403 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2404 i->ensure_monitor_input( ! i->monitoring_input());
2409 Route::has_external_redirects () const
2411 boost::shared_ptr<const PortInsert> pi;
2413 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2414 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2416 for (PortSet::const_iterator port = pi->outputs().begin();
2417 port != pi->outputs().end(); ++port) {
2419 string port_name = port->name();
2420 string client_name = port_name.substr (0, port_name.find(':'));
2422 /* only say "yes" if the redirect is actually in use */
2424 if (client_name != "ardour" && pi->active()) {
2435 Route::flush_redirects ()
2437 /* XXX shouldn't really try to take this lock, since
2438 this is called from the RT audio thread.
2441 Glib::RWLock::ReaderLock lm (redirect_lock);
2443 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2444 (*i)->deactivate ();
2450 Route::set_meter_point (MeterPoint p, void *src)
2452 if (_meter_point != p) {
2454 meter_change (src); /* EMIT SIGNAL */
2455 _session.set_dirty ();
2460 Route::update_total_latency ()
2464 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2465 if ((*i)->active ()) {
2466 _own_latency += (*i)->latency ();
2470 set_port_latency (_own_latency);
2472 /* this (virtual) function is used for pure Routes,
2473 not derived classes like AudioTrack. this means
2474 that the data processed here comes from an input
2475 port, not prerecorded material, and therefore we
2476 have to take into account any input latency.
2479 _own_latency += input_latency ();
2481 return _own_latency;
2485 Route::set_latency_delay (nframes_t longest_session_latency)
2487 _initial_delay = longest_session_latency - _own_latency;
2489 if (_session.transport_stopped()) {
2490 _roll_delay = _initial_delay;
2495 Route::automation_snapshot (nframes_t now)
2497 IO::automation_snapshot (now);
2499 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2500 (*i)->automation_snapshot (now);
2504 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2505 : Controllable (name), route (s), type(tp)
2511 Route::ToggleControllable::set_value (float val)
2513 bool bval = ((val >= 0.5f) ? true: false);
2517 route.set_mute (bval, this);
2520 route.set_solo (bval, this);
2528 Route::ToggleControllable::get_value (void) const
2534 val = route.muted() ? 1.0f : 0.0f;
2537 val = route.soloed() ? 1.0f : 0.0f;
2547 Route::set_block_size (nframes_t nframes)
2549 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2550 (*i)->set_block_size (nframes);
2555 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2557 _session.update_latency_compensation (false, false);
2561 Route::protect_automation ()
2563 switch (gain_automation_state()) {
2565 set_gain_automation_state (Off);
2567 set_gain_automation_state (Play);
2573 switch (panner().automation_state ()) {
2575 panner().set_automation_state (Off);
2578 panner().set_automation_state (Play);
2584 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2585 boost::shared_ptr<PluginInsert> pi;
2586 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2587 pi->protect_automation ();
2593 Route::set_pending_declick (int declick)
2596 /* this call is not allowed to turn off a pending declick unless "force" is true */
2598 _pending_declick = declick;
2600 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2602 _pending_declick = 0;