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 right before the main outs */
625 loc = find (_processors.begin(), _processors.end(), _main_outs);
628 return add_processor (processor, loc, err);
632 /** Add a processor to the route.
633 * If @a iter is not NULL, it must point to an iterator in _processors and the new
634 * processor will be inserted immediately before this location. Otherwise,
635 * @a position is used.
638 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
640 ChanCount old_pms = processor_max_streams;
642 if (!_session.engine().connected() || !processor) {
647 Glib::RWLock::WriterLock lm (_processor_lock);
649 boost::shared_ptr<PluginInsert> pi;
650 boost::shared_ptr<PortInsert> porti;
652 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
654 if (processor == _amp || processor == _meter || processor == _main_outs) {
655 // Ensure only one of these are in the list at any time
656 if (loc != _processors.end()) {
657 if (iter == loc) { // Already in place, do nothing
659 } else { // New position given, relocate
660 _processors.erase (loc);
665 if (loc != _processors.end()) {
666 cerr << "ERROR: Processor added to route twice!" << endl;
673 _processors.insert (loc, processor);
675 // Set up processor list channels. This will set processor->[input|output]_streams(),
676 // configure redirect ports properly, etc.
679 if (configure_processors_unlocked (err)) {
680 ProcessorList::iterator ploc = loc;
682 _processors.erase(ploc);
683 configure_processors_unlocked (0); // it worked before we tried to add it ...
684 cerr << "configure failed\n";
688 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
690 if (pi->natural_input_streams() == ChanCount::ZERO) {
691 /* generator plugin */
692 _have_internal_generator = true;
697 // XXX: do we want to emit the signal here ? change call order.
698 if (!boost::dynamic_pointer_cast<InternalSend>(processor)) {
699 processor->activate ();
701 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
703 _output->set_user_latency (0);
706 processors_changed (); /* EMIT SIGNAL */
712 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
714 const XMLProperty *prop;
716 if (node.name() != "Processor") {
721 if ((prop = node.property ("type")) != 0) {
723 boost::shared_ptr<Processor> processor;
725 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
726 prop->value() == "lv2" ||
727 prop->value() == "vst" ||
728 prop->value() == "audiounit") {
730 processor.reset (new PluginInsert(_session, node));
732 } else if (prop->value() == "port") {
734 processor.reset (new PortInsert (_session, _mute_master, node));
736 } else if (prop->value() == "send") {
738 processor.reset (new Send (_session, _mute_master, node));
740 } else if (prop->value() == "meter") {
743 if (_meter->set_state (node)) {
750 _meter.reset (new PeakMeter (_session, node));
753 } else if (prop->value() == "amp") {
755 /* amp always exists */
758 if (processor->set_state (node)) {
761 /* never any reason to add it */
765 } else if (prop->value() == "listen" || prop->value() == "deliver") {
767 /* XXX need to generalize */
769 } else if (prop->value() == "intsend") {
771 processor.reset (new InternalSend (_session, _mute_master, node));
773 } else if (prop->value() == "intreturn") {
776 if (_intreturn->set_state (node)) {
782 _intreturn.reset (new InternalReturn (_session, node));
783 processor = _intreturn;
785 } else if (prop->value() == "main-outs") {
788 if (_main_outs->set_state (node)) {
795 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
796 processor = _main_outs;
799 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
802 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
803 /* check for invisible processors stacked at the end and leave them there */
804 ProcessorList::iterator p;
805 p = _processors.end();
807 while (!(*p)->visible() && p != _processors.begin()) {
814 return (add_processor (processor, iter) == 0);
817 error << _("Processor XML node has no type property") << endmsg;
822 catch (failed_constructor &err) {
823 warning << _("processor could not be created. Ignored.") << endmsg;
829 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
831 ProcessorList::iterator loc;
834 loc = find(_processors.begin(), _processors.end(), before);
836 /* nothing specified - at end but before main outs */
837 loc = find (_processors.begin(), _processors.end(), _main_outs);
840 return add_processors (others, loc, err);
844 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
846 /* NOTE: this is intended to be used ONLY when copying
847 processors from another Route. Hence the subtle
848 differences between this and ::add_processor()
851 ChanCount old_pms = processor_max_streams;
853 if (!_session.engine().connected()) {
857 if (others.empty()) {
862 Glib::RWLock::WriterLock lm (_processor_lock);
863 ProcessorList::iterator existing_end = _processors.end();
866 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
868 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
870 // Ensure meter only appears in the list once
872 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
873 if (m != _processors.end()) {
874 _processors.erase(m);
878 boost::shared_ptr<PluginInsert> pi;
880 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
883 ChanCount m = max (pi->input_streams(), pi->output_streams());
885 if (m > potential_max_streams) {
886 potential_max_streams = m;
890 _processors.insert (iter, *i);
892 if (configure_processors_unlocked (err)) {
894 _processors.erase (existing_end, _processors.end());
895 configure_processors_unlocked (0); // it worked before we tried to add it ...
899 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
902 _output->set_user_latency (0);
905 processors_changed (); /* EMIT SIGNAL */
911 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
914 start = _processors.begin();
915 end = find(_processors.begin(), _processors.end(), _amp);
917 start = find(_processors.begin(), _processors.end(), _amp);
919 end = _processors.end();
923 /** Turn off all processors with a given placement
924 * @param p Placement of processors to disable
927 Route::disable_processors (Placement p)
929 Glib::RWLock::ReaderLock lm (_processor_lock);
931 ProcessorList::iterator start, end;
932 placement_range(p, start, end);
934 for (ProcessorList::iterator i = start; i != end; ++i) {
938 _session.set_dirty ();
941 /** Turn off all redirects
944 Route::disable_processors ()
946 Glib::RWLock::ReaderLock lm (_processor_lock);
948 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
952 _session.set_dirty ();
955 /** Turn off all redirects with a given placement
956 * @param p Placement of redirects to disable
959 Route::disable_plugins (Placement p)
961 Glib::RWLock::ReaderLock lm (_processor_lock);
963 ProcessorList::iterator start, end;
964 placement_range(p, start, end);
966 for (ProcessorList::iterator i = start; i != end; ++i) {
967 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
972 _session.set_dirty ();
975 /** Turn off all plugins
978 Route::disable_plugins ()
980 Glib::RWLock::ReaderLock lm (_processor_lock);
982 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
983 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
988 _session.set_dirty ();
993 Route::ab_plugins (bool forward)
995 Glib::RWLock::ReaderLock lm (_processor_lock);
999 /* forward = turn off all active redirects, and mark them so that the next time
1000 we go the other way, we will revert them
1003 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1004 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1008 if ((*i)->active()) {
1009 (*i)->deactivate ();
1010 (*i)->set_next_ab_is_active (true);
1012 (*i)->set_next_ab_is_active (false);
1018 /* backward = if the redirect was marked to go active on the next ab, do so */
1020 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1022 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1026 if ((*i)->get_next_ab_is_active()) {
1029 (*i)->deactivate ();
1034 _session.set_dirty ();
1038 /** Remove processors with a given placement.
1039 * @param p Placement of processors to remove.
1042 Route::clear_processors (Placement p)
1044 const ChanCount old_pms = processor_max_streams;
1046 if (!_session.engine().connected()) {
1050 bool already_deleting = _session.deletion_in_progress();
1051 if (!already_deleting) {
1052 _session.set_deletion_in_progress();
1056 Glib::RWLock::WriterLock lm (_processor_lock);
1057 ProcessorList new_list;
1058 ProcessorStreams err;
1059 bool seen_amp = false;
1061 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1067 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1069 /* you can't remove these */
1071 new_list.push_back (*i);
1078 new_list.push_back (*i);
1081 (*i)->drop_references ();
1089 (*i)->drop_references ();
1092 new_list.push_back (*i);
1099 _processors = new_list;
1100 configure_processors_unlocked (&err); // this can't fail
1103 processor_max_streams.reset();
1104 _have_internal_generator = false;
1105 processors_changed (); /* EMIT SIGNAL */
1107 if (!already_deleting) {
1108 _session.clear_deletion_in_progress();
1113 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1115 /* these can never be removed */
1117 if (processor == _amp || processor == _meter || processor == _main_outs) {
1121 ChanCount old_pms = processor_max_streams;
1123 if (!_session.engine().connected()) {
1127 processor_max_streams.reset();
1130 Glib::RWLock::WriterLock lm (_processor_lock);
1131 ProcessorList::iterator i;
1132 bool removed = false;
1134 for (i = _processors.begin(); i != _processors.end(); ) {
1135 if (*i == processor) {
1137 /* move along, see failure case for configure_processors()
1138 where we may need to reconfigure the processor.
1141 /* stop redirects that send signals to JACK ports
1142 from causing noise as a result of no longer being
1146 boost::shared_ptr<IOProcessor> iop;
1148 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1150 iop->input()->disconnect (this);
1152 if (iop->output()) {
1153 iop->output()->disconnect (this);
1157 i = _processors.erase (i);
1165 _output->set_user_latency (0);
1173 if (configure_processors_unlocked (err)) {
1174 /* get back to where we where */
1175 _processors.insert (i, processor);
1176 /* we know this will work, because it worked before :) */
1177 configure_processors_unlocked (0);
1181 _have_internal_generator = false;
1183 for (i = _processors.begin(); i != _processors.end(); ++i) {
1184 boost::shared_ptr<PluginInsert> pi;
1186 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1187 if (pi->is_generator()) {
1188 _have_internal_generator = true;
1195 processor->drop_references ();
1196 processors_changed (); /* EMIT SIGNAL */
1202 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1204 ProcessorList deleted;
1205 ProcessorList as_we_were;
1207 if (!_session.engine().connected()) {
1211 processor_max_streams.reset();
1214 Glib::RWLock::WriterLock lm (_processor_lock);
1215 ProcessorList::iterator i;
1216 boost::shared_ptr<Processor> processor;
1218 as_we_were = _processors;
1220 for (i = _processors.begin(); i != _processors.end(); ) {
1224 /* these can never be removed */
1226 if (processor == _amp || processor == _meter || processor == _main_outs) {
1231 /* see if its in the list of processors to delete */
1233 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1238 /* stop IOProcessors that send to JACK ports
1239 from causing noise as a result of no longer being
1243 boost::shared_ptr<IOProcessor> iop;
1245 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1249 deleted.push_back (processor);
1250 i = _processors.erase (i);
1253 if (deleted.empty()) {
1254 /* none of those in the requested list were found */
1258 _output->set_user_latency (0);
1260 if (configure_processors_unlocked (err)) {
1261 /* get back to where we where */
1262 _processors = as_we_were;
1263 /* we know this will work, because it worked before :) */
1264 configure_processors_unlocked (0);
1268 _have_internal_generator = false;
1270 for (i = _processors.begin(); i != _processors.end(); ++i) {
1271 boost::shared_ptr<PluginInsert> pi;
1273 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1274 if (pi->is_generator()) {
1275 _have_internal_generator = true;
1282 /* now try to do what we need to so that those that were removed will be deleted */
1284 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1285 (*i)->drop_references ();
1288 processors_changed (); /* EMIT SIGNAL */
1295 Route::configure_processors (ProcessorStreams* err)
1297 if (!_in_configure_processors) {
1298 Glib::RWLock::WriterLock lm (_processor_lock);
1299 return configure_processors_unlocked (err);
1304 /** Configure the input/output configuration of each processor in the processors list.
1305 * Return 0 on success, otherwise configuration is impossible.
1308 Route::configure_processors_unlocked (ProcessorStreams* err)
1310 if (_in_configure_processors) {
1314 _in_configure_processors = true;
1316 // Check each processor in order to see if we can configure as requested
1317 ChanCount in = _input->n_ports ();
1319 list< pair<ChanCount,ChanCount> > configuration;
1322 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1323 if ((*p)->can_support_io_configuration(in, out)) {
1324 configuration.push_back(make_pair(in, out));
1331 _in_configure_processors = false;
1336 // We can, so configure everything
1337 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1338 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1339 (*p)->configure_io(c->first, c->second);
1340 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1341 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1345 // Ensure route outputs match last processor's outputs
1346 if (out != _output->n_ports ()) {
1347 _output->ensure_io (out, false, this);
1350 _in_configure_processors = false;
1355 Route::all_processors_flip ()
1357 Glib::RWLock::ReaderLock lm (_processor_lock);
1359 if (_processors.empty()) {
1363 bool first_is_on = _processors.front()->active();
1365 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1367 (*i)->deactivate ();
1373 _session.set_dirty ();
1376 /** Set all processors with a given placement to a given active state.
1377 * @param p Placement of processors to change.
1378 * @param state New active state for those processors.
1381 Route::all_processors_active (Placement p, bool state)
1383 Glib::RWLock::ReaderLock lm (_processor_lock);
1385 if (_processors.empty()) {
1388 ProcessorList::iterator start, end;
1389 placement_range(p, start, end);
1391 bool before_amp = true;
1392 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1397 if (p == PreFader && before_amp) {
1401 (*i)->deactivate ();
1406 _session.set_dirty ();
1410 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1412 bool pre_fader = true;
1413 Glib::RWLock::ReaderLock lm (_processor_lock);
1415 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1417 /* semantic note: if p == amp, we want to return true, so test
1418 for equality before checking if this is the amp
1435 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1437 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1438 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1439 processors in the current actual processor list that are hidden. Any visible processors
1440 in the current list but not in "new_order" will be assumed to be deleted.
1444 Glib::RWLock::WriterLock lm (_processor_lock);
1445 ChanCount old_pms = processor_max_streams;
1446 ProcessorList::iterator oiter;
1447 ProcessorList::const_iterator niter;
1448 ProcessorList as_it_was_before = _processors;
1449 ProcessorList as_it_will_be;
1451 oiter = _processors.begin();
1452 niter = new_order.begin();
1454 while (niter != new_order.end()) {
1456 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1457 then append it to the temp list.
1459 Otherwise, see if the next processor in the old list is in the new list. if not,
1460 its been deleted. If its there, append it to the temp list.
1463 if (oiter == _processors.end()) {
1465 /* no more elements in the old list, so just stick the rest of
1466 the new order onto the temp list.
1469 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1470 while (niter != new_order.end()) {
1477 if (!(*oiter)->visible()) {
1479 as_it_will_be.push_back (*oiter);
1483 /* visible processor: check that its in the new order */
1485 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1486 /* deleted: do nothing, shared_ptr<> will clean up */
1488 /* ignore this one, and add the next item from the new order instead */
1489 as_it_will_be.push_back (*niter);
1494 /* now remove from old order - its taken care of no matter what */
1495 oiter = _processors.erase (oiter);
1500 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1502 if (configure_processors_unlocked (err)) {
1503 _processors = as_it_was_before;
1504 processor_max_streams = old_pms;
1509 processors_changed (); /* EMIT SIGNAL */
1521 Route::get_template()
1523 return state(false);
1527 Route::state(bool full_state)
1529 XMLNode *node = new XMLNode("Route");
1530 ProcessorList::iterator i;
1533 id().print (buf, sizeof (buf));
1534 node->add_property("id", buf);
1535 node->add_property ("name", _name);
1536 node->add_property("default-type", _default_type.to_string());
1539 node->add_property("flags", enum_2_string (_flags));
1542 node->add_property("active", _active?"yes":"no");
1543 node->add_property("phase-invert", _phase_invert?"yes":"no");
1544 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1545 node->add_property("meter-point", enum_2_string (_meter_point));
1548 node->add_property("route-group", _route_group->name());
1551 string order_string;
1552 OrderKeys::iterator x = order_keys.begin();
1554 while (x != order_keys.end()) {
1555 order_string += string ((*x).first);
1556 order_string += '=';
1557 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1558 order_string += buf;
1562 if (x == order_keys.end()) {
1566 order_string += ':';
1568 node->add_property ("order-keys", order_string);
1570 node->add_child_nocopy (_input->state (full_state));
1571 node->add_child_nocopy (_output->state (full_state));
1572 node->add_child_nocopy (_solo_control->get_state ());
1573 node->add_child_nocopy (_mute_master->get_state ());
1575 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1576 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1577 remote_control_node->add_property (X_("id"), buf);
1578 node->add_child_nocopy (*remote_control_node);
1580 if (_comment.length()) {
1581 XMLNode *cmt = node->add_child ("Comment");
1582 cmt->add_content (_comment);
1585 for (i = _processors.begin(); i != _processors.end(); ++i) {
1586 node->add_child_nocopy((*i)->state (full_state));
1590 node->add_child_copy (*_extra_xml);
1597 Route::set_state (const XMLNode& node)
1599 return _set_state (node, true);
1603 Route::_set_state (const XMLNode& node, bool call_base)
1607 XMLNodeConstIterator niter;
1609 XMLPropertyList plist;
1610 const XMLProperty *prop;
1612 if (node.name() != "Route"){
1613 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1617 if ((prop = node.property (X_("name"))) != 0) {
1618 Route::set_name (prop->value());
1621 if ((prop = node.property ("id")) != 0) {
1622 _id = prop->value ();
1625 if ((prop = node.property (X_("flags"))) != 0) {
1626 _flags = Flag (string_2_enum (prop->value(), _flags));
1631 /* add all processors (except amp, which is always present) */
1633 nlist = node.children();
1634 XMLNode processor_state (X_("processor_state"));
1636 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1640 if (child->name() == IO::state_node_name) {
1641 if ((prop = child->property (X_("direction"))) == 0) {
1645 if (prop->value() == "Input") {
1646 _input->set_state (*child);
1647 } else if (prop->value() == "Output") {
1648 _output->set_state (*child);
1652 if (child->name() == X_("Processor")) {
1653 processor_state.add_child_copy (*child);
1657 set_processor_state (processor_state);
1659 if ((prop = node.property ("solo_level")) != 0) {
1660 _solo_level = 0; // needed for mod_solo_level() to work
1661 mod_solo_level (atoi (prop->value()));
1664 if ((prop = node.property ("solo-isolated")) != 0) {
1665 set_solo_isolated (prop->value() == "yes", this);
1668 if ((prop = node.property (X_("phase-invert"))) != 0) {
1669 set_phase_invert (prop->value()=="yes"?true:false);
1672 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1673 set_denormal_protection (prop->value()=="yes"?true:false);
1676 if ((prop = node.property (X_("active"))) != 0) {
1677 bool yn = (prop->value() == "yes");
1678 _active = !yn; // force switch
1682 if ((prop = node.property (X_("soloed"))) != 0) {
1683 bool yn = (prop->value()=="yes");
1685 /* XXX force reset of solo status */
1687 set_solo (yn, this);
1690 if ((prop = node.property (X_("meter-point"))) != 0) {
1691 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1694 if ((prop = node.property (X_("route-group"))) != 0) {
1695 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1696 if (route_group == 0) {
1697 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1699 set_route_group (route_group, this);
1703 if ((prop = node.property (X_("order-keys"))) != 0) {
1707 string::size_type colon, equal;
1708 string remaining = prop->value();
1710 while (remaining.length()) {
1712 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1713 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1716 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1717 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1720 set_order_key (remaining.substr (0, equal), n);
1724 colon = remaining.find_first_of (':');
1726 if (colon != string::npos) {
1727 remaining = remaining.substr (colon+1);
1734 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1737 if (child->name() == X_("Comment")) {
1739 /* XXX this is a terrible API design in libxml++ */
1741 XMLNode *cmt = *(child->children().begin());
1742 _comment = cmt->content();
1744 } else if (child->name() == X_("Extra")) {
1746 _extra_xml = new XMLNode (*child);
1748 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1750 if (prop->value() == "solo") {
1751 _solo_control->set_state (*child);
1752 _session.add_controllable (_solo_control);
1755 } else if (child->name() == X_("RemoteControl")) {
1756 if ((prop = child->property (X_("id"))) != 0) {
1758 sscanf (prop->value().c_str(), "%d", &x);
1759 set_remote_control_id (x);
1762 } else if (child->name() == X_("MuteMaster")) {
1763 _mute_master->set_state (*child);
1771 Route::get_processor_state ()
1773 XMLNode* root = new XMLNode (X_("redirects"));
1774 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1775 root->add_child_nocopy ((*i)->state (true));
1782 Route::set_processor_state (const XMLNode& node)
1784 const XMLNodeList &nlist = node.children();
1785 XMLNodeConstIterator niter;
1786 ProcessorList::iterator i, o;
1788 // Iterate through existing processors, remove those which are not in the state list
1790 for (i = _processors.begin(); i != _processors.end(); ) {
1792 /* leave amp alone, always */
1799 ProcessorList::iterator tmp = i;
1802 bool processorInStateList = false;
1804 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1806 XMLProperty* id_prop = (*niter)->property(X_("id"));
1808 if (id_prop && (*i)->id() == id_prop->value()) {
1809 processorInStateList = true;
1814 if (!processorInStateList) {
1815 remove_processor (*i);
1821 // Iterate through state list and make sure all processors are on the track and in the correct order,
1822 // set the state of existing processors according to the new state on the same go
1824 i = _processors.begin();
1826 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1828 XMLProperty* prop = (*niter)->property ("type");
1832 // Check whether the next processor in the list is the right one,
1833 // except for "amp" which is always there and may not have the
1834 // old ID since it is always created anew in every Route
1836 if (prop->value() != "amp") {
1837 while (o != _processors.end()) {
1838 XMLProperty* id_prop = (*niter)->property(X_("id"));
1839 if (id_prop && (*o)->id() == id_prop->value()) {
1847 // If the processor (*niter) is not on the route,
1848 // create it and move it to the correct location
1850 if (o == _processors.end()) {
1852 if (add_processor_from_xml (**niter, i)) {
1853 --i; // move iterator to the newly inserted processor
1855 cerr << "Error restoring route: unable to restore processor" << endl;
1860 // Otherwise, the processor already exists; just
1861 // ensure it is at the location provided in the XML state
1864 boost::shared_ptr<Processor> tmp = (*o);
1865 _processors.erase (o); // remove the old copy
1866 _processors.insert (i, tmp); // insert the processor at the correct location
1867 --i; // move iterator to the correct processor
1870 // and make it (just) so
1872 (*i)->set_state (**niter);
1876 /* note: there is no configure_processors() call because we figure that
1877 the XML state represents a working signal route.
1880 processors_changed ();
1884 Route::curve_reallocate ()
1886 // _gain_automation_curve.finish_resize ();
1887 // _pan_automation_curve.finish_resize ();
1891 Route::silence (nframes_t nframes)
1895 _output->silence (nframes);
1898 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
1901 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1902 boost::shared_ptr<PluginInsert> pi;
1904 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1905 // skip plugins, they don't need anything when we're not active
1909 (*i)->silence (nframes);
1912 if (nframes == _session.get_block_size()) {
1922 Route::add_internal_return ()
1925 _intreturn.reset (new InternalReturn (_session));
1926 add_processor (_intreturn, PreFader);
1931 Route::get_return_buffer () const
1933 Glib::RWLock::ReaderLock rm (_processor_lock);
1935 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1936 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1939 BufferSet* bs = d->get_buffers ();
1948 Route::release_return_buffer () const
1950 Glib::RWLock::ReaderLock rm (_processor_lock);
1952 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1953 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1956 return d->release_buffers ();
1962 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool active, bool aux)
1964 vector<string> ports;
1965 vector<string>::const_iterator i;
1968 Glib::RWLock::ReaderLock rm (_processor_lock);
1970 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
1972 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1974 if (d && d->target_route() == route) {
1976 /* if the target is the control outs, then make sure
1977 we take note of which i-send is doing that.
1980 if (route == _session.control_out()) {
1981 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
1984 /* already listening via the specified IO: do nothing */
1991 boost::shared_ptr<InternalSend> listener;
1994 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
1996 } catch (failed_constructor& err) {
2000 if (route == _session.control_out()) {
2001 _control_outs = listener;
2004 add_processor (listener, placement);
2010 Route::drop_listen (boost::shared_ptr<Route> route)
2012 ProcessorStreams err;
2013 ProcessorList::iterator tmp;
2015 Glib::RWLock::ReaderLock rl(_processor_lock);
2019 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2021 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2023 if (d && d->target_route() == route) {
2025 remove_processor (*x, &err);
2028 /* list could have been demolished while we dropped the lock
2038 if (route == _session.control_out()) {
2039 _control_outs.reset ();
2044 Route::set_route_group (RouteGroup *rg, void *src)
2046 if (rg == _route_group) {
2051 _route_group->remove (this);
2054 if ((_route_group = rg) != 0) {
2055 _route_group->add (this);
2058 _session.set_dirty ();
2059 route_group_changed (src); /* EMIT SIGNAL */
2063 Route::drop_route_group (void *src)
2066 _session.set_dirty ();
2067 route_group_changed (src); /* EMIT SIGNAL */
2071 Route::set_comment (string cmt, void *src)
2074 comment_changed (src);
2075 _session.set_dirty ();
2079 Route::feeds (boost::shared_ptr<Route> other)
2081 // cerr << _name << endl;
2083 if (_output->connected_to (other->input())) {
2084 // cerr << "\tdirect FEEDS " << other->name() << endl;
2088 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2090 boost::shared_ptr<IOProcessor> iop;
2092 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2093 if (iop->feeds (other)) {
2094 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2097 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2102 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2107 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
2109 nframes_t now = _session.transport_frame();
2112 Glib::RWLock::ReaderLock lm (_processor_lock);
2115 automation_snapshot (now, true);
2118 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2120 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2121 (*i)->deactivate ();
2125 (*i)->transport_stopped (now);
2129 _roll_delay = _initial_delay;
2133 Route::input_change_handler (IOChange change, void *src)
2135 if ((change & ConfigurationChanged)) {
2136 configure_processors (0);
2141 Route::output_change_handler (IOChange change, void *src)
2143 if ((change & ConfigurationChanged)) {
2145 /* XXX resize all listeners to match _main_outs? */
2147 // configure_processors (0);
2152 Route::pans_required () const
2154 if (n_outputs().n_audio() < 2) {
2158 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2162 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2163 bool session_state_changing, bool can_record, bool rec_monitors_input)
2165 if (n_outputs().n_total() == 0) {
2169 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2174 _amp->apply_gain_automation (false);
2175 passthru (start_frame, end_frame, nframes, 0);
2181 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2183 if (_roll_delay > nframes) {
2185 _roll_delay -= nframes;
2187 /* transport frame is not legal for caller to use */
2190 } else if (_roll_delay > 0) {
2192 nframes -= _roll_delay;
2193 silence (_roll_delay);
2194 /* we've written _roll_delay of samples into the
2195 output ports, so make a note of that for
2198 _main_outs->increment_output_offset (_roll_delay);
2199 transport_frame += _roll_delay;
2208 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2209 bool can_record, bool rec_monitors_input)
2212 // automation snapshot can also be called from the non-rt context
2213 // and it uses the processor list, so we try to acquire the lock here
2214 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2217 automation_snapshot (_session.transport_frame(), false);
2221 if (n_outputs().n_total() == 0) {
2225 if (!_active || n_inputs().n_total() == 0) {
2230 nframes_t unused = 0;
2232 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2238 passthru (start_frame, end_frame, nframes, declick);
2244 Route::silent_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2245 bool can_record, bool rec_monitors_input)
2252 Route::toggle_monitor_input ()
2254 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2255 i->ensure_monitor_input( ! i->monitoring_input());
2260 Route::has_external_redirects () const
2262 // FIXME: what about sends? - they don't return a signal back to ardour?
2264 boost::shared_ptr<const PortInsert> pi;
2266 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2268 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2270 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2272 string port_name = port->name();
2273 string client_name = port_name.substr (0, port_name.find(':'));
2275 /* only say "yes" if the redirect is actually in use */
2277 if (client_name != "ardour" && pi->active()) {
2288 Route::flush_processors ()
2290 /* XXX shouldn't really try to take this lock, since
2291 this is called from the RT audio thread.
2294 Glib::RWLock::ReaderLock lm (_processor_lock);
2296 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2297 (*i)->deactivate ();
2303 Route::set_meter_point (MeterPoint p, void *src)
2305 if (_meter_point != p) {
2308 // Move meter in the processors list
2309 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2310 _processors.erase(loc);
2313 loc = _processors.begin();
2316 loc = find(_processors.begin(), _processors.end(), _amp);
2318 case MeterPostFader:
2319 loc = _processors.end();
2322 _processors.insert(loc, _meter);
2324 meter_change (src); /* EMIT SIGNAL */
2325 processors_changed (); /* EMIT SIGNAL */
2326 _session.set_dirty ();
2330 Route::put_control_outs_at (Placement p)
2332 if (!_control_outs) {
2336 // Move meter in the processors list
2337 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2338 _processors.erase(loc);
2342 loc = find(_processors.begin(), _processors.end(), _amp);
2343 if (loc != _processors.begin()) {
2348 loc = find(_processors.begin(), _processors.end(), _amp);
2349 assert (loc != _processors.end());
2354 _processors.insert(loc, _control_outs);
2356 processors_changed (); /* EMIT SIGNAL */
2357 _session.set_dirty ();
2361 Route::update_total_latency ()
2363 nframes_t old = _output->effective_latency();
2364 nframes_t own_latency = _output->user_latency();
2366 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2367 if ((*i)->active ()) {
2368 own_latency += (*i)->signal_latency ();
2372 #undef DEBUG_LATENCY
2373 #ifdef DEBUG_LATENCY
2374 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2377 _output->set_port_latency (own_latency);
2379 if (_output->user_latency() == 0) {
2381 /* this (virtual) function is used for pure Routes,
2382 not derived classes like AudioTrack. this means
2383 that the data processed here comes from an input
2384 port, not prerecorded material, and therefore we
2385 have to take into account any input latency.
2388 own_latency += _input->signal_latency ();
2391 if (old != own_latency) {
2392 _output->set_latency_delay (own_latency);
2393 signal_latency_changed (); /* EMIT SIGNAL */
2396 #ifdef DEBUG_LATENCY
2397 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2398 << own_latency << endl;
2401 return _output->effective_latency ();
2405 Route::set_user_latency (nframes_t nframes)
2407 _output->set_user_latency (nframes);
2408 _session.update_latency_compensation (false, false);
2412 Route::set_latency_delay (nframes_t longest_session_latency)
2414 nframes_t old = _initial_delay;
2416 if (_output->effective_latency() < longest_session_latency) {
2417 _initial_delay = longest_session_latency - _output->effective_latency();
2422 if (_initial_delay != old) {
2423 initial_delay_changed (); /* EMIT SIGNAL */
2426 if (_session.transport_stopped()) {
2427 _roll_delay = _initial_delay;
2432 Route::automation_snapshot (nframes_t now, bool force)
2434 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2435 (*i)->automation_snapshot (now, force);
2439 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2440 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2441 boost::shared_ptr<AutomationList>(), name)
2444 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2449 Route::SoloControllable::set_value (float val)
2451 bool bval = ((val >= 0.5f) ? true: false);
2453 route.set_solo (bval, this);
2457 Route::SoloControllable::get_value (void) const
2459 return route.soloed() ? 1.0f : 0.0f;
2463 Route::set_block_size (nframes_t nframes)
2465 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2466 (*i)->set_block_size (nframes);
2468 _session.ensure_buffers(processor_max_streams);
2472 Route::protect_automation ()
2474 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2475 (*i)->protect_automation();
2479 Route::set_pending_declick (int declick)
2482 /* this call is not allowed to turn off a pending declick unless "force" is true */
2484 _pending_declick = declick;
2486 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2488 _pending_declick = 0;
2493 /** Shift automation forwards from a particular place, thereby inserting time.
2494 * Adds undo commands for any shifts that are performed.
2496 * @param pos Position to start shifting from.
2497 * @param frames Amount to shift forwards by.
2501 Route::shift (nframes64_t pos, nframes64_t frames)
2503 #ifdef THIS_NEEDS_FIXING_FOR_V3
2505 /* gain automation */
2506 XMLNode &before = _gain_control->get_state ();
2507 _gain_control->shift (pos, frames);
2508 XMLNode &after = _gain_control->get_state ();
2509 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2511 /* pan automation */
2512 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2513 Curve & c = (*i)->automation ();
2514 XMLNode &before = c.get_state ();
2515 c.shift (pos, frames);
2516 XMLNode &after = c.get_state ();
2517 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2520 /* redirect automation */
2522 Glib::RWLock::ReaderLock lm (redirect_lock);
2523 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2526 (*i)->what_has_automation (a);
2528 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2529 AutomationList & al = (*i)->automation_list (*j);
2530 XMLNode &before = al.get_state ();
2531 al.shift (pos, frames);
2532 XMLNode &after = al.get_state ();
2533 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2543 Route::save_as_template (const string& path, const string& name)
2545 XMLNode& node (state (false));
2548 IO::set_name_in_state (*node.children().front(), name);
2550 tree.set_root (&node);
2551 return tree.write (path.c_str());
2556 Route::set_name (const string& str)
2562 name = Route::ensure_track_or_route_name (str, _session);
2563 SessionObject::set_name (name);
2565 ret = (_input->set_name(name) && _output->set_name(name));
2569 Glib::RWLock::ReaderLock lm (_processor_lock);
2571 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2573 /* rename all I/O processors that have inputs or outputs */
2575 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2577 if (iop && (iop->output() || iop->input())) {
2578 if (!iop->set_name (name)) {
2589 boost::shared_ptr<Send>
2590 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2592 Glib::RWLock::ReaderLock lm (_processor_lock);
2594 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2595 boost::shared_ptr<InternalSend> send;
2597 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2598 if (send->target_route() == target) {
2604 return boost::shared_ptr<Send>();
2608 Route::set_phase_invert (bool yn)
2610 if (_phase_invert != yn) {
2611 _phase_invert = 0xffff; // XXX all channels
2612 phase_invert_changed (); /* EMIT SIGNAL */
2617 Route::phase_invert () const
2619 return _phase_invert != 0;
2623 Route::set_denormal_protection (bool yn)
2625 if (_denormal_protection != yn) {
2626 _denormal_protection = yn;
2627 denormal_protection_changed (); /* EMIT SIGNAL */
2632 Route::denormal_protection () const
2634 return _denormal_protection;
2638 Route::set_active (bool yn)
2640 if (_active != yn) {
2642 _input->set_active (yn);
2643 _output->set_active (yn);
2644 active_changed (); // EMIT SIGNAL
2651 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2655 boost::shared_ptr<Panner>
2656 Route::panner() const
2659 return _main_outs->panner();
2662 boost::shared_ptr<AutomationControl>
2663 Route::gain_control() const
2666 return _amp->gain_control();
2669 boost::shared_ptr<AutomationControl>
2670 Route::get_control (const Evoral::Parameter& param)
2672 /* either we own the control or .... */
2674 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2678 /* maybe one of our processors does or ... */
2680 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2681 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2682 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
2690 /* nobody does so we'll make a new one */
2692 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));