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, string const &> 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[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);
168 Route::set_remote_control_id (uint32_t id)
170 if (id != _remote_control_id) {
171 _remote_control_id = id;
172 RemoteControlIDChanged ();
177 Route::remote_control_id() const
179 return _remote_control_id;
183 Route::order_key (std::string const & name) const
185 OrderKeys::const_iterator i = order_keys.find (name);
186 if (i == order_keys.end()) {
194 Route::set_order_key (std::string const & name, long n)
196 order_keys[name] = n;
198 if (Config->get_sync_all_route_ordering()) {
199 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
204 _session.set_dirty ();
207 /** Set all order keys to be the same as that for `base', if such a key
208 * exists in this route.
209 * @param base Base key.
212 Route::sync_order_keys (std::string const & base)
214 if (order_keys.empty()) {
218 OrderKeys::iterator i;
221 if ((i = order_keys.find (base)) == order_keys.end()) {
222 /* key doesn't exist, use the first existing key (during session initialization) */
223 i = order_keys.begin();
227 /* key exists - use it and reset all others (actually, itself included) */
229 i = order_keys.begin();
232 for (; i != order_keys.end(); ++i) {
238 Route::ensure_track_or_route_name(string name, Session &session)
240 string newname = name;
242 while (session.route_by_name (newname) != NULL) {
243 newname = bump_name_once (newname);
251 Route::inc_gain (gain_t fraction, void *src)
253 _amp->inc_gain (fraction, src);
257 Route::set_gain (gain_t val, void *src)
259 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
261 if (_route_group->is_relative()) {
263 gain_t usable_gain = _amp->gain();
264 if (usable_gain < 0.000001f) {
265 usable_gain = 0.000001f;
269 if (delta < 0.000001f) {
273 delta -= usable_gain;
278 gain_t factor = delta / usable_gain;
281 factor = _route_group->get_max_factor(factor);
282 if (factor == 0.0f) {
283 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
287 factor = _route_group->get_min_factor(factor);
288 if (factor == 0.0f) {
289 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
294 _route_group->apply (&Route::inc_gain, factor, _route_group);
298 _route_group->apply (&Route::set_gain, val, _route_group);
304 if (val == _amp->gain()) {
308 _amp->set_gain (val, src);
311 /** Process this route for one (sub) cycle (process thread)
313 * @param bufs Scratch buffers to use for the signal path
314 * @param start_frame Initial transport frame
315 * @param end_frame Final transport frame
316 * @param nframes Number of frames to output (to ports)
318 * Note that (end_frame - start_frame) may not be equal to nframes when the
319 * transport speed isn't 1.0 (eg varispeed).
322 Route::process_output_buffers (BufferSet& bufs,
323 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
324 bool with_processors, int declick)
328 bufs.is_silent (false);
330 switch (Config->get_monitoring_model()) {
331 case HardwareMonitoring:
332 case ExternalMonitoring:
333 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
340 declick = _pending_declick;
343 /* figure out if we're going to use gain automation */
344 _amp->setup_gain_automation (start_frame, end_frame, nframes);
347 /* tell main outs what to do about monitoring */
348 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
351 /* -------------------------------------------------------------------------------------------
352 GLOBAL DECLICK (for transport changes etc.)
353 ----------------------------------------------------------------------------------------- */
356 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
357 } else if (declick < 0) {
358 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
361 _pending_declick = 0;
363 /* -------------------------------------------------------------------------------------------
364 DENORMAL CONTROL/PHASE INVERT
365 ----------------------------------------------------------------------------------------- */
371 if (_denormal_protection || Config->get_denormal_protection()) {
373 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
374 Sample* const sp = i->data();
376 if (_phase_invert & chn) {
377 for (nframes_t nx = 0; nx < nframes; ++nx) {
382 for (nframes_t nx = 0; nx < nframes; ++nx) {
390 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
391 Sample* const sp = i->data();
393 if (_phase_invert & chn) {
394 for (nframes_t nx = 0; nx < nframes; ++nx) {
403 if (_denormal_protection || Config->get_denormal_protection()) {
405 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
406 Sample* const sp = i->data();
407 for (nframes_t nx = 0; nx < nframes; ++nx) {
415 /* -------------------------------------------------------------------------------------------
417 ----------------------------------------------------------------------------------------- */
419 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
422 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
423 bufs.set_count (ChanCount::max(bufs.count(), (*i)->input_streams()));
424 (*i)->run (bufs, start_frame, end_frame, nframes);
425 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
428 if (!_processors.empty()) {
429 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
435 Route::n_process_buffers ()
437 return max (_input->n_ports(), processor_max_streams);
441 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
443 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
447 assert (bufs.available() >= _input->n_ports());
449 if (_input->n_ports() == ChanCount::ZERO) {
453 bufs.set_count (_input->n_ports());
455 if (is_control() && _session.listening()) {
457 /* control/monitor bus ignores input ports when something is
458 feeding the listen "stream". data will "arrive" into the
459 route from the intreturn processor element.
462 bufs.silence (nframes, 0);
466 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
468 BufferSet::iterator o = bufs.begin(*t);
469 PortSet& ports (_input->ports());
471 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
472 o->read_from (i->get_buffer(nframes), nframes);
477 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
481 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
483 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, true, declick);
487 Route::set_listen (bool yn, void* src)
490 if (yn != _control_outs->active()) {
492 _control_outs->activate ();
494 _control_outs->deactivate ();
497 listen_changed (src); /* EMIT SIGNAL */
503 Route::listening () const
506 return _control_outs->active ();
513 Route::set_solo (bool yn, void *src)
515 if (_solo_safe || _solo_isolated) {
519 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
520 _route_group->apply (&Route::set_solo, yn, _route_group);
524 if (soloed() != yn) {
525 mod_solo_level (yn ? 1 : -1);
526 solo_changed (src); /* EMIT SIGNAL */
527 _solo_control->Changed (); /* EMIT SIGNAL */
532 Route::mod_solo_level (int32_t delta)
535 if (_solo_level >= (uint32_t) delta) {
536 _solo_level += delta;
541 _solo_level += delta;
544 /* tell main outs what the solo situation is
547 _main_outs->set_solo_level (_solo_level);
548 _main_outs->set_solo_isolated (_solo_isolated);
552 Route::set_solo_isolated (bool yn, void *src)
554 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
555 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
559 if (yn != _solo_isolated) {
562 /* tell main outs what the solo situation is
565 _main_outs->set_solo_level (_solo_level);
566 _main_outs->set_solo_isolated (_solo_isolated);
568 solo_isolated_changed (src);
573 Route::solo_isolated () const
575 return _solo_isolated;
579 Route::set_mute (bool yn, void *src)
581 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
582 _route_group->apply (&Route::set_mute, yn, _route_group);
587 _mute_master->mute (yn);
595 return _mute_master->muted ();
600 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
602 cerr << name << " {" << endl;
603 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
604 p != procs.end(); ++p) {
605 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
612 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
614 ProcessorList::iterator loc;
616 /* XXX this is not thread safe - we don't hold the lock across determining the iter
617 to add before and actually doing the insertion. dammit.
620 if (placement == PreFader) {
621 /* generic pre-fader: insert immediately before the amp */
622 loc = find(_processors.begin(), _processors.end(), _amp);
624 /* generic post-fader: insert at end */
625 loc = _processors.end();
627 if (processor->visible() && !_processors.empty()) {
628 /* check for invisible processors stacked at the end and leave them there */
629 ProcessorList::iterator p;
630 p = _processors.end();
632 while (!(*p)->visible() && p != _processors.begin()) {
640 return add_processor (processor, loc, err);
644 /** Add a processor to the route.
645 * If @a iter is not NULL, it must point to an iterator in _processors and the new
646 * processor will be inserted immediately before this location. Otherwise,
647 * @a position is used.
650 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
652 ChanCount old_pms = processor_max_streams;
654 if (!_session.engine().connected() || !processor) {
659 Glib::RWLock::WriterLock lm (_processor_lock);
661 boost::shared_ptr<PluginInsert> pi;
662 boost::shared_ptr<PortInsert> porti;
664 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
666 if (processor == _amp || processor == _meter || processor == _main_outs) {
667 // Ensure only one of these are in the list at any time
668 if (loc != _processors.end()) {
669 if (iter == loc) { // Already in place, do nothing
671 } else { // New position given, relocate
672 _processors.erase (loc);
677 if (loc != _processors.end()) {
678 cerr << "ERROR: Processor added to route twice!" << endl;
685 _processors.insert (loc, processor);
687 // Set up processor list channels. This will set processor->[input|output]_streams(),
688 // configure redirect ports properly, etc.
691 if (configure_processors_unlocked (err)) {
692 ProcessorList::iterator ploc = loc;
694 _processors.erase(ploc);
695 configure_processors_unlocked (0); // it worked before we tried to add it ...
696 cerr << "configure failed\n";
700 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
702 if (pi->natural_input_streams() == ChanCount::ZERO) {
703 /* generator plugin */
704 _have_internal_generator = true;
709 // XXX: do we want to emit the signal here ? change call order.
710 if (!boost::dynamic_pointer_cast<InternalSend>(processor)) {
711 processor->activate ();
713 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
715 _output->set_user_latency (0);
718 processors_changed (); /* EMIT SIGNAL */
724 Route::add_processor_from_xml (const XMLNode& node, Placement placement)
726 ProcessorList::iterator loc;
728 if (placement == PreFader) {
729 /* generic pre-fader: insert immediately before the amp */
730 loc = find(_processors.begin(), _processors.end(), _amp);
732 /* generic post-fader: insert at end */
733 loc = _processors.end();
736 return add_processor_from_xml (node, loc);
740 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
742 const XMLProperty *prop;
744 // legacy sessions use a different node name for sends
745 if (node.name() == "Send") {
748 boost::shared_ptr<Send> send (new Send (_session, _mute_master, node));
749 add_processor (send, iter);
753 catch (failed_constructor &err) {
754 error << _("Send construction failed") << endmsg;
758 } else if (node.name() == "Processor") {
761 if ((prop = node.property ("type")) != 0) {
763 boost::shared_ptr<Processor> processor;
765 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
766 prop->value() == "lv2" ||
767 prop->value() == "vst" ||
768 prop->value() == "audiounit") {
770 processor.reset (new PluginInsert(_session, node));
772 } else if (prop->value() == "port") {
774 processor.reset (new PortInsert (_session, _mute_master, node));
776 } else if (prop->value() == "send") {
778 processor.reset (new Send (_session, _mute_master, node));
780 } else if (prop->value() == "meter") {
783 if (_meter->set_state (node)) {
790 _meter.reset (new PeakMeter (_session, node));
793 } else if (prop->value() == "amp") {
795 /* amp always exists */
798 if (processor->set_state (node)) {
801 /* never any reason to add it */
805 } else if (prop->value() == "listen" || prop->value() == "deliver") {
807 /* XXX need to generalize */
809 } else if (prop->value() == "intsend") {
811 processor.reset (new InternalSend (_session, _mute_master, node));
813 } else if (prop->value() == "intreturn") {
816 if (_intreturn->set_state (node)) {
822 _intreturn.reset (new InternalReturn (_session, node));
823 processor = _intreturn;
825 } else if (prop->value() == "main-outs") {
828 if (_main_outs->set_state (node)) {
835 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
836 processor = _main_outs;
839 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
842 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
843 /* check for invisible processors stacked at the end and leave them there */
844 ProcessorList::iterator p;
845 p = _processors.end();
847 while (!(*p)->visible() && p != _processors.begin()) {
854 return (add_processor (processor, iter) == 0);
857 error << _("Processor XML node has no type property") << endmsg;
861 catch (failed_constructor &err) {
862 warning << _("processor could not be created. Ignored.") << endmsg;
870 Route::add_processors (const ProcessorList& others, Placement placement, ProcessorStreams* err)
872 ProcessorList::iterator loc;
873 if (placement == PreFader) {
874 /* generic pre-fader: insert immediately before the amp */
875 loc = find(_processors.begin(), _processors.end(), _amp);
877 /* generic post-fader: insert at end */
878 loc = _processors.end();
880 if (!_processors.empty()) {
881 /* check for invisible processors stacked at the end and leave them there */
882 ProcessorList::iterator p;
883 p = _processors.end();
885 cerr << "Let's check " << (*p)->name() << " vis ? " << (*p)->visible() << endl;
886 while (!(*p)->visible() && p != _processors.begin()) {
894 return add_processors (others, loc, err);
898 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
900 /* NOTE: this is intended to be used ONLY when copying
901 processors from another Route. Hence the subtle
902 differences between this and ::add_processor()
905 ChanCount old_pms = processor_max_streams;
907 if (!_session.engine().connected()) {
911 if (others.empty()) {
916 Glib::RWLock::WriterLock lm (_processor_lock);
917 ProcessorList::iterator existing_end = _processors.end();
920 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
922 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
924 // Ensure meter only appears in the list once
926 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
927 if (m != _processors.end()) {
928 _processors.erase(m);
932 boost::shared_ptr<PluginInsert> pi;
934 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
937 ChanCount m = max(pi->input_streams(), pi->output_streams());
938 if (m > potential_max_streams)
939 potential_max_streams = m;
942 _processors.insert (iter, *i);
944 if (configure_processors_unlocked (err)) {
946 _processors.erase (existing_end, _processors.end());
947 configure_processors_unlocked (0); // it worked before we tried to add it ...
951 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
954 _output->set_user_latency (0);
957 processors_changed (); /* EMIT SIGNAL */
963 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
966 start = _processors.begin();
967 end = find(_processors.begin(), _processors.end(), _amp);
969 start = find(_processors.begin(), _processors.end(), _amp);
971 end = _processors.end();
975 /** Turn off all processors with a given placement
976 * @param p Placement of processors to disable
979 Route::disable_processors (Placement p)
981 Glib::RWLock::ReaderLock lm (_processor_lock);
983 ProcessorList::iterator start, end;
984 placement_range(p, start, end);
986 for (ProcessorList::iterator i = start; i != end; ++i) {
990 _session.set_dirty ();
993 /** Turn off all redirects
996 Route::disable_processors ()
998 Glib::RWLock::ReaderLock lm (_processor_lock);
1000 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1001 (*i)->deactivate ();
1004 _session.set_dirty ();
1007 /** Turn off all redirects with a given placement
1008 * @param p Placement of redirects to disable
1011 Route::disable_plugins (Placement p)
1013 Glib::RWLock::ReaderLock lm (_processor_lock);
1015 ProcessorList::iterator start, end;
1016 placement_range(p, start, end);
1018 for (ProcessorList::iterator i = start; i != end; ++i) {
1019 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1020 (*i)->deactivate ();
1024 _session.set_dirty ();
1027 /** Turn off all plugins
1030 Route::disable_plugins ()
1032 Glib::RWLock::ReaderLock lm (_processor_lock);
1034 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1035 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1036 (*i)->deactivate ();
1040 _session.set_dirty ();
1045 Route::ab_plugins (bool forward)
1047 Glib::RWLock::ReaderLock lm (_processor_lock);
1051 /* forward = turn off all active redirects, and mark them so that the next time
1052 we go the other way, we will revert them
1055 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1056 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1060 if ((*i)->active()) {
1061 (*i)->deactivate ();
1062 (*i)->set_next_ab_is_active (true);
1064 (*i)->set_next_ab_is_active (false);
1070 /* backward = if the redirect was marked to go active on the next ab, do so */
1072 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1074 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1078 if ((*i)->get_next_ab_is_active()) {
1081 (*i)->deactivate ();
1086 _session.set_dirty ();
1090 /** Remove processors with a given placement.
1091 * @param p Placement of processors to remove.
1094 Route::clear_processors (Placement p)
1096 const ChanCount old_pms = processor_max_streams;
1098 if (!_session.engine().connected()) {
1102 bool already_deleting = _session.deletion_in_progress();
1103 if (!already_deleting) {
1104 _session.set_deletion_in_progress();
1108 Glib::RWLock::WriterLock lm (_processor_lock);
1109 ProcessorList new_list;
1110 ProcessorStreams err;
1112 ProcessorList::iterator amp_loc = find(_processors.begin(), _processors.end(), _amp);
1113 if (p == PreFader) {
1114 // Get rid of PreFader processors
1115 for (ProcessorList::iterator i = _processors.begin(); i != amp_loc; ++i) {
1116 (*i)->drop_references ();
1119 for (ProcessorList::iterator i = amp_loc; i != _processors.end(); ++i) {
1120 new_list.push_back (*i);
1123 // Keep PreFader processors
1124 for (ProcessorList::iterator i = _processors.begin(); i != amp_loc; ++i) {
1125 new_list.push_back (*i);
1127 new_list.push_back (_amp);
1128 // Get rid of PostFader processors
1129 for (ProcessorList::iterator i = amp_loc; i != _processors.end(); ++i) {
1130 (*i)->drop_references ();
1134 _processors = new_list;
1135 configure_processors_unlocked (&err); // this can't fail
1138 processor_max_streams.reset();
1139 _have_internal_generator = false;
1140 processors_changed (); /* EMIT SIGNAL */
1142 if (!already_deleting) {
1143 _session.clear_deletion_in_progress();
1148 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1150 /* these can never be removed */
1152 if (processor == _amp || processor == _meter || processor == _main_outs) {
1156 ChanCount old_pms = processor_max_streams;
1158 if (!_session.engine().connected()) {
1162 processor_max_streams.reset();
1165 Glib::RWLock::WriterLock lm (_processor_lock);
1166 ProcessorList::iterator i;
1167 bool removed = false;
1169 for (i = _processors.begin(); i != _processors.end(); ) {
1170 if (*i == processor) {
1172 /* move along, see failure case for configure_processors()
1173 where we may need to reconfigure the processor.
1176 /* stop redirects that send signals to JACK ports
1177 from causing noise as a result of no longer being
1181 boost::shared_ptr<IOProcessor> iop;
1183 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1185 iop->input()->disconnect (this);
1187 if (iop->output()) {
1188 iop->output()->disconnect (this);
1192 i = _processors.erase (i);
1200 _output->set_user_latency (0);
1208 if (configure_processors_unlocked (err)) {
1209 /* get back to where we where */
1210 _processors.insert (i, processor);
1211 /* we know this will work, because it worked before :) */
1212 configure_processors_unlocked (0);
1216 _have_internal_generator = false;
1218 for (i = _processors.begin(); i != _processors.end(); ++i) {
1219 boost::shared_ptr<PluginInsert> pi;
1221 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1222 if (pi->is_generator()) {
1223 _have_internal_generator = true;
1230 processor->drop_references ();
1231 processors_changed (); /* EMIT SIGNAL */
1237 Route::configure_processors (ProcessorStreams* err)
1239 if (!_in_configure_processors) {
1240 Glib::RWLock::WriterLock lm (_processor_lock);
1241 return configure_processors_unlocked (err);
1246 /** Configure the input/output configuration of each processor in the processors list.
1247 * Return 0 on success, otherwise configuration is impossible.
1250 Route::configure_processors_unlocked (ProcessorStreams* err)
1252 if (_in_configure_processors) {
1256 _in_configure_processors = true;
1258 // Check each processor in order to see if we can configure as requested
1259 ChanCount in = _input->n_ports ();
1261 list< pair<ChanCount,ChanCount> > configuration;
1264 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1265 if ((*p)->can_support_io_configuration(in, out)) {
1266 configuration.push_back(make_pair(in, out));
1273 _in_configure_processors = false;
1278 // We can, so configure everything
1279 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1280 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1281 (*p)->configure_io(c->first, c->second);
1282 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1283 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1287 // Ensure route outputs match last processor's outputs
1288 if (out != _output->n_ports ()) {
1289 _output->ensure_io (out, false, this);
1292 _in_configure_processors = false;
1297 Route::all_processors_flip ()
1299 Glib::RWLock::ReaderLock lm (_processor_lock);
1301 if (_processors.empty()) {
1305 bool first_is_on = _processors.front()->active();
1307 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1309 (*i)->deactivate ();
1315 _session.set_dirty ();
1318 /** Set all processors with a given placement to a given active state.
1319 * @param p Placement of processors to change.
1320 * @param state New active state for those processors.
1323 Route::all_processors_active (Placement p, bool state)
1325 Glib::RWLock::ReaderLock lm (_processor_lock);
1327 if (_processors.empty()) {
1330 ProcessorList::iterator start, end;
1331 placement_range(p, start, end);
1333 bool before_amp = true;
1334 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1339 if (p == PreFader && before_amp) {
1343 (*i)->deactivate ();
1348 _session.set_dirty ();
1352 Route::reorder_processors (const ProcessorList& new_order, Placement placement, ProcessorStreams* err)
1354 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1355 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1356 processors in the current actual processor list that are hidden. Any visible processors
1357 in the current list but not in "new_order" will be assumed to be deleted.
1361 Glib::RWLock::WriterLock lm (_processor_lock);
1362 ChanCount old_pms = processor_max_streams;
1363 ProcessorList::iterator oiter;
1364 ProcessorList::const_iterator niter;
1365 ProcessorList as_it_was_before = _processors;
1366 ProcessorList as_it_will_be;
1367 ProcessorList::iterator start, end;
1369 placement_range (placement, start, end);
1372 niter = new_order.begin();
1374 while (niter != new_order.end()) {
1376 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1377 then append it to the temp list.
1379 Otherwise, see if the next processor in the old list is in the new list. if not,
1380 its been deleted. If its there, append it to the temp list.
1385 /* no more elements in the old list, so just stick the rest of
1386 the new order onto the temp list.
1389 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1390 while (niter != new_order.end()) {
1391 (*niter)->set_placement (placement);
1398 if (!(*oiter)->visible()) {
1400 as_it_will_be.push_back (*oiter);
1401 (*oiter)->set_placement (placement);
1405 /* visible processor: check that its in the new order */
1407 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1408 /* deleted: do nothing, shared_ptr<> will clean up */
1410 /* ignore this one, and add the next item from the new order instead */
1411 as_it_will_be.push_back (*niter);
1412 (*niter)->set_placement (placement);
1417 /* now remove from old order - its taken care of no matter what */
1418 oiter = _processors.erase (oiter);
1423 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1425 if (configure_processors_unlocked (err)) {
1426 _processors = as_it_was_before;
1427 processor_max_streams = old_pms;
1432 processors_changed (); /* EMIT SIGNAL */
1444 Route::get_template()
1446 return state(false);
1450 Route::state(bool full_state)
1452 XMLNode *node = new XMLNode("Route");
1453 ProcessorList::iterator i;
1456 id().print (buf, sizeof (buf));
1457 node->add_property("id", buf);
1458 node->add_property ("name", _name);
1459 node->add_property("default-type", _default_type.to_string());
1462 node->add_property("flags", enum_2_string (_flags));
1465 node->add_property("active", _active?"yes":"no");
1466 node->add_property("phase-invert", _phase_invert?"yes":"no");
1467 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1468 node->add_property("meter-point", enum_2_string (_meter_point));
1471 node->add_property("route-group", _route_group->name());
1474 string order_string;
1475 OrderKeys::iterator x = order_keys.begin();
1477 while (x != order_keys.end()) {
1478 order_string += string ((*x).first);
1479 order_string += '=';
1480 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1481 order_string += buf;
1485 if (x == order_keys.end()) {
1489 order_string += ':';
1491 node->add_property ("order-keys", order_string);
1493 node->add_child_nocopy (_input->state (full_state));
1494 node->add_child_nocopy (_output->state (full_state));
1495 node->add_child_nocopy (_solo_control->get_state ());
1496 node->add_child_nocopy (_mute_master->get_state ());
1498 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1499 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1500 remote_control_node->add_property (X_("id"), buf);
1501 node->add_child_nocopy (*remote_control_node);
1503 if (_comment.length()) {
1504 XMLNode *cmt = node->add_child ("Comment");
1505 cmt->add_content (_comment);
1508 for (i = _processors.begin(); i != _processors.end(); ++i) {
1509 node->add_child_nocopy((*i)->state (full_state));
1513 node->add_child_copy (*_extra_xml);
1520 Route::set_state (const XMLNode& node)
1522 return _set_state (node, true);
1526 Route::_set_state (const XMLNode& node, bool call_base)
1530 XMLNodeConstIterator niter;
1532 XMLPropertyList plist;
1533 const XMLProperty *prop;
1535 if (node.name() != "Route"){
1536 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1540 if ((prop = node.property (X_("name"))) != 0) {
1541 Route::set_name (prop->value());
1544 if ((prop = node.property ("id")) != 0) {
1545 _id = prop->value ();
1548 if ((prop = node.property (X_("flags"))) != 0) {
1549 _flags = Flag (string_2_enum (prop->value(), _flags));
1554 /* add all processors (except amp, which is always present) */
1556 nlist = node.children();
1557 XMLNode processor_state (X_("processor_state"));
1559 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1563 if (child->name() == IO::state_node_name) {
1564 if ((prop = child->property (X_("direction"))) == 0) {
1568 if (prop->value() == "Input") {
1569 _input->set_state (*child);
1570 } else if (prop->value() == "Output") {
1571 _output->set_state (*child);
1575 if (child->name() == X_("Processor")) {
1576 processor_state.add_child_copy (*child);
1580 set_processor_state (processor_state);
1582 if ((prop = node.property ("solo_level")) != 0) {
1583 _solo_level = 0; // needed for mod_solo_level() to work
1584 mod_solo_level (atoi (prop->value()));
1587 if ((prop = node.property ("solo-isolated")) != 0) {
1588 set_solo_isolated (prop->value() == "yes", this);
1591 if ((prop = node.property (X_("phase-invert"))) != 0) {
1592 set_phase_invert (prop->value()=="yes"?true:false);
1595 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1596 set_denormal_protection (prop->value()=="yes"?true:false);
1599 if ((prop = node.property (X_("active"))) != 0) {
1600 bool yn = (prop->value() == "yes");
1601 _active = !yn; // force switch
1605 if ((prop = node.property (X_("soloed"))) != 0) {
1606 bool yn = (prop->value()=="yes");
1608 /* XXX force reset of solo status */
1610 set_solo (yn, this);
1613 if ((prop = node.property (X_("meter-point"))) != 0) {
1614 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1617 if ((prop = node.property (X_("route-group"))) != 0) {
1618 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1619 if (route_group == 0) {
1620 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1622 set_route_group (route_group, this);
1626 if ((prop = node.property (X_("order-keys"))) != 0) {
1630 string::size_type colon, equal;
1631 string remaining = prop->value();
1633 while (remaining.length()) {
1635 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1636 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1639 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1640 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1643 set_order_key (remaining.substr (0, equal), n);
1647 colon = remaining.find_first_of (':');
1649 if (colon != string::npos) {
1650 remaining = remaining.substr (colon+1);
1657 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1660 if (child->name() == X_("Comment")) {
1662 /* XXX this is a terrible API design in libxml++ */
1664 XMLNode *cmt = *(child->children().begin());
1665 _comment = cmt->content();
1667 } else if (child->name() == X_("Extra")) {
1669 _extra_xml = new XMLNode (*child);
1671 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1673 if (prop->value() == "solo") {
1674 _solo_control->set_state (*child);
1675 _session.add_controllable (_solo_control);
1678 } else if (child->name() == X_("RemoteControl")) {
1679 if ((prop = child->property (X_("id"))) != 0) {
1681 sscanf (prop->value().c_str(), "%d", &x);
1682 set_remote_control_id (x);
1685 } else if (child->name() == X_("MuteMaster")) {
1686 _mute_master->set_state (*child);
1694 Route::get_processor_state ()
1696 XMLNode* root = new XMLNode (X_("redirects"));
1697 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1698 root->add_child_nocopy ((*i)->state (true));
1705 Route::set_processor_state (const XMLNode& node)
1707 const XMLNodeList &nlist = node.children();
1708 XMLNodeConstIterator niter;
1709 ProcessorList::iterator i, o;
1711 // Iterate through existing processors, remove those which are not in the state list
1713 for (i = _processors.begin(); i != _processors.end(); ) {
1715 /* leave amp alone, always */
1722 ProcessorList::iterator tmp = i;
1725 bool processorInStateList = false;
1727 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1729 XMLProperty* id_prop = (*niter)->property(X_("id"));
1731 if (id_prop && (*i)->id() == id_prop->value()) {
1732 processorInStateList = true;
1737 if (!processorInStateList) {
1738 remove_processor (*i);
1744 // Iterate through state list and make sure all processors are on the track and in the correct order,
1745 // set the state of existing processors according to the new state on the same go
1747 i = _processors.begin();
1749 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1751 XMLProperty* prop = (*niter)->property ("type");
1755 // Check whether the next processor in the list is the right one,
1756 // except for "amp" which is always there and may not have the
1757 // old ID since it is always created anew in every Route
1759 if (prop->value() != "amp") {
1760 while (o != _processors.end()) {
1761 XMLProperty* id_prop = (*niter)->property(X_("id"));
1762 if (id_prop && (*o)->id() == id_prop->value()) {
1770 // If the processor (*niter) is not on the route,
1771 // create it and move it to the correct location
1773 if (o == _processors.end()) {
1775 if (add_processor_from_xml (**niter, i)) {
1776 --i; // move iterator to the newly inserted processor
1778 cerr << "Error restoring route: unable to restore processor" << endl;
1783 // Otherwise, the processor already exists; just
1784 // ensure it is at the location provided in the XML state
1787 boost::shared_ptr<Processor> tmp = (*o);
1788 _processors.erase (o); // remove the old copy
1789 _processors.insert (i, tmp); // insert the processor at the correct location
1790 --i; // move iterator to the correct processor
1793 // and make it (just) so
1795 (*i)->set_state (**niter);
1799 /* note: there is no configure_processors() call because we figure that
1800 the XML state represents a working signal route.
1803 processors_changed ();
1807 Route::curve_reallocate ()
1809 // _gain_automation_curve.finish_resize ();
1810 // _pan_automation_curve.finish_resize ();
1814 Route::silence (nframes_t nframes)
1818 _output->silence (nframes);
1821 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
1824 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1825 boost::shared_ptr<PluginInsert> pi;
1827 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1828 // skip plugins, they don't need anything when we're not active
1832 (*i)->silence (nframes);
1835 if (nframes == _session.get_block_size()) {
1845 Route::add_internal_return ()
1848 _intreturn.reset (new InternalReturn (_session));
1849 add_processor (_intreturn, PreFader);
1854 Route::get_return_buffer () const
1856 Glib::RWLock::ReaderLock rm (_processor_lock);
1858 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1859 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1862 BufferSet* bs = d->get_buffers ();
1871 Route::release_return_buffer () const
1873 Glib::RWLock::ReaderLock rm (_processor_lock);
1875 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1876 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1879 return d->release_buffers ();
1885 Route::listen_via (boost::shared_ptr<Route> route, bool active)
1887 vector<string> ports;
1888 vector<string>::const_iterator i;
1891 Glib::RWLock::ReaderLock rm (_processor_lock);
1893 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
1895 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1897 if (d && d->target_route() == route) {
1899 /* if the target is the control outs, then make sure
1900 we take note of which i-send is doing that.
1903 if (route == _session.control_out()) {
1904 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
1907 /* already listening via the specified IO: do nothing */
1914 boost::shared_ptr<InternalSend> listener;
1917 listener.reset (new InternalSend (_session, _mute_master, route));
1919 } catch (failed_constructor& err) {
1923 if (route == _session.control_out()) {
1924 _control_outs = listener;
1927 add_processor (listener, (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader));
1933 Route::drop_listen (boost::shared_ptr<Route> route)
1935 ProcessorStreams err;
1936 ProcessorList::iterator tmp;
1938 Glib::RWLock::ReaderLock rl(_processor_lock);
1942 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
1944 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1946 if (d && d->target_route() == route) {
1948 remove_processor (*x, &err);
1951 /* list could have been demolished while we dropped the lock
1961 if (route == _session.control_out()) {
1962 _control_outs.reset ();
1967 Route::set_route_group (RouteGroup *rg, void *src)
1969 if (rg == _route_group) {
1974 _route_group->remove (this);
1977 if ((_route_group = rg) != 0) {
1978 _route_group->add (this);
1981 _session.set_dirty ();
1982 route_group_changed (src); /* EMIT SIGNAL */
1986 Route::drop_route_group (void *src)
1989 _session.set_dirty ();
1990 route_group_changed (src); /* EMIT SIGNAL */
1994 Route::set_comment (string cmt, void *src)
1997 comment_changed (src);
1998 _session.set_dirty ();
2002 Route::feeds (boost::shared_ptr<Route> other)
2004 // cerr << _name << endl;
2006 if (_output->connected_to (other->input())) {
2007 // cerr << "\tdirect FEEDS " << other->name() << endl;
2011 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2013 boost::shared_ptr<IOProcessor> iop;
2015 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2016 if (iop->feeds (other)) {
2017 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2020 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2025 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2030 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
2032 nframes_t now = _session.transport_frame();
2035 Glib::RWLock::ReaderLock lm (_processor_lock);
2038 automation_snapshot (now, true);
2041 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2043 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2044 (*i)->deactivate ();
2048 (*i)->transport_stopped (now);
2052 _roll_delay = _initial_delay;
2056 Route::input_change_handler (IOChange change, void *src)
2058 if ((change & ConfigurationChanged)) {
2059 configure_processors (0);
2064 Route::output_change_handler (IOChange change, void *src)
2066 if ((change & ConfigurationChanged)) {
2068 /* XXX resize all listeners to match _main_outs? */
2070 // configure_processors (0);
2075 Route::pans_required () const
2077 if (n_outputs().n_audio() < 2) {
2081 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2085 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2086 bool session_state_changing, bool can_record, bool rec_monitors_input)
2088 if (n_outputs().n_total() == 0) {
2092 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2097 _amp->apply_gain_automation (false);
2098 passthru (start_frame, end_frame, nframes, 0);
2104 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2106 if (_roll_delay > nframes) {
2108 _roll_delay -= nframes;
2110 /* transport frame is not legal for caller to use */
2113 } else if (_roll_delay > 0) {
2115 nframes -= _roll_delay;
2116 silence (_roll_delay);
2117 /* we've written _roll_delay of samples into the
2118 output ports, so make a note of that for
2121 _main_outs->increment_output_offset (_roll_delay);
2122 transport_frame += _roll_delay;
2131 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2132 bool can_record, bool rec_monitors_input)
2135 // automation snapshot can also be called from the non-rt context
2136 // and it uses the processor list, so we try to acquire the lock here
2137 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2140 automation_snapshot (_session.transport_frame(), false);
2144 if (n_outputs().n_total() == 0) {
2148 if (!_active || n_inputs().n_total() == 0) {
2153 nframes_t unused = 0;
2155 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2161 passthru (start_frame, end_frame, nframes, declick);
2167 Route::silent_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2168 bool can_record, bool rec_monitors_input)
2175 Route::toggle_monitor_input ()
2177 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2178 i->ensure_monitor_input( ! i->monitoring_input());
2183 Route::has_external_redirects () const
2185 // FIXME: what about sends? - they don't return a signal back to ardour?
2187 boost::shared_ptr<const PortInsert> pi;
2189 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2191 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2193 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2195 string port_name = port->name();
2196 string client_name = port_name.substr (0, port_name.find(':'));
2198 /* only say "yes" if the redirect is actually in use */
2200 if (client_name != "ardour" && pi->active()) {
2211 Route::flush_processors ()
2213 /* XXX shouldn't really try to take this lock, since
2214 this is called from the RT audio thread.
2217 Glib::RWLock::ReaderLock lm (_processor_lock);
2219 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2220 (*i)->deactivate ();
2226 Route::set_meter_point (MeterPoint p, void *src)
2228 if (_meter_point != p) {
2231 // Move meter in the processors list
2232 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2233 _processors.erase(loc);
2236 loc = _processors.begin();
2239 loc = find(_processors.begin(), _processors.end(), _amp);
2241 case MeterPostFader:
2242 loc = _processors.end();
2245 _processors.insert(loc, _meter);
2247 meter_change (src); /* EMIT SIGNAL */
2248 processors_changed (); /* EMIT SIGNAL */
2249 _session.set_dirty ();
2253 Route::put_control_outs_at (Placement p)
2255 if (!_control_outs) {
2259 // Move meter in the processors list
2260 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2261 _processors.erase(loc);
2265 loc = find(_processors.begin(), _processors.end(), _amp);
2266 if (loc != _processors.begin()) {
2271 loc = find(_processors.begin(), _processors.end(), _amp);
2272 assert (loc != _processors.end());
2277 _processors.insert(loc, _control_outs);
2279 processors_changed (); /* EMIT SIGNAL */
2280 _session.set_dirty ();
2284 Route::update_total_latency ()
2286 nframes_t old = _output->effective_latency();
2287 nframes_t own_latency = _output->user_latency();
2289 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2290 if ((*i)->active ()) {
2291 own_latency += (*i)->signal_latency ();
2295 #undef DEBUG_LATENCY
2296 #ifdef DEBUG_LATENCY
2297 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2300 _output->set_port_latency (own_latency);
2302 if (_output->user_latency() == 0) {
2304 /* this (virtual) function is used for pure Routes,
2305 not derived classes like AudioTrack. this means
2306 that the data processed here comes from an input
2307 port, not prerecorded material, and therefore we
2308 have to take into account any input latency.
2311 own_latency += _input->signal_latency ();
2314 if (old != own_latency) {
2315 _output->set_latency_delay (own_latency);
2316 signal_latency_changed (); /* EMIT SIGNAL */
2319 #ifdef DEBUG_LATENCY
2320 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2321 << own_latency << endl;
2324 return _output->effective_latency ();
2328 Route::set_user_latency (nframes_t nframes)
2330 _output->set_user_latency (nframes);
2331 _session.update_latency_compensation (false, false);
2335 Route::set_latency_delay (nframes_t longest_session_latency)
2337 nframes_t old = _initial_delay;
2339 if (_output->effective_latency() < longest_session_latency) {
2340 _initial_delay = longest_session_latency - _output->effective_latency();
2345 if (_initial_delay != old) {
2346 initial_delay_changed (); /* EMIT SIGNAL */
2349 if (_session.transport_stopped()) {
2350 _roll_delay = _initial_delay;
2355 Route::automation_snapshot (nframes_t now, bool force)
2357 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2358 (*i)->automation_snapshot (now, force);
2362 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2363 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2364 boost::shared_ptr<AutomationList>(), name)
2367 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2372 Route::SoloControllable::set_value (float val)
2374 bool bval = ((val >= 0.5f) ? true: false);
2376 route.set_solo (bval, this);
2380 Route::SoloControllable::get_value (void) const
2382 return route.soloed() ? 1.0f : 0.0f;
2386 Route::set_block_size (nframes_t nframes)
2388 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2389 (*i)->set_block_size (nframes);
2391 _session.ensure_buffers(processor_max_streams);
2395 Route::protect_automation ()
2397 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2398 (*i)->protect_automation();
2402 Route::set_pending_declick (int declick)
2405 /* this call is not allowed to turn off a pending declick unless "force" is true */
2407 _pending_declick = declick;
2409 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2411 _pending_declick = 0;
2416 /** Shift automation forwards from a particular place, thereby inserting time.
2417 * Adds undo commands for any shifts that are performed.
2419 * @param pos Position to start shifting from.
2420 * @param frames Amount to shift forwards by.
2424 Route::shift (nframes64_t pos, nframes64_t frames)
2426 #ifdef THIS_NEEDS_FIXING_FOR_V3
2428 /* gain automation */
2429 XMLNode &before = _gain_control->get_state ();
2430 _gain_control->shift (pos, frames);
2431 XMLNode &after = _gain_control->get_state ();
2432 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2434 /* pan automation */
2435 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2436 Curve & c = (*i)->automation ();
2437 XMLNode &before = c.get_state ();
2438 c.shift (pos, frames);
2439 XMLNode &after = c.get_state ();
2440 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2443 /* redirect automation */
2445 Glib::RWLock::ReaderLock lm (redirect_lock);
2446 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2449 (*i)->what_has_automation (a);
2451 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2452 AutomationList & al = (*i)->automation_list (*j);
2453 XMLNode &before = al.get_state ();
2454 al.shift (pos, frames);
2455 XMLNode &after = al.get_state ();
2456 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2466 Route::save_as_template (const string& path, const string& name)
2468 XMLNode& node (state (false));
2471 IO::set_name_in_state (*node.children().front(), name);
2473 tree.set_root (&node);
2474 return tree.write (path.c_str());
2479 Route::set_name (const string& str)
2485 name = Route::ensure_track_or_route_name (str, _session);
2486 SessionObject::set_name (name);
2488 ret = (_input->set_name(name) && _output->set_name(name));
2492 Glib::RWLock::ReaderLock lm (_processor_lock);
2494 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2496 /* rename all I/O processors that have inputs or outputs */
2498 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2500 if (iop && (iop->output() || iop->input())) {
2501 if (!iop->set_name (name)) {
2512 boost::shared_ptr<Send>
2513 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2515 Glib::RWLock::ReaderLock lm (_processor_lock);
2517 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2518 boost::shared_ptr<InternalSend> send;
2520 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2521 if (send->target_route() == target) {
2527 return boost::shared_ptr<Send>();
2531 Route::set_phase_invert (bool yn)
2533 if (_phase_invert != yn) {
2534 _phase_invert = 0xffff; // XXX all channels
2535 phase_invert_changed (); /* EMIT SIGNAL */
2540 Route::phase_invert () const
2542 return _phase_invert != 0;
2546 Route::set_denormal_protection (bool yn)
2548 if (_denormal_protection != yn) {
2549 _denormal_protection = yn;
2550 denormal_protection_changed (); /* EMIT SIGNAL */
2555 Route::denormal_protection () const
2557 return _denormal_protection;
2561 Route::set_active (bool yn)
2563 if (_active != yn) {
2565 _input->set_active (yn);
2566 _output->set_active (yn);
2567 active_changed (); // EMIT SIGNAL
2574 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2578 boost::shared_ptr<Panner>
2579 Route::panner() const
2582 return _main_outs->panner();
2585 boost::shared_ptr<AutomationControl>
2586 Route::gain_control() const
2589 return _amp->gain_control();
2592 boost::shared_ptr<AutomationControl>
2593 Route::get_control (const Evoral::Parameter& param)
2595 /* either we own the control or .... */
2597 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2601 /* maybe one of our processors does or ... */
2603 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2604 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2605 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
2613 /* nobody does so we'll make a new one */
2615 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));