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>
27 #include <pbd/stacktrace.h>
29 #include <ardour/timestamps.h>
30 #include <ardour/audioengine.h>
31 #include <ardour/route.h>
32 #include <ardour/buffer.h>
33 #include <ardour/processor.h>
34 #include <ardour/plugin_insert.h>
35 #include <ardour/port_insert.h>
36 #include <ardour/send.h>
37 #include <ardour/session.h>
38 #include <ardour/utils.h>
39 #include <ardour/configuration.h>
40 #include <ardour/cycle_timer.h>
41 #include <ardour/route_group.h>
42 #include <ardour/port.h>
43 #include <ardour/audio_port.h>
44 #include <ardour/ladspa_plugin.h>
45 #include <ardour/panner.h>
46 #include <ardour/dB.h>
47 #include <ardour/amp.h>
48 #include <ardour/meter.h>
49 #include <ardour/buffer_set.h>
50 #include <ardour/mix.h>
51 #include <ardour/profile.h>
56 using namespace ARDOUR;
59 uint32_t Route::order_key_cnt = 0;
60 sigc::signal<void,const char*> Route::SyncOrderKeys;
62 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
63 : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
65 _solo_control (new ToggleControllable (X_("solo"), *this, ToggleControllable::SoloControl)),
66 _mute_control (new ToggleControllable (X_("mute"), *this, ToggleControllable::MuteControl))
71 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
72 : IO (sess, *node.child ("IO"), default_type),
73 _solo_control (new ToggleControllable (X_("solo"), *this, ToggleControllable::SoloControl)),
74 _mute_control (new ToggleControllable (X_("mute"), *this, ToggleControllable::MuteControl))
77 _set_state (node, false);
83 processor_max_outs.reset();
89 _phase_invert = false;
90 _denormal_protection = false;
91 order_keys[strdup (N_("signal"))] = order_key_cnt++;
93 _meter_point = MeterPostFader;
98 _have_internal_generator = false;
100 _pending_declick = true;
101 _remote_control_id = 0;
106 _mute_affects_pre_fader = Config->get_mute_affects_pre_fader();
107 _mute_affects_post_fader = Config->get_mute_affects_post_fader();
108 _mute_affects_control_outs = Config->get_mute_affects_control_outs();
109 _mute_affects_main_outs = Config->get_mute_affects_main_outs();
112 desired_solo_gain = 1.0;
114 desired_mute_gain = 1.0;
118 input_changed.connect (mem_fun (this, &Route::input_change_handler));
119 output_changed.connect (mem_fun (this, &Route::output_change_handler));
124 clear_processors (PreFader);
125 clear_processors (PostFader);
127 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
128 free ((void*)(i->first));
132 delete _control_outs;
137 Route::set_remote_control_id (uint32_t id)
139 if (id != _remote_control_id) {
140 _remote_control_id = id;
141 RemoteControlIDChanged ();
146 Route::remote_control_id() const
148 return _remote_control_id;
152 Route::order_key (const char* name) const
154 OrderKeys::const_iterator i;
156 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
157 if (!strcmp (name, i->first)) {
166 Route::set_order_key (const char* name, long n)
168 order_keys[strdup(name)] = n;
170 if (Config->get_sync_all_route_ordering()) {
171 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
176 _session.set_dirty ();
180 Route::sync_order_keys (const char* base)
182 if (order_keys.empty()) {
186 OrderKeys::iterator i;
189 if ((i = order_keys.find (base)) == order_keys.end()) {
190 /* key doesn't exist, use the first existing
191 key (this is done during session initialization)
193 i = order_keys.begin();
197 /* key exists - use it and reset all others
198 (actually, itself included)
200 i = order_keys.begin();
204 for (; i != order_keys.end(); ++i) {
210 Route::ensure_track_or_route_name(string name, Session &session)
212 string newname = name;
214 while (session.route_by_name (newname)!=NULL)
216 newname = bump_name_once (newname);
224 Route::inc_gain (gain_t fraction, void *src)
226 IO::inc_gain (fraction, src);
230 Route::set_gain (gain_t val, void *src)
232 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
234 if (_mix_group->is_relative()) {
236 gain_t usable_gain = gain();
237 if (usable_gain < 0.000001f) {
238 usable_gain = 0.000001f;
242 if (delta < 0.000001f) {
246 delta -= usable_gain;
251 gain_t factor = delta / usable_gain;
254 factor = _mix_group->get_max_factor(factor);
255 if (factor == 0.0f) {
256 _gain_control->Changed(); /* EMIT SIGNAL */
260 factor = _mix_group->get_min_factor(factor);
261 if (factor == 0.0f) {
262 _gain_control->Changed(); /* EMIT SIGNAL */
267 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
271 _mix_group->apply (&Route::set_gain, val, _mix_group);
281 IO::set_gain (val, src);
284 /** Process this route for one (sub) cycle (process thread)
286 * @param bufs Scratch buffers to use for the signal path
287 * @param start_frame Initial transport frame
288 * @param end_frame Final transport frame
289 * @param nframes Number of frames to output (to ports)
290 * @param offset Output offset (of port buffers, for split cycles)
292 * Note that (end_frame - start_frame) may not be equal to nframes when the
293 * transport speed isn't 1.0 (eg varispeed).
296 Route::process_output_buffers (BufferSet& bufs,
297 nframes_t start_frame, nframes_t end_frame,
298 nframes_t nframes, nframes_t offset, bool with_processors, int declick,
301 // This is definitely very audio-only for now
302 assert(_default_type == DataType::AUDIO);
304 ProcessorList::iterator i;
305 bool post_fader_work = false;
306 bool mute_declick_applied = false;
312 gain_t* gab = _session.gain_automation_buffer();
314 switch (Config->get_monitoring_model()) {
315 case HardwareMonitoring:
316 case ExternalMonitoring:
323 declick = _pending_declick;
326 Glib::Mutex::Lock cm (_control_outs_lock, Glib::TRY_LOCK);
336 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
339 dmg = desired_mute_gain;
340 dsg = desired_solo_gain;
349 /* ----------------------------------------------------------------------------------------------------
350 GLOBAL DECLICK (for transport changes etc.)
351 -------------------------------------------------------------------------------------------------- */
354 Amp::run_in_place (bufs, nframes, 0.0, 1.0, false);
355 _pending_declick = 0;
356 } else if (declick < 0) {
357 Amp::run_in_place (bufs, nframes, 1.0, 0.0, false);
358 _pending_declick = 0;
361 /* no global declick */
363 if (solo_gain != dsg) {
364 Amp::run_in_place (bufs, nframes, solo_gain, dsg, false);
370 /* ----------------------------------------------------------------------------------------------------
371 INPUT METERING & MONITORING
372 -------------------------------------------------------------------------------------------------- */
374 if (meter && (_meter_point == MeterInput)) {
375 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
378 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
379 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
381 mute_declick_applied = true;
384 if ((_meter_point == MeterInput) && co) {
386 solo_audible = dsg > 0;
387 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
389 if ( // muted by solo of another track
393 // muted by mute of this track
397 // rec-enabled but not s/w monitoring
399 // TODO: this is probably wrong
401 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
405 co->silence (nframes, offset);
409 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
414 /* -----------------------------------------------------------------------------------------------------
416 -------------------------------------------------------------------------------------------------- */
418 if (_denormal_protection || Config->get_denormal_protection()) {
420 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
421 Sample* const sp = i->data();
423 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
429 /* ----------------------------------------------------------------------------------------------------
431 -------------------------------------------------------------------------------------------------- */
433 if (with_processors) {
434 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
436 if (mute_gain > 0 || !_mute_affects_pre_fader) {
437 for (i = _processors.begin(); i != _processors.end(); ++i) {
438 switch ((*i)->placement()) {
440 (*i)->run_in_place (bufs, start_frame, end_frame, nframes, offset);
443 post_fader_work = true;
448 for (i = _processors.begin(); i != _processors.end(); ++i) {
449 switch ((*i)->placement()) {
451 (*i)->silence (nframes, offset);
454 post_fader_work = true;
462 // This really should already be true...
463 bufs.set_count(pre_fader_streams());
465 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
466 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
468 mute_declick_applied = true;
471 /* ----------------------------------------------------------------------------------------------------
472 PRE-FADER METERING & MONITORING
473 -------------------------------------------------------------------------------------------------- */
475 if (meter && (_meter_point == MeterPreFader)) {
476 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
480 if ((_meter_point == MeterPreFader) && co) {
482 solo_audible = dsg > 0;
483 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
485 if ( // muted by solo of another track
489 // muted by mute of this track
493 // rec-enabled but not s/w monitoring
495 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
499 co->silence (nframes, offset);
503 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
507 /* ----------------------------------------------------------------------------------------------------
509 -------------------------------------------------------------------------------------------------- */
511 /* if not recording or recording and requiring any monitor signal, then apply gain */
513 if ( // not recording
515 !(record_enabled() && _session.actively_recording()) ||
519 // AND software monitoring required
521 Config->get_monitoring_model() == SoftwareMonitoring) {
523 if (apply_gain_automation) {
526 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
527 Sample* const sp = i->data();
529 for (nframes_t nx = 0; nx < nframes; ++nx) {
534 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
535 Sample* const sp = i->data();
537 for (nframes_t nx = 0; nx < nframes; ++nx) {
543 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
544 _effective_gain = gab[nframes-1];
549 /* manual (scalar) gain */
553 Amp::run_in_place (bufs, nframes, _gain, dg, _phase_invert);
556 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
558 /* no need to interpolate current gain value,
559 but its non-unity, so apply it. if the gain
560 is zero, do nothing because we'll ship silence
572 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
573 Sample* const sp = i->data();
574 apply_gain_to_buffer(sp,nframes,this_gain);
577 } else if (_gain == 0) {
578 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
586 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
590 /* ----------------------------------------------------------------------------------------------------
592 -------------------------------------------------------------------------------------------------- */
594 /* note that post_fader_work cannot be true unless with_processors was also true, so don't test both */
596 if (post_fader_work) {
598 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
600 if (mute_gain > 0 || !_mute_affects_post_fader) {
601 for (i = _processors.begin(); i != _processors.end(); ++i) {
602 switch ((*i)->placement()) {
606 (*i)->run_in_place (bufs, start_frame, end_frame, nframes, offset);
611 for (i = _processors.begin(); i != _processors.end(); ++i) {
612 switch ((*i)->placement()) {
616 (*i)->silence (nframes, offset);
624 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
625 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
627 mute_declick_applied = true;
630 /* ----------------------------------------------------------------------------------------------------
632 -------------------------------------------------------------------------------------------------- */
634 if ((_meter_point == MeterPostFader) && co) {
636 solo_audible = solo_gain > 0;
637 mute_audible = dmg > 0 || !_mute_affects_control_outs;
639 if ( // silent anyway
641 (_gain == 0 && !apply_gain_automation) ||
643 // muted by solo of another track
647 // muted by mute of this track
651 // recording but not s/w monitoring
653 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
657 co->silence (nframes, offset);
661 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
665 /* ----------------------------------------------------------------------
667 ----------------------------------------------------------------------*/
669 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
670 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
672 mute_declick_applied = true;
675 /* ----------------------------------------------------------------------------------------------------
677 -------------------------------------------------------------------------------------------------- */
679 solo_audible = dsg > 0;
680 mute_audible = dmg > 0 || !_mute_affects_main_outs;
682 if (n_outputs().get(_default_type) == 0) {
686 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
688 IO::silence (nframes, offset);
692 if ( // silent anyway
694 (_gain == 0 && !apply_gain_automation) ||
696 // muted by solo of another track, but not using control outs for solo
698 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
700 // muted by mute of this track
706 /* don't use Route::silence() here, because that causes
707 all outputs (sends, port processors, etc. to be silent).
710 if (_meter_point == MeterPostFader) {
711 peak_meter().reset();
714 IO::silence (nframes, offset);
718 deliver_output(bufs, start_frame, end_frame, nframes, offset);
724 /* ----------------------------------------------------------------------------------------------------
726 -------------------------------------------------------------------------------------------------- */
728 if (meter && (_meter_point == MeterPostFader)) {
729 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
732 _meter->run_in_place(output_buffers(), start_frame, end_frame, nframes, offset);
738 /** Process this route for one (sub) cycle (process thread)
740 * @param bufs Scratch buffers to use for the signal path
741 * @param start_frame Initial transport frame
742 * @param end_frame Final transport frame
743 * @param nframes Number of frames to output (to ports)
744 * @param offset Output offset (of port buffers, for split cycles)
746 * Note that (end_frame - start_frame) may not be equal to nframes when the
747 * transport speed isn't 1.0 (eg varispeed).
750 Route::process_output_buffers (BufferSet& bufs,
751 nframes_t start_frame, nframes_t end_frame,
752 nframes_t nframes, nframes_t offset, bool with_processors, int declick,
755 // This is definitely very audio-only for now
756 assert(_default_type == DataType::AUDIO);
758 ProcessorList::iterator i;
759 bool post_fader_work = false;
760 bool mute_declick_applied = false;
766 gain_t* gab = _session.gain_automation_buffer();
768 switch (Config->get_monitoring_model()) {
769 case HardwareMonitoring:
770 case ExternalMonitoring:
777 declick = _pending_declick;
780 Glib::Mutex::Lock cm (_control_outs_lock, Glib::TRY_LOCK);
790 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
793 dmg = desired_mute_gain;
794 dsg = desired_solo_gain;
803 /* ----------------------------------------------------------------------------------------------------
804 GLOBAL DECLICK (for transport changes etc.)
805 input metering & monitoring (control outs)
808 pre-fader metering & monitoring (control outs)
813 post-fader metering & monitoring (control outs)
817 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
818 for (i = processors.begin(); i != processors.end(); ++i) {
819 (*i)->run_in_place (bufs, start_frame, end_frame, nframes, offset);
823 /* ----------------------------------------------------------------------------------------------------
824 INPUT METERING & MONITORING
825 -------------------------------------------------------------------------------------------------- */
827 if (meter && (_meter_point == MeterInput)) {
828 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
831 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
832 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
834 mute_declick_applied = true;
837 /* ----------------------------------------------------------------------------------------------------
839 -------------------------------------------------------------------------------------------------- */
841 // This really should already be true...
842 bufs.set_count(pre_fader_streams());
845 if ((_meter_point == MeterPreFader) && co) {
847 solo_audible = dsg > 0;
848 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
850 if ( // muted by solo of another track
854 // muted by mute of this track
858 // rec-enabled but not s/w monitoring
860 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
864 co->silence (nframes, offset);
868 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
872 /* ----------------------------------------------------------------------------------------------------
874 -------------------------------------------------------------------------------------------------- */
876 /* if not recording or recording and requiring any monitor signal, then apply gain */
878 if ( // not recording
880 !(record_enabled() && _session.actively_recording()) ||
884 // AND software monitoring required
886 Config->get_monitoring_model() == SoftwareMonitoring) {
888 if (apply_gain_automation) {
891 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
892 Sample* const sp = i->data();
894 for (nframes_t nx = 0; nx < nframes; ++nx) {
899 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
900 Sample* const sp = i->data();
902 for (nframes_t nx = 0; nx < nframes; ++nx) {
908 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
909 _effective_gain = gab[nframes-1];
914 /* manual (scalar) gain */
918 Amp::run_in_place (bufs, nframes, _gain, dg, _phase_invert);
921 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
923 /* no need to interpolate current gain value,
924 but its non-unity, so apply it. if the gain
925 is zero, do nothing because we'll ship silence
937 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
938 Sample* const sp = i->data();
939 apply_gain_to_buffer(sp,nframes,this_gain);
942 } else if (_gain == 0) {
943 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
951 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
956 /* ----------------------------------------------------------------------------------------------------
958 -------------------------------------------------------------------------------------------------- */
960 if ((_meter_point == MeterPostFader) && co) {
962 solo_audible = solo_gain > 0;
963 mute_audible = dmg > 0 || !_mute_affects_control_outs;
965 if ( // silent anyway
967 (_gain == 0 && !apply_gain_automation) ||
969 // muted by solo of another track
973 // muted by mute of this track
977 // recording but not s/w monitoring
979 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
983 co->silence (nframes, offset);
987 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
991 /* ----------------------------------------------------------------------------------------------------
993 -------------------------------------------------------------------------------------------------- */
995 solo_audible = dsg > 0;
996 mute_audible = dmg > 0 || !_mute_affects_main_outs;
998 if (n_outputs().get(_default_type) == 0) {
1002 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
1004 IO::silence (nframes, offset);
1008 if ( // silent anyway
1010 (_gain == 0 && !apply_gain_automation) ||
1012 // muted by solo of another track, but not using control outs for solo
1014 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
1016 // muted by mute of this track
1022 /* don't use Route::silence() here, because that causes
1023 all outputs (sends, port processors, etc. to be silent).
1026 if (_meter_point == MeterPostFader) {
1027 peak_meter().reset();
1030 IO::silence (nframes, offset);
1034 deliver_output(bufs, start_frame, end_frame, nframes, offset);
1041 #endif /* NEW_POB */
1044 Route::n_process_buffers ()
1046 return max (n_inputs(), processor_max_outs);
1050 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
1052 BufferSet& bufs = _session.get_scratch_buffers(n_process_buffers());
1056 collect_input (bufs, nframes, offset);
1059 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
1060 meter_first = false;
1065 process_output_buffers (bufs, start_frame, end_frame, nframes, offset, true, declick, meter_first);
1069 Route::passthru_silence (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter)
1071 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, offset, true, declick, meter);
1075 Route::set_solo (bool yn, void *src)
1081 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
1082 _mix_group->apply (&Route::set_solo, yn, _mix_group);
1086 if (_soloed != yn) {
1088 solo_changed (src); /* EMIT SIGNAL */
1089 _solo_control->Changed (); /* EMIT SIGNAL */
1094 Route::set_solo_mute (bool yn)
1096 Glib::Mutex::Lock lm (declick_lock);
1098 /* Called by Session in response to another Route being soloed.
1101 desired_solo_gain = (yn?0.0:1.0);
1105 Route::set_solo_safe (bool yn, void *src)
1107 if (_solo_safe != yn) {
1109 solo_safe_changed (src); /* EMIT SIGNAL */
1114 Route::set_mute (bool yn, void *src)
1117 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
1118 _mix_group->apply (&Route::set_mute, yn, _mix_group);
1124 mute_changed (src); /* EMIT SIGNAL */
1126 _mute_control->Changed (); /* EMIT SIGNAL */
1128 Glib::Mutex::Lock lm (declick_lock);
1129 desired_mute_gain = (yn?0.0f:1.0f);
1134 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1136 ChanCount old_pmo = processor_max_outs;
1138 if (!_session.engine().connected()) {
1143 Glib::RWLock::WriterLock lm (_processor_lock);
1145 boost::shared_ptr<PluginInsert> pi;
1146 boost::shared_ptr<PortInsert> porti;
1148 //processor->set_default_type(_default_type);
1150 _processors.push_back (processor);
1152 // Set up processor list channels. This will set processor->[input|output]_streams(),
1153 // configure redirect ports properly, etc.
1154 if (_reset_processor_counts (err)) {
1155 _processors.pop_back ();
1156 _reset_processor_counts (0); // it worked before we tried to add it ...
1160 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1162 if (pi->natural_input_streams() == ChanCount::ZERO) {
1163 /* generator plugin */
1164 _have_internal_generator = true;
1169 // Ensure peak vector sizes before the plugin is activated
1171 ChanCount potential_max_streams;
1173 potential_max_streams.set (DataType::AUDIO, max (processor->input_streams().n_audio(),
1174 processor->output_streams().n_audio()));
1175 potential_max_streams.set (DataType::MIDI, max (processor->input_streams().n_midi(),
1176 processor->output_streams().n_midi()));
1178 _meter->configure_io (potential_max_streams, potential_max_streams);
1180 // XXX: do we want to emit the signal here ? change call order.
1181 processor->activate ();
1182 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
1187 if (processor_max_outs != old_pmo || old_pmo == ChanCount::ZERO) {
1191 processors_changed (); /* EMIT SIGNAL */
1197 Route::add_processors (const ProcessorList& others, ProcessorStreams* err)
1199 ChanCount old_pmo = processor_max_outs;
1201 if (!_session.engine().connected()) {
1206 Glib::RWLock::WriterLock lm (_processor_lock);
1208 ProcessorList::iterator existing_end = _processors.end();
1211 ChanCount potential_max_streams;
1213 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1215 boost::shared_ptr<PluginInsert> pi;
1217 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1220 ChanCount m = max(pi->input_streams(), pi->output_streams());
1221 if (m > potential_max_streams)
1222 potential_max_streams = m;
1225 // Ensure peak vector sizes before the plugin is activated
1226 _meter->configure_io (potential_max_streams, potential_max_streams);
1228 _processors.push_back (*i);
1230 if (_reset_processor_counts (err)) {
1232 _processors.erase (existing_end, _processors.end());
1233 _reset_processor_counts (0); // it worked before we tried to add it ...
1238 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
1244 if (processor_max_outs != old_pmo || old_pmo == ChanCount::ZERO) {
1248 processors_changed (); /* EMIT SIGNAL */
1252 /** Turn off all processors with a given placement
1253 * @param p Placement of processors to disable
1257 Route::disable_processors (Placement p)
1259 Glib::RWLock::ReaderLock lm (_processor_lock);
1261 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1262 if ((*i)->placement() == p) {
1263 (*i)->set_active (false);
1267 _session.set_dirty ();
1270 /** Turn off all redirects
1274 Route::disable_processors ()
1276 Glib::RWLock::ReaderLock lm (_processor_lock);
1278 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1279 (*i)->set_active (false);
1282 _session.set_dirty ();
1285 /** Turn off all redirects with a given placement
1286 * @param p Placement of redirects to disable
1290 Route::disable_plugins (Placement p)
1292 Glib::RWLock::ReaderLock lm (_processor_lock);
1294 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1295 if (boost::dynamic_pointer_cast<PluginInsert> (*i) && (*i)->placement() == p) {
1296 (*i)->set_active (false);
1300 _session.set_dirty ();
1303 /** Turn off all plugins
1307 Route::disable_plugins ()
1309 Glib::RWLock::ReaderLock lm (_processor_lock);
1311 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1312 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1313 (*i)->set_active (false);
1317 _session.set_dirty ();
1322 Route::ab_plugins (bool forward)
1324 Glib::RWLock::ReaderLock lm (_processor_lock);
1328 /* forward = turn off all active redirects, and mark them so that the next time
1329 we go the other way, we will revert them
1332 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1333 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1337 if ((*i)->active()) {
1338 (*i)->set_active (false);
1339 (*i)->set_next_ab_is_active (true);
1341 (*i)->set_next_ab_is_active (false);
1347 /* backward = if the redirect was marked to go active on the next ab, do so */
1349 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1351 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1355 if ((*i)->get_next_ab_is_active()) {
1356 (*i)->set_active (true);
1358 (*i)->set_active (false);
1363 _session.set_dirty ();
1367 /* Figure out the streams that will feed into PreFader */
1369 Route::pre_fader_streams() const
1371 boost::shared_ptr<Processor> processor;
1373 // Find the last pre-fader redirect
1374 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1375 if ((*i)->placement() == PreFader) {
1381 return processor->output_streams();
1388 /** Remove processors with a given placement.
1389 * @param p Placement of processors to remove.
1392 Route::clear_processors (Placement p)
1394 const ChanCount old_pmo = processor_max_outs;
1396 if (!_session.engine().connected()) {
1401 Glib::RWLock::WriterLock lm (_processor_lock);
1402 ProcessorList new_list;
1404 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1405 if ((*i)->placement() == p) {
1406 /* it's the placement we want to get rid of */
1407 (*i)->drop_references ();
1409 /* it's a different placement, so keep it */
1410 new_list.push_back (*i);
1414 _processors = new_list;
1417 /* FIXME: can't see how this test can ever fire */
1418 if (processor_max_outs != old_pmo) {
1422 processor_max_outs.reset();
1423 _have_internal_generator = false;
1424 processors_changed (); /* EMIT SIGNAL */
1428 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1430 ChanCount old_pmo = processor_max_outs;
1432 if (!_session.engine().connected()) {
1436 processor_max_outs.reset();
1439 Glib::RWLock::WriterLock lm (_processor_lock);
1440 ProcessorList::iterator i;
1441 bool removed = false;
1443 for (i = _processors.begin(); i != _processors.end(); ++i) {
1444 if (*i == processor) {
1446 ProcessorList::iterator tmp;
1448 /* move along, see failure case for reset_processor_counts()
1449 where we may need to reprocessor the processor.
1455 /* stop redirects that send signals to JACK ports
1456 from causing noise as a result of no longer being
1460 boost::shared_ptr<IOProcessor> redirect;
1462 if ((redirect = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1463 redirect->io()->disconnect_inputs (this);
1464 redirect->io()->disconnect_outputs (this);
1467 _processors.erase (i);
1482 if (_reset_processor_counts (err)) {
1483 /* get back to where we where */
1484 _processors.insert (i, processor);
1485 /* we know this will work, because it worked before :) */
1486 _reset_processor_counts (0);
1490 _have_internal_generator = false;
1492 for (i = _processors.begin(); i != _processors.end(); ++i) {
1493 boost::shared_ptr<PluginInsert> pi;
1495 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1496 if (pi->is_generator()) {
1497 _have_internal_generator = true;
1504 if (old_pmo != processor_max_outs) {
1508 processor->drop_references ();
1510 processors_changed (); /* EMIT SIGNAL */
1515 Route::reset_processor_counts (ProcessorStreams* err)
1517 Glib::RWLock::WriterLock lm (_processor_lock);
1518 return _reset_processor_counts (err);
1523 Route::_reset_processor_counts (ProcessorStreams* err)
1525 ProcessorList::iterator r;
1526 uint32_t insert_cnt = 0;
1527 uint32_t send_cnt = 0;
1528 map<Placement,list<ProcessorCount> > proc_map;
1529 ProcessorList::iterator prev;
1530 ChanCount initial_streams = n_inputs ();
1531 ChanCount previous_initial_streams = n_inputs ();
1533 uint32_t max_audio = 0;
1534 uint32_t max_midi = 0;
1536 processor_max_outs.reset ();
1538 /* Step 1: build a map that links each insert to an in/out channel count
1540 Divide inserts up by placement so we get the signal flow
1541 properly modelled. we need to do this because the _processors
1542 list is not sorted by placement, and because other reasons may
1543 exist now or in the future for this separate treatment.
1546 /* ... but it should/will be... */
1548 for (r = _processors.begin(); r != _processors.end(); ++r) {
1550 boost::shared_ptr<PluginInsert> plugin_insert;
1551 boost::shared_ptr<PortInsert> port_insert;
1553 if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert>(*r)) != 0) {
1556 proc_map[(*r)->placement()].push_back (ProcessorCount (*r));
1558 /* reset plugin counts back to one for now so
1559 that we have a predictable, controlled
1560 state to try to configure.
1563 plugin_insert->set_count (1);
1565 } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert>(*r)) != 0) {
1568 proc_map[(*r)->placement()].push_back (ProcessorCount (*r));
1570 } else if (boost::dynamic_pointer_cast<Send> (*r) != 0) {
1575 if (insert_cnt == 0) {
1584 /* Now process each placement in order, checking to see if we
1585 can really do what has been requested.
1590 if (check_some_processor_counts (proc_map[PreFader], n_inputs (), err)) {
1594 if (!proc_map[PreFader].empty()) {
1595 previous_initial_streams = n_inputs ();
1596 for (list<ProcessorCount>::iterator i = proc_map[PreFader].begin(); i != proc_map[PreFader].end(); i++) {
1597 if (i->processor->can_support_io_configuration (previous_initial_streams, initial_streams) < 0) {
1600 previous_initial_streams = initial_streams;
1606 if (check_some_processor_counts (proc_map[PostFader], initial_streams, err)) {
1610 if (!proc_map[PostFader].empty()) {
1611 for (list<ProcessorCount>::iterator i = proc_map[PostFader].begin(); i != proc_map[PostFader].end(); i++) {
1612 if (i->processor->can_support_io_configuration (previous_initial_streams, initial_streams) < 0) {
1615 previous_initial_streams = initial_streams;
1619 /* OK, everything can be set up correctly, so lets do it */
1621 apply_some_processor_counts (proc_map[PreFader]);
1622 apply_some_processor_counts (proc_map[PostFader]);
1624 /* recompute max outs of any processor */
1630 processor_max_outs.reset ();
1631 prev = _processors.end();
1633 for (r = _processors.begin(); r != _processors.end(); prev = r, ++r) {
1634 boost::shared_ptr<Send> s;
1636 if ((s = boost::dynamic_pointer_cast<Send> (*r)) != 0) {
1637 if (r == _processors.begin()) {
1638 s->expect_inputs (n_inputs());
1640 s->expect_inputs ((*prev)->output_streams());
1645 /* don't pay any attention to send output configuration, since it doesn't
1649 max_audio = max ((*r)->output_streams ().n_audio(), max_audio);
1650 max_midi = max ((*r)->output_streams ().n_midi(), max_midi);
1654 processor_max_outs.set (DataType::AUDIO, max_audio);
1655 processor_max_outs.set (DataType::MIDI, max_midi);
1661 for (r = _processors.begin(); r != _processors.end(); ++r) {
1662 max_audio = max ((*r)->output_streams ().n_audio(), max_audio);
1663 max_midi = max ((*r)->output_streams ().n_midi(), max_midi);
1666 processor_max_outs.set (DataType::AUDIO, max_audio);
1667 processor_max_outs.set (DataType::MIDI, max_midi);
1673 Route::apply_some_processor_counts (list<ProcessorCount>& iclist)
1675 list<ProcessorCount>::iterator i;
1677 for (i = iclist.begin(); i != iclist.end(); ++i) {
1679 ProcessorCount& pc (*i);
1681 cerr << "now applying for " << (*i).processor->name() << " in = " << pc.in.n_audio() << " out = " << pc.out.n_audio() << endl;
1683 if (pc.processor->configure_io (pc.in, pc.out)) {
1687 /* make sure that however many we have, they are all active */
1689 pc.processor->activate ();
1695 /** Returns whether \a iclist can be configured and run starting with
1696 * \a required_inputs at the first processor's inputs.
1697 * If false is returned, \a iclist can not be run with \a required_inputs, and \a err is set.
1698 * Otherwise, \a err is set to the output of the list.
1701 Route::check_some_processor_counts (list<ProcessorCount>& iclist, ChanCount required_inputs, ProcessorStreams* err)
1703 list<ProcessorCount>::iterator i;
1708 err->count = required_inputs;
1711 for (i = iclist.begin(); i != iclist.end(); ++i, ++index) {
1713 cerr << "Checking whether " << (*i).processor->name() << " can support " << required_inputs.n_audio() << " inputs\n";
1715 if (!(*i).processor->can_support_io_configuration (required_inputs, (*i).out)) {
1718 err->count = required_inputs;
1723 (*i).in = required_inputs;
1724 required_inputs = (*i).out;
1731 Route::copy_processors (const Route& other, Placement placement, ProcessorStreams* err)
1733 ChanCount old_pmo = processor_max_outs;
1735 ProcessorList to_be_deleted;
1738 Glib::RWLock::WriterLock lm (_processor_lock);
1739 ProcessorList::iterator tmp;
1740 ProcessorList the_copy;
1742 the_copy = _processors;
1744 /* remove all relevant processors */
1746 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ) {
1750 if ((*i)->placement() == placement) {
1751 to_be_deleted.push_back (*i);
1752 _processors.erase (i);
1758 /* now copy the relevant ones from "other" */
1760 for (ProcessorList::const_iterator i = other._processors.begin(); i != other._processors.end(); ++i) {
1761 if ((*i)->placement() == placement) {
1762 _processors.push_back (IOProcessor::clone (*i));
1766 /* reset plugin stream handling */
1768 if (_reset_processor_counts (err)) {
1770 /* FAILED COPY ATTEMPT: we have to restore order */
1772 /* delete all cloned processors */
1774 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ) {
1779 if ((*i)->placement() == placement) {
1780 _processors.erase (i);
1786 /* restore the natural order */
1788 _processors = the_copy;
1789 processor_max_outs = old_pmo;
1791 /* we failed, even though things are OK again */
1797 /* SUCCESSFUL COPY ATTEMPT: delete the processors we removed pre-copy */
1798 to_be_deleted.clear ();
1803 if (processor_max_outs != old_pmo || old_pmo == ChanCount::ZERO) {
1807 processors_changed (); /* EMIT SIGNAL */
1812 Route::all_processors_flip ()
1814 Glib::RWLock::ReaderLock lm (_processor_lock);
1816 if (_processors.empty()) {
1820 bool first_is_on = _processors.front()->active();
1822 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1823 (*i)->set_active (!first_is_on);
1826 _session.set_dirty ();
1829 /** Set all processors with a given placement to a given active state.
1830 * @param p Placement of processors to change.
1831 * @param state New active state for those processors.
1834 Route::all_processors_active (Placement p, bool state)
1836 Glib::RWLock::ReaderLock lm (_processor_lock);
1838 if (_processors.empty()) {
1842 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1843 if ((*i)->placement() == p) {
1844 (*i)->set_active (state);
1848 _session.set_dirty ();
1851 struct ProcessorSorter {
1852 bool operator() (boost::shared_ptr<const Processor> a, boost::shared_ptr<const Processor> b) {
1853 return a->sort_key() < b->sort_key();
1858 Route::sort_processors (ProcessorStreams* err)
1861 ProcessorSorter comparator;
1862 Glib::RWLock::WriterLock lm (_processor_lock);
1863 ChanCount old_pmo = processor_max_outs;
1865 /* the sweet power of C++ ... */
1867 ProcessorList as_it_was_before = _processors;
1869 _processors.sort (comparator);
1871 if (_reset_processor_counts (err)) {
1872 _processors = as_it_was_before;
1873 processor_max_outs = old_pmo;
1879 processors_changed (); /* EMIT SIGNAL */
1891 Route::get_template()
1893 return state(false);
1897 Route::state(bool full_state)
1899 XMLNode *node = new XMLNode("Route");
1900 ProcessorList::iterator i;
1904 node->add_property("flags", enum_2_string (_flags));
1907 node->add_property("default-type", _default_type.to_string());
1909 node->add_property("active", _active?"yes":"no");
1910 node->add_property("muted", _muted?"yes":"no");
1911 node->add_property("soloed", _soloed?"yes":"no");
1912 node->add_property("phase-invert", _phase_invert?"yes":"no");
1913 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1914 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1915 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1916 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1917 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1920 node->add_property("edit-group", _edit_group->name());
1923 node->add_property("mix-group", _mix_group->name());
1926 string order_string;
1927 OrderKeys::iterator x = order_keys.begin();
1929 while (x != order_keys.end()) {
1930 order_string += string ((*x).first);
1931 order_string += '=';
1932 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1933 order_string += buf;
1937 if (x == order_keys.end()) {
1941 order_string += ':';
1943 node->add_property ("order-keys", order_string);
1945 node->add_child_nocopy (IO::state (full_state));
1946 node->add_child_nocopy (_solo_control->get_state ());
1947 node->add_child_nocopy (_mute_control->get_state ());
1949 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1950 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1951 remote_control_node->add_property (X_("id"), buf);
1952 node->add_child_nocopy (*remote_control_node);
1954 if (_control_outs) {
1955 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1956 cnode->add_child_nocopy (_control_outs->state (full_state));
1957 node->add_child_nocopy (*cnode);
1960 if (_comment.length()) {
1961 XMLNode *cmt = node->add_child ("Comment");
1962 cmt->add_content (_comment);
1965 for (i = _processors.begin(); i != _processors.end(); ++i) {
1966 node->add_child_nocopy((*i)->state (full_state));
1970 node->add_child_copy (*_extra_xml);
1977 Route::get_processor_state ()
1979 XMLNode* root = new XMLNode (X_("redirects"));
1980 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1981 root->add_child_nocopy ((*i)->state (true));
1988 Route::set_processor_state (const XMLNode& root)
1990 if (root.name() != X_("redirects")) {
1996 XMLNodeConstIterator iter;
1997 XMLNodeConstIterator niter;
1998 Glib::RWLock::ReaderLock lm (_processor_lock);
2000 nlist = root.children();
2002 for (iter = nlist.begin(); iter != nlist.end(); ++iter){
2004 /* iter now points to a IOProcessor state node */
2006 nnlist = (*iter)->children ();
2008 for (niter = nnlist.begin(); niter != nnlist.end(); ++niter) {
2010 /* find the IO child node, since it contains the ID we need */
2012 /* XXX OOP encapsulation violation, ugh */
2014 if ((*niter)->name() == IO::state_node_name) {
2016 XMLProperty* prop = (*niter)->property (X_("id"));
2019 warning << _("IOProcessor node has no ID, ignored") << endmsg;
2023 ID id = prop->value ();
2025 /* now look for a processor with that ID */
2027 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2028 if ((*i)->id() == id) {
2029 (*i)->set_state (**iter);
2045 Route::set_deferred_state ()
2048 XMLNodeConstIterator niter;
2050 if (!deferred_state) {
2054 nlist = deferred_state->children();
2056 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2057 add_processor_from_xml (**niter);
2060 delete deferred_state;
2065 Route::add_processor_from_xml (const XMLNode& node)
2067 const XMLProperty *prop;
2069 // legacy sessions use a different node name for sends
2070 if (node.name() == "Send") {
2073 boost::shared_ptr<Send> send (new Send (_session, node));
2074 add_processor (send);
2077 catch (failed_constructor &err) {
2078 error << _("Send construction failed") << endmsg;
2082 // use "Processor" in XML?
2083 } else if (node.name() == "Processor") {
2086 if ((prop = node.property ("type")) != 0) {
2088 boost::shared_ptr<Processor> processor;
2089 bool have_insert = false;
2091 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2092 prop->value() == "lv2" ||
2093 prop->value() == "vst" ||
2094 prop->value() == "audiounit") {
2096 processor.reset (new PluginInsert(_session, node));
2099 } else if (prop->value() == "port") {
2101 processor.reset (new PortInsert (_session, node));
2103 } else if (prop->value() == "send") {
2105 processor.reset (new Send (_session, node));
2110 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2113 add_processor (processor);
2116 error << _("Processor XML node has no type property") << endmsg;
2120 catch (failed_constructor &err) {
2121 warning << _("processor could not be created. Ignored.") << endmsg;
2128 Route::set_state (const XMLNode& node)
2130 return _set_state (node, true);
2134 Route::_set_state (const XMLNode& node, bool call_base)
2137 XMLNodeConstIterator niter;
2139 XMLPropertyList plist;
2140 const XMLProperty *prop;
2142 if (node.name() != "Route"){
2143 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2147 if ((prop = node.property (X_("flags"))) != 0) {
2148 _flags = Flag (string_2_enum (prop->value(), _flags));
2153 if ((prop = node.property (X_("default-type"))) != 0) {
2154 _default_type = DataType(prop->value());
2155 assert(_default_type != DataType::NIL);
2158 if ((prop = node.property (X_("phase-invert"))) != 0) {
2159 set_phase_invert (prop->value()=="yes"?true:false, this);
2162 if ((prop = node.property (X_("denormal-protection"))) != 0) {
2163 set_denormal_protection (prop->value()=="yes"?true:false, this);
2167 if ((prop = node.property (X_("active"))) != 0) {
2168 set_active (prop->value() == "yes");
2171 if ((prop = node.property (X_("muted"))) != 0) {
2172 bool yn = prop->value()=="yes"?true:false;
2174 /* force reset of mute status */
2178 mute_gain = desired_mute_gain;
2181 if ((prop = node.property (X_("soloed"))) != 0) {
2182 bool yn = prop->value()=="yes"?true:false;
2184 /* force reset of solo status */
2187 set_solo (yn, this);
2188 solo_gain = desired_solo_gain;
2191 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2192 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
2195 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2196 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
2199 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2200 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
2203 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2204 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
2207 if ((prop = node.property (X_("edit-group"))) != 0) {
2208 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
2209 if(edit_group == 0) {
2210 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
2212 set_edit_group(edit_group, this);
2216 if ((prop = node.property (X_("order-keys"))) != 0) {
2220 string::size_type colon, equal;
2221 string remaining = prop->value();
2223 while (remaining.length()) {
2225 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2226 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2229 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
2230 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2233 set_order_key (remaining.substr (0, equal).c_str(), n);
2237 colon = remaining.find_first_of (':');
2239 if (colon != string::npos) {
2240 remaining = remaining.substr (colon+1);
2247 nlist = node.children();
2249 if (deferred_state) {
2250 delete deferred_state;
2253 deferred_state = new XMLNode(X_("deferred state"));
2255 /* set parent class properties before anything else */
2257 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2261 if (child->name() == IO::state_node_name && call_base) {
2263 IO::set_state (*child);
2268 XMLNodeList processor_nodes;
2270 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2274 if (child->name() == X_("Send") || child->name() == X_("Processor")) {
2275 processor_nodes.push_back(child);
2280 _set_processor_states(processor_nodes);
2283 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2285 // All processors have been applied already
2287 if (child->name() == X_("Automation")) {
2289 if ((prop = child->property (X_("path"))) != 0) {
2290 load_automation (prop->value());
2293 } else if (child->name() == X_("ControlOuts")) {
2295 string coutname = _name;
2296 coutname += _("[control]");
2298 _control_outs = new IO (_session, coutname);
2299 _control_outs->set_state (**(child->children().begin()));
2301 } else if (child->name() == X_("Comment")) {
2303 /* XXX this is a terrible API design in libxml++ */
2305 XMLNode *cmt = *(child->children().begin());
2306 _comment = cmt->content();
2308 } else if (child->name() == X_("extra")) {
2310 _extra_xml = new XMLNode (*child);
2312 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
2314 if (prop->value() == "solo") {
2315 _solo_control->set_state (*child);
2316 _session.add_controllable (_solo_control);
2318 else if (prop->value() == "mute") {
2319 _mute_control->set_state (*child);
2320 _session.add_controllable (_mute_control);
2323 else if (child->name() == X_("remote_control")) {
2324 if ((prop = child->property (X_("id"))) != 0) {
2326 sscanf (prop->value().c_str(), "%d", &x);
2327 set_remote_control_id (x);
2332 if ((prop = node.property (X_("mix-group"))) != 0) {
2333 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
2334 if (mix_group == 0) {
2335 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
2337 set_mix_group(mix_group, this);
2345 Route::_set_processor_states(const XMLNodeList &nlist)
2347 XMLNodeConstIterator niter;
2350 ProcessorList::iterator i, o;
2352 // Iterate through existing processors, remove those which are not in the state list
2353 for (i = _processors.begin(); i != _processors.end(); ) {
2354 ProcessorList::iterator tmp = i;
2357 bool processorInStateList = false;
2359 (*i)->id().print (buf, sizeof (buf));
2362 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2364 // legacy sessions (IOProcessor as a child of Processor, both is-a IO)
2365 if (strncmp(buf,(*niter)->child(X_("IOProcessor"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
2366 processorInStateList = true;
2368 } else if (strncmp(buf,(*niter)->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
2369 processorInStateList = true;
2374 if (!processorInStateList) {
2375 remove_processor (*i);
2383 // Iterate through state list and make sure all processors are on the track and in the correct order,
2384 // set the state of existing processors according to the new state on the same go
2385 i = _processors.begin();
2386 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
2388 // Check whether the next processor in the list
2391 while (o != _processors.end()) {
2392 (*o)->id().print (buf, sizeof (buf));
2393 if ( strncmp(buf, (*niter)->child(X_("IOProcessor"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
2395 else if (strncmp(buf,(*niter)->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
2401 if (o == _processors.end()) {
2402 // If the processor (*niter) is not on the route, we need to create it
2403 // and move it to the correct location
2405 ProcessorList::iterator prev_last = _processors.end();
2406 --prev_last; // We need this to check whether adding succeeded
2408 add_processor_from_xml (**niter);
2410 ProcessorList::iterator last = _processors.end();
2413 if (prev_last == last) {
2414 cerr << "Could not fully restore state as some processors were not possible to create" << endl;
2419 boost::shared_ptr<Processor> tmp = (*last);
2420 // remove the processor from the wrong location
2421 _processors.erase(last);
2422 // processor the new processor at the current location
2423 _processors.insert(i, tmp);
2425 --i; // move pointer to the newly processored processor
2429 // We found the processor (*niter) on the route, first we must make sure the processor
2430 // is at the location provided in the XML state
2432 boost::shared_ptr<Processor> tmp = (*o);
2433 // remove the old copy
2434 _processors.erase(o);
2435 // processor the processor at the correct location
2436 _processors.insert(i, tmp);
2438 --i; // move pointer so it points to the right processor
2441 (*i)->set_state( (**niter) );
2444 processors_changed ();
2448 Route::curve_reallocate ()
2450 // _gain_automation_curve.finish_resize ();
2451 // _pan_automation_curve.finish_resize ();
2455 Route::silence (nframes_t nframes, nframes_t offset)
2459 IO::silence (nframes, offset);
2461 if (_control_outs) {
2462 _control_outs->silence (nframes, offset);
2466 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2469 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2470 boost::shared_ptr<PluginInsert> pi;
2471 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2472 // skip plugins, they don't need anything when we're not active
2476 (*i)->silence (nframes, offset);
2479 if (nframes == _session.get_block_size() && offset == 0) {
2489 Route::set_control_outs (const vector<string>& ports)
2491 Glib::Mutex::Lock lm (_control_outs_lock);
2492 vector<string>::const_iterator i;
2495 if (_control_outs) {
2496 delete _control_outs;
2500 if (is_control() || is_master()) {
2501 /* no control outs for these two special busses */
2505 if (ports.empty()) {
2509 string coutname = _name;
2510 coutname += _("[control]");
2512 _control_outs = new IO (_session, coutname);
2514 /* our control outs need as many outputs as we
2515 have audio outputs. we track the changes in ::output_change_handler().
2518 // XXX its stupid that we have to get this value twice
2520 limit = n_outputs().n_audio();
2522 if (_control_outs->ensure_io (ChanCount::ZERO, ChanCount (DataType::AUDIO, n_outputs().get (DataType::AUDIO)), true, this)) {
2526 /* now connect to the named ports */
2528 for (size_t n = 0; n < limit; ++n) {
2529 if (_control_outs->connect_output (_control_outs->output (n), ports[n % ports.size()], this)) {
2530 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2539 Route::set_edit_group (RouteGroup *eg, void *src)
2542 if (eg == _edit_group) {
2547 _edit_group->remove (this);
2550 if ((_edit_group = eg) != 0) {
2551 _edit_group->add (this);
2554 _session.set_dirty ();
2555 edit_group_changed (src); /* EMIT SIGNAL */
2559 Route::drop_edit_group (void *src)
2562 _session.set_dirty ();
2563 edit_group_changed (src); /* EMIT SIGNAL */
2567 Route::set_mix_group (RouteGroup *mg, void *src)
2570 if (mg == _mix_group) {
2575 _mix_group->remove (this);
2578 if ((_mix_group = mg) != 0) {
2579 _mix_group->add (this);
2582 _session.set_dirty ();
2583 mix_group_changed (src); /* EMIT SIGNAL */
2587 Route::drop_mix_group (void *src)
2590 _session.set_dirty ();
2591 mix_group_changed (src); /* EMIT SIGNAL */
2595 Route::set_comment (string cmt, void *src)
2598 comment_changed (src);
2599 _session.set_dirty ();
2603 Route::feeds (boost::shared_ptr<Route> other)
2608 uint32_t no = self.n_outputs().n_total();
2609 uint32_t ni = other->n_inputs ().n_total();
2611 for (i = 0; i < no; ++i) {
2612 for (j = 0; j < ni; ++j) {
2613 if (self.output(i)->connected_to (other->input(j)->name())) {
2619 /* check IOProcessors which may also interconnect Routes */
2621 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2623 boost::shared_ptr<IOProcessor> redirect = boost::dynamic_pointer_cast<IOProcessor>(*r);
2628 // TODO: support internal redirects here
2630 no = redirect->io()->n_outputs().n_total();
2632 for (i = 0; i < no; ++i) {
2633 for (j = 0; j < ni; ++j) {
2634 if (redirect->io()->output(i)->connected_to (other->input (j)->name())) {
2641 /* check for control room outputs which may also interconnect Routes */
2643 if (_control_outs) {
2645 no = _control_outs->n_outputs().n_total();
2647 for (i = 0; i < no; ++i) {
2648 for (j = 0; j < ni; ++j) {
2649 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2660 Route::set_mute_config (mute_type t, bool onoff, void *src)
2664 _mute_affects_pre_fader = onoff;
2665 pre_fader_changed(src); /* EMIT SIGNAL */
2669 _mute_affects_post_fader = onoff;
2670 post_fader_changed(src); /* EMIT SIGNAL */
2674 _mute_affects_control_outs = onoff;
2675 control_outs_changed(src); /* EMIT SIGNAL */
2679 _mute_affects_main_outs = onoff;
2680 main_outs_changed(src); /* EMIT SIGNAL */
2686 Route::get_mute_config (mute_type t)
2692 onoff = _mute_affects_pre_fader;
2695 onoff = _mute_affects_post_fader;
2698 onoff = _mute_affects_control_outs;
2701 onoff = _mute_affects_main_outs;
2709 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
2711 nframes_t now = _session.transport_frame();
2714 Glib::RWLock::ReaderLock lm (_processor_lock);
2717 automation_snapshot (now, true);
2720 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2722 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2723 (*i)->deactivate ();
2727 (*i)->transport_stopped (now);
2731 IO::transport_stopped (now);
2733 _roll_delay = _initial_delay;
2737 Route::input_change_handler (IOChange change, void *ignored)
2739 if (change & ConfigurationChanged) {
2740 reset_processor_counts (0);
2745 Route::output_change_handler (IOChange change, void *ignored)
2747 if (change & ConfigurationChanged) {
2748 if (_control_outs) {
2749 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().n_audio()), true, this);
2752 reset_processor_counts (0);
2757 Route::pans_required () const
2759 if (n_outputs().n_audio() < 2) {
2763 return max (n_inputs ().n_audio(), processor_max_outs.n_audio());
2767 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2768 bool session_state_changing, bool can_record, bool rec_monitors_input)
2770 if (n_outputs().n_total() == 0) {
2774 if (session_state_changing || !_active) {
2775 silence (nframes, offset);
2779 apply_gain_automation = false;
2781 if (n_inputs().n_total()) {
2782 passthru (start_frame, end_frame, nframes, offset, 0, false);
2784 silence (nframes, offset);
2791 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2793 if (_roll_delay > nframes) {
2795 _roll_delay -= nframes;
2796 silence (nframes, offset);
2797 /* transport frame is not legal for caller to use */
2800 } else if (_roll_delay > 0) {
2802 nframes -= _roll_delay;
2804 silence (_roll_delay, offset);
2806 offset += _roll_delay;
2807 transport_frame += _roll_delay;
2816 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2817 bool can_record, bool rec_monitors_input)
2820 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2822 // automation snapshot can also be called from the non-rt context
2823 // and it uses the processor list, so we take the lock out here
2824 automation_snapshot (_session.transport_frame(), false);
2828 if ((n_outputs().n_total() == 0 && _processors.empty()) || n_inputs().n_total() == 0 || !_active) {
2829 silence (nframes, offset);
2833 nframes_t unused = 0;
2835 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2841 apply_gain_automation = false;
2844 Glib::Mutex::Lock am (data().control_lock(), Glib::TRY_LOCK);
2846 if (am.locked() && _session.transport_rolling()) {
2848 if (_gain_control->automation_playback()) {
2849 apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector (
2850 start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2855 passthru (start_frame, end_frame, nframes, offset, declick, false);
2861 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2862 bool can_record, bool rec_monitors_input)
2864 silence (nframes, offset);
2869 Route::toggle_monitor_input ()
2871 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2872 i->ensure_monitor_input( ! i->monitoring_input());
2877 Route::has_external_redirects () const
2879 // FIXME: what about sends?
2881 boost::shared_ptr<const PortInsert> pi;
2883 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2884 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2886 for (PortSet::const_iterator port = pi->io()->outputs().begin();
2887 port != pi->io()->outputs().end(); ++port) {
2889 string port_name = port->name();
2890 string client_name = port_name.substr (0, port_name.find(':'));
2892 /* only say "yes" if the redirect is actually in use */
2894 if (client_name != "ardour" && pi->active()) {
2905 Route::flush_processors ()
2907 /* XXX shouldn't really try to take this lock, since
2908 this is called from the RT audio thread.
2911 Glib::RWLock::ReaderLock lm (_processor_lock);
2913 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2914 (*i)->deactivate ();
2920 Route::set_meter_point (MeterPoint p, void *src)
2922 if (_meter_point != p) {
2924 meter_change (src); /* EMIT SIGNAL */
2925 _session.set_dirty ();
2930 Route::update_total_latency ()
2932 nframes_t old = _own_latency;
2934 if (_user_latency) {
2935 _own_latency = _user_latency;
2939 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2940 if ((*i)->active ()) {
2941 _own_latency += (*i)->signal_latency ();
2946 #undef DEBUG_LATENCY
2947 #ifdef DEBUG_LATENCY
2948 cerr << _name << ": internal redirect latency = " << _own_latency << endl;
2951 set_port_latency (_own_latency);
2953 if (!_user_latency) {
2954 /* this (virtual) function is used for pure Routes,
2955 not derived classes like AudioTrack. this means
2956 that the data processed here comes from an input
2957 port, not prerecorded material, and therefore we
2958 have to take into account any input latency.
2962 _own_latency += input_latency ();
2965 if (old != _own_latency) {
2966 signal_latency_changed (); /* EMIT SIGNAL */
2969 #ifdef DEBUG_LATENCY
2970 cerr << _name << ": input latency = " << input_latency() << " total = "
2971 << _own_latency << endl;
2974 return _own_latency;
2978 Route::set_user_latency (nframes_t nframes)
2980 Latent::set_user_latency (nframes);
2981 _session.update_latency_compensation (false, false);
2985 Route::set_latency_delay (nframes_t longest_session_latency)
2987 nframes_t old = _initial_delay;
2989 if (_own_latency < longest_session_latency) {
2990 _initial_delay = longest_session_latency - _own_latency;
2995 if (_initial_delay != old) {
2996 initial_delay_changed (); /* EMIT SIGNAL */
2999 if (_session.transport_stopped()) {
3000 _roll_delay = _initial_delay;
3005 Route::automation_snapshot (nframes_t now, bool force)
3007 if (!force && !should_snapshot(now)) {
3011 IO::automation_snapshot (now, force);
3013 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3014 (*i)->automation_snapshot (now, force);
3018 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
3019 : Controllable (name), route (s), type(tp)
3025 Route::ToggleControllable::set_value (float val)
3027 bool bval = ((val >= 0.5f) ? true: false);
3031 route.set_mute (bval, this);
3034 route.set_solo (bval, this);
3042 Route::ToggleControllable::get_value (void) const
3048 val = route.muted() ? 1.0f : 0.0f;
3051 val = route.soloed() ? 1.0f : 0.0f;
3061 Route::set_block_size (nframes_t nframes)
3063 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3064 (*i)->set_block_size (nframes);
3069 Route::protect_automation ()
3071 Automatable::protect_automation();
3073 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3074 (*i)->protect_automation();
3078 Route::set_pending_declick (int declick)
3081 /* this call is not allowed to turn off a pending declick unless "force" is true */
3083 _pending_declick = declick;
3085 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
3087 _pending_declick = 0;