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 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1812 if (child->name() == X_("Send")) {
1815 if (!IO::ports_legal) {
1817 deferred_state->add_child_copy (*child);
1820 add_redirect_from_xml (*child);
1823 } else if (child->name() == X_("Insert")) {
1825 if (!IO::ports_legal) {
1827 deferred_state->add_child_copy (*child);
1831 add_redirect_from_xml (*child);
1834 } else if (child->name() == X_("Automation")) {
1836 if ((prop = child->property (X_("path"))) != 0) {
1837 load_automation (prop->value());
1840 } else if (child->name() == X_("ControlOuts")) {
1842 string coutname = _name;
1843 coutname += _("[control]");
1845 _control_outs = new IO (_session, coutname);
1846 _control_outs->set_state (**(child->children().begin()));
1848 } else if (child->name() == X_("Comment")) {
1850 /* XXX this is a terrible API design in libxml++ */
1852 XMLNode *cmt = *(child->children().begin());
1853 _comment = cmt->content();
1855 } else if (child->name() == X_("extra")) {
1857 _extra_xml = new XMLNode (*child);
1859 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1861 if (prop->value() == "solo") {
1862 _solo_control.set_state (*child);
1863 _session.add_controllable (&_solo_control);
1865 else if (prop->value() == "mute") {
1866 _mute_control.set_state (*child);
1867 _session.add_controllable (&_mute_control);
1870 else if (child->name() == X_("remote_control")) {
1871 if ((prop = child->property (X_("id"))) != 0) {
1873 sscanf (prop->value().c_str(), "%d", &x);
1874 set_remote_control_id (x);
1879 if ((prop = node.property (X_("mix-group"))) != 0) {
1880 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1881 if (mix_group == 0) {
1882 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1884 set_mix_group(mix_group, this);
1892 Route::curve_reallocate ()
1894 // _gain_automation_curve.finish_resize ();
1895 // _pan_automation_curve.finish_resize ();
1899 Route::silence (nframes_t nframes, nframes_t offset)
1903 IO::silence (nframes, offset);
1905 if (_control_outs) {
1906 _control_outs->silence (nframes, offset);
1910 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
1913 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
1914 boost::shared_ptr<PluginInsert> pi;
1915 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1916 // skip plugins, they don't need anything when we're not active
1920 (*i)->silence (nframes, offset);
1923 if (nframes == _session.get_block_size() && offset == 0) {
1933 Route::set_control_outs (const vector<string>& ports)
1935 Glib::Mutex::Lock lm (control_outs_lock);
1936 vector<string>::const_iterator i;
1939 if (_control_outs) {
1940 delete _control_outs;
1944 if (control() || master()) {
1945 /* no control outs for these two special busses */
1949 if (ports.empty()) {
1953 string coutname = _name;
1954 coutname += _("[control]");
1956 _control_outs = new IO (_session, coutname);
1958 /* our control outs need as many outputs as we
1959 have audio outputs. we track the changes in ::output_change_handler().
1962 // XXX its stupid that we have to get this value twice
1964 limit = n_outputs().n_audio();
1966 if (_control_outs->ensure_io (ChanCount::ZERO, ChanCount (DataType::AUDIO, n_outputs().get (DataType::AUDIO)), true, this)) {
1970 /* now connect to the named ports */
1972 for (size_t n = 0; n < limit; ++n) {
1973 if (_control_outs->connect_output (_control_outs->output (n), ports[n], this)) {
1974 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
1983 Route::set_edit_group (RouteGroup *eg, void *src)
1986 if (eg == _edit_group) {
1991 _edit_group->remove (this);
1994 if ((_edit_group = eg) != 0) {
1995 _edit_group->add (this);
1998 _session.set_dirty ();
1999 edit_group_changed (src); /* EMIT SIGNAL */
2003 Route::drop_edit_group (void *src)
2006 _session.set_dirty ();
2007 edit_group_changed (src); /* EMIT SIGNAL */
2011 Route::set_mix_group (RouteGroup *mg, void *src)
2014 if (mg == _mix_group) {
2019 _mix_group->remove (this);
2022 if ((_mix_group = mg) != 0) {
2023 _mix_group->add (this);
2026 _session.set_dirty ();
2027 mix_group_changed (src); /* EMIT SIGNAL */
2031 Route::drop_mix_group (void *src)
2034 _session.set_dirty ();
2035 mix_group_changed (src); /* EMIT SIGNAL */
2039 Route::set_comment (string cmt, void *src)
2042 comment_changed (src);
2043 _session.set_dirty ();
2047 Route::feeds (boost::shared_ptr<Route> other)
2052 uint32_t no = self.n_outputs().get_total();
2053 uint32_t ni = other->n_inputs ().get_total();
2055 for (i = 0; i < no; ++i) {
2056 for (j = 0; j < ni; ++j) {
2057 if (self.output(i)->connected_to (other->input(j)->name())) {
2063 /* check Redirects which may also interconnect Routes */
2065 for (RedirectList::iterator r = _redirects.begin(); r != _redirects.end(); r++) {
2067 no = (*r)->n_outputs().get_total();
2069 for (i = 0; i < no; ++i) {
2070 for (j = 0; j < ni; ++j) {
2071 if ((*r)->output(i)->connected_to (other->input (j)->name())) {
2078 /* check for control room outputs which may also interconnect Routes */
2080 if (_control_outs) {
2082 no = _control_outs->n_outputs().get_total();
2084 for (i = 0; i < no; ++i) {
2085 for (j = 0; j < ni; ++j) {
2086 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2097 Route::set_mute_config (mute_type t, bool onoff, void *src)
2101 _mute_affects_pre_fader = onoff;
2102 pre_fader_changed(src); /* EMIT SIGNAL */
2106 _mute_affects_post_fader = onoff;
2107 post_fader_changed(src); /* EMIT SIGNAL */
2111 _mute_affects_control_outs = onoff;
2112 control_outs_changed(src); /* EMIT SIGNAL */
2116 _mute_affects_main_outs = onoff;
2117 main_outs_changed(src); /* EMIT SIGNAL */
2123 Route::get_mute_config (mute_type t)
2129 onoff = _mute_affects_pre_fader;
2132 onoff = _mute_affects_post_fader;
2135 onoff = _mute_affects_control_outs;
2138 onoff = _mute_affects_main_outs;
2146 Route::set_active (bool yn)
2149 active_changed(); /* EMIT SIGNAL */
2153 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
2155 nframes_t now = _session.transport_frame();
2158 Glib::RWLock::ReaderLock lm (redirect_lock);
2161 automation_snapshot (now);
2164 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2166 if (Config->get_plugins_stop_with_transport() && can_flush_redirects) {
2167 (*i)->deactivate ();
2171 (*i)->transport_stopped (now);
2175 IO::transport_stopped (now);
2177 _roll_delay = _initial_delay;
2181 Route::input_change_handler (IOChange change, void *ignored)
2183 if (change & ConfigurationChanged) {
2184 reset_plugin_counts (0);
2189 Route::output_change_handler (IOChange change, void *ignored)
2191 if (change & ConfigurationChanged) {
2192 if (_control_outs) {
2193 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().n_audio()), true, this);
2196 reset_plugin_counts (0);
2201 Route::pans_required () const
2203 if (n_outputs().n_audio() < 2) {
2207 return max (n_inputs ().n_audio(), static_cast<size_t>(redirect_max_outs.n_audio()));
2211 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2212 bool session_state_changing, bool can_record, bool rec_monitors_input)
2214 if (n_outputs().get_total() == 0) {
2218 if (session_state_changing || !_active) {
2219 silence (nframes, offset);
2223 apply_gain_automation = false;
2225 if (n_inputs().get_total()) {
2226 passthru (start_frame, end_frame, nframes, offset, 0, false);
2228 silence (nframes, offset);
2235 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2237 if (_roll_delay > nframes) {
2239 _roll_delay -= nframes;
2240 silence (nframes, offset);
2241 /* transport frame is not legal for caller to use */
2244 } else if (_roll_delay > 0) {
2246 nframes -= _roll_delay;
2248 silence (_roll_delay, offset);
2250 offset += _roll_delay;
2251 transport_frame += _roll_delay;
2260 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2261 bool can_record, bool rec_monitors_input)
2264 Glib::RWLock::ReaderLock lm (redirect_lock, Glib::TRY_LOCK);
2266 // automation snapshot can also be called from the non-rt context
2267 // and it uses the redirect list, so we take the lock out here
2268 automation_snapshot (_session.transport_frame());
2272 if ((n_outputs().get_total() == 0 && _redirects.empty()) || n_inputs().get_total() == 0 || !_active) {
2273 silence (nframes, offset);
2277 nframes_t unused = 0;
2279 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2285 apply_gain_automation = false;
2288 Glib::Mutex::Lock am (automation_lock, Glib::TRY_LOCK);
2290 if (am.locked() && _session.transport_rolling()) {
2292 if (gain_automation_playback()) {
2293 apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2298 passthru (start_frame, end_frame, nframes, offset, declick, false);
2304 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2305 bool can_record, bool rec_monitors_input)
2307 silence (nframes, offset);
2312 Route::toggle_monitor_input ()
2314 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2315 i->ensure_monitor_input( ! i->monitoring_input());
2320 Route::has_external_redirects () const
2322 boost::shared_ptr<const PortInsert> pi;
2324 for (RedirectList::const_iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2325 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2327 for (PortSet::const_iterator port = pi->outputs().begin();
2328 port != pi->outputs().end(); ++port) {
2330 string port_name = port->name();
2331 string client_name = port_name.substr (0, port_name.find(':'));
2333 /* only say "yes" if the redirect is actually in use */
2335 if (client_name != "ardour" && pi->active()) {
2346 Route::flush_redirects ()
2348 /* XXX shouldn't really try to take this lock, since
2349 this is called from the RT audio thread.
2352 Glib::RWLock::ReaderLock lm (redirect_lock);
2354 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2355 (*i)->deactivate ();
2361 Route::set_meter_point (MeterPoint p, void *src)
2363 if (_meter_point != p) {
2365 meter_change (src); /* EMIT SIGNAL */
2366 _session.set_dirty ();
2371 Route::update_total_latency ()
2375 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2376 if ((*i)->active ()) {
2377 _own_latency += (*i)->latency ();
2381 set_port_latency (_own_latency);
2383 /* this (virtual) function is used for pure Routes,
2384 not derived classes like AudioTrack. this means
2385 that the data processed here comes from an input
2386 port, not prerecorded material, and therefore we
2387 have to take into account any input latency.
2390 _own_latency += input_latency ();
2392 return _own_latency;
2396 Route::set_latency_delay (nframes_t longest_session_latency)
2398 _initial_delay = longest_session_latency - _own_latency;
2400 if (_session.transport_stopped()) {
2401 _roll_delay = _initial_delay;
2406 Route::automation_snapshot (nframes_t now)
2408 IO::automation_snapshot (now);
2410 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2411 (*i)->automation_snapshot (now);
2415 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2416 : Controllable (name), route (s), type(tp)
2422 Route::ToggleControllable::set_value (float val)
2424 bool bval = ((val >= 0.5f) ? true: false);
2428 route.set_mute (bval, this);
2431 route.set_solo (bval, this);
2439 Route::ToggleControllable::get_value (void) const
2445 val = route.muted() ? 1.0f : 0.0f;
2448 val = route.soloed() ? 1.0f : 0.0f;
2458 Route::set_block_size (nframes_t nframes)
2460 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2461 (*i)->set_block_size (nframes);
2466 Route::redirect_active_proxy (Redirect* ignored, void* ignored_src)
2468 _session.update_latency_compensation (false, false);
2472 Route::protect_automation ()
2474 switch (gain_automation_state()) {
2476 set_gain_automation_state (Off);
2478 set_gain_automation_state (Play);
2484 switch (panner().automation_state ()) {
2486 panner().set_automation_state (Off);
2489 panner().set_automation_state (Play);
2495 for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
2496 boost::shared_ptr<PluginInsert> pi;
2497 if ((pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2498 pi->protect_automation ();
2504 Route::set_pending_declick (int declick)
2507 /* this call is not allowed to turn off a pending declick unless "force" is true */
2509 _pending_declick = declick;
2511 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2513 _pending_declick = 0;