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.
25 #include <sigc++/bind.h>
26 #include "pbd/xml++.h"
27 #include "pbd/enumwriter.h"
28 #include "pbd/stacktrace.h"
29 #include "pbd/memento_command.h"
31 #include "evoral/Curve.hpp"
33 #include "ardour/amp.h"
34 #include "ardour/audio_port.h"
35 #include "ardour/audioengine.h"
36 #include "ardour/buffer.h"
37 #include "ardour/buffer_set.h"
38 #include "ardour/configuration.h"
39 #include "ardour/cycle_timer.h"
40 #include "ardour/delivery.h"
41 #include "ardour/dB.h"
42 #include "ardour/internal_send.h"
43 #include "ardour/internal_return.h"
44 #include "ardour/ladspa_plugin.h"
45 #include "ardour/meter.h"
46 #include "ardour/mix.h"
47 #include "ardour/panner.h"
48 #include "ardour/plugin_insert.h"
49 #include "ardour/port.h"
50 #include "ardour/port_insert.h"
51 #include "ardour/processor.h"
52 #include "ardour/profile.h"
53 #include "ardour/route.h"
54 #include "ardour/route_group.h"
55 #include "ardour/send.h"
56 #include "ardour/session.h"
57 #include "ardour/timestamps.h"
58 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 uint32_t Route::order_key_cnt = 0;
67 sigc::signal<void,const char*> Route::SyncOrderKeys;
69 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
70 : SessionObject (sess, name)
71 , AutomatableControls (sess)
73 , _solo_control (new SoloControllable (X_("solo"), *this))
74 , _mute_master (new MuteMaster (sess, name))
75 , _default_type (default_type)
80 /* add standard processors other than amp (added by ::init()) */
82 _meter.reset (new PeakMeter (_session));
83 add_processor (_meter, PreFader);
85 if (_flags & ControlOut) {
86 /* where we listen to tracks */
87 _intreturn.reset (new InternalReturn (_session));
88 add_processor (_intreturn, PreFader);
91 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
92 add_processor (_main_outs, PostFader);
94 /* now that we have _meter, its safe to connect to this */
96 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
99 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
100 : SessionObject (sess, "toBeReset")
101 , AutomatableControls (sess)
102 , _solo_control (new SoloControllable (X_("solo"), *this))
103 , _mute_master (new MuteMaster (sess, "toBeReset"))
104 , _default_type (default_type)
108 _set_state (node, false);
110 /* now that we have _meter, its safe to connect to this */
112 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
119 _solo_isolated = false;
121 processor_max_streams.reset();
124 order_keys[strdup (N_("signal"))] = order_key_cnt++;
126 _meter_point = MeterPostFader;
129 _have_internal_generator = false;
130 _declickable = false;
131 _pending_declick = true;
132 _remote_control_id = 0;
133 _in_configure_processors = false;
138 _denormal_protection = false;
140 /* add standard controls */
142 add_control (_solo_control);
143 add_control (_mute_master);
145 /* input and output objects */
147 _input.reset (new IO (_session, _name, IO::Input, _default_type));
148 _output.reset (new IO (_session, _name, IO::Output, _default_type));
150 _input->changed.connect (mem_fun (this, &Route::input_change_handler));
151 _output->changed.connect (mem_fun (this, &Route::output_change_handler));
153 /* add amp processor */
155 _amp.reset (new Amp (_session, _mute_master));
156 add_processor (_amp, PostFader);
161 Metering::disconnect (_meter_connection);
163 clear_processors (PreFader);
164 clear_processors (PostFader);
166 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
167 free ((void*)(i->first));
172 Route::set_remote_control_id (uint32_t id)
174 if (id != _remote_control_id) {
175 _remote_control_id = id;
176 RemoteControlIDChanged ();
181 Route::remote_control_id() const
183 return _remote_control_id;
187 Route::order_key (const char* name) const
189 OrderKeys::const_iterator i;
191 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
192 if (!strcmp (name, i->first)) {
201 Route::set_order_key (const char* name, long n)
203 order_keys[strdup(name)] = n;
205 if (Config->get_sync_all_route_ordering()) {
206 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
211 _session.set_dirty ();
215 Route::sync_order_keys (const char* base)
217 if (order_keys.empty()) {
221 OrderKeys::iterator i;
224 if ((i = order_keys.find (base)) == order_keys.end()) {
225 /* key doesn't exist, use the first existing key (during session initialization) */
226 i = order_keys.begin();
230 /* key exists - use it and reset all others (actually, itself included) */
232 i = order_keys.begin();
235 for (; i != order_keys.end(); ++i) {
241 Route::ensure_track_or_route_name(string name, Session &session)
243 string newname = name;
245 while (session.route_by_name (newname) != NULL) {
246 newname = bump_name_once (newname);
254 Route::inc_gain (gain_t fraction, void *src)
256 _amp->inc_gain (fraction, src);
260 Route::set_gain (gain_t val, void *src)
262 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
264 if (_route_group->is_relative()) {
266 gain_t usable_gain = _amp->gain();
267 if (usable_gain < 0.000001f) {
268 usable_gain = 0.000001f;
272 if (delta < 0.000001f) {
276 delta -= usable_gain;
281 gain_t factor = delta / usable_gain;
284 factor = _route_group->get_max_factor(factor);
285 if (factor == 0.0f) {
286 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
290 factor = _route_group->get_min_factor(factor);
291 if (factor == 0.0f) {
292 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
297 _route_group->apply (&Route::inc_gain, factor, _route_group);
301 _route_group->apply (&Route::set_gain, val, _route_group);
307 if (val == _amp->gain()) {
311 _amp->set_gain (val, src);
314 /** Process this route for one (sub) cycle (process thread)
316 * @param bufs Scratch buffers to use for the signal path
317 * @param start_frame Initial transport frame
318 * @param end_frame Final transport frame
319 * @param nframes Number of frames to output (to ports)
321 * Note that (end_frame - start_frame) may not be equal to nframes when the
322 * transport speed isn't 1.0 (eg varispeed).
325 Route::process_output_buffers (BufferSet& bufs,
326 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
327 bool with_processors, int declick)
331 bufs.is_silent (false);
333 switch (Config->get_monitoring_model()) {
334 case HardwareMonitoring:
335 case ExternalMonitoring:
336 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
343 declick = _pending_declick;
346 /* figure out if we're going to use gain automation */
347 _amp->setup_gain_automation (start_frame, end_frame, nframes);
350 /* tell main outs what to do about monitoring */
351 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
354 /* -------------------------------------------------------------------------------------------
355 GLOBAL DECLICK (for transport changes etc.)
356 ----------------------------------------------------------------------------------------- */
359 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
360 } else if (declick < 0) {
361 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
364 _pending_declick = 0;
366 /* -------------------------------------------------------------------------------------------
367 DENORMAL CONTROL/PHASE INVERT
368 ----------------------------------------------------------------------------------------- */
374 if (_denormal_protection || Config->get_denormal_protection()) {
376 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
377 Sample* const sp = i->data();
379 if (_phase_invert & chn) {
380 for (nframes_t nx = 0; nx < nframes; ++nx) {
385 for (nframes_t nx = 0; nx < nframes; ++nx) {
393 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
394 Sample* const sp = i->data();
396 if (_phase_invert & chn) {
397 for (nframes_t nx = 0; nx < nframes; ++nx) {
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();
410 for (nframes_t nx = 0; nx < nframes; ++nx) {
418 /* -------------------------------------------------------------------------------------------
420 ----------------------------------------------------------------------------------------- */
422 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
425 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
426 bufs.set_count (ChanCount::max(bufs.count(), (*i)->input_streams()));
427 (*i)->run (bufs, start_frame, end_frame, nframes);
428 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
431 if (!_processors.empty()) {
432 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
438 Route::n_process_buffers ()
440 return max (_input->n_ports(), processor_max_streams);
444 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
446 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
450 assert (bufs.available() >= _input->n_ports());
452 if (_input->n_ports() == ChanCount::ZERO) {
456 bufs.set_count (_input->n_ports());
458 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
460 BufferSet::iterator o = bufs.begin(*t);
461 PortSet& ports (_input->ports());
463 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
464 o->read_from (i->get_buffer(nframes), nframes);
468 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
472 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
474 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, true, declick);
478 Route::set_solo (bool yn, void *src)
480 if (_solo_safe || _solo_isolated) {
484 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
485 _route_group->apply (&Route::set_solo, yn, _route_group);
489 if (soloed() != yn) {
490 mod_solo_level (yn ? 1 : -1);
491 solo_changed (src); /* EMIT SIGNAL */
492 _solo_control->Changed (); /* EMIT SIGNAL */
497 Route::mod_solo_level (int32_t delta)
500 if (_solo_level >= (uint32_t) delta) {
501 _solo_level += delta;
506 _solo_level += delta;
509 /* tell "special" delivery units what the solo situation is
512 switch (Config->get_solo_model()) {
514 /* main outs are used for soloing */
515 _main_outs->set_solo_level (_solo_level);
516 _main_outs->set_solo_isolated (_solo_isolated);
518 /* control outs just keep on playing */
519 _control_outs->set_solo_level (0);
520 _control_outs->set_solo_isolated (true);
526 /* control outs are used for soloing */
528 _control_outs->set_solo_level (_solo_level);
529 _control_outs->set_solo_isolated (_solo_isolated);
531 /* main outs just keep on playing */
532 _main_outs->set_solo_level (0);
533 _main_outs->set_solo_isolated (true);
539 Route::set_solo_isolated (bool yn, void *src)
541 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
542 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
546 if (yn != _solo_isolated) {
549 /* tell "special" delivery units what the solo situation is
552 switch (Config->get_solo_model()) {
554 _main_outs->set_solo_level (_solo_level);
555 _main_outs->set_solo_isolated (_solo_isolated);
557 _main_outs->set_solo_level (1);
558 _main_outs->set_solo_isolated (false);
564 _control_outs->set_solo_level (_solo_level);
565 _control_outs->set_solo_isolated (_solo_isolated);
567 _main_outs->set_solo_level (1);
568 _main_outs->set_solo_isolated (false);
572 solo_isolated_changed (src);
577 Route::solo_isolated () const
579 return _solo_isolated;
583 Route::set_mute (bool yn, void *src)
585 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
586 _route_group->apply (&Route::set_mute, yn, _route_group);
591 _mute_master->mute (yn);
599 return _mute_master->muted ();
604 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
606 cerr << name << " {" << endl;
607 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
608 p != procs.end(); ++p) {
609 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
616 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
618 ProcessorList::iterator loc;
620 /* XXX this is not thread safe - we don't hold the lock across determining the iter
621 to add before and actually doing the insertion. dammit.
624 if (placement == PreFader) {
625 /* generic pre-fader: insert immediately before the amp */
626 loc = find(_processors.begin(), _processors.end(), _amp);
628 /* generic post-fader: insert at end */
629 loc = _processors.end();
631 if (processor->visible() && !_processors.empty()) {
632 /* check for invisible processors stacked at the end and leave them there */
633 ProcessorList::iterator p;
634 p = _processors.end();
636 while (!(*p)->visible() && p != _processors.begin()) {
644 return add_processor (processor, loc, err);
648 /** Add a processor to the route.
649 * If @a iter is not NULL, it must point to an iterator in _processors and the new
650 * processor will be inserted immediately before this location. Otherwise,
651 * @a position is used.
654 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
656 ChanCount old_pms = processor_max_streams;
658 if (!_session.engine().connected() || !processor) {
663 Glib::RWLock::WriterLock lm (_processor_lock);
665 boost::shared_ptr<PluginInsert> pi;
666 boost::shared_ptr<PortInsert> porti;
668 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
670 if (processor == _amp || processor == _meter || processor == _main_outs) {
671 // Ensure only one of these are in the list at any time
672 if (loc != _processors.end()) {
673 if (iter == loc) { // Already in place, do nothing
675 } else { // New position given, relocate
676 _processors.erase (loc);
681 if (loc != _processors.end()) {
682 cerr << "ERROR: Processor added to route twice!" << endl;
689 _processors.insert (loc, processor);
691 // Set up processor list channels. This will set processor->[input|output]_streams(),
692 // configure redirect ports properly, etc.
695 if (configure_processors_unlocked (err)) {
696 ProcessorList::iterator ploc = loc;
698 _processors.erase(ploc);
699 configure_processors_unlocked (0); // it worked before we tried to add it ...
700 cerr << "configure failed\n";
704 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
706 if (pi->natural_input_streams() == ChanCount::ZERO) {
707 /* generator plugin */
708 _have_internal_generator = true;
713 // XXX: do we want to emit the signal here ? change call order.
714 processor->activate ();
715 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
717 _output->set_user_latency (0);
720 processors_changed (); /* EMIT SIGNAL */
726 Route::add_processor_from_xml (const XMLNode& node, Placement placement)
728 ProcessorList::iterator loc;
730 if (placement == PreFader) {
731 /* generic pre-fader: insert immediately before the amp */
732 loc = find(_processors.begin(), _processors.end(), _amp);
734 /* generic post-fader: insert at end */
735 loc = _processors.end();
738 return add_processor_from_xml (node, loc);
742 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
744 const XMLProperty *prop;
746 // legacy sessions use a different node name for sends
747 if (node.name() == "Send") {
750 boost::shared_ptr<Send> send (new Send (_session, _mute_master, node));
751 add_processor (send, iter);
755 catch (failed_constructor &err) {
756 error << _("Send construction failed") << endmsg;
760 } else if (node.name() == "Processor") {
763 if ((prop = node.property ("type")) != 0) {
765 boost::shared_ptr<Processor> processor;
767 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
768 prop->value() == "lv2" ||
769 prop->value() == "vst" ||
770 prop->value() == "audiounit") {
772 processor.reset (new PluginInsert(_session, node));
774 } else if (prop->value() == "port") {
776 processor.reset (new PortInsert (_session, _mute_master, node));
778 } else if (prop->value() == "send") {
780 processor.reset (new Send (_session, _mute_master, node));
782 } else if (prop->value() == "meter") {
785 if (_meter->set_state (node)) {
792 _meter.reset (new PeakMeter (_session, node));
795 } else if (prop->value() == "amp") {
797 /* amp always exists */
800 if (processor->set_state (node)) {
803 /* never any reason to add it */
807 } else if (prop->value() == "listen" || prop->value() == "deliver") {
809 /* XXX need to generalize */
811 } else if (prop->value() == "intsend") {
813 processor.reset (new InternalSend (_session, _mute_master, node));
815 } else if (prop->value() == "intreturn") {
818 if (_intreturn->set_state (node)) {
824 _intreturn.reset (new InternalReturn (_session, node));
825 processor = _intreturn;
827 } else if (prop->value() == "main-outs") {
830 if (_main_outs->set_state (node)) {
837 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
838 processor = _main_outs;
841 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
844 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
845 /* check for invisible processors stacked at the end and leave them there */
846 ProcessorList::iterator p;
847 p = _processors.end();
849 while (!(*p)->visible() && p != _processors.begin()) {
856 return (add_processor (processor, iter) == 0);
859 error << _("Processor XML node has no type property") << endmsg;
863 catch (failed_constructor &err) {
864 warning << _("processor could not be created. Ignored.") << endmsg;
872 Route::add_processors (const ProcessorList& others, Placement placement, ProcessorStreams* err)
874 ProcessorList::iterator loc;
875 if (placement == PreFader) {
876 /* generic pre-fader: insert immediately before the amp */
877 loc = find(_processors.begin(), _processors.end(), _amp);
879 /* generic post-fader: insert at end */
880 loc = _processors.end();
882 if (!_processors.empty()) {
883 /* check for invisible processors stacked at the end and leave them there */
884 ProcessorList::iterator p;
885 p = _processors.end();
887 cerr << "Let's check " << (*p)->name() << " vis ? " << (*p)->visible() << endl;
888 while (!(*p)->visible() && p != _processors.begin()) {
896 return add_processors (others, loc, err);
900 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
902 /* NOTE: this is intended to be used ONLY when copying
903 processors from another Route. Hence the subtle
904 differences between this and ::add_processor()
907 ChanCount old_pms = processor_max_streams;
909 if (!_session.engine().connected()) {
913 if (others.empty()) {
918 Glib::RWLock::WriterLock lm (_processor_lock);
919 ProcessorList::iterator existing_end = _processors.end();
922 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
924 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
926 // Ensure meter only appears in the list once
928 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
929 if (m != _processors.end()) {
930 _processors.erase(m);
934 boost::shared_ptr<PluginInsert> pi;
936 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
939 ChanCount m = max(pi->input_streams(), pi->output_streams());
940 if (m > potential_max_streams)
941 potential_max_streams = m;
944 _processors.insert (iter, *i);
946 if (configure_processors_unlocked (err)) {
948 _processors.erase (existing_end, _processors.end());
949 configure_processors_unlocked (0); // it worked before we tried to add it ...
953 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
956 _output->set_user_latency (0);
959 processors_changed (); /* EMIT SIGNAL */
965 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
968 start = _processors.begin();
969 end = find(_processors.begin(), _processors.end(), _amp);
971 start = find(_processors.begin(), _processors.end(), _amp);
973 end = _processors.end();
977 /** Turn off all processors with a given placement
978 * @param p Placement of processors to disable
981 Route::disable_processors (Placement p)
983 Glib::RWLock::ReaderLock lm (_processor_lock);
985 ProcessorList::iterator start, end;
986 placement_range(p, start, end);
988 for (ProcessorList::iterator i = start; i != end; ++i) {
992 _session.set_dirty ();
995 /** Turn off all redirects
998 Route::disable_processors ()
1000 Glib::RWLock::ReaderLock lm (_processor_lock);
1002 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1003 (*i)->deactivate ();
1006 _session.set_dirty ();
1009 /** Turn off all redirects with a given placement
1010 * @param p Placement of redirects to disable
1013 Route::disable_plugins (Placement p)
1015 Glib::RWLock::ReaderLock lm (_processor_lock);
1017 ProcessorList::iterator start, end;
1018 placement_range(p, start, end);
1020 for (ProcessorList::iterator i = start; i != end; ++i) {
1021 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1022 (*i)->deactivate ();
1026 _session.set_dirty ();
1029 /** Turn off all plugins
1032 Route::disable_plugins ()
1034 Glib::RWLock::ReaderLock lm (_processor_lock);
1036 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1037 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1038 (*i)->deactivate ();
1042 _session.set_dirty ();
1047 Route::ab_plugins (bool forward)
1049 Glib::RWLock::ReaderLock lm (_processor_lock);
1053 /* forward = turn off all active redirects, and mark them so that the next time
1054 we go the other way, we will revert them
1057 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1058 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1062 if ((*i)->active()) {
1063 (*i)->deactivate ();
1064 (*i)->set_next_ab_is_active (true);
1066 (*i)->set_next_ab_is_active (false);
1072 /* backward = if the redirect was marked to go active on the next ab, do so */
1074 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1076 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1080 if ((*i)->get_next_ab_is_active()) {
1083 (*i)->deactivate ();
1088 _session.set_dirty ();
1092 /** Remove processors with a given placement.
1093 * @param p Placement of processors to remove.
1096 Route::clear_processors (Placement p)
1098 const ChanCount old_pms = processor_max_streams;
1100 if (!_session.engine().connected()) {
1104 bool already_deleting = _session.deletion_in_progress();
1105 if (!already_deleting) {
1106 _session.set_deletion_in_progress();
1110 Glib::RWLock::WriterLock lm (_processor_lock);
1111 ProcessorList new_list;
1112 ProcessorStreams err;
1114 ProcessorList::iterator amp_loc = find(_processors.begin(), _processors.end(), _amp);
1115 if (p == PreFader) {
1116 // Get rid of PreFader processors
1117 for (ProcessorList::iterator i = _processors.begin(); i != amp_loc; ++i) {
1118 (*i)->drop_references ();
1121 for (ProcessorList::iterator i = amp_loc; i != _processors.end(); ++i) {
1122 new_list.push_back (*i);
1125 // Keep PreFader processors
1126 for (ProcessorList::iterator i = _processors.begin(); i != amp_loc; ++i) {
1127 new_list.push_back (*i);
1129 new_list.push_back (_amp);
1130 // Get rid of PostFader processors
1131 for (ProcessorList::iterator i = amp_loc; i != _processors.end(); ++i) {
1132 (*i)->drop_references ();
1136 _processors = new_list;
1137 configure_processors_unlocked (&err); // this can't fail
1140 processor_max_streams.reset();
1141 _have_internal_generator = false;
1142 processors_changed (); /* EMIT SIGNAL */
1144 if (!already_deleting) {
1145 _session.clear_deletion_in_progress();
1150 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1152 /* these can never be removed */
1154 if (processor == _amp || processor == _meter || processor == _main_outs) {
1158 ChanCount old_pms = processor_max_streams;
1160 if (!_session.engine().connected()) {
1164 processor_max_streams.reset();
1167 Glib::RWLock::WriterLock lm (_processor_lock);
1168 ProcessorList::iterator i;
1169 bool removed = false;
1171 for (i = _processors.begin(); i != _processors.end(); ) {
1172 if (*i == processor) {
1174 /* move along, see failure case for configure_processors()
1175 where we may need to reconfigure the processor.
1178 /* stop redirects that send signals to JACK ports
1179 from causing noise as a result of no longer being
1183 boost::shared_ptr<IOProcessor> iop;
1185 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1187 iop->input()->disconnect (this);
1189 if (iop->output()) {
1190 iop->output()->disconnect (this);
1194 i = _processors.erase (i);
1202 _output->set_user_latency (0);
1210 if (configure_processors_unlocked (err)) {
1211 /* get back to where we where */
1212 _processors.insert (i, processor);
1213 /* we know this will work, because it worked before :) */
1214 configure_processors_unlocked (0);
1218 _have_internal_generator = false;
1220 for (i = _processors.begin(); i != _processors.end(); ++i) {
1221 boost::shared_ptr<PluginInsert> pi;
1223 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1224 if (pi->is_generator()) {
1225 _have_internal_generator = true;
1232 processor->drop_references ();
1233 processors_changed (); /* EMIT SIGNAL */
1239 Route::configure_processors (ProcessorStreams* err)
1241 if (!_in_configure_processors) {
1242 Glib::RWLock::WriterLock lm (_processor_lock);
1243 return configure_processors_unlocked (err);
1248 /** Configure the input/output configuration of each processor in the processors list.
1249 * Return 0 on success, otherwise configuration is impossible.
1252 Route::configure_processors_unlocked (ProcessorStreams* err)
1254 if (_in_configure_processors) {
1258 _in_configure_processors = true;
1260 // Check each processor in order to see if we can configure as requested
1261 ChanCount in = _input->n_ports ();
1263 list< pair<ChanCount,ChanCount> > configuration;
1266 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1267 if ((*p)->can_support_io_configuration(in, out)) {
1268 configuration.push_back(make_pair(in, out));
1275 _in_configure_processors = false;
1280 // We can, so configure everything
1281 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1282 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1283 (*p)->configure_io(c->first, c->second);
1285 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1286 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1290 // Ensure route outputs match last processor's outputs
1291 if (out != _output->n_ports ()) {
1292 _output->ensure_io (out, false, this);
1295 _in_configure_processors = false;
1300 Route::all_processors_flip ()
1302 Glib::RWLock::ReaderLock lm (_processor_lock);
1304 if (_processors.empty()) {
1308 bool first_is_on = _processors.front()->active();
1310 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1312 (*i)->deactivate ();
1318 _session.set_dirty ();
1321 /** Set all processors with a given placement to a given active state.
1322 * @param p Placement of processors to change.
1323 * @param state New active state for those processors.
1326 Route::all_processors_active (Placement p, bool state)
1328 Glib::RWLock::ReaderLock lm (_processor_lock);
1330 if (_processors.empty()) {
1333 ProcessorList::iterator start, end;
1334 placement_range(p, start, end);
1336 bool before_amp = true;
1337 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1342 if (p == PreFader && before_amp) {
1346 (*i)->deactivate ();
1351 _session.set_dirty ();
1355 Route::reorder_processors (const ProcessorList& new_order, Placement placement, ProcessorStreams* err)
1357 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1358 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1359 processors in the current actual processor list that are hidden. Any visible processors
1360 in the current list but not in "new_order" will be assumed to be deleted.
1364 Glib::RWLock::WriterLock lm (_processor_lock);
1365 ChanCount old_pms = processor_max_streams;
1366 ProcessorList::iterator oiter;
1367 ProcessorList::const_iterator niter;
1368 ProcessorList as_it_was_before = _processors;
1369 ProcessorList as_it_will_be;
1370 ProcessorList::iterator start, end;
1372 placement_range (placement, start, end);
1375 niter = new_order.begin();
1377 while (niter != new_order.end()) {
1379 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1380 then append it to the temp list.
1382 Otherwise, see if the next processor in the old list is in the new list. if not,
1383 its been deleted. If its there, append it to the temp list.
1388 /* no more elements in the old list, so just stick the rest of
1389 the new order onto the temp list.
1392 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1393 while (niter != new_order.end()) {
1394 (*niter)->set_placement (placement);
1401 if (!(*oiter)->visible()) {
1403 as_it_will_be.push_back (*oiter);
1404 (*oiter)->set_placement (placement);
1408 /* visible processor: check that its in the new order */
1410 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1411 /* deleted: do nothing, shared_ptr<> will clean up */
1413 /* ignore this one, and add the next item from the new order instead */
1414 as_it_will_be.push_back (*niter);
1415 (*niter)->set_placement (placement);
1420 /* now remove from old order - its taken care of no matter what */
1421 oiter = _processors.erase (oiter);
1426 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1428 if (configure_processors_unlocked (err)) {
1429 _processors = as_it_was_before;
1430 processor_max_streams = old_pms;
1435 processors_changed (); /* EMIT SIGNAL */
1447 Route::get_template()
1449 return state(false);
1453 Route::state(bool full_state)
1455 XMLNode *node = new XMLNode("Route");
1456 ProcessorList::iterator i;
1459 id().print (buf, sizeof (buf));
1460 node->add_property("id", buf);
1461 node->add_property ("name", _name);
1462 node->add_property("default-type", _default_type.to_string());
1465 node->add_property("flags", enum_2_string (_flags));
1468 node->add_property("active", _active?"yes":"no");
1469 node->add_property("phase-invert", _phase_invert?"yes":"no");
1470 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1471 node->add_property("meter-point", enum_2_string (_meter_point));
1474 node->add_property("route-group", _route_group->name());
1477 string order_string;
1478 OrderKeys::iterator x = order_keys.begin();
1480 while (x != order_keys.end()) {
1481 order_string += string ((*x).first);
1482 order_string += '=';
1483 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1484 order_string += buf;
1488 if (x == order_keys.end()) {
1492 order_string += ':';
1494 node->add_property ("order-keys", order_string);
1496 node->add_child_nocopy (_input->state (full_state));
1497 node->add_child_nocopy (_output->state (full_state));
1498 node->add_child_nocopy (_solo_control->get_state ());
1499 node->add_child_nocopy (_mute_master->get_state ());
1501 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1502 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1503 remote_control_node->add_property (X_("id"), buf);
1504 node->add_child_nocopy (*remote_control_node);
1506 if (_comment.length()) {
1507 XMLNode *cmt = node->add_child ("Comment");
1508 cmt->add_content (_comment);
1511 for (i = _processors.begin(); i != _processors.end(); ++i) {
1512 node->add_child_nocopy((*i)->state (full_state));
1516 node->add_child_copy (*_extra_xml);
1523 Route::set_state (const XMLNode& node)
1525 return _set_state (node, true);
1529 Route::_set_state (const XMLNode& node, bool call_base)
1533 XMLNodeConstIterator niter;
1535 XMLPropertyList plist;
1536 const XMLProperty *prop;
1538 if (node.name() != "Route"){
1539 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1543 if ((prop = node.property (X_("name"))) != 0) {
1544 Route::set_name (prop->value());
1547 if ((prop = node.property ("id")) != 0) {
1548 _id = prop->value ();
1551 if ((prop = node.property (X_("flags"))) != 0) {
1552 _flags = Flag (string_2_enum (prop->value(), _flags));
1557 /* add all processors (except amp, which is always present) */
1559 nlist = node.children();
1560 XMLNode processor_state (X_("processor_state"));
1562 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1566 if (child->name() == IO::state_node_name) {
1567 if ((prop = child->property (X_("direction"))) == 0) {
1571 if (prop->value() == "Input") {
1572 _input->set_state (*child);
1573 } else if (prop->value() == "Output") {
1574 _output->set_state (*child);
1578 if (child->name() == X_("Processor")) {
1579 processor_state.add_child_copy (*child);
1583 set_processor_state (processor_state);
1585 if ((prop = node.property ("solo_level")) != 0) {
1586 _solo_level = 0; // needed for mod_solo_level() to work
1587 mod_solo_level (atoi (prop->value()));
1590 if ((prop = node.property ("solo-isolated")) != 0) {
1591 set_solo_isolated (prop->value() == "yes", this);
1594 if ((prop = node.property (X_("phase-invert"))) != 0) {
1595 set_phase_invert (prop->value()=="yes"?true:false);
1598 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1599 set_denormal_protection (prop->value()=="yes"?true:false);
1602 if ((prop = node.property (X_("active"))) != 0) {
1603 bool yn = (prop->value() == "yes");
1604 _active = !yn; // force switch
1608 if ((prop = node.property (X_("soloed"))) != 0) {
1609 bool yn = (prop->value()=="yes");
1611 /* XXX force reset of solo status */
1613 set_solo (yn, this);
1616 if ((prop = node.property (X_("meter-point"))) != 0) {
1617 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1620 if ((prop = node.property (X_("route-group"))) != 0) {
1621 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1622 if (route_group == 0) {
1623 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1625 set_route_group (route_group, this);
1629 if ((prop = node.property (X_("order-keys"))) != 0) {
1633 string::size_type colon, equal;
1634 string remaining = prop->value();
1636 while (remaining.length()) {
1638 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1639 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1642 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1643 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1646 set_order_key (remaining.substr (0, equal).c_str(), n);
1650 colon = remaining.find_first_of (':');
1652 if (colon != string::npos) {
1653 remaining = remaining.substr (colon+1);
1660 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1663 if (child->name() == X_("Comment")) {
1665 /* XXX this is a terrible API design in libxml++ */
1667 XMLNode *cmt = *(child->children().begin());
1668 _comment = cmt->content();
1670 } else if (child->name() == X_("Extra")) {
1672 _extra_xml = new XMLNode (*child);
1674 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1676 if (prop->value() == "solo") {
1677 _solo_control->set_state (*child);
1678 _session.add_controllable (_solo_control);
1681 } else if (child->name() == X_("RemoteControl")) {
1682 if ((prop = child->property (X_("id"))) != 0) {
1684 sscanf (prop->value().c_str(), "%d", &x);
1685 set_remote_control_id (x);
1688 } else if (child->name() == X_("MuteMaster")) {
1689 _mute_master->set_state (*child);
1697 Route::get_processor_state ()
1699 XMLNode* root = new XMLNode (X_("redirects"));
1700 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1701 root->add_child_nocopy ((*i)->state (true));
1708 Route::set_processor_state (const XMLNode& node)
1710 const XMLNodeList &nlist = node.children();
1711 XMLNodeConstIterator niter;
1712 ProcessorList::iterator i, o;
1714 // Iterate through existing processors, remove those which are not in the state list
1716 for (i = _processors.begin(); i != _processors.end(); ) {
1718 /* leave amp alone, always */
1725 ProcessorList::iterator tmp = i;
1728 bool processorInStateList = false;
1730 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1732 XMLProperty* id_prop = (*niter)->property(X_("id"));
1734 if (id_prop && (*i)->id() == id_prop->value()) {
1735 processorInStateList = true;
1740 if (!processorInStateList) {
1741 remove_processor (*i);
1747 // Iterate through state list and make sure all processors are on the track and in the correct order,
1748 // set the state of existing processors according to the new state on the same go
1750 i = _processors.begin();
1752 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1754 XMLProperty* prop = (*niter)->property ("type");
1758 // Check whether the next processor in the list is the right one,
1759 // except for "amp" which is always there and may not have the
1760 // old ID since it is always created anew in every Route
1762 if (prop->value() != "amp") {
1763 while (o != _processors.end()) {
1764 XMLProperty* id_prop = (*niter)->property(X_("id"));
1765 if (id_prop && (*o)->id() == id_prop->value()) {
1773 // If the processor (*niter) is not on the route,
1774 // create it and move it to the correct location
1776 if (o == _processors.end()) {
1778 if (add_processor_from_xml (**niter, i)) {
1779 --i; // move iterator to the newly inserted processor
1781 cerr << "Error restoring route: unable to restore processor" << endl;
1786 // Otherwise, the processor already exists; just
1787 // ensure it is at the location provided in the XML state
1790 boost::shared_ptr<Processor> tmp = (*o);
1791 _processors.erase (o); // remove the old copy
1792 _processors.insert (i, tmp); // insert the processor at the correct location
1793 --i; // move iterator to the correct processor
1796 // and make it (just) so
1798 (*i)->set_state (**niter);
1802 /* note: there is no configure_processors() call because we figure that
1803 the XML state represents a working signal route.
1806 processors_changed ();
1810 Route::curve_reallocate ()
1812 // _gain_automation_curve.finish_resize ();
1813 // _pan_automation_curve.finish_resize ();
1817 Route::silence (nframes_t nframes)
1821 _output->silence (nframes);
1824 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
1827 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1828 boost::shared_ptr<PluginInsert> pi;
1830 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1831 // skip plugins, they don't need anything when we're not active
1835 (*i)->silence (nframes);
1838 if (nframes == _session.get_block_size()) {
1848 Route::add_internal_return ()
1851 _intreturn.reset (new InternalReturn (_session));
1852 add_processor (_intreturn, PreFader);
1857 Route::get_return_buffer () const
1859 Glib::RWLock::ReaderLock rm (_processor_lock);
1861 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1862 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1865 return d->get_buffers ();
1873 Route::release_return_buffer () const
1875 Glib::RWLock::ReaderLock rm (_processor_lock);
1877 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1878 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1881 return d->release_buffers ();
1887 Route::listen_via (boost::shared_ptr<Route> route, const string& listen_name)
1889 vector<string> ports;
1890 vector<string>::const_iterator i;
1893 Glib::RWLock::ReaderLock rm (_processor_lock);
1895 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
1896 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1898 if (d && d->target_route() == route) {
1900 /* if the target is the control outs, then make sure
1901 we take note of which i-send is doing that.
1904 if (route == _session.control_out()) {
1905 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
1908 /* already listening via the specified IO: do nothing */
1915 boost::shared_ptr<InternalSend> listener;
1918 listener.reset (new InternalSend (_session, _mute_master, route));
1920 } catch (failed_constructor& err) {
1924 add_processor (listener, PreFader);
1930 Route::drop_listen (boost::shared_ptr<Route> route)
1932 ProcessorStreams err;
1933 ProcessorList::iterator tmp;
1935 Glib::RWLock::ReaderLock rl(_processor_lock);
1939 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
1941 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1943 if (d && d->target_route() == route) {
1945 remove_processor (*x, &err);
1948 /* list could have been demolished while we dropped the lock
1958 if (route == _session.control_out()) {
1959 _control_outs.reset ();
1964 Route::set_route_group (RouteGroup *rg, void *src)
1966 if (rg == _route_group) {
1971 _route_group->remove (this);
1974 if ((_route_group = rg) != 0) {
1975 _route_group->add (this);
1978 _session.set_dirty ();
1979 route_group_changed (src); /* EMIT SIGNAL */
1983 Route::drop_route_group (void *src)
1986 _session.set_dirty ();
1987 route_group_changed (src); /* EMIT SIGNAL */
1991 Route::set_comment (string cmt, void *src)
1994 comment_changed (src);
1995 _session.set_dirty ();
1999 Route::feeds (boost::shared_ptr<Route> other)
2001 // cerr << _name << endl;
2003 if (_output->connected_to (other->input())) {
2004 // cerr << "\tdirect FEEDS " << other->name() << endl;
2008 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2010 boost::shared_ptr<IOProcessor> iop;
2012 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2013 if (iop->feeds (other)) {
2014 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2017 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2022 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2027 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
2029 nframes_t now = _session.transport_frame();
2032 Glib::RWLock::ReaderLock lm (_processor_lock);
2035 automation_snapshot (now, true);
2038 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2040 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2041 (*i)->deactivate ();
2045 (*i)->transport_stopped (now);
2049 _roll_delay = _initial_delay;
2053 Route::input_change_handler (IOChange change, void *src)
2055 if ((change & ConfigurationChanged)) {
2056 configure_processors (0);
2061 Route::output_change_handler (IOChange change, void *src)
2063 if ((change & ConfigurationChanged)) {
2065 /* XXX resize all listeners to match _main_outs? */
2067 // configure_processors (0);
2072 Route::pans_required () const
2074 if (n_outputs().n_audio() < 2) {
2078 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2082 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2083 bool session_state_changing, bool can_record, bool rec_monitors_input)
2085 if (n_outputs().n_total() == 0) {
2089 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2094 _amp->apply_gain_automation (false);
2095 passthru (start_frame, end_frame, nframes, 0);
2101 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2103 if (_roll_delay > nframes) {
2105 _roll_delay -= nframes;
2107 /* transport frame is not legal for caller to use */
2110 } else if (_roll_delay > 0) {
2112 nframes -= _roll_delay;
2113 silence (_roll_delay);
2114 /* we've written _roll_delay of samples into the
2115 output ports, so make a note of that for
2118 _main_outs->increment_output_offset (_roll_delay);
2119 transport_frame += _roll_delay;
2128 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2129 bool can_record, bool rec_monitors_input)
2132 // automation snapshot can also be called from the non-rt context
2133 // and it uses the processor list, so we try to acquire the lock here
2134 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2137 automation_snapshot (_session.transport_frame(), false);
2141 if (n_outputs().n_total() == 0) {
2145 if (!_active || n_inputs().n_total() == 0) {
2150 nframes_t unused = 0;
2152 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2158 passthru (start_frame, end_frame, nframes, declick);
2164 Route::silent_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2165 bool can_record, bool rec_monitors_input)
2172 Route::toggle_monitor_input ()
2174 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2175 i->ensure_monitor_input( ! i->monitoring_input());
2180 Route::has_external_redirects () const
2182 // FIXME: what about sends? - they don't return a signal back to ardour?
2184 boost::shared_ptr<const PortInsert> pi;
2186 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2188 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2190 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2192 string port_name = port->name();
2193 string client_name = port_name.substr (0, port_name.find(':'));
2195 /* only say "yes" if the redirect is actually in use */
2197 if (client_name != "ardour" && pi->active()) {
2208 Route::flush_processors ()
2210 /* XXX shouldn't really try to take this lock, since
2211 this is called from the RT audio thread.
2214 Glib::RWLock::ReaderLock lm (_processor_lock);
2216 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2217 (*i)->deactivate ();
2223 Route::set_meter_point (MeterPoint p, void *src)
2225 if (_meter_point != p) {
2228 // Move meter in the processors list
2229 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2230 _processors.erase(loc);
2233 loc = _processors.begin();
2236 loc = find(_processors.begin(), _processors.end(), _amp);
2238 case MeterPostFader:
2239 loc = _processors.end();
2242 _processors.insert(loc, _meter);
2244 meter_change (src); /* EMIT SIGNAL */
2245 processors_changed (); /* EMIT SIGNAL */
2246 _session.set_dirty ();
2250 Route::put_control_outs_at (Placement p)
2252 if (!_control_outs) {
2256 // Move meter in the processors list
2257 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2258 _processors.erase(loc);
2262 loc = find(_processors.begin(), _processors.end(), _amp);
2263 if (loc != _processors.begin()) {
2268 loc = find(_processors.begin(), _processors.end(), _amp);
2269 assert (loc != _processors.end());
2274 _processors.insert(loc, _control_outs);
2276 processors_changed (); /* EMIT SIGNAL */
2277 _session.set_dirty ();
2281 Route::update_total_latency ()
2283 nframes_t old = _output->effective_latency();
2284 nframes_t own_latency = _output->user_latency();
2286 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2287 if ((*i)->active ()) {
2288 own_latency += (*i)->signal_latency ();
2292 #undef DEBUG_LATENCY
2293 #ifdef DEBUG_LATENCY
2294 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2297 _output->set_port_latency (own_latency);
2299 if (_output->user_latency() == 0) {
2301 /* this (virtual) function is used for pure Routes,
2302 not derived classes like AudioTrack. this means
2303 that the data processed here comes from an input
2304 port, not prerecorded material, and therefore we
2305 have to take into account any input latency.
2308 own_latency += _input->signal_latency ();
2311 if (old != own_latency) {
2312 _output->set_latency_delay (own_latency);
2313 signal_latency_changed (); /* EMIT SIGNAL */
2316 #ifdef DEBUG_LATENCY
2317 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2318 << own_latency << endl;
2321 return _output->effective_latency ();
2325 Route::set_user_latency (nframes_t nframes)
2327 _output->set_user_latency (nframes);
2328 _session.update_latency_compensation (false, false);
2332 Route::set_latency_delay (nframes_t longest_session_latency)
2334 nframes_t old = _initial_delay;
2336 if (_output->effective_latency() < longest_session_latency) {
2337 _initial_delay = longest_session_latency - _output->effective_latency();
2342 if (_initial_delay != old) {
2343 initial_delay_changed (); /* EMIT SIGNAL */
2346 if (_session.transport_stopped()) {
2347 _roll_delay = _initial_delay;
2352 Route::automation_snapshot (nframes_t now, bool force)
2354 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2355 (*i)->automation_snapshot (now, force);
2359 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2360 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2361 boost::shared_ptr<AutomationList>(), name)
2364 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2369 Route::SoloControllable::set_value (float val)
2371 bool bval = ((val >= 0.5f) ? true: false);
2373 route.set_solo (bval, this);
2377 Route::SoloControllable::get_value (void) const
2379 return route.soloed() ? 1.0f : 0.0f;
2383 Route::set_block_size (nframes_t nframes)
2385 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2386 (*i)->set_block_size (nframes);
2388 _session.ensure_buffers(processor_max_streams);
2392 Route::protect_automation ()
2394 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2395 (*i)->protect_automation();
2399 Route::set_pending_declick (int declick)
2402 /* this call is not allowed to turn off a pending declick unless "force" is true */
2404 _pending_declick = declick;
2406 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2408 _pending_declick = 0;
2413 /** Shift automation forwards from a particular place, thereby inserting time.
2414 * Adds undo commands for any shifts that are performed.
2416 * @param pos Position to start shifting from.
2417 * @param frames Amount to shift forwards by.
2421 Route::shift (nframes64_t pos, nframes64_t frames)
2423 #ifdef THIS_NEEDS_FIXING_FOR_V3
2425 /* gain automation */
2426 XMLNode &before = _gain_control->get_state ();
2427 _gain_control->shift (pos, frames);
2428 XMLNode &after = _gain_control->get_state ();
2429 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2431 /* pan automation */
2432 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2433 Curve & c = (*i)->automation ();
2434 XMLNode &before = c.get_state ();
2435 c.shift (pos, frames);
2436 XMLNode &after = c.get_state ();
2437 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2440 /* redirect automation */
2442 Glib::RWLock::ReaderLock lm (redirect_lock);
2443 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2446 (*i)->what_has_automation (a);
2448 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2449 AutomationList & al = (*i)->automation_list (*j);
2450 XMLNode &before = al.get_state ();
2451 al.shift (pos, frames);
2452 XMLNode &after = al.get_state ();
2453 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2463 Route::save_as_template (const string& path, const string& name)
2465 XMLNode& node (state (false));
2468 IO::set_name_in_state (*node.children().front(), name);
2470 tree.set_root (&node);
2471 return tree.write (path.c_str());
2476 Route::set_name (const string& str)
2482 name = Route::ensure_track_or_route_name (str, _session);
2483 SessionObject::set_name (name);
2485 ret = (_input->set_name(name) && _output->set_name(name));
2489 Glib::RWLock::ReaderLock lm (_processor_lock);
2491 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2493 /* rename all processors with outputs to reflect our new name */
2495 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2498 string iop_name = name;
2500 iop_name += "XXX FIX ME XXX";
2503 if (!iop->set_name (iop_name)) {
2514 boost::shared_ptr<Send>
2515 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2517 Glib::RWLock::ReaderLock lm (_processor_lock);
2519 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2520 boost::shared_ptr<InternalSend> send;
2522 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2523 if (send->target_route() == target) {
2529 return boost::shared_ptr<Send>();
2533 Route::set_phase_invert (bool yn)
2535 if (_phase_invert != yn) {
2536 _phase_invert = 0xffff; // XXX all channels
2537 phase_invert_changed (); /* EMIT SIGNAL */
2542 Route::phase_invert () const
2544 return _phase_invert != 0;
2548 Route::set_denormal_protection (bool yn)
2550 if (_denormal_protection != yn) {
2551 _denormal_protection = yn;
2552 denormal_protection_changed (); /* EMIT SIGNAL */
2557 Route::denormal_protection () const
2559 return _denormal_protection;
2563 Route::set_active (bool yn)
2565 if (_active != yn) {
2567 _input->set_active (yn);
2568 _output->set_active (yn);
2569 active_changed (); // EMIT SIGNAL
2576 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2580 boost::shared_ptr<Panner>
2581 Route::panner() const
2584 return _main_outs->panner();
2587 boost::shared_ptr<AutomationControl>
2588 Route::gain_control() const
2591 return _amp->gain_control();
2594 boost::shared_ptr<AutomationControl>
2595 Route::get_control (const Evoral::Parameter& param)
2597 /* either we own the control or .... */
2599 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2603 /* maybe one of our processors does or ... */
2605 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2606 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2607 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
2615 /* nobody does so we'll make a new one */
2617 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));