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> 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 ()
184 if (order_keys.empty()) {
188 OrderKeys::iterator x = order_keys.begin();
192 for (; x != order_keys.end(); ++x) {
198 Route::ensure_track_or_route_name(string name, Session &session)
200 string newname = name;
202 while (session.route_by_name (newname)!=NULL)
204 newname = bump_name_once (newname);
212 Route::inc_gain (gain_t fraction, void *src)
214 IO::inc_gain (fraction, src);
218 Route::set_gain (gain_t val, void *src)
220 if (src != 0 && _mix_group && src != _mix_group && _mix_group->is_active()) {
222 if (_mix_group->is_relative()) {
224 gain_t usable_gain = gain();
225 if (usable_gain < 0.000001f) {
226 usable_gain = 0.000001f;
230 if (delta < 0.000001f) {
234 delta -= usable_gain;
239 gain_t factor = delta / usable_gain;
242 factor = _mix_group->get_max_factor(factor);
243 if (factor == 0.0f) {
244 _gain_control->Changed(); /* EMIT SIGNAL */
248 factor = _mix_group->get_min_factor(factor);
249 if (factor == 0.0f) {
250 _gain_control->Changed(); /* EMIT SIGNAL */
255 _mix_group->apply (&Route::inc_gain, factor, _mix_group);
259 _mix_group->apply (&Route::set_gain, val, _mix_group);
269 IO::set_gain (val, src);
272 /** Process this route for one (sub) cycle (process thread)
274 * @param bufs Scratch buffers to use for the signal path
275 * @param start_frame Initial transport frame
276 * @param end_frame Final transport frame
277 * @param nframes Number of frames to output (to ports)
278 * @param offset Output offset (of port buffers, for split cycles)
280 * Note that (end_frame - start_frame) may not be equal to nframes when the
281 * transport speed isn't 1.0 (eg varispeed).
284 Route::process_output_buffers (BufferSet& bufs,
285 nframes_t start_frame, nframes_t end_frame,
286 nframes_t nframes, nframes_t offset, bool with_processors, int declick,
289 // This is definitely very audio-only for now
290 assert(_default_type == DataType::AUDIO);
292 ProcessorList::iterator i;
293 bool post_fader_work = false;
294 bool mute_declick_applied = false;
300 gain_t* gab = _session.gain_automation_buffer();
302 switch (Config->get_monitoring_model()) {
303 case HardwareMonitoring:
304 case ExternalMonitoring:
311 declick = _pending_declick;
314 Glib::Mutex::Lock cm (_control_outs_lock, Glib::TRY_LOCK);
324 Glib::Mutex::Lock dm (declick_lock, Glib::TRY_LOCK);
327 dmg = desired_mute_gain;
328 dsg = desired_solo_gain;
337 /* ----------------------------------------------------------------------------------------------------
338 GLOBAL DECLICK (for transport changes etc.)
339 -------------------------------------------------------------------------------------------------- */
342 Amp::run_in_place (bufs, nframes, 0.0, 1.0, false);
343 _pending_declick = 0;
344 } else if (declick < 0) {
345 Amp::run_in_place (bufs, nframes, 1.0, 0.0, false);
346 _pending_declick = 0;
349 /* no global declick */
351 if (solo_gain != dsg) {
352 Amp::run_in_place (bufs, nframes, solo_gain, dsg, false);
358 /* ----------------------------------------------------------------------------------------------------
359 INPUT METERING & MONITORING
360 -------------------------------------------------------------------------------------------------- */
362 if (meter && (_meter_point == MeterInput)) {
363 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
366 if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
367 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
369 mute_declick_applied = true;
372 if ((_meter_point == MeterInput) && co) {
374 solo_audible = dsg > 0;
375 mute_audible = dmg > 0;// || !_mute_affects_pre_fader;
377 if ( // muted by solo of another track
381 // muted by mute of this track
385 // rec-enabled but not s/w monitoring
387 // TODO: this is probably wrong
389 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
393 co->silence (nframes, offset);
397 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
402 /* -----------------------------------------------------------------------------------------------------
404 -------------------------------------------------------------------------------------------------- */
406 if (_denormal_protection || Config->get_denormal_protection()) {
408 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
409 Sample* const sp = i->data();
411 for (nframes_t nx = offset; nx < nframes + offset; ++nx) {
417 /* ----------------------------------------------------------------------------------------------------
419 -------------------------------------------------------------------------------------------------- */
421 if (with_processors) {
422 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
424 if (mute_gain > 0 || !_mute_affects_pre_fader) {
425 for (i = _processors.begin(); i != _processors.end(); ++i) {
426 switch ((*i)->placement()) {
428 (*i)->run_in_place (bufs, start_frame, end_frame, nframes, offset);
431 post_fader_work = true;
436 for (i = _processors.begin(); i != _processors.end(); ++i) {
437 switch ((*i)->placement()) {
439 (*i)->silence (nframes, offset);
442 post_fader_work = true;
450 // This really should already be true...
451 bufs.set_count(pre_fader_streams());
453 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
454 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
456 mute_declick_applied = true;
459 /* ----------------------------------------------------------------------------------------------------
460 PRE-FADER METERING & MONITORING
461 -------------------------------------------------------------------------------------------------- */
463 if (meter && (_meter_point == MeterPreFader)) {
464 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
468 if ((_meter_point == MeterPreFader) && co) {
470 solo_audible = dsg > 0;
471 mute_audible = dmg > 0 || !_mute_affects_pre_fader;
473 if ( // muted by solo of another track
477 // muted by mute of this track
481 // rec-enabled but not s/w monitoring
483 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
487 co->silence (nframes, offset);
491 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
495 /* ----------------------------------------------------------------------------------------------------
497 -------------------------------------------------------------------------------------------------- */
499 /* if not recording or recording and requiring any monitor signal, then apply gain */
501 if ( // not recording
503 !(record_enabled() && _session.actively_recording()) ||
507 // AND software monitoring required
509 Config->get_monitoring_model() == SoftwareMonitoring) {
511 if (apply_gain_automation) {
514 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
515 Sample* const sp = i->data();
517 for (nframes_t nx = 0; nx < nframes; ++nx) {
522 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
523 Sample* const sp = i->data();
525 for (nframes_t nx = 0; nx < nframes; ++nx) {
531 if (apply_gain_automation && _session.transport_rolling() && nframes > 0) {
532 _effective_gain = gab[nframes-1];
537 /* manual (scalar) gain */
541 Amp::run_in_place (bufs, nframes, _gain, dg, _phase_invert);
544 } else if (_gain != 0 && (_phase_invert || _gain != 1.0)) {
546 /* no need to interpolate current gain value,
547 but its non-unity, so apply it. if the gain
548 is zero, do nothing because we'll ship silence
560 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
561 Sample* const sp = i->data();
562 apply_gain_to_buffer(sp,nframes,this_gain);
565 } else if (_gain == 0) {
566 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
574 /* actively recording, no monitoring required; leave buffers as-is to save CPU cycles */
578 /* ----------------------------------------------------------------------------------------------------
580 -------------------------------------------------------------------------------------------------- */
582 /* note that post_fader_work cannot be true unless with_processors was also true, so don't test both */
584 if (post_fader_work) {
586 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
588 if (mute_gain > 0 || !_mute_affects_post_fader) {
589 for (i = _processors.begin(); i != _processors.end(); ++i) {
590 switch ((*i)->placement()) {
594 (*i)->run_in_place (bufs, start_frame, end_frame, nframes, offset);
599 for (i = _processors.begin(); i != _processors.end(); ++i) {
600 switch ((*i)->placement()) {
604 (*i)->silence (nframes, offset);
612 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
613 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
615 mute_declick_applied = true;
618 /* ----------------------------------------------------------------------------------------------------
620 -------------------------------------------------------------------------------------------------- */
622 if ((_meter_point == MeterPostFader) && co) {
624 solo_audible = solo_gain > 0;
625 mute_audible = dmg > 0 || !_mute_affects_control_outs;
627 if ( // silent anyway
629 (_gain == 0 && !apply_gain_automation) ||
631 // muted by solo of another track
635 // muted by mute of this track
639 // recording but not s/w monitoring
641 (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
645 co->silence (nframes, offset);
649 co->deliver_output (bufs, start_frame, end_frame, nframes, offset);
653 /* ----------------------------------------------------------------------
655 ----------------------------------------------------------------------*/
657 if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
658 Amp::run_in_place (bufs, nframes, mute_gain, dmg, false);
660 mute_declick_applied = true;
663 /* ----------------------------------------------------------------------------------------------------
665 -------------------------------------------------------------------------------------------------- */
667 solo_audible = dsg > 0;
668 mute_audible = dmg > 0 || !_mute_affects_main_outs;
670 if (n_outputs().get(_default_type) == 0) {
674 } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
676 IO::silence (nframes, offset);
680 if ( // silent anyway
682 (_gain == 0 && !apply_gain_automation) ||
684 // muted by solo of another track, but not using control outs for solo
686 (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
688 // muted by mute of this track
694 /* don't use Route::silence() here, because that causes
695 all outputs (sends, port processors, etc. to be silent).
698 if (_meter_point == MeterPostFader) {
699 peak_meter().reset();
702 IO::silence (nframes, offset);
706 deliver_output(bufs, start_frame, end_frame, nframes, offset);
712 /* ----------------------------------------------------------------------------------------------------
714 -------------------------------------------------------------------------------------------------- */
716 if (meter && (_meter_point == MeterPostFader)) {
717 if ((_gain == 0 && !apply_gain_automation) || dmg == 0) {
720 _meter->run_in_place(output_buffers(), start_frame, end_frame, nframes, offset);
726 Route::n_process_buffers ()
728 return max (n_inputs(), processor_max_outs);
732 Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
734 BufferSet& bufs = _session.get_scratch_buffers(n_process_buffers());
738 collect_input (bufs, nframes, offset);
741 _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
745 process_output_buffers (bufs, start_frame, end_frame, nframes, offset, true, declick, meter_first);
749 Route::passthru_silence (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter)
751 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, offset, true, declick, meter);
755 Route::set_solo (bool yn, void *src)
761 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
762 _mix_group->apply (&Route::set_solo, yn, _mix_group);
768 solo_changed (src); /* EMIT SIGNAL */
769 _solo_control->Changed (); /* EMIT SIGNAL */
774 Route::set_solo_mute (bool yn)
776 Glib::Mutex::Lock lm (declick_lock);
778 /* Called by Session in response to another Route being soloed.
781 desired_solo_gain = (yn?0.0:1.0);
785 Route::set_solo_safe (bool yn, void *src)
787 if (_solo_safe != yn) {
789 solo_safe_changed (src); /* EMIT SIGNAL */
794 Route::set_mute (bool yn, void *src)
797 if (_mix_group && src != _mix_group && _mix_group->is_active()) {
798 _mix_group->apply (&Route::set_mute, yn, _mix_group);
804 mute_changed (src); /* EMIT SIGNAL */
806 _mute_control->Changed (); /* EMIT SIGNAL */
808 Glib::Mutex::Lock lm (declick_lock);
809 desired_mute_gain = (yn?0.0f:1.0f);
814 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
816 ChanCount old_rmo = processor_max_outs;
818 if (!_session.engine().connected()) {
823 Glib::RWLock::WriterLock lm (_processor_lock);
825 boost::shared_ptr<PluginInsert> pi;
826 boost::shared_ptr<PortInsert> porti;
828 //processor->set_default_type(_default_type);
830 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
833 if (pi->natural_input_streams() == ChanCount::ZERO) {
834 /* generator plugin */
835 _have_internal_generator = true;
840 _processors.push_back (processor);
842 // Set up processor list channels. This will set processor->[input|output]_streams(),
843 // configure redirect ports properly, etc.
844 if (_reset_plugin_counts (err)) {
845 _processors.pop_back ();
846 _reset_plugin_counts (0); // it worked before we tried to add it ...
850 // Ensure peak vector sizes before the plugin is activated
851 ChanCount potential_max_streams = max(processor->input_streams(), processor->output_streams());
852 _meter->configure_io(potential_max_streams, potential_max_streams);
854 processor->activate ();
855 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
860 if (processor_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
864 processors_changed (); /* EMIT SIGNAL */
870 Route::add_processors (const ProcessorList& others, ProcessorStreams* err)
872 ChanCount old_rmo = processor_max_outs;
874 if (!_session.engine().connected()) {
879 Glib::RWLock::WriterLock lm (_processor_lock);
881 ProcessorList::iterator existing_end = _processors.end();
884 ChanCount potential_max_streams;
886 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
888 boost::shared_ptr<PluginInsert> pi;
890 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
893 ChanCount m = max(pi->input_streams(), pi->output_streams());
894 if (m > potential_max_streams)
895 potential_max_streams = m;
898 // Ensure peak vector sizes before the plugin is activated
899 _meter->configure_io(potential_max_streams, potential_max_streams);
901 _processors.push_back (*i);
903 if (_reset_plugin_counts (err)) {
905 _processors.erase (existing_end, _processors.end());
906 _reset_plugin_counts (0); // it worked before we tried to add it ...
911 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
917 if (processor_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
921 processors_changed (); /* EMIT SIGNAL */
925 /** Turn off all processors with a given placement
926 * @param p Placement of processors to disable
930 Route::disable_processors (Placement p)
932 Glib::RWLock::ReaderLock lm (_processor_lock);
934 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
935 if ((*i)->placement() == p) {
936 (*i)->set_active (false);
940 _session.set_dirty ();
943 /** Turn off all redirects
947 Route::disable_processors ()
949 Glib::RWLock::ReaderLock lm (_processor_lock);
951 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
952 (*i)->set_active (false);
955 _session.set_dirty ();
958 /** Turn off all redirects with a given placement
959 * @param p Placement of redirects to disable
963 Route::disable_plugins (Placement p)
965 Glib::RWLock::ReaderLock lm (_processor_lock);
967 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
968 if (boost::dynamic_pointer_cast<PluginInsert> (*i) && (*i)->placement() == p) {
969 (*i)->set_active (false);
973 _session.set_dirty ();
976 /** Turn off all plugins
980 Route::disable_plugins ()
982 Glib::RWLock::ReaderLock lm (_processor_lock);
984 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
985 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
986 (*i)->set_active (false);
990 _session.set_dirty ();
995 Route::ab_plugins (bool forward)
997 Glib::RWLock::ReaderLock lm (_processor_lock);
1001 /* forward = turn off all active redirects, and mark them so that the next time
1002 we go the other way, we will revert them
1005 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1006 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1010 if ((*i)->active()) {
1011 (*i)->set_active (false);
1012 (*i)->set_next_ab_is_active (true);
1014 (*i)->set_next_ab_is_active (false);
1020 /* backward = if the redirect was marked to go active on the next ab, do so */
1022 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1024 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1028 if ((*i)->get_next_ab_is_active()) {
1029 (*i)->set_active (true);
1031 (*i)->set_active (false);
1036 _session.set_dirty ();
1040 /* Figure out the streams that will feed into PreFader */
1042 Route::pre_fader_streams() const
1044 boost::shared_ptr<Processor> processor;
1046 // Find the last pre-fader redirect
1047 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1048 if ((*i)->placement() == PreFader) {
1054 return processor->output_streams();
1061 /** Remove processors with a given placement.
1062 * @param p Placement of processors to remove.
1065 Route::clear_processors (Placement p)
1067 const ChanCount old_rmo = processor_max_outs;
1069 if (!_session.engine().connected()) {
1074 Glib::RWLock::WriterLock lm (_processor_lock);
1075 ProcessorList new_list;
1077 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1078 if ((*i)->placement() == p) {
1079 /* it's the placement we want to get rid of */
1080 (*i)->drop_references ();
1082 /* it's a different placement, so keep it */
1083 new_list.push_back (*i);
1087 _processors = new_list;
1090 /* FIXME: can't see how this test can ever fire */
1091 if (processor_max_outs != old_rmo) {
1095 processor_max_outs.reset();
1096 _have_internal_generator = false;
1097 processors_changed (); /* EMIT SIGNAL */
1101 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1103 ChanCount old_rmo = processor_max_outs;
1105 if (!_session.engine().connected()) {
1109 processor_max_outs.reset();
1112 Glib::RWLock::WriterLock lm (_processor_lock);
1113 ProcessorList::iterator i;
1114 bool removed = false;
1116 for (i = _processors.begin(); i != _processors.end(); ++i) {
1117 if (*i == processor) {
1119 ProcessorList::iterator tmp;
1121 /* move along, see failure case for reset_plugin_counts()
1122 where we may need to reprocessor the processor.
1128 /* stop redirects that send signals to JACK ports
1129 from causing noise as a result of no longer being
1133 boost::shared_ptr<IOProcessor> redirect;
1135 if ((redirect = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1136 redirect->io()->disconnect_inputs (this);
1137 redirect->io()->disconnect_outputs (this);
1140 _processors.erase (i);
1155 if (_reset_plugin_counts (err)) {
1156 /* get back to where we where */
1157 _processors.insert (i, processor);
1158 /* we know this will work, because it worked before :) */
1159 _reset_plugin_counts (0);
1165 for (i = _processors.begin(); i != _processors.end(); ++i) {
1166 boost::shared_ptr<PluginInsert> pi;
1168 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1169 if (pi->is_generator()) {
1175 _have_internal_generator = foo;
1178 if (old_rmo != processor_max_outs) {
1182 processor->drop_references ();
1184 processors_changed (); /* EMIT SIGNAL */
1189 Route::reset_plugin_counts (ProcessorStreams* err)
1191 Glib::RWLock::WriterLock lm (_processor_lock);
1192 return _reset_plugin_counts (err);
1197 Route::_reset_plugin_counts (ProcessorStreams* err)
1199 ProcessorList::iterator r;
1200 map<Placement,list<ProcessorCount> > processor_map;
1201 ChanCount initial_streams;
1202 ChanCount post_fader_input;
1205 /* Process each placement in order, checking to see if we
1206 can really do what has been requested.
1209 /* divide processors up by placement so we get the signal flow
1210 properly modelled. we need to do this because the _processors
1211 list is not sorted by placement, and because other reasons may
1212 exist now or in the future for this separate treatment.
1215 /* ... but it should/will be... */
1217 for (r = _processors.begin(); r != _processors.end(); ++r) {
1219 boost::shared_ptr<Processor> processor;
1221 if ((processor = boost::dynamic_pointer_cast<Processor>(*r)) != 0) {
1222 processor_map[processor->placement()].push_back (ProcessorCount (processor));
1228 if ( ! check_some_plugin_counts (processor_map[PreFader], n_inputs (), err)) {
1232 post_fader_input = (err ? err->count : n_inputs());
1236 if ( ! check_some_plugin_counts (processor_map[PostFader], post_fader_input, err)) {
1240 /* OK, everything can be set up correctly, so lets do it */
1242 apply_some_plugin_counts (processor_map[PreFader]);
1243 apply_some_plugin_counts (processor_map[PostFader]);
1245 /* recompute max outs of any processor */
1250 processor_max_outs.reset();
1252 for (r = _processors.begin(); r != _processors.end(); ++r) {
1253 processor_max_outs = max ((*r)->output_streams (), processor_max_outs);
1260 Route::apply_some_plugin_counts (list<ProcessorCount>& iclist)
1262 list<ProcessorCount>::iterator i;
1264 for (i = iclist.begin(); i != iclist.end(); ++i) {
1266 cerr << "now applying for " << (*i).processor->name() << " in = " << (*i).in.n_audio() << " out = " << (*i).out.n_audio() << endl;
1268 if ((*i).processor->configure_io ((*i).in, (*i).out)) {
1271 /* make sure that however many we have, they are all active */
1272 (*i).processor->activate ();
1278 /** Returns whether \a iclist can be configured and run starting with
1279 * \a required_inputs at the first processor's inputs.
1280 * If false is returned, \a iclist can not be run with \a required_inputs, and \a err is set.
1281 * Otherwise, \a err is set to the output of the list.
1284 Route::check_some_plugin_counts (list<ProcessorCount>& iclist, ChanCount required_inputs, ProcessorStreams* err)
1286 list<ProcessorCount>::iterator i;
1291 err->count = required_inputs;
1294 for (i = iclist.begin(); i != iclist.end(); ++i) {
1297 cerr << "Checking whether " << (*i).processor->name() << " can support " << required_inputs.n_audio() << " inputs\n";
1299 if ((*i).processor->can_support_input_configuration (required_inputs) < 0) {
1302 err->count = required_inputs;
1307 (*i).in = required_inputs;
1308 (*i).out = (*i).processor->output_for_input_configuration (required_inputs);
1310 cerr << "config looks like " << (*i).processor->name() << " in = " << (*i).in.n_audio() << " out = " << (*i).out.n_audio() << endl;
1312 required_inputs = (*i).out;
1318 if (!iclist.empty()) {
1320 err->count = iclist.back().processor->output_for_input_configuration(required_inputs);
1328 Route::copy_processors (const Route& other, Placement placement, ProcessorStreams* err)
1330 ChanCount old_rmo = processor_max_outs;
1332 ProcessorList to_be_deleted;
1335 Glib::RWLock::WriterLock lm (_processor_lock);
1336 ProcessorList::iterator tmp;
1337 ProcessorList the_copy;
1339 the_copy = _processors;
1341 /* remove all relevant processors */
1343 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ) {
1347 if ((*i)->placement() == placement) {
1348 to_be_deleted.push_back (*i);
1349 _processors.erase (i);
1355 /* now copy the relevant ones from "other" */
1357 for (ProcessorList::const_iterator i = other._processors.begin(); i != other._processors.end(); ++i) {
1358 if ((*i)->placement() == placement) {
1359 _processors.push_back (IOProcessor::clone (*i));
1363 /* reset plugin stream handling */
1365 if (_reset_plugin_counts (err)) {
1367 /* FAILED COPY ATTEMPT: we have to restore order */
1369 /* delete all cloned processors */
1371 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ) {
1376 if ((*i)->placement() == placement) {
1377 _processors.erase (i);
1383 /* restore the natural order */
1385 _processors = the_copy;
1386 processor_max_outs = old_rmo;
1388 /* we failed, even though things are OK again */
1394 /* SUCCESSFUL COPY ATTEMPT: delete the processors we removed pre-copy */
1395 to_be_deleted.clear ();
1400 if (processor_max_outs != old_rmo || old_rmo == ChanCount::ZERO) {
1404 processors_changed (); /* EMIT SIGNAL */
1409 Route::all_processors_flip ()
1411 Glib::RWLock::ReaderLock lm (_processor_lock);
1413 if (_processors.empty()) {
1417 bool first_is_on = _processors.front()->active();
1419 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1420 (*i)->set_active (!first_is_on);
1423 _session.set_dirty ();
1426 /** Set all processors with a given placement to a given active state.
1427 * @param p Placement of processors to change.
1428 * @param state New active state for those processors.
1431 Route::all_processors_active (Placement p, bool state)
1433 Glib::RWLock::ReaderLock lm (_processor_lock);
1435 if (_processors.empty()) {
1439 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1440 if ((*i)->placement() == p) {
1441 (*i)->set_active (state);
1445 _session.set_dirty ();
1448 struct ProcessorSorter {
1449 bool operator() (boost::shared_ptr<const Processor> a, boost::shared_ptr<const Processor> b) {
1450 return a->sort_key() < b->sort_key();
1455 Route::sort_processors (ProcessorStreams* err)
1458 ProcessorSorter comparator;
1459 Glib::RWLock::WriterLock lm (_processor_lock);
1460 ChanCount old_rmo = processor_max_outs;
1462 /* the sweet power of C++ ... */
1464 ProcessorList as_it_was_before = _processors;
1466 _processors.sort (comparator);
1468 if (_reset_plugin_counts (err)) {
1469 _processors = as_it_was_before;
1470 processor_max_outs = old_rmo;
1476 processors_changed (); /* EMIT SIGNAL */
1488 Route::get_template()
1490 return state(false);
1494 Route::state(bool full_state)
1496 XMLNode *node = new XMLNode("Route");
1497 ProcessorList::iterator i;
1501 node->add_property("flags", enum_2_string (_flags));
1504 node->add_property("default-type", _default_type.to_string());
1506 node->add_property("active", _active?"yes":"no");
1507 node->add_property("muted", _muted?"yes":"no");
1508 node->add_property("soloed", _soloed?"yes":"no");
1509 node->add_property("phase-invert", _phase_invert?"yes":"no");
1510 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1511 node->add_property("mute-affects-pre-fader", _mute_affects_pre_fader?"yes":"no");
1512 node->add_property("mute-affects-post-fader", _mute_affects_post_fader?"yes":"no");
1513 node->add_property("mute-affects-control-outs", _mute_affects_control_outs?"yes":"no");
1514 node->add_property("mute-affects-main-outs", _mute_affects_main_outs?"yes":"no");
1517 node->add_property("edit-group", _edit_group->name());
1520 node->add_property("mix-group", _mix_group->name());
1523 string order_string;
1524 OrderKeys::iterator x = order_keys.begin();
1526 while (x != order_keys.end()) {
1527 order_string += string ((*x).first);
1528 order_string += '=';
1529 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1530 order_string += buf;
1534 if (x == order_keys.end()) {
1538 order_string += ':';
1540 node->add_property ("order-keys", order_string);
1542 node->add_child_nocopy (IO::state (full_state));
1543 node->add_child_nocopy (_solo_control->get_state ());
1544 node->add_child_nocopy (_mute_control->get_state ());
1546 XMLNode* remote_control_node = new XMLNode (X_("remote_control"));
1547 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1548 remote_control_node->add_property (X_("id"), buf);
1549 node->add_child_nocopy (*remote_control_node);
1551 if (_control_outs) {
1552 XMLNode* cnode = new XMLNode (X_("ControlOuts"));
1553 cnode->add_child_nocopy (_control_outs->state (full_state));
1554 node->add_child_nocopy (*cnode);
1557 if (_comment.length()) {
1558 XMLNode *cmt = node->add_child ("Comment");
1559 cmt->add_content (_comment);
1562 for (i = _processors.begin(); i != _processors.end(); ++i) {
1563 node->add_child_nocopy((*i)->state (full_state));
1567 node->add_child_copy (*_extra_xml);
1574 Route::get_processor_state ()
1576 XMLNode* root = new XMLNode (X_("redirects"));
1577 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1578 root->add_child_nocopy ((*i)->state (true));
1585 Route::set_processor_state (const XMLNode& root)
1587 if (root.name() != X_("redirects")) {
1593 XMLNodeConstIterator iter;
1594 XMLNodeConstIterator niter;
1595 Glib::RWLock::ReaderLock lm (_processor_lock);
1597 nlist = root.children();
1599 for (iter = nlist.begin(); iter != nlist.end(); ++iter){
1601 /* iter now points to a IOProcessor state node */
1603 nnlist = (*iter)->children ();
1605 for (niter = nnlist.begin(); niter != nnlist.end(); ++niter) {
1607 /* find the IO child node, since it contains the ID we need */
1609 /* XXX OOP encapsulation violation, ugh */
1611 if ((*niter)->name() == IO::state_node_name) {
1613 XMLProperty* prop = (*niter)->property (X_("id"));
1616 warning << _("IOProcessor node has no ID, ignored") << endmsg;
1620 ID id = prop->value ();
1622 /* now look for a processor with that ID */
1624 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1625 if ((*i)->id() == id) {
1626 (*i)->set_state (**iter);
1642 Route::set_deferred_state ()
1645 XMLNodeConstIterator niter;
1647 if (!deferred_state) {
1651 nlist = deferred_state->children();
1653 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1654 add_processor_from_xml (**niter);
1657 delete deferred_state;
1662 Route::add_processor_from_xml (const XMLNode& node)
1664 const XMLProperty *prop;
1666 // legacy sessions use a different node name for sends
1667 if (node.name() == "Send") {
1670 boost::shared_ptr<Send> send (new Send (_session, node));
1671 add_processor (send);
1674 catch (failed_constructor &err) {
1675 error << _("Send construction failed") << endmsg;
1679 // use "Processor" in XML?
1680 } else if (node.name() == "Processor") {
1683 if ((prop = node.property ("type")) != 0) {
1685 boost::shared_ptr<Processor> processor;
1686 bool have_insert = false;
1688 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1689 prop->value() == "lv2" ||
1690 prop->value() == "vst" ||
1691 prop->value() == "audiounit") {
1693 processor.reset (new PluginInsert(_session, node));
1696 } else if (prop->value() == "port") {
1698 processor.reset (new PortInsert (_session, node));
1700 } else if (prop->value() == "send") {
1702 processor.reset (new Send (_session, node));
1707 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
1710 add_processor (processor);
1713 error << _("Processor XML node has no type property") << endmsg;
1717 catch (failed_constructor &err) {
1718 warning << _("processor could not be created. Ignored.") << endmsg;
1725 Route::set_state (const XMLNode& node)
1727 return _set_state (node, true);
1731 Route::_set_state (const XMLNode& node, bool call_base)
1734 XMLNodeConstIterator niter;
1736 XMLPropertyList plist;
1737 const XMLProperty *prop;
1739 if (node.name() != "Route"){
1740 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1744 if ((prop = node.property (X_("flags"))) != 0) {
1745 _flags = Flag (string_2_enum (prop->value(), _flags));
1750 if ((prop = node.property (X_("default-type"))) != 0) {
1751 _default_type = DataType(prop->value());
1752 assert(_default_type != DataType::NIL);
1755 if ((prop = node.property (X_("phase-invert"))) != 0) {
1756 set_phase_invert (prop->value()=="yes"?true:false, this);
1759 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1760 set_denormal_protection (prop->value()=="yes"?true:false, this);
1764 if ((prop = node.property (X_("active"))) != 0) {
1765 set_active (prop->value() == "yes");
1768 if ((prop = node.property (X_("muted"))) != 0) {
1769 bool yn = prop->value()=="yes"?true:false;
1771 /* force reset of mute status */
1775 mute_gain = desired_mute_gain;
1778 if ((prop = node.property (X_("soloed"))) != 0) {
1779 bool yn = prop->value()=="yes"?true:false;
1781 /* force reset of solo status */
1784 set_solo (yn, this);
1785 solo_gain = desired_solo_gain;
1788 if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
1789 _mute_affects_pre_fader = (prop->value()=="yes")?true:false;
1792 if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
1793 _mute_affects_post_fader = (prop->value()=="yes")?true:false;
1796 if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
1797 _mute_affects_control_outs = (prop->value()=="yes")?true:false;
1800 if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
1801 _mute_affects_main_outs = (prop->value()=="yes")?true:false;
1804 if ((prop = node.property (X_("edit-group"))) != 0) {
1805 RouteGroup* edit_group = _session.edit_group_by_name(prop->value());
1806 if(edit_group == 0) {
1807 error << string_compose(_("Route %1: unknown edit group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1809 set_edit_group(edit_group, this);
1813 if ((prop = node.property (X_("order-keys"))) != 0) {
1817 string::size_type colon, equal;
1818 string remaining = prop->value();
1820 while (remaining.length()) {
1822 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1823 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1826 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1827 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1830 set_order_key (remaining.substr (0, equal).c_str(), n);
1834 colon = remaining.find_first_of (':');
1836 if (colon != string::npos) {
1837 remaining = remaining.substr (colon+1);
1844 nlist = node.children();
1846 if (deferred_state) {
1847 delete deferred_state;
1850 deferred_state = new XMLNode(X_("deferred state"));
1852 /* set parent class properties before anything else */
1854 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1858 if (child->name() == IO::state_node_name && call_base) {
1860 IO::set_state (*child);
1865 XMLNodeList processor_nodes;
1867 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1871 if (child->name() == X_("Send") || child->name() == X_("Processor")) {
1872 processor_nodes.push_back(child);
1877 _set_processor_states(processor_nodes);
1880 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1882 // All processors have been applied already
1884 if (child->name() == X_("Automation")) {
1886 if ((prop = child->property (X_("path"))) != 0) {
1887 load_automation (prop->value());
1890 } else if (child->name() == X_("ControlOuts")) {
1892 string coutname = _name;
1893 coutname += _("[control]");
1895 _control_outs = new IO (_session, coutname);
1896 _control_outs->set_state (**(child->children().begin()));
1898 } else if (child->name() == X_("Comment")) {
1900 /* XXX this is a terrible API design in libxml++ */
1902 XMLNode *cmt = *(child->children().begin());
1903 _comment = cmt->content();
1905 } else if (child->name() == X_("extra")) {
1907 _extra_xml = new XMLNode (*child);
1909 } else if (child->name() == X_("controllable") && (prop = child->property("name")) != 0) {
1911 if (prop->value() == "solo") {
1912 _solo_control->set_state (*child);
1913 _session.add_controllable (_solo_control);
1915 else if (prop->value() == "mute") {
1916 _mute_control->set_state (*child);
1917 _session.add_controllable (_mute_control);
1920 else if (child->name() == X_("remote_control")) {
1921 if ((prop = child->property (X_("id"))) != 0) {
1923 sscanf (prop->value().c_str(), "%d", &x);
1924 set_remote_control_id (x);
1929 if ((prop = node.property (X_("mix-group"))) != 0) {
1930 RouteGroup* mix_group = _session.mix_group_by_name(prop->value());
1931 if (mix_group == 0) {
1932 error << string_compose(_("Route %1: unknown mix group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1934 set_mix_group(mix_group, this);
1942 Route::_set_processor_states(const XMLNodeList &nlist)
1944 XMLNodeConstIterator niter;
1947 ProcessorList::iterator i, o;
1949 // Iterate through existing processors, remove those which are not in the state list
1950 for (i = _processors.begin(); i != _processors.end(); ) {
1951 ProcessorList::iterator tmp = i;
1954 bool processorInStateList = false;
1956 (*i)->id().print (buf, sizeof (buf));
1959 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1961 // legacy sessions (IOProcessor as a child of Processor, both is-a IO)
1962 if (strncmp(buf,(*niter)->child(X_("IOProcessor"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1963 processorInStateList = true;
1965 } else if (strncmp(buf,(*niter)->property(X_("id"))->value().c_str(), sizeof(buf)) == 0) {
1966 processorInStateList = true;
1971 if (!processorInStateList) {
1972 remove_processor (*i);
1980 // Iterate through state list and make sure all processors are on the track and in the correct order,
1981 // set the state of existing processors according to the new state on the same go
1982 i = _processors.begin();
1983 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1985 // Check whether the next processor in the list
1988 while (o != _processors.end()) {
1989 (*o)->id().print (buf, sizeof (buf));
1990 if ( strncmp(buf, (*niter)->child(X_("IOProcessor"))->child(X_("IO"))->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1992 else if (strncmp(buf,(*niter)->property(X_("id"))->value().c_str(), sizeof(buf)) == 0)
1998 if (o == _processors.end()) {
1999 // If the processor (*niter) is not on the route, we need to create it
2000 // and move it to the correct location
2002 ProcessorList::iterator prev_last = _processors.end();
2003 --prev_last; // We need this to check whether adding succeeded
2005 add_processor_from_xml (**niter);
2007 ProcessorList::iterator last = _processors.end();
2010 if (prev_last == last) {
2011 cerr << "Could not fully restore state as some processors were not possible to create" << endl;
2016 boost::shared_ptr<Processor> tmp = (*last);
2017 // remove the processor from the wrong location
2018 _processors.erase(last);
2019 // processor the new processor at the current location
2020 _processors.insert(i, tmp);
2022 --i; // move pointer to the newly processored processor
2026 // We found the processor (*niter) on the route, first we must make sure the processor
2027 // is at the location provided in the XML state
2029 boost::shared_ptr<Processor> tmp = (*o);
2030 // remove the old copy
2031 _processors.erase(o);
2032 // processor the processor at the correct location
2033 _processors.insert(i, tmp);
2035 --i; // move pointer so it points to the right processor
2038 (*i)->set_state( (**niter) );
2041 processors_changed ();
2045 Route::curve_reallocate ()
2047 // _gain_automation_curve.finish_resize ();
2048 // _pan_automation_curve.finish_resize ();
2052 Route::silence (nframes_t nframes, nframes_t offset)
2056 IO::silence (nframes, offset);
2058 if (_control_outs) {
2059 _control_outs->silence (nframes, offset);
2063 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2066 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2067 boost::shared_ptr<PluginInsert> pi;
2068 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2069 // skip plugins, they don't need anything when we're not active
2073 (*i)->silence (nframes, offset);
2076 if (nframes == _session.get_block_size() && offset == 0) {
2086 Route::set_control_outs (const vector<string>& ports)
2088 Glib::Mutex::Lock lm (_control_outs_lock);
2089 vector<string>::const_iterator i;
2092 if (_control_outs) {
2093 delete _control_outs;
2097 if (is_control() || is_master()) {
2098 /* no control outs for these two special busses */
2102 if (ports.empty()) {
2106 string coutname = _name;
2107 coutname += _("[control]");
2109 _control_outs = new IO (_session, coutname);
2111 /* our control outs need as many outputs as we
2112 have audio outputs. we track the changes in ::output_change_handler().
2115 // XXX its stupid that we have to get this value twice
2117 limit = n_outputs().n_audio();
2119 if (_control_outs->ensure_io (ChanCount::ZERO, ChanCount (DataType::AUDIO, n_outputs().get (DataType::AUDIO)), true, this)) {
2123 /* now connect to the named ports */
2125 for (size_t n = 0; n < limit; ++n) {
2126 if (_control_outs->connect_output (_control_outs->output (n), ports[n % ports.size()], this)) {
2127 error << string_compose (_("could not connect %1 to %2"), _control_outs->output(n)->name(), ports[n]) << endmsg;
2136 Route::set_edit_group (RouteGroup *eg, void *src)
2139 if (eg == _edit_group) {
2144 _edit_group->remove (this);
2147 if ((_edit_group = eg) != 0) {
2148 _edit_group->add (this);
2151 _session.set_dirty ();
2152 edit_group_changed (src); /* EMIT SIGNAL */
2156 Route::drop_edit_group (void *src)
2159 _session.set_dirty ();
2160 edit_group_changed (src); /* EMIT SIGNAL */
2164 Route::set_mix_group (RouteGroup *mg, void *src)
2167 if (mg == _mix_group) {
2172 _mix_group->remove (this);
2175 if ((_mix_group = mg) != 0) {
2176 _mix_group->add (this);
2179 _session.set_dirty ();
2180 mix_group_changed (src); /* EMIT SIGNAL */
2184 Route::drop_mix_group (void *src)
2187 _session.set_dirty ();
2188 mix_group_changed (src); /* EMIT SIGNAL */
2192 Route::set_comment (string cmt, void *src)
2195 comment_changed (src);
2196 _session.set_dirty ();
2200 Route::feeds (boost::shared_ptr<Route> other)
2205 uint32_t no = self.n_outputs().n_total();
2206 uint32_t ni = other->n_inputs ().n_total();
2208 for (i = 0; i < no; ++i) {
2209 for (j = 0; j < ni; ++j) {
2210 if (self.output(i)->connected_to (other->input(j)->name())) {
2216 /* check IOProcessors which may also interconnect Routes */
2218 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2220 boost::shared_ptr<IOProcessor> redirect = boost::dynamic_pointer_cast<IOProcessor>(*r);
2225 // TODO: support internal redirects here
2227 no = redirect->io()->n_outputs().n_total();
2229 for (i = 0; i < no; ++i) {
2230 for (j = 0; j < ni; ++j) {
2231 if (redirect->io()->output(i)->connected_to (other->input (j)->name())) {
2238 /* check for control room outputs which may also interconnect Routes */
2240 if (_control_outs) {
2242 no = _control_outs->n_outputs().n_total();
2244 for (i = 0; i < no; ++i) {
2245 for (j = 0; j < ni; ++j) {
2246 if (_control_outs->output(i)->connected_to (other->input (j)->name())) {
2257 Route::set_mute_config (mute_type t, bool onoff, void *src)
2261 _mute_affects_pre_fader = onoff;
2262 pre_fader_changed(src); /* EMIT SIGNAL */
2266 _mute_affects_post_fader = onoff;
2267 post_fader_changed(src); /* EMIT SIGNAL */
2271 _mute_affects_control_outs = onoff;
2272 control_outs_changed(src); /* EMIT SIGNAL */
2276 _mute_affects_main_outs = onoff;
2277 main_outs_changed(src); /* EMIT SIGNAL */
2283 Route::get_mute_config (mute_type t)
2289 onoff = _mute_affects_pre_fader;
2292 onoff = _mute_affects_post_fader;
2295 onoff = _mute_affects_control_outs;
2298 onoff = _mute_affects_main_outs;
2306 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
2308 nframes_t now = _session.transport_frame();
2311 Glib::RWLock::ReaderLock lm (_processor_lock);
2314 automation_snapshot (now, true);
2317 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2319 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2320 (*i)->deactivate ();
2324 (*i)->transport_stopped (now);
2328 IO::transport_stopped (now);
2330 _roll_delay = _initial_delay;
2334 Route::input_change_handler (IOChange change, void *ignored)
2336 if (change & ConfigurationChanged) {
2337 reset_plugin_counts (0);
2342 Route::output_change_handler (IOChange change, void *ignored)
2344 if (change & ConfigurationChanged) {
2345 if (_control_outs) {
2346 _control_outs->ensure_io (ChanCount::ZERO, ChanCount(DataType::AUDIO, n_outputs().n_audio()), true, this);
2349 reset_plugin_counts (0);
2354 Route::pans_required () const
2356 if (n_outputs().n_audio() < 2) {
2360 return max (n_inputs ().n_audio(), processor_max_outs.n_audio());
2364 Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2365 bool session_state_changing, bool can_record, bool rec_monitors_input)
2367 if (n_outputs().n_total() == 0) {
2371 if (session_state_changing || !_active) {
2372 silence (nframes, offset);
2376 apply_gain_automation = false;
2378 if (n_inputs().n_total()) {
2379 passthru (start_frame, end_frame, nframes, offset, 0, false);
2381 silence (nframes, offset);
2388 Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
2390 if (_roll_delay > nframes) {
2392 _roll_delay -= nframes;
2393 silence (nframes, offset);
2394 /* transport frame is not legal for caller to use */
2397 } else if (_roll_delay > 0) {
2399 nframes -= _roll_delay;
2401 silence (_roll_delay, offset);
2403 offset += _roll_delay;
2404 transport_frame += _roll_delay;
2413 Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
2414 bool can_record, bool rec_monitors_input)
2417 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2419 // automation snapshot can also be called from the non-rt context
2420 // and it uses the processor list, so we take the lock out here
2421 automation_snapshot (_session.transport_frame(), false);
2425 if ((n_outputs().n_total() == 0 && _processors.empty()) || n_inputs().n_total() == 0 || !_active) {
2426 silence (nframes, offset);
2430 nframes_t unused = 0;
2432 if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
2438 apply_gain_automation = false;
2441 Glib::Mutex::Lock am (_automation_lock, Glib::TRY_LOCK);
2443 if (am.locked() && _session.transport_rolling()) {
2445 if (_gain_control->list()->automation_playback()) {
2446 apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector (
2447 start_frame, end_frame, _session.gain_automation_buffer(), nframes);
2452 passthru (start_frame, end_frame, nframes, offset, declick, false);
2458 Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset,
2459 bool can_record, bool rec_monitors_input)
2461 silence (nframes, offset);
2466 Route::toggle_monitor_input ()
2468 for (PortSet::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
2469 i->ensure_monitor_input( ! i->monitoring_input());
2474 Route::has_external_redirects () const
2476 // FIXME: what about sends?
2478 boost::shared_ptr<const PortInsert> pi;
2480 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2481 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2483 for (PortSet::const_iterator port = pi->io()->outputs().begin();
2484 port != pi->io()->outputs().end(); ++port) {
2486 string port_name = port->name();
2487 string client_name = port_name.substr (0, port_name.find(':'));
2489 /* only say "yes" if the redirect is actually in use */
2491 if (client_name != "ardour" && pi->active()) {
2502 Route::flush_processors ()
2504 /* XXX shouldn't really try to take this lock, since
2505 this is called from the RT audio thread.
2508 Glib::RWLock::ReaderLock lm (_processor_lock);
2510 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2511 (*i)->deactivate ();
2517 Route::set_meter_point (MeterPoint p, void *src)
2519 if (_meter_point != p) {
2521 meter_change (src); /* EMIT SIGNAL */
2522 _session.set_dirty ();
2527 Route::update_total_latency ()
2529 nframes_t old = _own_latency;
2531 if (_user_latency) {
2532 _own_latency = _user_latency;
2536 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2537 if ((*i)->active ()) {
2538 _own_latency += (*i)->signal_latency ();
2543 set_port_latency (_own_latency);
2545 if (!_user_latency) {
2546 /* this (virtual) function is used for pure Routes,
2547 not derived classes like AudioTrack. this means
2548 that the data processed here comes from an input
2549 port, not prerecorded material, and therefore we
2550 have to take into account any input latency.
2554 _own_latency += input_latency ();
2557 if (old != _own_latency) {
2558 signal_latency_changed (); /* EMIT SIGNAL */
2561 return _own_latency;
2565 Route::set_user_latency (nframes_t nframes)
2567 Latent::set_user_latency (nframes);
2568 _session.update_latency_compensation (false, false);
2572 Route::set_latency_delay (nframes_t longest_session_latency)
2574 nframes_t old = _initial_delay;
2576 if (_own_latency < longest_session_latency) {
2577 _initial_delay = longest_session_latency - _own_latency;
2582 if (_initial_delay != old) {
2583 initial_delay_changed (); /* EMIT SIGNAL */
2586 if (_session.transport_stopped()) {
2587 _roll_delay = _initial_delay;
2592 Route::automation_snapshot (nframes_t now, bool force)
2594 if (!force && !should_snapshot(now)) {
2598 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2599 // IO::automation_snapshot (now, force); ?
2600 (*i)->automation_snapshot (now, force);
2604 Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
2605 : Controllable (name), route (s), type(tp)
2611 Route::ToggleControllable::set_value (float val)
2613 bool bval = ((val >= 0.5f) ? true: false);
2617 route.set_mute (bval, this);
2620 route.set_solo (bval, this);
2628 Route::ToggleControllable::get_value (void) const
2634 val = route.muted() ? 1.0f : 0.0f;
2637 val = route.soloed() ? 1.0f : 0.0f;
2647 Route::set_block_size (nframes_t nframes)
2649 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2650 (*i)->set_block_size (nframes);
2655 Route::protect_automation ()
2657 Automatable::protect_automation();
2659 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2660 (*i)->protect_automation();
2664 Route::set_pending_declick (int declick)
2667 /* this call is not allowed to turn off a pending declick unless "force" is true */
2669 _pending_declick = declick;
2671 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2673 _pending_declick = 0;