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 for " << (*i)->name() << " = " << (*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 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
483 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
487 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
489 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
490 write_out_of_band_data (bufs, start_frame, end_frame, nframes);
491 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
495 Route::set_listen (bool yn, void* src)
498 if (yn != _control_outs->active()) {
500 _control_outs->activate ();
502 _control_outs->deactivate ();
505 listen_changed (src); /* EMIT SIGNAL */
511 Route::listening () const
514 return _control_outs->active ();
521 Route::set_solo (bool yn, void *src)
523 if (_solo_safe || _solo_isolated) {
527 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
528 _route_group->apply (&Route::set_solo, yn, _route_group);
532 if (soloed() != yn) {
533 mod_solo_level (yn ? 1 : -1);
534 solo_changed (src); /* EMIT SIGNAL */
535 _solo_control->Changed (); /* EMIT SIGNAL */
540 Route::mod_solo_level (int32_t delta)
543 if (_solo_level >= (uint32_t) delta) {
544 _solo_level += delta;
549 _solo_level += delta;
552 /* tell main outs what the solo situation is
555 _main_outs->set_solo_level (_solo_level);
556 _main_outs->set_solo_isolated (_solo_isolated);
560 Route::set_solo_isolated (bool yn, void *src)
562 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
563 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
567 if (yn != _solo_isolated) {
570 /* tell main outs what the solo situation is
573 _main_outs->set_solo_level (_solo_level);
574 _main_outs->set_solo_isolated (_solo_isolated);
576 solo_isolated_changed (src);
581 Route::solo_isolated () const
583 return _solo_isolated;
587 Route::set_mute (bool yn, void *src)
589 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
590 _route_group->apply (&Route::set_mute, yn, _route_group);
595 _mute_master->mute (yn);
603 return _mute_master->muted ();
608 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
610 cerr << name << " {" << endl;
611 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
612 p != procs.end(); ++p) {
613 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
620 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
622 ProcessorList::iterator loc;
624 /* XXX this is not thread safe - we don't hold the lock across determining the iter
625 to add before and actually doing the insertion. dammit.
628 if (placement == PreFader) {
629 /* generic pre-fader: insert immediately before the amp */
630 loc = find (_processors.begin(), _processors.end(), _amp);
632 /* generic post-fader: insert right before the main outs */
633 loc = find (_processors.begin(), _processors.end(), _main_outs);
636 return add_processor (processor, loc, err);
640 /** Add a processor to the route.
641 * If @a iter is not NULL, it must point to an iterator in _processors and the new
642 * processor will be inserted immediately before this location. Otherwise,
643 * @a position is used.
646 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
648 ChanCount old_pms = processor_max_streams;
650 if (!_session.engine().connected() || !processor) {
655 Glib::RWLock::WriterLock lm (_processor_lock);
657 boost::shared_ptr<PluginInsert> pi;
658 boost::shared_ptr<PortInsert> porti;
660 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
662 if (processor == _amp || processor == _meter || processor == _main_outs) {
663 // Ensure only one of these are in the list at any time
664 if (loc != _processors.end()) {
665 if (iter == loc) { // Already in place, do nothing
667 } else { // New position given, relocate
668 _processors.erase (loc);
673 if (loc != _processors.end()) {
674 cerr << "ERROR: Processor added to route twice!" << endl;
681 _processors.insert (loc, processor);
683 // Set up processor list channels. This will set processor->[input|output]_streams(),
684 // configure redirect ports properly, etc.
687 if (configure_processors_unlocked (err)) {
688 ProcessorList::iterator ploc = loc;
690 _processors.erase(ploc);
691 configure_processors_unlocked (0); // it worked before we tried to add it ...
692 cerr << "configure failed\n";
696 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
698 if (pi->natural_input_streams() == ChanCount::ZERO) {
699 /* generator plugin */
700 _have_internal_generator = true;
705 if (_control_outs != processor) {
706 // XXX: do we want to emit the signal here ? change call order.
707 processor->activate ();
709 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
711 _output->set_user_latency (0);
714 processors_changed (); /* EMIT SIGNAL */
720 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
722 const XMLProperty *prop;
724 if (node.name() != "Processor") {
729 if ((prop = node.property ("type")) != 0) {
731 boost::shared_ptr<Processor> processor;
733 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
734 prop->value() == "lv2" ||
735 prop->value() == "vst" ||
736 prop->value() == "audiounit") {
738 processor.reset (new PluginInsert(_session, node));
740 } else if (prop->value() == "port") {
742 processor.reset (new PortInsert (_session, _mute_master, node));
744 } else if (prop->value() == "send") {
746 processor.reset (new Send (_session, _mute_master, node));
748 } else if (prop->value() == "meter") {
751 if (_meter->set_state (node)) {
758 _meter.reset (new PeakMeter (_session, node));
761 } else if (prop->value() == "amp") {
763 /* amp always exists */
766 if (processor->set_state (node)) {
769 /* never any reason to add it */
773 } else if (prop->value() == "intsend") {
775 processor.reset (new InternalSend (_session, _mute_master, node));
777 } else if (prop->value() == "intreturn") {
780 if (_intreturn->set_state (node)) {
786 _intreturn.reset (new InternalReturn (_session, node));
787 processor = _intreturn;
789 } else if (prop->value() == "main-outs") {
792 if (_main_outs->set_state (node)) {
799 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
800 processor = _main_outs;
803 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
807 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
808 /* check for invisible processors stacked at the end and leave them there */
809 ProcessorList::iterator p;
810 p = _processors.end();
812 while (!(*p)->visible() && p != _processors.begin()) {
819 return (add_processor (processor, iter) == 0);
822 error << _("Processor XML node has no type property") << endmsg;
827 catch (failed_constructor &err) {
828 warning << _("processor could not be created. Ignored.") << endmsg;
834 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
836 ProcessorList::iterator loc;
839 loc = find(_processors.begin(), _processors.end(), before);
841 /* nothing specified - at end but before main outs */
842 loc = find (_processors.begin(), _processors.end(), _main_outs);
845 return add_processors (others, loc, err);
849 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
851 /* NOTE: this is intended to be used ONLY when copying
852 processors from another Route. Hence the subtle
853 differences between this and ::add_processor()
856 ChanCount old_pms = processor_max_streams;
858 if (!_session.engine().connected()) {
862 if (others.empty()) {
867 Glib::RWLock::WriterLock lm (_processor_lock);
868 ProcessorList::iterator existing_end = _processors.end();
871 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
873 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
875 // Ensure meter only appears in the list once
877 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
878 if (m != _processors.end()) {
879 _processors.erase(m);
883 boost::shared_ptr<PluginInsert> pi;
885 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
888 ChanCount m = max (pi->input_streams(), pi->output_streams());
890 if (m > potential_max_streams) {
891 potential_max_streams = m;
895 _processors.insert (iter, *i);
897 if (configure_processors_unlocked (err)) {
899 _processors.erase (existing_end, _processors.end());
900 configure_processors_unlocked (0); // it worked before we tried to add it ...
904 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
907 _output->set_user_latency (0);
910 processors_changed (); /* EMIT SIGNAL */
916 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
919 start = _processors.begin();
920 end = find(_processors.begin(), _processors.end(), _amp);
922 start = find(_processors.begin(), _processors.end(), _amp);
924 end = _processors.end();
928 /** Turn off all processors with a given placement
929 * @param p Placement of processors to disable
932 Route::disable_processors (Placement p)
934 Glib::RWLock::ReaderLock lm (_processor_lock);
936 ProcessorList::iterator start, end;
937 placement_range(p, start, end);
939 for (ProcessorList::iterator i = start; i != end; ++i) {
943 _session.set_dirty ();
946 /** Turn off all redirects
949 Route::disable_processors ()
951 Glib::RWLock::ReaderLock lm (_processor_lock);
953 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
957 _session.set_dirty ();
960 /** Turn off all redirects with a given placement
961 * @param p Placement of redirects to disable
964 Route::disable_plugins (Placement p)
966 Glib::RWLock::ReaderLock lm (_processor_lock);
968 ProcessorList::iterator start, end;
969 placement_range(p, start, end);
971 for (ProcessorList::iterator i = start; i != end; ++i) {
972 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
977 _session.set_dirty ();
980 /** Turn off all plugins
983 Route::disable_plugins ()
985 Glib::RWLock::ReaderLock lm (_processor_lock);
987 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
988 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
993 _session.set_dirty ();
998 Route::ab_plugins (bool forward)
1000 Glib::RWLock::ReaderLock lm (_processor_lock);
1004 /* forward = turn off all active redirects, and mark them so that the next time
1005 we go the other way, we will revert them
1008 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1009 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1013 if ((*i)->active()) {
1014 (*i)->deactivate ();
1015 (*i)->set_next_ab_is_active (true);
1017 (*i)->set_next_ab_is_active (false);
1023 /* backward = if the redirect was marked to go active on the next ab, do so */
1025 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1027 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1031 if ((*i)->get_next_ab_is_active()) {
1034 (*i)->deactivate ();
1039 _session.set_dirty ();
1043 /** Remove processors with a given placement.
1044 * @param p Placement of processors to remove.
1047 Route::clear_processors (Placement p)
1049 const ChanCount old_pms = processor_max_streams;
1051 if (!_session.engine().connected()) {
1055 bool already_deleting = _session.deletion_in_progress();
1056 if (!already_deleting) {
1057 _session.set_deletion_in_progress();
1061 Glib::RWLock::WriterLock lm (_processor_lock);
1062 ProcessorList new_list;
1063 ProcessorStreams err;
1064 bool seen_amp = false;
1066 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1072 if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1074 /* you can't remove these */
1076 new_list.push_back (*i);
1083 new_list.push_back (*i);
1086 (*i)->drop_references ();
1094 (*i)->drop_references ();
1097 new_list.push_back (*i);
1104 _processors = new_list;
1105 configure_processors_unlocked (&err); // this can't fail
1108 processor_max_streams.reset();
1109 _have_internal_generator = false;
1110 processors_changed (); /* EMIT SIGNAL */
1112 if (!already_deleting) {
1113 _session.clear_deletion_in_progress();
1118 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1120 /* these can never be removed */
1122 if (processor == _amp || processor == _meter || processor == _main_outs) {
1126 ChanCount old_pms = processor_max_streams;
1128 if (!_session.engine().connected()) {
1132 processor_max_streams.reset();
1135 Glib::RWLock::WriterLock lm (_processor_lock);
1136 ProcessorList::iterator i;
1137 bool removed = false;
1139 for (i = _processors.begin(); i != _processors.end(); ) {
1140 if (*i == processor) {
1142 /* move along, see failure case for configure_processors()
1143 where we may need to reconfigure the processor.
1146 /* stop redirects that send signals to JACK ports
1147 from causing noise as a result of no longer being
1151 boost::shared_ptr<IOProcessor> iop;
1153 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1155 iop->input()->disconnect (this);
1157 if (iop->output()) {
1158 iop->output()->disconnect (this);
1162 i = _processors.erase (i);
1170 _output->set_user_latency (0);
1178 if (configure_processors_unlocked (err)) {
1179 /* get back to where we where */
1180 _processors.insert (i, processor);
1181 /* we know this will work, because it worked before :) */
1182 configure_processors_unlocked (0);
1186 _have_internal_generator = false;
1188 for (i = _processors.begin(); i != _processors.end(); ++i) {
1189 boost::shared_ptr<PluginInsert> pi;
1191 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1192 if (pi->is_generator()) {
1193 _have_internal_generator = true;
1200 processor->drop_references ();
1201 processors_changed (); /* EMIT SIGNAL */
1207 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1209 ProcessorList deleted;
1210 ProcessorList as_we_were;
1212 if (!_session.engine().connected()) {
1216 processor_max_streams.reset();
1219 Glib::RWLock::WriterLock lm (_processor_lock);
1220 ProcessorList::iterator i;
1221 boost::shared_ptr<Processor> processor;
1223 as_we_were = _processors;
1225 for (i = _processors.begin(); i != _processors.end(); ) {
1229 /* these can never be removed */
1231 if (processor == _amp || processor == _meter || processor == _main_outs) {
1236 /* see if its in the list of processors to delete */
1238 if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1243 /* stop IOProcessors that send to JACK ports
1244 from causing noise as a result of no longer being
1248 boost::shared_ptr<IOProcessor> iop;
1250 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1254 deleted.push_back (processor);
1255 i = _processors.erase (i);
1258 if (deleted.empty()) {
1259 /* none of those in the requested list were found */
1263 _output->set_user_latency (0);
1265 if (configure_processors_unlocked (err)) {
1266 /* get back to where we where */
1267 _processors = as_we_were;
1268 /* we know this will work, because it worked before :) */
1269 configure_processors_unlocked (0);
1273 _have_internal_generator = false;
1275 for (i = _processors.begin(); i != _processors.end(); ++i) {
1276 boost::shared_ptr<PluginInsert> pi;
1278 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1279 if (pi->is_generator()) {
1280 _have_internal_generator = true;
1287 /* now try to do what we need to so that those that were removed will be deleted */
1289 for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1290 (*i)->drop_references ();
1293 processors_changed (); /* EMIT SIGNAL */
1300 Route::configure_processors (ProcessorStreams* err)
1302 if (!_in_configure_processors) {
1303 Glib::RWLock::WriterLock lm (_processor_lock);
1304 return configure_processors_unlocked (err);
1309 /** Configure the input/output configuration of each processor in the processors list.
1310 * Return 0 on success, otherwise configuration is impossible.
1313 Route::configure_processors_unlocked (ProcessorStreams* err)
1315 if (_in_configure_processors) {
1319 _in_configure_processors = true;
1321 // Check each processor in order to see if we can configure as requested
1322 ChanCount in = _input->n_ports ();
1324 list< pair<ChanCount,ChanCount> > configuration;
1327 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1328 if ((*p)->can_support_io_configuration(in, out)) {
1329 configuration.push_back(make_pair(in, out));
1336 _in_configure_processors = false;
1341 // We can, so configure everything
1342 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1343 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1344 cerr << _name << " Configure " << (*p)->name() << " for " << in << " + " << out << endl;
1345 (*p)->configure_io(c->first, c->second);
1346 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1347 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1351 // Ensure route outputs match last processor's outputs
1352 if (out != _output->n_ports ()) {
1353 _output->ensure_io (out, false, this);
1356 _in_configure_processors = false;
1361 Route::all_processors_flip ()
1363 Glib::RWLock::ReaderLock lm (_processor_lock);
1365 if (_processors.empty()) {
1369 bool first_is_on = _processors.front()->active();
1371 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1373 (*i)->deactivate ();
1379 _session.set_dirty ();
1382 /** Set all processors with a given placement to a given active state.
1383 * @param p Placement of processors to change.
1384 * @param state New active state for those processors.
1387 Route::all_processors_active (Placement p, bool state)
1389 Glib::RWLock::ReaderLock lm (_processor_lock);
1391 if (_processors.empty()) {
1394 ProcessorList::iterator start, end;
1395 placement_range(p, start, end);
1397 bool before_amp = true;
1398 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1403 if (p == PreFader && before_amp) {
1407 (*i)->deactivate ();
1412 _session.set_dirty ();
1416 Route::processor_is_prefader (boost::shared_ptr<Processor> p)
1418 bool pre_fader = true;
1419 Glib::RWLock::ReaderLock lm (_processor_lock);
1421 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1423 /* semantic note: if p == amp, we want to return true, so test
1424 for equality before checking if this is the amp
1441 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1443 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1444 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1445 processors in the current actual processor list that are hidden. Any visible processors
1446 in the current list but not in "new_order" will be assumed to be deleted.
1450 Glib::RWLock::WriterLock lm (_processor_lock);
1451 ChanCount old_pms = processor_max_streams;
1452 ProcessorList::iterator oiter;
1453 ProcessorList::const_iterator niter;
1454 ProcessorList as_it_was_before = _processors;
1455 ProcessorList as_it_will_be;
1457 oiter = _processors.begin();
1458 niter = new_order.begin();
1460 while (niter != new_order.end()) {
1462 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1463 then append it to the temp list.
1465 Otherwise, see if the next processor in the old list is in the new list. if not,
1466 its been deleted. If its there, append it to the temp list.
1469 if (oiter == _processors.end()) {
1471 /* no more elements in the old list, so just stick the rest of
1472 the new order onto the temp list.
1475 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1476 while (niter != new_order.end()) {
1483 if (!(*oiter)->visible()) {
1485 as_it_will_be.push_back (*oiter);
1489 /* visible processor: check that its in the new order */
1491 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1492 /* deleted: do nothing, shared_ptr<> will clean up */
1494 /* ignore this one, and add the next item from the new order instead */
1495 as_it_will_be.push_back (*niter);
1500 /* now remove from old order - its taken care of no matter what */
1501 oiter = _processors.erase (oiter);
1506 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1508 if (configure_processors_unlocked (err)) {
1509 _processors = as_it_was_before;
1510 processor_max_streams = old_pms;
1515 processors_changed (); /* EMIT SIGNAL */
1527 Route::get_template()
1529 return state(false);
1533 Route::state(bool full_state)
1535 XMLNode *node = new XMLNode("Route");
1536 ProcessorList::iterator i;
1539 id().print (buf, sizeof (buf));
1540 node->add_property("id", buf);
1541 node->add_property ("name", _name);
1542 node->add_property("default-type", _default_type.to_string());
1545 node->add_property("flags", enum_2_string (_flags));
1548 node->add_property("active", _active?"yes":"no");
1549 node->add_property("phase-invert", _phase_invert?"yes":"no");
1550 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1551 node->add_property("meter-point", enum_2_string (_meter_point));
1554 node->add_property("route-group", _route_group->name());
1557 string order_string;
1558 OrderKeys::iterator x = order_keys.begin();
1560 while (x != order_keys.end()) {
1561 order_string += string ((*x).first);
1562 order_string += '=';
1563 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1564 order_string += buf;
1568 if (x == order_keys.end()) {
1572 order_string += ':';
1574 node->add_property ("order-keys", order_string);
1576 node->add_child_nocopy (_input->state (full_state));
1577 node->add_child_nocopy (_output->state (full_state));
1578 node->add_child_nocopy (_solo_control->get_state ());
1579 node->add_child_nocopy (_mute_master->get_state ());
1581 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1582 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1583 remote_control_node->add_property (X_("id"), buf);
1584 node->add_child_nocopy (*remote_control_node);
1586 if (_comment.length()) {
1587 XMLNode *cmt = node->add_child ("Comment");
1588 cmt->add_content (_comment);
1591 for (i = _processors.begin(); i != _processors.end(); ++i) {
1592 node->add_child_nocopy((*i)->state (full_state));
1596 node->add_child_copy (*_extra_xml);
1603 Route::set_state (const XMLNode& node)
1605 return _set_state (node, true);
1609 Route::_set_state (const XMLNode& node, bool /*call_base*/)
1613 XMLNodeConstIterator niter;
1615 XMLPropertyList plist;
1616 const XMLProperty *prop;
1618 if (node.name() != "Route"){
1619 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1623 if ((prop = node.property (X_("name"))) != 0) {
1624 Route::set_name (prop->value());
1627 if ((prop = node.property ("id")) != 0) {
1628 _id = prop->value ();
1631 if ((prop = node.property (X_("flags"))) != 0) {
1632 _flags = Flag (string_2_enum (prop->value(), _flags));
1637 /* add all processors (except amp, which is always present) */
1639 nlist = node.children();
1640 XMLNode processor_state (X_("processor_state"));
1642 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1646 if (child->name() == IO::state_node_name) {
1647 if ((prop = child->property (X_("direction"))) == 0) {
1651 if (prop->value() == "Input") {
1652 _input->set_state (*child);
1653 } else if (prop->value() == "Output") {
1654 _output->set_state (*child);
1658 if (child->name() == X_("Processor")) {
1659 processor_state.add_child_copy (*child);
1663 set_processor_state (processor_state);
1665 if ((prop = node.property ("solo_level")) != 0) {
1666 _solo_level = 0; // needed for mod_solo_level() to work
1667 mod_solo_level (atoi (prop->value()));
1670 if ((prop = node.property ("solo-isolated")) != 0) {
1671 set_solo_isolated (prop->value() == "yes", this);
1674 if ((prop = node.property (X_("phase-invert"))) != 0) {
1675 set_phase_invert (prop->value()=="yes"?true:false);
1678 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1679 set_denormal_protection (prop->value()=="yes"?true:false);
1682 if ((prop = node.property (X_("active"))) != 0) {
1683 bool yn = (prop->value() == "yes");
1684 _active = !yn; // force switch
1688 if ((prop = node.property (X_("soloed"))) != 0) {
1689 bool yn = (prop->value()=="yes");
1691 /* XXX force reset of solo status */
1693 set_solo (yn, this);
1696 if ((prop = node.property (X_("meter-point"))) != 0) {
1697 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1700 if ((prop = node.property (X_("route-group"))) != 0) {
1701 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1702 if (route_group == 0) {
1703 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1705 set_route_group (route_group, this);
1709 if ((prop = node.property (X_("order-keys"))) != 0) {
1713 string::size_type colon, equal;
1714 string remaining = prop->value();
1716 while (remaining.length()) {
1718 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1719 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1722 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1723 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1726 set_order_key (remaining.substr (0, equal), n);
1730 colon = remaining.find_first_of (':');
1732 if (colon != string::npos) {
1733 remaining = remaining.substr (colon+1);
1740 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1743 if (child->name() == X_("Comment")) {
1745 /* XXX this is a terrible API design in libxml++ */
1747 XMLNode *cmt = *(child->children().begin());
1748 _comment = cmt->content();
1750 } else if (child->name() == X_("Extra")) {
1752 _extra_xml = new XMLNode (*child);
1754 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1756 if (prop->value() == "solo") {
1757 _solo_control->set_state (*child);
1758 _session.add_controllable (_solo_control);
1761 } else if (child->name() == X_("RemoteControl")) {
1762 if ((prop = child->property (X_("id"))) != 0) {
1764 sscanf (prop->value().c_str(), "%d", &x);
1765 set_remote_control_id (x);
1768 } else if (child->name() == X_("MuteMaster")) {
1769 _mute_master->set_state (*child);
1777 Route::get_processor_state ()
1779 XMLNode* root = new XMLNode (X_("redirects"));
1780 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1781 root->add_child_nocopy ((*i)->state (true));
1788 Route::set_processor_state (const XMLNode& node)
1790 const XMLNodeList &nlist = node.children();
1791 XMLNodeConstIterator niter;
1792 ProcessorList::iterator i, o;
1794 // Iterate through existing processors, remove those which are not in the state list
1796 for (i = _processors.begin(); i != _processors.end(); ) {
1798 /* leave amp alone, always */
1805 ProcessorList::iterator tmp = i;
1808 bool processorInStateList = false;
1810 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1812 XMLProperty* id_prop = (*niter)->property(X_("id"));
1814 if (id_prop && (*i)->id() == id_prop->value()) {
1815 processorInStateList = true;
1820 if (!processorInStateList) {
1821 remove_processor (*i);
1827 // Iterate through state list and make sure all processors are on the track and in the correct order,
1828 // set the state of existing processors according to the new state on the same go
1830 i = _processors.begin();
1832 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1834 XMLProperty* prop = (*niter)->property ("type");
1838 // Check whether the next processor in the list is the right one,
1839 // except for "amp" which is always there and may not have the
1840 // old ID since it is always created anew in every Route
1842 if (prop->value() != "amp") {
1843 while (o != _processors.end()) {
1844 XMLProperty* id_prop = (*niter)->property(X_("id"));
1845 if (id_prop && (*o)->id() == id_prop->value()) {
1853 // If the processor (*niter) is not on the route,
1854 // create it and move it to the correct location
1856 if (o == _processors.end()) {
1858 if (add_processor_from_xml (**niter, i)) {
1859 --i; // move iterator to the newly inserted processor
1861 cerr << "Error restoring route: unable to restore processor" << endl;
1866 // Otherwise, the processor already exists; just
1867 // ensure it is at the location provided in the XML state
1870 boost::shared_ptr<Processor> tmp = (*o);
1871 _processors.erase (o); // remove the old copy
1872 _processors.insert (i, tmp); // insert the processor at the correct location
1873 --i; // move iterator to the correct processor
1876 // and make it (just) so
1878 (*i)->set_state (**niter);
1882 /* note: there is no configure_processors() call because we figure that
1883 the XML state represents a working signal route.
1886 processors_changed ();
1890 Route::curve_reallocate ()
1892 // _gain_automation_curve.finish_resize ();
1893 // _pan_automation_curve.finish_resize ();
1897 Route::silence (nframes_t nframes)
1901 _output->silence (nframes);
1904 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
1907 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1908 boost::shared_ptr<PluginInsert> pi;
1910 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1911 // skip plugins, they don't need anything when we're not active
1915 (*i)->silence (nframes);
1918 if (nframes == _session.get_block_size()) {
1928 Route::add_internal_return ()
1931 _intreturn.reset (new InternalReturn (_session));
1932 add_processor (_intreturn, PreFader);
1937 Route::get_return_buffer () const
1939 Glib::RWLock::ReaderLock rm (_processor_lock);
1941 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1942 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1945 BufferSet* bs = d->get_buffers ();
1954 Route::release_return_buffer () const
1956 Glib::RWLock::ReaderLock rm (_processor_lock);
1958 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1959 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1962 return d->release_buffers ();
1968 Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
1970 vector<string> ports;
1971 vector<string>::const_iterator i;
1974 Glib::RWLock::ReaderLock rm (_processor_lock);
1976 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
1978 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1980 if (d && d->target_route() == route) {
1982 /* if the target is the control outs, then make sure
1983 we take note of which i-send is doing that.
1986 if (route == _session.control_out()) {
1987 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
1990 /* already listening via the specified IO: do nothing */
1997 boost::shared_ptr<InternalSend> listener;
2000 listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen)));
2002 } catch (failed_constructor& err) {
2006 if (route == _session.control_out()) {
2007 _control_outs = listener;
2010 add_processor (listener, placement);
2016 Route::drop_listen (boost::shared_ptr<Route> route)
2018 ProcessorStreams err;
2019 ProcessorList::iterator tmp;
2021 Glib::RWLock::ReaderLock rl(_processor_lock);
2025 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
2027 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2029 if (d && d->target_route() == route) {
2031 remove_processor (*x, &err);
2034 /* list could have been demolished while we dropped the lock
2044 if (route == _session.control_out()) {
2045 _control_outs.reset ();
2050 Route::set_route_group (RouteGroup *rg, void *src)
2052 if (rg == _route_group) {
2057 _route_group->remove (this);
2060 if ((_route_group = rg) != 0) {
2061 _route_group->add (this);
2064 _session.set_dirty ();
2065 route_group_changed (src); /* EMIT SIGNAL */
2069 Route::drop_route_group (void *src)
2072 _session.set_dirty ();
2073 route_group_changed (src); /* EMIT SIGNAL */
2077 Route::set_comment (string cmt, void *src)
2080 comment_changed (src);
2081 _session.set_dirty ();
2085 Route::feeds (boost::shared_ptr<Route> other)
2087 // cerr << _name << endl;
2089 if (_output->connected_to (other->input())) {
2090 // cerr << "\tdirect FEEDS " << other->name() << endl;
2094 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2096 boost::shared_ptr<IOProcessor> iop;
2098 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2099 if (iop->feeds (other)) {
2100 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2103 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2108 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2113 Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
2115 nframes_t now = _session.transport_frame();
2118 Glib::RWLock::ReaderLock lm (_processor_lock);
2121 automation_snapshot (now, true);
2124 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2126 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2127 (*i)->deactivate ();
2131 (*i)->transport_stopped (now);
2135 _roll_delay = _initial_delay;
2139 Route::input_change_handler (IOChange change, void * /*src*/)
2141 if ((change & ConfigurationChanged)) {
2142 configure_processors (0);
2147 Route::output_change_handler (IOChange change, void * /*src*/)
2149 if ((change & ConfigurationChanged)) {
2151 /* XXX resize all listeners to match _main_outs? */
2153 // configure_processors (0);
2158 Route::pans_required () const
2160 if (n_outputs().n_audio() < 2) {
2164 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2168 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2169 bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
2171 if (n_outputs().n_total() == 0) {
2175 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2180 _amp->apply_gain_automation (false);
2181 passthru (start_frame, end_frame, nframes, 0);
2187 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2189 if (_roll_delay > nframes) {
2191 _roll_delay -= nframes;
2193 /* transport frame is not legal for caller to use */
2196 } else if (_roll_delay > 0) {
2198 nframes -= _roll_delay;
2199 silence (_roll_delay);
2200 /* we've written _roll_delay of samples into the
2201 output ports, so make a note of that for
2204 _main_outs->increment_output_offset (_roll_delay);
2205 transport_frame += _roll_delay;
2214 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2215 bool /*can_record*/, bool /*rec_monitors_input*/)
2218 // automation snapshot can also be called from the non-rt context
2219 // and it uses the processor list, so we try to acquire the lock here
2220 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2223 automation_snapshot (_session.transport_frame(), false);
2227 if (n_outputs().n_total() == 0) {
2231 if (!_active || n_inputs().n_total() == 0) {
2236 nframes_t unused = 0;
2238 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2244 passthru (start_frame, end_frame, nframes, declick);
2250 Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/,
2251 bool /*can_record*/, bool /*rec_monitors_input*/)
2258 Route::toggle_monitor_input ()
2260 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2261 i->ensure_monitor_input( ! i->monitoring_input());
2266 Route::has_external_redirects () const
2268 // FIXME: what about sends? - they don't return a signal back to ardour?
2270 boost::shared_ptr<const PortInsert> pi;
2272 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2274 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2276 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2278 string port_name = port->name();
2279 string client_name = port_name.substr (0, port_name.find(':'));
2281 /* only say "yes" if the redirect is actually in use */
2283 if (client_name != "ardour" && pi->active()) {
2294 Route::flush_processors ()
2296 /* XXX shouldn't really try to take this lock, since
2297 this is called from the RT audio thread.
2300 Glib::RWLock::ReaderLock lm (_processor_lock);
2302 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2303 (*i)->deactivate ();
2309 Route::set_meter_point (MeterPoint p, void *src)
2311 if (_meter_point != p) {
2314 // Move meter in the processors list
2315 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2316 _processors.erase(loc);
2319 loc = _processors.begin();
2322 loc = find(_processors.begin(), _processors.end(), _amp);
2324 case MeterPostFader:
2325 loc = _processors.end();
2328 _processors.insert(loc, _meter);
2330 meter_change (src); /* EMIT SIGNAL */
2331 processors_changed (); /* EMIT SIGNAL */
2332 _session.set_dirty ();
2336 Route::put_control_outs_at (Placement p)
2338 if (!_control_outs) {
2342 // Move meter in the processors list
2343 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2344 _processors.erase(loc);
2348 loc = find(_processors.begin(), _processors.end(), _amp);
2349 if (loc != _processors.begin()) {
2354 loc = find(_processors.begin(), _processors.end(), _amp);
2355 assert (loc != _processors.end());
2360 _processors.insert(loc, _control_outs);
2362 processors_changed (); /* EMIT SIGNAL */
2363 _session.set_dirty ();
2367 Route::update_total_latency ()
2369 nframes_t old = _output->effective_latency();
2370 nframes_t own_latency = _output->user_latency();
2372 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2373 if ((*i)->active ()) {
2374 own_latency += (*i)->signal_latency ();
2378 #undef DEBUG_LATENCY
2379 #ifdef DEBUG_LATENCY
2380 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2383 _output->set_port_latency (own_latency);
2385 if (_output->user_latency() == 0) {
2387 /* this (virtual) function is used for pure Routes,
2388 not derived classes like AudioTrack. this means
2389 that the data processed here comes from an input
2390 port, not prerecorded material, and therefore we
2391 have to take into account any input latency.
2394 own_latency += _input->signal_latency ();
2397 if (old != own_latency) {
2398 _output->set_latency_delay (own_latency);
2399 signal_latency_changed (); /* EMIT SIGNAL */
2402 #ifdef DEBUG_LATENCY
2403 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2404 << own_latency << endl;
2407 return _output->effective_latency ();
2411 Route::set_user_latency (nframes_t nframes)
2413 _output->set_user_latency (nframes);
2414 _session.update_latency_compensation (false, false);
2418 Route::set_latency_delay (nframes_t longest_session_latency)
2420 nframes_t old = _initial_delay;
2422 if (_output->effective_latency() < longest_session_latency) {
2423 _initial_delay = longest_session_latency - _output->effective_latency();
2428 if (_initial_delay != old) {
2429 initial_delay_changed (); /* EMIT SIGNAL */
2432 if (_session.transport_stopped()) {
2433 _roll_delay = _initial_delay;
2438 Route::automation_snapshot (nframes_t now, bool force)
2440 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2441 (*i)->automation_snapshot (now, force);
2445 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2446 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2447 boost::shared_ptr<AutomationList>(), name)
2450 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2455 Route::SoloControllable::set_value (float val)
2457 bool bval = ((val >= 0.5f) ? true: false);
2459 route.set_solo (bval, this);
2463 Route::SoloControllable::get_value (void) const
2465 return route.soloed() ? 1.0f : 0.0f;
2469 Route::set_block_size (nframes_t nframes)
2471 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2472 (*i)->set_block_size (nframes);
2474 _session.ensure_buffers(processor_max_streams);
2478 Route::protect_automation ()
2480 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2481 (*i)->protect_automation();
2485 Route::set_pending_declick (int declick)
2488 /* this call is not allowed to turn off a pending declick unless "force" is true */
2490 _pending_declick = declick;
2492 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2494 _pending_declick = 0;
2499 /** Shift automation forwards from a particular place, thereby inserting time.
2500 * Adds undo commands for any shifts that are performed.
2502 * @param pos Position to start shifting from.
2503 * @param frames Amount to shift forwards by.
2507 Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
2509 #ifdef THIS_NEEDS_FIXING_FOR_V3
2511 /* gain automation */
2512 XMLNode &before = _gain_control->get_state ();
2513 _gain_control->shift (pos, frames);
2514 XMLNode &after = _gain_control->get_state ();
2515 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2517 /* pan automation */
2518 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2519 Curve & c = (*i)->automation ();
2520 XMLNode &before = c.get_state ();
2521 c.shift (pos, frames);
2522 XMLNode &after = c.get_state ();
2523 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2526 /* redirect automation */
2528 Glib::RWLock::ReaderLock lm (redirect_lock);
2529 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2532 (*i)->what_has_automation (a);
2534 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2535 AutomationList & al = (*i)->automation_list (*j);
2536 XMLNode &before = al.get_state ();
2537 al.shift (pos, frames);
2538 XMLNode &after = al.get_state ();
2539 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2549 Route::save_as_template (const string& path, const string& name)
2551 XMLNode& node (state (false));
2554 IO::set_name_in_state (*node.children().front(), name);
2556 tree.set_root (&node);
2557 return tree.write (path.c_str());
2562 Route::set_name (const string& str)
2568 name = Route::ensure_track_or_route_name (str, _session);
2569 SessionObject::set_name (name);
2571 ret = (_input->set_name(name) && _output->set_name(name));
2575 Glib::RWLock::ReaderLock lm (_processor_lock);
2577 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2579 /* rename all I/O processors that have inputs or outputs */
2581 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2583 if (iop && (iop->output() || iop->input())) {
2584 if (!iop->set_name (name)) {
2595 boost::shared_ptr<Send>
2596 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2598 Glib::RWLock::ReaderLock lm (_processor_lock);
2600 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2601 boost::shared_ptr<InternalSend> send;
2603 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2604 if (send->target_route() == target) {
2610 return boost::shared_ptr<Send>();
2614 Route::set_phase_invert (bool yn)
2616 if (_phase_invert != yn) {
2617 _phase_invert = 0xffff; // XXX all channels
2618 phase_invert_changed (); /* EMIT SIGNAL */
2623 Route::phase_invert () const
2625 return _phase_invert != 0;
2629 Route::set_denormal_protection (bool yn)
2631 if (_denormal_protection != yn) {
2632 _denormal_protection = yn;
2633 denormal_protection_changed (); /* EMIT SIGNAL */
2638 Route::denormal_protection () const
2640 return _denormal_protection;
2644 Route::set_active (bool yn)
2646 if (_active != yn) {
2648 _input->set_active (yn);
2649 _output->set_active (yn);
2650 active_changed (); // EMIT SIGNAL
2657 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2663 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2665 boost::shared_ptr<Send> s;
2666 boost::shared_ptr<Return> r;
2668 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
2669 s->meter()->meter();
2670 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
2671 r->meter()->meter ();
2676 boost::shared_ptr<Panner>
2677 Route::panner() const
2680 return _main_outs->panner();
2683 boost::shared_ptr<AutomationControl>
2684 Route::gain_control() const
2687 return _amp->gain_control();
2690 boost::shared_ptr<AutomationControl>
2691 Route::get_control (const Evoral::Parameter& param)
2693 /* either we own the control or .... */
2695 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2699 /* maybe one of our processors does or ... */
2701 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2702 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2703 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
2711 /* nobody does so we'll make a new one */
2713 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));