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 if (bufs.count() != (*i)->input_streams()) {
424 cerr << _name << " bufs = " << bufs.count()
425 << " input = " << (*i)->input_streams()
428 assert (bufs.count() == (*i)->input_streams());
429 (*i)->run (bufs, start_frame, end_frame, nframes);
430 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
433 if (!_processors.empty()) {
434 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
440 Route::n_process_buffers ()
442 return max (_input->n_ports(), processor_max_streams);
446 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
448 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
452 assert (bufs.available() >= _input->n_ports());
454 if (_input->n_ports() == ChanCount::ZERO) {
458 bufs.set_count (_input->n_ports());
460 if (is_control() && _session.listening()) {
462 /* control/monitor bus ignores input ports when something is
463 feeding the listen "stream". data will "arrive" into the
464 route from the intreturn processor element.
467 bufs.silence (nframes, 0);
471 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
473 BufferSet::iterator o = bufs.begin(*t);
474 PortSet& ports (_input->ports());
476 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
477 o->read_from (i->get_buffer(nframes), nframes);
482 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
486 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
488 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, true, declick);
492 Route::set_listen (bool yn, void* src)
495 if (yn != _control_outs->active()) {
497 _control_outs->activate ();
499 _control_outs->deactivate ();
502 listen_changed (src); /* EMIT SIGNAL */
508 Route::listening () const
511 return _control_outs->active ();
518 Route::set_solo (bool yn, void *src)
520 if (_solo_safe || _solo_isolated) {
524 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
525 _route_group->apply (&Route::set_solo, yn, _route_group);
529 if (soloed() != yn) {
530 mod_solo_level (yn ? 1 : -1);
531 solo_changed (src); /* EMIT SIGNAL */
532 _solo_control->Changed (); /* EMIT SIGNAL */
537 Route::mod_solo_level (int32_t delta)
540 if (_solo_level >= (uint32_t) delta) {
541 _solo_level += delta;
546 _solo_level += delta;
549 /* tell main outs what the solo situation is
552 _main_outs->set_solo_level (_solo_level);
553 _main_outs->set_solo_isolated (_solo_isolated);
557 Route::set_solo_isolated (bool yn, void *src)
559 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
560 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
564 if (yn != _solo_isolated) {
567 /* tell main outs what the solo situation is
570 _main_outs->set_solo_level (_solo_level);
571 _main_outs->set_solo_isolated (_solo_isolated);
573 solo_isolated_changed (src);
578 Route::solo_isolated () const
580 return _solo_isolated;
584 Route::set_mute (bool yn, void *src)
586 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
587 _route_group->apply (&Route::set_mute, yn, _route_group);
592 _mute_master->mute (yn);
600 return _mute_master->muted ();
605 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
607 cerr << name << " {" << endl;
608 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
609 p != procs.end(); ++p) {
610 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
617 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
619 ProcessorList::iterator loc;
621 /* XXX this is not thread safe - we don't hold the lock across determining the iter
622 to add before and actually doing the insertion. dammit.
625 if (placement == PreFader) {
626 /* generic pre-fader: insert immediately before the amp */
627 loc = find (_processors.begin(), _processors.end(), _amp);
629 /* generic post-fader: insert right before the main outs */
630 loc = find (_processors.begin(), _processors.end(), _main_outs);
633 return add_processor (processor, loc, err);
637 /** Add a processor to the route.
638 * If @a iter is not NULL, it must point to an iterator in _processors and the new
639 * processor will be inserted immediately before this location. Otherwise,
640 * @a position is used.
643 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
645 ChanCount old_pms = processor_max_streams;
647 if (!_session.engine().connected() || !processor) {
652 Glib::RWLock::WriterLock lm (_processor_lock);
654 boost::shared_ptr<PluginInsert> pi;
655 boost::shared_ptr<PortInsert> porti;
657 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
659 if (processor == _amp || processor == _meter || processor == _main_outs) {
660 // Ensure only one of these are in the list at any time
661 if (loc != _processors.end()) {
662 if (iter == loc) { // Already in place, do nothing
664 } else { // New position given, relocate
665 _processors.erase (loc);
670 if (loc != _processors.end()) {
671 cerr << "ERROR: Processor added to route twice!" << endl;
678 _processors.insert (loc, processor);
680 // Set up processor list channels. This will set processor->[input|output]_streams(),
681 // configure redirect ports properly, etc.
684 if (configure_processors_unlocked (err)) {
685 ProcessorList::iterator ploc = loc;
687 _processors.erase(ploc);
688 configure_processors_unlocked (0); // it worked before we tried to add it ...
689 cerr << "configure failed\n";
693 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
695 if (pi->natural_input_streams() == ChanCount::ZERO) {
696 /* generator plugin */
697 _have_internal_generator = true;
702 if (_control_outs != processor) {
703 // XXX: do we want to emit the signal here ? change call order.
704 processor->activate ();
706 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
708 _output->set_user_latency (0);
711 processors_changed (); /* EMIT SIGNAL */
717 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
719 const XMLProperty *prop;
721 if (node.name() != "Processor") {
726 if ((prop = node.property ("type")) != 0) {
728 boost::shared_ptr<Processor> processor;
730 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
731 prop->value() == "lv2" ||
732 prop->value() == "vst" ||
733 prop->value() == "audiounit") {
735 processor.reset (new PluginInsert(_session, node));
737 } else if (prop->value() == "port") {
739 processor.reset (new PortInsert (_session, _mute_master, node));
741 } else if (prop->value() == "send") {
743 processor.reset (new Send (_session, _mute_master, node));
745 } else if (prop->value() == "meter") {
748 if (_meter->set_state (node)) {
755 _meter.reset (new PeakMeter (_session, node));
758 } else if (prop->value() == "amp") {
760 /* amp always exists */
763 if (processor->set_state (node)) {
766 /* never any reason to add it */
770 } else if (prop->value() == "intsend") {
772 processor.reset (new InternalSend (_session, _mute_master, node));
774 } else if (prop->value() == "intreturn") {
777 if (_intreturn->set_state (node)) {
783 _intreturn.reset (new InternalReturn (_session, node));
784 processor = _intreturn;
786 } else if (prop->value() == "main-outs") {
789 if (_main_outs->set_state (node)) {
796 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
797 processor = _main_outs;
800 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
804 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
805 /* check for invisible processors stacked at the end and leave them there */
806 ProcessorList::iterator p;
807 p = _processors.end();
809 while (!(*p)->visible() && p != _processors.begin()) {
816 return (add_processor (processor, iter) == 0);
819 error << _("Processor XML node has no type property") << endmsg;
824 catch (failed_constructor &err) {
825 warning << _("processor could not be created. Ignored.") << endmsg;
831 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
833 ProcessorList::iterator loc;
836 loc = find(_processors.begin(), _processors.end(), before);
838 /* nothing specified - at end but before main outs */
839 loc = find (_processors.begin(), _processors.end(), _main_outs);
842 return add_processors (others, loc, err);
846 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
848 /* NOTE: this is intended to be used ONLY when copying
849 processors from another Route. Hence the subtle
850 differences between this and ::add_processor()
853 ChanCount old_pms = processor_max_streams;
855 if (!_session.engine().connected()) {
859 if (others.empty()) {
864 Glib::RWLock::WriterLock lm (_processor_lock);
865 ProcessorList::iterator existing_end = _processors.end();
868 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
870 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
872 // Ensure meter only appears in the list once
874 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
875 if (m != _processors.end()) {
876 _processors.erase(m);
880 boost::shared_ptr<PluginInsert> pi;
882 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
885 ChanCount m = max (pi->input_streams(), pi->output_streams());
887 if (m > potential_max_streams) {
888 potential_max_streams = m;
892 _processors.insert (iter, *i);
894 if (configure_processors_unlocked (err)) {
896 _processors.erase (existing_end, _processors.end());
897 configure_processors_unlocked (0); // it worked before we tried to add it ...
901 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
904 _output->set_user_latency (0);
907 processors_changed (); /* EMIT SIGNAL */
913 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
916 start = _processors.begin();
917 end = find(_processors.begin(), _processors.end(), _amp);
919 start = find(_processors.begin(), _processors.end(), _amp);
921 end = _processors.end();
925 /** Turn off all processors with a given placement
926 * @param p Placement of processors to disable
929 Route::disable_processors (Placement p)
931 Glib::RWLock::ReaderLock lm (_processor_lock);
933 ProcessorList::iterator start, end;
934 placement_range(p, start, end);
936 for (ProcessorList::iterator i = start; i != end; ++i) {
940 _session.set_dirty ();
943 /** Turn off all redirects
946 Route::disable_processors ()
948 Glib::RWLock::ReaderLock lm (_processor_lock);
950 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
954 _session.set_dirty ();
957 /** Turn off all redirects with a given placement
958 * @param p Placement of redirects to disable
961 Route::disable_plugins (Placement p)
963 Glib::RWLock::ReaderLock lm (_processor_lock);
965 ProcessorList::iterator start, end;
966 placement_range(p, start, end);
968 for (ProcessorList::iterator i = start; i != end; ++i) {
969 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
974 _session.set_dirty ();
977 /** Turn off all plugins
980 Route::disable_plugins ()
982 Glib::RWLock::ReaderLock lm (_processor_lock);
984 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
985 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
990 _session.set_dirty ();
995 Route::ab_plugins (bool forward)
997 Glib::RWLock::ReaderLock lm (_processor_lock);
1001 /* forward = turn off all active redirects, and mark them so that the next time
1002 we go the other way, we will revert them
1005 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1006 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1010 if ((*i)->active()) {
1011 (*i)->deactivate ();
1012 (*i)->set_next_ab_is_active (true);
1014 (*i)->set_next_ab_is_active (false);
1020 /* backward = if the redirect was marked to go active on the next ab, do so */
1022 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1024 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1028 if ((*i)->get_next_ab_is_active()) {
1031 (*i)->deactivate ();
1036 _session.set_dirty ();
1040 /** Remove processors with a given placement.
1041 * @param p Placement of processors to remove.
1044 Route::clear_processors (Placement p)
1046 const ChanCount old_pms = processor_max_streams;
1048 if (!_session.engine().connected()) {
1052 bool already_deleting = _session.deletion_in_progress();
1053 if (!already_deleting) {
1054 _session.set_deletion_in_progress();
1058 Glib::RWLock::WriterLock lm (_processor_lock);
1059 ProcessorList new_list;
1060 ProcessorStreams err;
1061 bool seen_amp = false;
1063 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1069 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1071 /* you can't remove these */
1073 new_list.push_back (*i);
1080 new_list.push_back (*i);
1083 (*i)->drop_references ();
1091 (*i)->drop_references ();
1094 new_list.push_back (*i);
1101 _processors = new_list;
1102 configure_processors_unlocked (&err); // this can't fail
1105 processor_max_streams.reset();
1106 _have_internal_generator = false;
1107 processors_changed (); /* EMIT SIGNAL */
1109 if (!already_deleting) {
1110 _session.clear_deletion_in_progress();
1115 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1117 /* these can never be removed */
1119 if (processor == _amp || processor == _meter || processor == _main_outs) {
1123 ChanCount old_pms = processor_max_streams;
1125 if (!_session.engine().connected()) {
1129 processor_max_streams.reset();
1132 Glib::RWLock::WriterLock lm (_processor_lock);
1133 ProcessorList::iterator i;
1134 bool removed = false;
1136 for (i = _processors.begin(); i != _processors.end(); ) {
1137 if (*i == processor) {
1139 /* move along, see failure case for configure_processors()
1140 where we may need to reconfigure the processor.
1143 /* stop redirects that send signals to JACK ports
1144 from causing noise as a result of no longer being
1148 boost::shared_ptr<IOProcessor> iop;
1150 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1152 iop->input()->disconnect (this);
1154 if (iop->output()) {
1155 iop->output()->disconnect (this);
1159 i = _processors.erase (i);
1167 _output->set_user_latency (0);
1175 if (configure_processors_unlocked (err)) {
1176 /* get back to where we where */
1177 _processors.insert (i, processor);
1178 /* we know this will work, because it worked before :) */
1179 configure_processors_unlocked (0);
1183 _have_internal_generator = false;
1185 for (i = _processors.begin(); i != _processors.end(); ++i) {
1186 boost::shared_ptr<PluginInsert> pi;
1188 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1189 if (pi->is_generator()) {
1190 _have_internal_generator = true;
1197 processor->drop_references ();
1198 processors_changed (); /* EMIT SIGNAL */
1204 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1206 ProcessorList deleted;
1207 ProcessorList as_we_were;
1209 if (!_session.engine().connected()) {
1213 processor_max_streams.reset();
1216 Glib::RWLock::WriterLock lm (_processor_lock);
1217 ProcessorList::iterator i;
1218 boost::shared_ptr<Processor> processor;
1220 as_we_were = _processors;
1222 for (i = _processors.begin(); i != _processors.end(); ) {
1226 /* these can never be removed */
1228 if (processor == _amp || processor == _meter || processor == _main_outs) {
1233 /* see if its in the list of processors to delete */
1235 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1240 /* stop IOProcessors that send to JACK ports
1241 from causing noise as a result of no longer being
1245 boost::shared_ptr<IOProcessor> iop;
1247 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1251 deleted.push_back (processor);
1252 i = _processors.erase (i);
1255 if (deleted.empty()) {
1256 /* none of those in the requested list were found */
1260 _output->set_user_latency (0);
1262 if (configure_processors_unlocked (err)) {
1263 /* get back to where we where */
1264 _processors = as_we_were;
1265 /* we know this will work, because it worked before :) */
1266 configure_processors_unlocked (0);
1270 _have_internal_generator = false;
1272 for (i = _processors.begin(); i != _processors.end(); ++i) {
1273 boost::shared_ptr<PluginInsert> pi;
1275 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1276 if (pi->is_generator()) {
1277 _have_internal_generator = true;
1284 /* now try to do what we need to so that those that were removed will be deleted */
1286 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1287 (*i)->drop_references ();
1290 processors_changed (); /* EMIT SIGNAL */
1297 Route::configure_processors (ProcessorStreams* err)
1299 if (!_in_configure_processors) {
1300 Glib::RWLock::WriterLock lm (_processor_lock);
1301 return configure_processors_unlocked (err);
1306 /** Configure the input/output configuration of each processor in the processors list.
1307 * Return 0 on success, otherwise configuration is impossible.
1310 Route::configure_processors_unlocked (ProcessorStreams* err)
1312 if (_in_configure_processors) {
1316 _in_configure_processors = true;
1318 // Check each processor in order to see if we can configure as requested
1319 ChanCount in = _input->n_ports ();
1321 list< pair<ChanCount,ChanCount> > configuration;
1324 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1325 if ((*p)->can_support_io_configuration(in, out)) {
1326 configuration.push_back(make_pair(in, out));
1333 _in_configure_processors = false;
1338 // We can, so configure everything
1339 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1340 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1341 cerr << _name << " Configure " << (*p)->name() << " for " << in << " + " << out << endl;
1342 (*p)->configure_io(c->first, c->second);
1343 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1344 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1348 // Ensure route outputs match last processor's outputs
1349 if (out != _output->n_ports ()) {
1350 _output->ensure_io (out, false, this);
1353 _in_configure_processors = false;
1358 Route::all_processors_flip ()
1360 Glib::RWLock::ReaderLock lm (_processor_lock);
1362 if (_processors.empty()) {
1366 bool first_is_on = _processors.front()->active();
1368 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1370 (*i)->deactivate ();
1376 _session.set_dirty ();
1379 /** Set all processors with a given placement to a given active state.
1380 * @param p Placement of processors to change.
1381 * @param state New active state for those processors.
1384 Route::all_processors_active (Placement p, bool state)
1386 Glib::RWLock::ReaderLock lm (_processor_lock);
1388 if (_processors.empty()) {
1391 ProcessorList::iterator start, end;
1392 placement_range(p, start, end);
1394 bool before_amp = true;
1395 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1400 if (p == PreFader && before_amp) {
1404 (*i)->deactivate ();
1409 _session.set_dirty ();
1413 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1415 bool pre_fader = true;
1416 Glib::RWLock::ReaderLock lm (_processor_lock);
1418 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1420 /* semantic note: if p == amp, we want to return true, so test
1421 for equality before checking if this is the amp
1438 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1440 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1441 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1442 processors in the current actual processor list that are hidden. Any visible processors
1443 in the current list but not in "new_order" will be assumed to be deleted.
1447 Glib::RWLock::WriterLock lm (_processor_lock);
1448 ChanCount old_pms = processor_max_streams;
1449 ProcessorList::iterator oiter;
1450 ProcessorList::const_iterator niter;
1451 ProcessorList as_it_was_before = _processors;
1452 ProcessorList as_it_will_be;
1454 oiter = _processors.begin();
1455 niter = new_order.begin();
1457 while (niter != new_order.end()) {
1459 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1460 then append it to the temp list.
1462 Otherwise, see if the next processor in the old list is in the new list. if not,
1463 its been deleted. If its there, append it to the temp list.
1466 if (oiter == _processors.end()) {
1468 /* no more elements in the old list, so just stick the rest of
1469 the new order onto the temp list.
1472 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1473 while (niter != new_order.end()) {
1480 if (!(*oiter)->visible()) {
1482 as_it_will_be.push_back (*oiter);
1486 /* visible processor: check that its in the new order */
1488 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1489 /* deleted: do nothing, shared_ptr<> will clean up */
1491 /* ignore this one, and add the next item from the new order instead */
1492 as_it_will_be.push_back (*niter);
1497 /* now remove from old order - its taken care of no matter what */
1498 oiter = _processors.erase (oiter);
1503 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1505 if (configure_processors_unlocked (err)) {
1506 _processors = as_it_was_before;
1507 processor_max_streams = old_pms;
1512 processors_changed (); /* EMIT SIGNAL */
1524 Route::get_template()
1526 return state(false);
1530 Route::state(bool full_state)
1532 XMLNode *node = new XMLNode("Route");
1533 ProcessorList::iterator i;
1536 id().print (buf, sizeof (buf));
1537 node->add_property("id", buf);
1538 node->add_property ("name", _name);
1539 node->add_property("default-type", _default_type.to_string());
1542 node->add_property("flags", enum_2_string (_flags));
1545 node->add_property("active", _active?"yes":"no");
1546 node->add_property("phase-invert", _phase_invert?"yes":"no");
1547 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1548 node->add_property("meter-point", enum_2_string (_meter_point));
1551 node->add_property("route-group", _route_group->name());
1554 string order_string;
1555 OrderKeys::iterator x = order_keys.begin();
1557 while (x != order_keys.end()) {
1558 order_string += string ((*x).first);
1559 order_string += '=';
1560 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1561 order_string += buf;
1565 if (x == order_keys.end()) {
1569 order_string += ':';
1571 node->add_property ("order-keys", order_string);
1573 node->add_child_nocopy (_input->state (full_state));
1574 node->add_child_nocopy (_output->state (full_state));
1575 node->add_child_nocopy (_solo_control->get_state ());
1576 node->add_child_nocopy (_mute_master->get_state ());
1578 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1579 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1580 remote_control_node->add_property (X_("id"), buf);
1581 node->add_child_nocopy (*remote_control_node);
1583 if (_comment.length()) {
1584 XMLNode *cmt = node->add_child ("Comment");
1585 cmt->add_content (_comment);
1588 for (i = _processors.begin(); i != _processors.end(); ++i) {
1589 node->add_child_nocopy((*i)->state (full_state));
1593 node->add_child_copy (*_extra_xml);
1600 Route::set_state (const XMLNode& node)
1602 return _set_state (node, true);
1606 Route::_set_state (const XMLNode& node, bool /*call_base*/)
1610 XMLNodeConstIterator niter;
1612 XMLPropertyList plist;
1613 const XMLProperty *prop;
1615 if (node.name() != "Route"){
1616 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1620 if ((prop = node.property (X_("name"))) != 0) {
1621 Route::set_name (prop->value());
1624 if ((prop = node.property ("id")) != 0) {
1625 _id = prop->value ();
1628 if ((prop = node.property (X_("flags"))) != 0) {
1629 _flags = Flag (string_2_enum (prop->value(), _flags));
1634 /* add all processors (except amp, which is always present) */
1636 nlist = node.children();
1637 XMLNode processor_state (X_("processor_state"));
1639 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1643 if (child->name() == IO::state_node_name) {
1644 if ((prop = child->property (X_("direction"))) == 0) {
1648 if (prop->value() == "Input") {
1649 _input->set_state (*child);
1650 } else if (prop->value() == "Output") {
1651 _output->set_state (*child);
1655 if (child->name() == X_("Processor")) {
1656 processor_state.add_child_copy (*child);
1660 set_processor_state (processor_state);
1662 if ((prop = node.property ("solo_level")) != 0) {
1663 _solo_level = 0; // needed for mod_solo_level() to work
1664 mod_solo_level (atoi (prop->value()));
1667 if ((prop = node.property ("solo-isolated")) != 0) {
1668 set_solo_isolated (prop->value() == "yes", this);
1671 if ((prop = node.property (X_("phase-invert"))) != 0) {
1672 set_phase_invert (prop->value()=="yes"?true:false);
1675 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1676 set_denormal_protection (prop->value()=="yes"?true:false);
1679 if ((prop = node.property (X_("active"))) != 0) {
1680 bool yn = (prop->value() == "yes");
1681 _active = !yn; // force switch
1685 if ((prop = node.property (X_("soloed"))) != 0) {
1686 bool yn = (prop->value()=="yes");
1688 /* XXX force reset of solo status */
1690 set_solo (yn, this);
1693 if ((prop = node.property (X_("meter-point"))) != 0) {
1694 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1697 if ((prop = node.property (X_("route-group"))) != 0) {
1698 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1699 if (route_group == 0) {
1700 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1702 set_route_group (route_group, this);
1706 if ((prop = node.property (X_("order-keys"))) != 0) {
1710 string::size_type colon, equal;
1711 string remaining = prop->value();
1713 while (remaining.length()) {
1715 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1716 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1719 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1720 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1723 set_order_key (remaining.substr (0, equal), n);
1727 colon = remaining.find_first_of (':');
1729 if (colon != string::npos) {
1730 remaining = remaining.substr (colon+1);
1737 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1740 if (child->name() == X_("Comment")) {
1742 /* XXX this is a terrible API design in libxml++ */
1744 XMLNode *cmt = *(child->children().begin());
1745 _comment = cmt->content();
1747 } else if (child->name() == X_("Extra")) {
1749 _extra_xml = new XMLNode (*child);
1751 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1753 if (prop->value() == "solo") {
1754 _solo_control->set_state (*child);
1755 _session.add_controllable (_solo_control);
1758 } else if (child->name() == X_("RemoteControl")) {
1759 if ((prop = child->property (X_("id"))) != 0) {
1761 sscanf (prop->value().c_str(), "%d", &x);
1762 set_remote_control_id (x);
1765 } else if (child->name() == X_("MuteMaster")) {
1766 _mute_master->set_state (*child);
1774 Route::get_processor_state ()
1776 XMLNode* root = new XMLNode (X_("redirects"));
1777 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1778 root->add_child_nocopy ((*i)->state (true));
1785 Route::set_processor_state (const XMLNode& node)
1787 const XMLNodeList &nlist = node.children();
1788 XMLNodeConstIterator niter;
1789 ProcessorList::iterator i, o;
1791 // Iterate through existing processors, remove those which are not in the state list
1793 for (i = _processors.begin(); i != _processors.end(); ) {
1795 /* leave amp alone, always */
1802 ProcessorList::iterator tmp = i;
1805 bool processorInStateList = false;
1807 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1809 XMLProperty* id_prop = (*niter)->property(X_("id"));
1811 if (id_prop && (*i)->id() == id_prop->value()) {
1812 processorInStateList = true;
1817 if (!processorInStateList) {
1818 remove_processor (*i);
1824 // Iterate through state list and make sure all processors are on the track and in the correct order,
1825 // set the state of existing processors according to the new state on the same go
1827 i = _processors.begin();
1829 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1831 XMLProperty* prop = (*niter)->property ("type");
1835 // Check whether the next processor in the list is the right one,
1836 // except for "amp" which is always there and may not have the
1837 // old ID since it is always created anew in every Route
1839 if (prop->value() != "amp") {
1840 while (o != _processors.end()) {
1841 XMLProperty* id_prop = (*niter)->property(X_("id"));
1842 if (id_prop && (*o)->id() == id_prop->value()) {
1850 // If the processor (*niter) is not on the route,
1851 // create it and move it to the correct location
1853 if (o == _processors.end()) {
1855 if (add_processor_from_xml (**niter, i)) {
1856 --i; // move iterator to the newly inserted processor
1858 cerr << "Error restoring route: unable to restore processor" << endl;
1863 // Otherwise, the processor already exists; just
1864 // ensure it is at the location provided in the XML state
1867 boost::shared_ptr<Processor> tmp = (*o);
1868 _processors.erase (o); // remove the old copy
1869 _processors.insert (i, tmp); // insert the processor at the correct location
1870 --i; // move iterator to the correct processor
1873 // and make it (just) so
1875 (*i)->set_state (**niter);
1879 /* note: there is no configure_processors() call because we figure that
1880 the XML state represents a working signal route.
1883 processors_changed ();
1887 Route::curve_reallocate ()
1889 // _gain_automation_curve.finish_resize ();
1890 // _pan_automation_curve.finish_resize ();
1894 Route::silence (nframes_t nframes)
1898 _output->silence (nframes);
1901 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
1904 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1905 boost::shared_ptr<PluginInsert> pi;
1907 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1908 // skip plugins, they don't need anything when we're not active
1912 (*i)->silence (nframes);
1915 if (nframes == _session.get_block_size()) {
1925 Route::add_internal_return ()
1928 _intreturn.reset (new InternalReturn (_session));
1929 add_processor (_intreturn, PreFader);
1934 Route::get_return_buffer () const
1936 Glib::RWLock::ReaderLock rm (_processor_lock);
1938 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1939 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1942 BufferSet* bs = d->get_buffers ();
1951 Route::release_return_buffer () const
1953 Glib::RWLock::ReaderLock rm (_processor_lock);
1955 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1956 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1959 return d->release_buffers ();
1965 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
1967 vector<string> ports;
1968 vector<string>::const_iterator i;
1971 Glib::RWLock::ReaderLock rm (_processor_lock);
1973 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
1975 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1977 if (d && d->target_route() == route) {
1979 /* if the target is the control outs, then make sure
1980 we take note of which i-send is doing that.
1983 if (route == _session.control_out()) {
1984 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
1987 /* already listening via the specified IO: do nothing */
1994 boost::shared_ptr<InternalSend> listener;
1997 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
1999 } catch (failed_constructor& err) {
2003 if (route == _session.control_out()) {
2004 _control_outs = listener;
2007 add_processor (listener, placement);
2013 Route::drop_listen (boost::shared_ptr<Route> route)
2015 ProcessorStreams err;
2016 ProcessorList::iterator tmp;
2018 Glib::RWLock::ReaderLock rl(_processor_lock);
2022 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2024 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2026 if (d && d->target_route() == route) {
2028 remove_processor (*x, &err);
2031 /* list could have been demolished while we dropped the lock
2041 if (route == _session.control_out()) {
2042 _control_outs.reset ();
2047 Route::set_route_group (RouteGroup *rg, void *src)
2049 if (rg == _route_group) {
2054 _route_group->remove (this);
2057 if ((_route_group = rg) != 0) {
2058 _route_group->add (this);
2061 _session.set_dirty ();
2062 route_group_changed (src); /* EMIT SIGNAL */
2066 Route::drop_route_group (void *src)
2069 _session.set_dirty ();
2070 route_group_changed (src); /* EMIT SIGNAL */
2074 Route::set_comment (string cmt, void *src)
2077 comment_changed (src);
2078 _session.set_dirty ();
2082 Route::feeds (boost::shared_ptr<Route> other)
2084 // cerr << _name << endl;
2086 if (_output->connected_to (other->input())) {
2087 // cerr << "\tdirect FEEDS " << other->name() << endl;
2091 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2093 boost::shared_ptr<IOProcessor> iop;
2095 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2096 if (iop->feeds (other)) {
2097 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2100 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2105 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2110 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2112 nframes_t now = _session.transport_frame();
2115 Glib::RWLock::ReaderLock lm (_processor_lock);
2118 automation_snapshot (now, true);
2121 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2123 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2124 (*i)->deactivate ();
2128 (*i)->transport_stopped (now);
2132 _roll_delay = _initial_delay;
2136 Route::input_change_handler (IOChange change, void * /*src*/)
2138 if ((change & ConfigurationChanged)) {
2139 configure_processors (0);
2144 Route::output_change_handler (IOChange change, void * /*src*/)
2146 if ((change & ConfigurationChanged)) {
2148 /* XXX resize all listeners to match _main_outs? */
2150 // configure_processors (0);
2155 Route::pans_required () const
2157 if (n_outputs().n_audio() < 2) {
2161 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2165 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2166 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2168 if (n_outputs().n_total() == 0) {
2172 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2177 _amp->apply_gain_automation (false);
2178 passthru (start_frame, end_frame, nframes, 0);
2184 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2186 if (_roll_delay > nframes) {
2188 _roll_delay -= nframes;
2190 /* transport frame is not legal for caller to use */
2193 } else if (_roll_delay > 0) {
2195 nframes -= _roll_delay;
2196 silence (_roll_delay);
2197 /* we've written _roll_delay of samples into the
2198 output ports, so make a note of that for
2201 _main_outs->increment_output_offset (_roll_delay);
2202 transport_frame += _roll_delay;
2211 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2212 bool /*can_record*/, bool /*rec_monitors_input*/)
2215 // automation snapshot can also be called from the non-rt context
2216 // and it uses the processor list, so we try to acquire the lock here
2217 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2220 automation_snapshot (_session.transport_frame(), false);
2224 if (n_outputs().n_total() == 0) {
2228 if (!_active || n_inputs().n_total() == 0) {
2233 nframes_t unused = 0;
2235 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2241 passthru (start_frame, end_frame, nframes, declick);
2247 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2248 bool /*can_record*/, bool /*rec_monitors_input*/)
2255 Route::toggle_monitor_input ()
2257 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2258 i->ensure_monitor_input( ! i->monitoring_input());
2263 Route::has_external_redirects () const
2265 // FIXME: what about sends? - they don't return a signal back to ardour?
2267 boost::shared_ptr<const PortInsert> pi;
2269 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2271 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2273 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2275 string port_name = port->name();
2276 string client_name = port_name.substr (0, port_name.find(':'));
2278 /* only say "yes" if the redirect is actually in use */
2280 if (client_name != "ardour" && pi->active()) {
2291 Route::flush_processors ()
2293 /* XXX shouldn't really try to take this lock, since
2294 this is called from the RT audio thread.
2297 Glib::RWLock::ReaderLock lm (_processor_lock);
2299 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2300 (*i)->deactivate ();
2306 Route::set_meter_point (MeterPoint p, void *src)
2308 if (_meter_point != p) {
2311 // Move meter in the processors list
2312 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2313 _processors.erase(loc);
2316 loc = _processors.begin();
2319 loc = find(_processors.begin(), _processors.end(), _amp);
2321 case MeterPostFader:
2322 loc = _processors.end();
2325 _processors.insert(loc, _meter);
2327 meter_change (src); /* EMIT SIGNAL */
2328 processors_changed (); /* EMIT SIGNAL */
2329 _session.set_dirty ();
2333 Route::put_control_outs_at (Placement p)
2335 if (!_control_outs) {
2339 // Move meter in the processors list
2340 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2341 _processors.erase(loc);
2345 loc = find(_processors.begin(), _processors.end(), _amp);
2346 if (loc != _processors.begin()) {
2351 loc = find(_processors.begin(), _processors.end(), _amp);
2352 assert (loc != _processors.end());
2357 _processors.insert(loc, _control_outs);
2359 processors_changed (); /* EMIT SIGNAL */
2360 _session.set_dirty ();
2364 Route::update_total_latency ()
2366 nframes_t old = _output->effective_latency();
2367 nframes_t own_latency = _output->user_latency();
2369 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2370 if ((*i)->active ()) {
2371 own_latency += (*i)->signal_latency ();
2375 #undef DEBUG_LATENCY
2376 #ifdef DEBUG_LATENCY
2377 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2380 _output->set_port_latency (own_latency);
2382 if (_output->user_latency() == 0) {
2384 /* this (virtual) function is used for pure Routes,
2385 not derived classes like AudioTrack. this means
2386 that the data processed here comes from an input
2387 port, not prerecorded material, and therefore we
2388 have to take into account any input latency.
2391 own_latency += _input->signal_latency ();
2394 if (old != own_latency) {
2395 _output->set_latency_delay (own_latency);
2396 signal_latency_changed (); /* EMIT SIGNAL */
2399 #ifdef DEBUG_LATENCY
2400 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2401 << own_latency << endl;
2404 return _output->effective_latency ();
2408 Route::set_user_latency (nframes_t nframes)
2410 _output->set_user_latency (nframes);
2411 _session.update_latency_compensation (false, false);
2415 Route::set_latency_delay (nframes_t longest_session_latency)
2417 nframes_t old = _initial_delay;
2419 if (_output->effective_latency() < longest_session_latency) {
2420 _initial_delay = longest_session_latency - _output->effective_latency();
2425 if (_initial_delay != old) {
2426 initial_delay_changed (); /* EMIT SIGNAL */
2429 if (_session.transport_stopped()) {
2430 _roll_delay = _initial_delay;
2435 Route::automation_snapshot (nframes_t now, bool force)
2437 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2438 (*i)->automation_snapshot (now, force);
2442 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2443 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2444 boost::shared_ptr<AutomationList>(), name)
2447 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2452 Route::SoloControllable::set_value (float val)
2454 bool bval = ((val >= 0.5f) ? true: false);
2456 route.set_solo (bval, this);
2460 Route::SoloControllable::get_value (void) const
2462 return route.soloed() ? 1.0f : 0.0f;
2466 Route::set_block_size (nframes_t nframes)
2468 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2469 (*i)->set_block_size (nframes);
2471 _session.ensure_buffers(processor_max_streams);
2475 Route::protect_automation ()
2477 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2478 (*i)->protect_automation();
2482 Route::set_pending_declick (int declick)
2485 /* this call is not allowed to turn off a pending declick unless "force" is true */
2487 _pending_declick = declick;
2489 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2491 _pending_declick = 0;
2496 /** Shift automation forwards from a particular place, thereby inserting time.
2497 * Adds undo commands for any shifts that are performed.
2499 * @param pos Position to start shifting from.
2500 * @param frames Amount to shift forwards by.
2504 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2506 #ifdef THIS_NEEDS_FIXING_FOR_V3
2508 /* gain automation */
2509 XMLNode &before = _gain_control->get_state ();
2510 _gain_control->shift (pos, frames);
2511 XMLNode &after = _gain_control->get_state ();
2512 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2514 /* pan automation */
2515 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2516 Curve & c = (*i)->automation ();
2517 XMLNode &before = c.get_state ();
2518 c.shift (pos, frames);
2519 XMLNode &after = c.get_state ();
2520 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2523 /* redirect automation */
2525 Glib::RWLock::ReaderLock lm (redirect_lock);
2526 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2529 (*i)->what_has_automation (a);
2531 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2532 AutomationList & al = (*i)->automation_list (*j);
2533 XMLNode &before = al.get_state ();
2534 al.shift (pos, frames);
2535 XMLNode &after = al.get_state ();
2536 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2546 Route::save_as_template (const string& path, const string& name)
2548 XMLNode& node (state (false));
2551 IO::set_name_in_state (*node.children().front(), name);
2553 tree.set_root (&node);
2554 return tree.write (path.c_str());
2559 Route::set_name (const string& str)
2565 name = Route::ensure_track_or_route_name (str, _session);
2566 SessionObject::set_name (name);
2568 ret = (_input->set_name(name) && _output->set_name(name));
2572 Glib::RWLock::ReaderLock lm (_processor_lock);
2574 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2576 /* rename all I/O processors that have inputs or outputs */
2578 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2580 if (iop && (iop->output() || iop->input())) {
2581 if (!iop->set_name (name)) {
2592 boost::shared_ptr<Send>
2593 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2595 Glib::RWLock::ReaderLock lm (_processor_lock);
2597 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2598 boost::shared_ptr<InternalSend> send;
2600 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2601 if (send->target_route() == target) {
2607 return boost::shared_ptr<Send>();
2611 Route::set_phase_invert (bool yn)
2613 if (_phase_invert != yn) {
2614 _phase_invert = 0xffff; // XXX all channels
2615 phase_invert_changed (); /* EMIT SIGNAL */
2620 Route::phase_invert () const
2622 return _phase_invert != 0;
2626 Route::set_denormal_protection (bool yn)
2628 if (_denormal_protection != yn) {
2629 _denormal_protection = yn;
2630 denormal_protection_changed (); /* EMIT SIGNAL */
2635 Route::denormal_protection () const
2637 return _denormal_protection;
2641 Route::set_active (bool yn)
2643 if (_active != yn) {
2645 _input->set_active (yn);
2646 _output->set_active (yn);
2647 active_changed (); // EMIT SIGNAL
2654 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2660 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2662 boost::shared_ptr<Send> s;
2663 boost::shared_ptr<Return> r;
2665 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
2666 s->meter()->meter();
2667 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
2668 r->meter()->meter ();
2673 boost::shared_ptr<Panner>
2674 Route::panner() const
2677 return _main_outs->panner();
2680 boost::shared_ptr<AutomationControl>
2681 Route::gain_control() const
2684 return _amp->gain_control();
2687 boost::shared_ptr<AutomationControl>
2688 Route::get_control (const Evoral::Parameter& param)
2690 /* either we own the control or .... */
2692 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2696 /* maybe one of our processors does or ... */
2698 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2699 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2700 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
2708 /* nobody does so we'll make a new one */
2710 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));