2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include <sigc++/bind.h>
26 #include "pbd/xml++.h"
27 #include "pbd/enumwriter.h"
28 #include "pbd/stacktrace.h"
29 #include "pbd/memento_command.h"
31 #include "evoral/Curve.hpp"
33 #include "ardour/amp.h"
34 #include "ardour/audio_port.h"
35 #include "ardour/audioengine.h"
36 #include "ardour/buffer.h"
37 #include "ardour/buffer_set.h"
38 #include "ardour/configuration.h"
39 #include "ardour/cycle_timer.h"
40 #include "ardour/delivery.h"
41 #include "ardour/dB.h"
42 #include "ardour/internal_send.h"
43 #include "ardour/internal_return.h"
44 #include "ardour/ladspa_plugin.h"
45 #include "ardour/meter.h"
46 #include "ardour/mix.h"
47 #include "ardour/panner.h"
48 #include "ardour/plugin_insert.h"
49 #include "ardour/port.h"
50 #include "ardour/port_insert.h"
51 #include "ardour/processor.h"
52 #include "ardour/profile.h"
53 #include "ardour/route.h"
54 #include "ardour/route_group.h"
55 #include "ardour/send.h"
56 #include "ardour/session.h"
57 #include "ardour/timestamps.h"
58 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 uint32_t Route::order_key_cnt = 0;
67 sigc::signal<void,const char*> Route::SyncOrderKeys;
69 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
70 : SessionObject (sess, name)
71 , AutomatableControls (sess)
73 , _solo_control (new SoloControllable (X_("solo"), *this))
74 , _mute_master (new MuteMaster (sess, name))
75 , _default_type (default_type)
80 /* add standard processors other than amp (added by ::init()) */
82 _meter.reset (new PeakMeter (_session));
83 add_processor (_meter, PreFader);
85 if (_flags & ControlOut) {
86 /* where we listen to tracks */
87 _intreturn.reset (new InternalReturn (_session));
88 add_processor (_intreturn, PreFader);
91 _main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
92 add_processor (_main_outs, PostFader);
94 /* now that we have _meter, its safe to connect to this */
96 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
99 Route::Route (Session& sess, const XMLNode& node, DataType default_type)
100 : SessionObject (sess, "toBeReset")
101 , AutomatableControls (sess)
102 , _solo_control (new SoloControllable (X_("solo"), *this))
103 , _mute_master (new MuteMaster (sess, "toBeReset"))
104 , _default_type (default_type)
108 _set_state (node, false);
110 /* now that we have _meter, its safe to connect to this */
112 _meter_connection = Metering::connect (mem_fun (*this, &Route::meter));
119 _solo_isolated = false;
121 processor_max_streams.reset();
124 order_keys[strdup (N_("signal"))] = order_key_cnt++;
126 _meter_point = MeterPostFader;
129 _have_internal_generator = false;
130 _declickable = false;
131 _pending_declick = true;
132 _remote_control_id = 0;
133 _in_configure_processors = false;
138 _denormal_protection = false;
140 /* add standard controls */
142 add_control (_solo_control);
143 add_control (_mute_master);
145 /* input and output objects */
147 _input.reset (new IO (_session, _name, IO::Input, _default_type));
148 _output.reset (new IO (_session, _name, IO::Output, _default_type));
150 _input->changed.connect (mem_fun (this, &Route::input_change_handler));
151 _output->changed.connect (mem_fun (this, &Route::output_change_handler));
153 /* add amp processor */
155 _amp.reset (new Amp (_session, _mute_master));
156 add_processor (_amp, PostFader);
161 Metering::disconnect (_meter_connection);
163 clear_processors (PreFader);
164 clear_processors (PostFader);
166 for (OrderKeys::iterator i = order_keys.begin(); i != order_keys.end(); ++i) {
167 free ((void*)(i->first));
172 Route::set_remote_control_id (uint32_t id)
174 if (id != _remote_control_id) {
175 _remote_control_id = id;
176 RemoteControlIDChanged ();
181 Route::remote_control_id() const
183 return _remote_control_id;
187 Route::order_key (const char* name) const
189 OrderKeys::const_iterator i;
191 for (i = order_keys.begin(); i != order_keys.end(); ++i) {
192 if (!strcmp (name, i->first)) {
201 Route::set_order_key (const char* name, long n)
203 order_keys[strdup(name)] = n;
205 if (Config->get_sync_all_route_ordering()) {
206 for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
211 _session.set_dirty ();
215 Route::sync_order_keys (const char* base)
217 if (order_keys.empty()) {
221 OrderKeys::iterator i;
224 if ((i = order_keys.find (base)) == order_keys.end()) {
225 /* key doesn't exist, use the first existing key (during session initialization) */
226 i = order_keys.begin();
230 /* key exists - use it and reset all others (actually, itself included) */
232 i = order_keys.begin();
235 for (; i != order_keys.end(); ++i) {
241 Route::ensure_track_or_route_name(string name, Session &session)
243 string newname = name;
245 while (session.route_by_name (newname) != NULL) {
246 newname = bump_name_once (newname);
254 Route::inc_gain (gain_t fraction, void *src)
256 _amp->inc_gain (fraction, src);
260 Route::set_gain (gain_t val, void *src)
262 if (src != 0 && _route_group && src != _route_group && _route_group->active_property (RouteGroup::Gain)) {
264 if (_route_group->is_relative()) {
266 gain_t usable_gain = _amp->gain();
267 if (usable_gain < 0.000001f) {
268 usable_gain = 0.000001f;
272 if (delta < 0.000001f) {
276 delta -= usable_gain;
281 gain_t factor = delta / usable_gain;
284 factor = _route_group->get_max_factor(factor);
285 if (factor == 0.0f) {
286 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
290 factor = _route_group->get_min_factor(factor);
291 if (factor == 0.0f) {
292 _amp->gain_control()->Changed(); /* EMIT SIGNAL */
297 _route_group->apply (&Route::inc_gain, factor, _route_group);
301 _route_group->apply (&Route::set_gain, val, _route_group);
307 if (val == _amp->gain()) {
311 _amp->set_gain (val, src);
314 /** Process this route for one (sub) cycle (process thread)
316 * @param bufs Scratch buffers to use for the signal path
317 * @param start_frame Initial transport frame
318 * @param end_frame Final transport frame
319 * @param nframes Number of frames to output (to ports)
321 * Note that (end_frame - start_frame) may not be equal to nframes when the
322 * transport speed isn't 1.0 (eg varispeed).
325 Route::process_output_buffers (BufferSet& bufs,
326 sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
327 bool with_processors, int declick)
331 bufs.is_silent (false);
333 switch (Config->get_monitoring_model()) {
334 case HardwareMonitoring:
335 case ExternalMonitoring:
336 monitor = !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording());
343 declick = _pending_declick;
346 /* figure out if we're going to use gain automation */
347 _amp->setup_gain_automation (start_frame, end_frame, nframes);
350 /* tell main outs what to do about monitoring */
351 _main_outs->no_outs_cuz_we_no_monitor (!monitor);
354 /* -------------------------------------------------------------------------------------------
355 GLOBAL DECLICK (for transport changes etc.)
356 ----------------------------------------------------------------------------------------- */
359 Amp::apply_gain (bufs, nframes, 0.0, 1.0);
360 } else if (declick < 0) {
361 Amp::apply_gain (bufs, nframes, 1.0, 0.0);
364 _pending_declick = 0;
366 /* -------------------------------------------------------------------------------------------
367 DENORMAL CONTROL/PHASE INVERT
368 ----------------------------------------------------------------------------------------- */
374 if (_denormal_protection || Config->get_denormal_protection()) {
376 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
377 Sample* const sp = i->data();
379 if (_phase_invert & chn) {
380 for (nframes_t nx = 0; nx < nframes; ++nx) {
385 for (nframes_t nx = 0; nx < nframes; ++nx) {
393 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
394 Sample* const sp = i->data();
396 if (_phase_invert & chn) {
397 for (nframes_t nx = 0; nx < nframes; ++nx) {
406 if (_denormal_protection || Config->get_denormal_protection()) {
408 for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
409 Sample* const sp = i->data();
410 for (nframes_t nx = 0; nx < nframes; ++nx) {
418 /* -------------------------------------------------------------------------------------------
420 ----------------------------------------------------------------------------------------- */
422 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
425 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
426 bufs.set_count (ChanCount::max(bufs.count(), (*i)->input_streams()));
427 (*i)->run (bufs, start_frame, end_frame, nframes);
428 bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
431 if (!_processors.empty()) {
432 bufs.set_count (ChanCount::max (bufs.count(), _processors.back()->output_streams()));
438 Route::n_process_buffers ()
440 return max (_input->n_ports(), processor_max_streams);
444 Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
446 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
450 assert (bufs.available() >= _input->n_ports());
452 if (_input->n_ports() == ChanCount::ZERO) {
456 bufs.set_count (_input->n_ports());
458 if (is_control() && _session.listening()) {
460 /* control/monitor bus ignores input ports when something is
461 feeding the listen "stream". data will "arrive" into the
462 route from the intreturn processor element.
465 bufs.silence (nframes, 0);
469 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
471 BufferSet::iterator o = bufs.begin(*t);
472 PortSet& ports (_input->ports());
474 for (PortSet::iterator i = ports.begin(*t); i != ports.end(*t); ++i, ++o) {
475 o->read_from (i->get_buffer(nframes), nframes);
480 process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
484 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
486 process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, true, declick);
490 Route::set_listen (bool yn, void* src)
493 if (yn != _control_outs->active()) {
495 _control_outs->activate ();
497 _control_outs->deactivate ();
500 listen_changed (src); /* EMIT SIGNAL */
506 Route::listening () const
509 return _control_outs->active ();
516 Route::set_solo (bool yn, void *src)
518 if (_solo_safe || _solo_isolated) {
522 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
523 _route_group->apply (&Route::set_solo, yn, _route_group);
527 if (soloed() != yn) {
528 mod_solo_level (yn ? 1 : -1);
529 solo_changed (src); /* EMIT SIGNAL */
530 _solo_control->Changed (); /* EMIT SIGNAL */
535 Route::mod_solo_level (int32_t delta)
538 if (_solo_level >= (uint32_t) delta) {
539 _solo_level += delta;
544 _solo_level += delta;
547 /* tell main outs what the solo situation is
550 _main_outs->set_solo_level (_solo_level);
551 _main_outs->set_solo_isolated (_solo_isolated);
555 Route::set_solo_isolated (bool yn, void *src)
557 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Solo)) {
558 _route_group->apply (&Route::set_solo_isolated, yn, _route_group);
562 if (yn != _solo_isolated) {
565 /* tell main outs what the solo situation is
568 _main_outs->set_solo_level (_solo_level);
569 _main_outs->set_solo_isolated (_solo_isolated);
571 solo_isolated_changed (src);
576 Route::solo_isolated () const
578 return _solo_isolated;
582 Route::set_mute (bool yn, void *src)
584 if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::Mute)) {
585 _route_group->apply (&Route::set_mute, yn, _route_group);
590 _mute_master->mute (yn);
598 return _mute_master->muted ();
603 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
605 cerr << name << " {" << endl;
606 for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
607 p != procs.end(); ++p) {
608 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << endl;
615 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err)
617 ProcessorList::iterator loc;
619 /* XXX this is not thread safe - we don't hold the lock across determining the iter
620 to add before and actually doing the insertion. dammit.
623 if (placement == PreFader) {
624 /* generic pre-fader: insert immediately before the amp */
625 loc = find(_processors.begin(), _processors.end(), _amp);
627 /* generic post-fader: insert at end */
628 loc = _processors.end();
630 if (processor->visible() && !_processors.empty()) {
631 /* check for invisible processors stacked at the end and leave them there */
632 ProcessorList::iterator p;
633 p = _processors.end();
635 while (!(*p)->visible() && p != _processors.begin()) {
643 return add_processor (processor, loc, err);
647 /** Add a processor to the route.
648 * If @a iter is not NULL, it must point to an iterator in _processors and the new
649 * processor will be inserted immediately before this location. Otherwise,
650 * @a position is used.
653 Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::iterator iter, ProcessorStreams* err)
655 ChanCount old_pms = processor_max_streams;
657 if (!_session.engine().connected() || !processor) {
662 Glib::RWLock::WriterLock lm (_processor_lock);
664 boost::shared_ptr<PluginInsert> pi;
665 boost::shared_ptr<PortInsert> porti;
667 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), processor);
669 if (processor == _amp || processor == _meter || processor == _main_outs) {
670 // Ensure only one of these are in the list at any time
671 if (loc != _processors.end()) {
672 if (iter == loc) { // Already in place, do nothing
674 } else { // New position given, relocate
675 _processors.erase (loc);
680 if (loc != _processors.end()) {
681 cerr << "ERROR: Processor added to route twice!" << endl;
688 _processors.insert (loc, processor);
690 // Set up processor list channels. This will set processor->[input|output]_streams(),
691 // configure redirect ports properly, etc.
694 if (configure_processors_unlocked (err)) {
695 ProcessorList::iterator ploc = loc;
697 _processors.erase(ploc);
698 configure_processors_unlocked (0); // it worked before we tried to add it ...
699 cerr << "configure failed\n";
703 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
705 if (pi->natural_input_streams() == ChanCount::ZERO) {
706 /* generator plugin */
707 _have_internal_generator = true;
712 // XXX: do we want to emit the signal here ? change call order.
713 if (!boost::dynamic_pointer_cast<InternalSend>(processor)) {
714 processor->activate ();
716 processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
718 _output->set_user_latency (0);
721 processors_changed (); /* EMIT SIGNAL */
727 Route::add_processor_from_xml (const XMLNode& node, Placement placement)
729 ProcessorList::iterator loc;
731 if (placement == PreFader) {
732 /* generic pre-fader: insert immediately before the amp */
733 loc = find(_processors.begin(), _processors.end(), _amp);
735 /* generic post-fader: insert at end */
736 loc = _processors.end();
739 return add_processor_from_xml (node, loc);
743 Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
745 const XMLProperty *prop;
747 // legacy sessions use a different node name for sends
748 if (node.name() == "Send") {
751 boost::shared_ptr<Send> send (new Send (_session, _mute_master, node));
752 add_processor (send, iter);
756 catch (failed_constructor &err) {
757 error << _("Send construction failed") << endmsg;
761 } else if (node.name() == "Processor") {
764 if ((prop = node.property ("type")) != 0) {
766 boost::shared_ptr<Processor> processor;
768 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
769 prop->value() == "lv2" ||
770 prop->value() == "vst" ||
771 prop->value() == "audiounit") {
773 processor.reset (new PluginInsert(_session, node));
775 } else if (prop->value() == "port") {
777 processor.reset (new PortInsert (_session, _mute_master, node));
779 } else if (prop->value() == "send") {
781 processor.reset (new Send (_session, _mute_master, node));
783 } else if (prop->value() == "meter") {
786 if (_meter->set_state (node)) {
793 _meter.reset (new PeakMeter (_session, node));
796 } else if (prop->value() == "amp") {
798 /* amp always exists */
801 if (processor->set_state (node)) {
804 /* never any reason to add it */
808 } else if (prop->value() == "listen" || prop->value() == "deliver") {
810 /* XXX need to generalize */
812 } else if (prop->value() == "intsend") {
814 processor.reset (new InternalSend (_session, _mute_master, node));
816 } else if (prop->value() == "intreturn") {
819 if (_intreturn->set_state (node)) {
825 _intreturn.reset (new InternalReturn (_session, node));
826 processor = _intreturn;
828 } else if (prop->value() == "main-outs") {
831 if (_main_outs->set_state (node)) {
838 _main_outs.reset (new Delivery (_session, _output, _mute_master, node));
839 processor = _main_outs;
842 error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
845 if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
846 /* check for invisible processors stacked at the end and leave them there */
847 ProcessorList::iterator p;
848 p = _processors.end();
850 while (!(*p)->visible() && p != _processors.begin()) {
857 return (add_processor (processor, iter) == 0);
860 error << _("Processor XML node has no type property") << endmsg;
864 catch (failed_constructor &err) {
865 warning << _("processor could not be created. Ignored.") << endmsg;
873 Route::add_processors (const ProcessorList& others, Placement placement, ProcessorStreams* err)
875 ProcessorList::iterator loc;
876 if (placement == PreFader) {
877 /* generic pre-fader: insert immediately before the amp */
878 loc = find(_processors.begin(), _processors.end(), _amp);
880 /* generic post-fader: insert at end */
881 loc = _processors.end();
883 if (!_processors.empty()) {
884 /* check for invisible processors stacked at the end and leave them there */
885 ProcessorList::iterator p;
886 p = _processors.end();
888 cerr << "Let's check " << (*p)->name() << " vis ? " << (*p)->visible() << endl;
889 while (!(*p)->visible() && p != _processors.begin()) {
897 return add_processors (others, loc, err);
901 Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter, ProcessorStreams* err)
903 /* NOTE: this is intended to be used ONLY when copying
904 processors from another Route. Hence the subtle
905 differences between this and ::add_processor()
908 ChanCount old_pms = processor_max_streams;
910 if (!_session.engine().connected()) {
914 if (others.empty()) {
919 Glib::RWLock::WriterLock lm (_processor_lock);
920 ProcessorList::iterator existing_end = _processors.end();
923 ChanCount potential_max_streams = ChanCount::max (_input->n_ports(), _output->n_ports());
925 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
927 // Ensure meter only appears in the list once
929 ProcessorList::iterator m = find(_processors.begin(), _processors.end(), *i);
930 if (m != _processors.end()) {
931 _processors.erase(m);
935 boost::shared_ptr<PluginInsert> pi;
937 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
940 ChanCount m = max(pi->input_streams(), pi->output_streams());
941 if (m > potential_max_streams)
942 potential_max_streams = m;
945 _processors.insert (iter, *i);
947 if (configure_processors_unlocked (err)) {
949 _processors.erase (existing_end, _processors.end());
950 configure_processors_unlocked (0); // it worked before we tried to add it ...
954 (*i)->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
957 _output->set_user_latency (0);
960 processors_changed (); /* EMIT SIGNAL */
966 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
969 start = _processors.begin();
970 end = find(_processors.begin(), _processors.end(), _amp);
972 start = find(_processors.begin(), _processors.end(), _amp);
974 end = _processors.end();
978 /** Turn off all processors with a given placement
979 * @param p Placement of processors to disable
982 Route::disable_processors (Placement p)
984 Glib::RWLock::ReaderLock lm (_processor_lock);
986 ProcessorList::iterator start, end;
987 placement_range(p, start, end);
989 for (ProcessorList::iterator i = start; i != end; ++i) {
993 _session.set_dirty ();
996 /** Turn off all redirects
999 Route::disable_processors ()
1001 Glib::RWLock::ReaderLock lm (_processor_lock);
1003 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1004 (*i)->deactivate ();
1007 _session.set_dirty ();
1010 /** Turn off all redirects with a given placement
1011 * @param p Placement of redirects to disable
1014 Route::disable_plugins (Placement p)
1016 Glib::RWLock::ReaderLock lm (_processor_lock);
1018 ProcessorList::iterator start, end;
1019 placement_range(p, start, end);
1021 for (ProcessorList::iterator i = start; i != end; ++i) {
1022 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1023 (*i)->deactivate ();
1027 _session.set_dirty ();
1030 /** Turn off all plugins
1033 Route::disable_plugins ()
1035 Glib::RWLock::ReaderLock lm (_processor_lock);
1037 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1038 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1039 (*i)->deactivate ();
1043 _session.set_dirty ();
1048 Route::ab_plugins (bool forward)
1050 Glib::RWLock::ReaderLock lm (_processor_lock);
1054 /* forward = turn off all active redirects, and mark them so that the next time
1055 we go the other way, we will revert them
1058 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1059 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1063 if ((*i)->active()) {
1064 (*i)->deactivate ();
1065 (*i)->set_next_ab_is_active (true);
1067 (*i)->set_next_ab_is_active (false);
1073 /* backward = if the redirect was marked to go active on the next ab, do so */
1075 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1077 if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1081 if ((*i)->get_next_ab_is_active()) {
1084 (*i)->deactivate ();
1089 _session.set_dirty ();
1093 /** Remove processors with a given placement.
1094 * @param p Placement of processors to remove.
1097 Route::clear_processors (Placement p)
1099 const ChanCount old_pms = processor_max_streams;
1101 if (!_session.engine().connected()) {
1105 bool already_deleting = _session.deletion_in_progress();
1106 if (!already_deleting) {
1107 _session.set_deletion_in_progress();
1111 Glib::RWLock::WriterLock lm (_processor_lock);
1112 ProcessorList new_list;
1113 ProcessorStreams err;
1115 ProcessorList::iterator amp_loc = find(_processors.begin(), _processors.end(), _amp);
1116 if (p == PreFader) {
1117 // Get rid of PreFader processors
1118 for (ProcessorList::iterator i = _processors.begin(); i != amp_loc; ++i) {
1119 (*i)->drop_references ();
1122 for (ProcessorList::iterator i = amp_loc; i != _processors.end(); ++i) {
1123 new_list.push_back (*i);
1126 // Keep PreFader processors
1127 for (ProcessorList::iterator i = _processors.begin(); i != amp_loc; ++i) {
1128 new_list.push_back (*i);
1130 new_list.push_back (_amp);
1131 // Get rid of PostFader processors
1132 for (ProcessorList::iterator i = amp_loc; i != _processors.end(); ++i) {
1133 (*i)->drop_references ();
1137 _processors = new_list;
1138 configure_processors_unlocked (&err); // this can't fail
1141 processor_max_streams.reset();
1142 _have_internal_generator = false;
1143 processors_changed (); /* EMIT SIGNAL */
1145 if (!already_deleting) {
1146 _session.clear_deletion_in_progress();
1151 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err)
1153 /* these can never be removed */
1155 if (processor == _amp || processor == _meter || processor == _main_outs) {
1159 ChanCount old_pms = processor_max_streams;
1161 if (!_session.engine().connected()) {
1165 processor_max_streams.reset();
1168 Glib::RWLock::WriterLock lm (_processor_lock);
1169 ProcessorList::iterator i;
1170 bool removed = false;
1172 for (i = _processors.begin(); i != _processors.end(); ) {
1173 if (*i == processor) {
1175 /* move along, see failure case for configure_processors()
1176 where we may need to reconfigure the processor.
1179 /* stop redirects that send signals to JACK ports
1180 from causing noise as a result of no longer being
1184 boost::shared_ptr<IOProcessor> iop;
1186 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1188 iop->input()->disconnect (this);
1190 if (iop->output()) {
1191 iop->output()->disconnect (this);
1195 i = _processors.erase (i);
1203 _output->set_user_latency (0);
1211 if (configure_processors_unlocked (err)) {
1212 /* get back to where we where */
1213 _processors.insert (i, processor);
1214 /* we know this will work, because it worked before :) */
1215 configure_processors_unlocked (0);
1219 _have_internal_generator = false;
1221 for (i = _processors.begin(); i != _processors.end(); ++i) {
1222 boost::shared_ptr<PluginInsert> pi;
1224 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1225 if (pi->is_generator()) {
1226 _have_internal_generator = true;
1233 processor->drop_references ();
1234 processors_changed (); /* EMIT SIGNAL */
1240 Route::configure_processors (ProcessorStreams* err)
1242 if (!_in_configure_processors) {
1243 Glib::RWLock::WriterLock lm (_processor_lock);
1244 return configure_processors_unlocked (err);
1249 /** Configure the input/output configuration of each processor in the processors list.
1250 * Return 0 on success, otherwise configuration is impossible.
1253 Route::configure_processors_unlocked (ProcessorStreams* err)
1255 if (_in_configure_processors) {
1259 _in_configure_processors = true;
1261 // Check each processor in order to see if we can configure as requested
1262 ChanCount in = _input->n_ports ();
1264 list< pair<ChanCount,ChanCount> > configuration;
1267 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1268 if ((*p)->can_support_io_configuration(in, out)) {
1269 configuration.push_back(make_pair(in, out));
1276 _in_configure_processors = false;
1281 // We can, so configure everything
1282 list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1283 for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1284 (*p)->configure_io(c->first, c->second);
1286 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1287 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1291 // Ensure route outputs match last processor's outputs
1292 if (out != _output->n_ports ()) {
1293 _output->ensure_io (out, false, this);
1296 _in_configure_processors = false;
1301 Route::all_processors_flip ()
1303 Glib::RWLock::ReaderLock lm (_processor_lock);
1305 if (_processors.empty()) {
1309 bool first_is_on = _processors.front()->active();
1311 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1313 (*i)->deactivate ();
1319 _session.set_dirty ();
1322 /** Set all processors with a given placement to a given active state.
1323 * @param p Placement of processors to change.
1324 * @param state New active state for those processors.
1327 Route::all_processors_active (Placement p, bool state)
1329 Glib::RWLock::ReaderLock lm (_processor_lock);
1331 if (_processors.empty()) {
1334 ProcessorList::iterator start, end;
1335 placement_range(p, start, end);
1337 bool before_amp = true;
1338 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1343 if (p == PreFader && before_amp) {
1347 (*i)->deactivate ();
1352 _session.set_dirty ();
1356 Route::reorder_processors (const ProcessorList& new_order, Placement placement, ProcessorStreams* err)
1358 /* "new_order" is an ordered list of processors to be positioned according to "placement".
1359 NOTE: all processors in "new_order" MUST be marked as visible. There maybe additional
1360 processors in the current actual processor list that are hidden. Any visible processors
1361 in the current list but not in "new_order" will be assumed to be deleted.
1365 Glib::RWLock::WriterLock lm (_processor_lock);
1366 ChanCount old_pms = processor_max_streams;
1367 ProcessorList::iterator oiter;
1368 ProcessorList::const_iterator niter;
1369 ProcessorList as_it_was_before = _processors;
1370 ProcessorList as_it_will_be;
1371 ProcessorList::iterator start, end;
1373 placement_range (placement, start, end);
1376 niter = new_order.begin();
1378 while (niter != new_order.end()) {
1380 /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1381 then append it to the temp list.
1383 Otherwise, see if the next processor in the old list is in the new list. if not,
1384 its been deleted. If its there, append it to the temp list.
1389 /* no more elements in the old list, so just stick the rest of
1390 the new order onto the temp list.
1393 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1394 while (niter != new_order.end()) {
1395 (*niter)->set_placement (placement);
1402 if (!(*oiter)->visible()) {
1404 as_it_will_be.push_back (*oiter);
1405 (*oiter)->set_placement (placement);
1409 /* visible processor: check that its in the new order */
1411 if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1412 /* deleted: do nothing, shared_ptr<> will clean up */
1414 /* ignore this one, and add the next item from the new order instead */
1415 as_it_will_be.push_back (*niter);
1416 (*niter)->set_placement (placement);
1421 /* now remove from old order - its taken care of no matter what */
1422 oiter = _processors.erase (oiter);
1427 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1429 if (configure_processors_unlocked (err)) {
1430 _processors = as_it_was_before;
1431 processor_max_streams = old_pms;
1436 processors_changed (); /* EMIT SIGNAL */
1448 Route::get_template()
1450 return state(false);
1454 Route::state(bool full_state)
1456 XMLNode *node = new XMLNode("Route");
1457 ProcessorList::iterator i;
1460 id().print (buf, sizeof (buf));
1461 node->add_property("id", buf);
1462 node->add_property ("name", _name);
1463 node->add_property("default-type", _default_type.to_string());
1466 node->add_property("flags", enum_2_string (_flags));
1469 node->add_property("active", _active?"yes":"no");
1470 node->add_property("phase-invert", _phase_invert?"yes":"no");
1471 node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1472 node->add_property("meter-point", enum_2_string (_meter_point));
1475 node->add_property("route-group", _route_group->name());
1478 string order_string;
1479 OrderKeys::iterator x = order_keys.begin();
1481 while (x != order_keys.end()) {
1482 order_string += string ((*x).first);
1483 order_string += '=';
1484 snprintf (buf, sizeof(buf), "%ld", (*x).second);
1485 order_string += buf;
1489 if (x == order_keys.end()) {
1493 order_string += ':';
1495 node->add_property ("order-keys", order_string);
1497 node->add_child_nocopy (_input->state (full_state));
1498 node->add_child_nocopy (_output->state (full_state));
1499 node->add_child_nocopy (_solo_control->get_state ());
1500 node->add_child_nocopy (_mute_master->get_state ());
1502 XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1503 snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1504 remote_control_node->add_property (X_("id"), buf);
1505 node->add_child_nocopy (*remote_control_node);
1507 if (_comment.length()) {
1508 XMLNode *cmt = node->add_child ("Comment");
1509 cmt->add_content (_comment);
1512 for (i = _processors.begin(); i != _processors.end(); ++i) {
1513 node->add_child_nocopy((*i)->state (full_state));
1517 node->add_child_copy (*_extra_xml);
1524 Route::set_state (const XMLNode& node)
1526 return _set_state (node, true);
1530 Route::_set_state (const XMLNode& node, bool call_base)
1534 XMLNodeConstIterator niter;
1536 XMLPropertyList plist;
1537 const XMLProperty *prop;
1539 if (node.name() != "Route"){
1540 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
1544 if ((prop = node.property (X_("name"))) != 0) {
1545 Route::set_name (prop->value());
1548 if ((prop = node.property ("id")) != 0) {
1549 _id = prop->value ();
1552 if ((prop = node.property (X_("flags"))) != 0) {
1553 _flags = Flag (string_2_enum (prop->value(), _flags));
1558 /* add all processors (except amp, which is always present) */
1560 nlist = node.children();
1561 XMLNode processor_state (X_("processor_state"));
1563 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1567 if (child->name() == IO::state_node_name) {
1568 if ((prop = child->property (X_("direction"))) == 0) {
1572 if (prop->value() == "Input") {
1573 _input->set_state (*child);
1574 } else if (prop->value() == "Output") {
1575 _output->set_state (*child);
1579 if (child->name() == X_("Processor")) {
1580 processor_state.add_child_copy (*child);
1584 set_processor_state (processor_state);
1586 if ((prop = node.property ("solo_level")) != 0) {
1587 _solo_level = 0; // needed for mod_solo_level() to work
1588 mod_solo_level (atoi (prop->value()));
1591 if ((prop = node.property ("solo-isolated")) != 0) {
1592 set_solo_isolated (prop->value() == "yes", this);
1595 if ((prop = node.property (X_("phase-invert"))) != 0) {
1596 set_phase_invert (prop->value()=="yes"?true:false);
1599 if ((prop = node.property (X_("denormal-protection"))) != 0) {
1600 set_denormal_protection (prop->value()=="yes"?true:false);
1603 if ((prop = node.property (X_("active"))) != 0) {
1604 bool yn = (prop->value() == "yes");
1605 _active = !yn; // force switch
1609 if ((prop = node.property (X_("soloed"))) != 0) {
1610 bool yn = (prop->value()=="yes");
1612 /* XXX force reset of solo status */
1614 set_solo (yn, this);
1617 if ((prop = node.property (X_("meter-point"))) != 0) {
1618 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
1621 if ((prop = node.property (X_("route-group"))) != 0) {
1622 RouteGroup* route_group = _session.route_group_by_name(prop->value());
1623 if (route_group == 0) {
1624 error << string_compose(_("Route %1: unknown route group \"%2 in saved state (ignored)"), _name, prop->value()) << endmsg;
1626 set_route_group (route_group, this);
1630 if ((prop = node.property (X_("order-keys"))) != 0) {
1634 string::size_type colon, equal;
1635 string remaining = prop->value();
1637 while (remaining.length()) {
1639 if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
1640 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1643 if (sscanf (remaining.substr (equal+1).c_str(), "%ld", &n) != 1) {
1644 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
1647 set_order_key (remaining.substr (0, equal).c_str(), n);
1651 colon = remaining.find_first_of (':');
1653 if (colon != string::npos) {
1654 remaining = remaining.substr (colon+1);
1661 for (niter = nlist.begin(); niter != nlist.end(); ++niter){
1664 if (child->name() == X_("Comment")) {
1666 /* XXX this is a terrible API design in libxml++ */
1668 XMLNode *cmt = *(child->children().begin());
1669 _comment = cmt->content();
1671 } else if (child->name() == X_("Extra")) {
1673 _extra_xml = new XMLNode (*child);
1675 } else if (child->name() == X_("Controllable") && (prop = child->property("name")) != 0) {
1677 if (prop->value() == "solo") {
1678 _solo_control->set_state (*child);
1679 _session.add_controllable (_solo_control);
1682 } else if (child->name() == X_("RemoteControl")) {
1683 if ((prop = child->property (X_("id"))) != 0) {
1685 sscanf (prop->value().c_str(), "%d", &x);
1686 set_remote_control_id (x);
1689 } else if (child->name() == X_("MuteMaster")) {
1690 _mute_master->set_state (*child);
1698 Route::get_processor_state ()
1700 XMLNode* root = new XMLNode (X_("redirects"));
1701 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1702 root->add_child_nocopy ((*i)->state (true));
1709 Route::set_processor_state (const XMLNode& node)
1711 const XMLNodeList &nlist = node.children();
1712 XMLNodeConstIterator niter;
1713 ProcessorList::iterator i, o;
1715 // Iterate through existing processors, remove those which are not in the state list
1717 for (i = _processors.begin(); i != _processors.end(); ) {
1719 /* leave amp alone, always */
1726 ProcessorList::iterator tmp = i;
1729 bool processorInStateList = false;
1731 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1733 XMLProperty* id_prop = (*niter)->property(X_("id"));
1735 if (id_prop && (*i)->id() == id_prop->value()) {
1736 processorInStateList = true;
1741 if (!processorInStateList) {
1742 remove_processor (*i);
1748 // Iterate through state list and make sure all processors are on the track and in the correct order,
1749 // set the state of existing processors according to the new state on the same go
1751 i = _processors.begin();
1753 for (niter = nlist.begin(); niter != nlist.end(); ++niter, ++i) {
1755 XMLProperty* prop = (*niter)->property ("type");
1759 // Check whether the next processor in the list is the right one,
1760 // except for "amp" which is always there and may not have the
1761 // old ID since it is always created anew in every Route
1763 if (prop->value() != "amp") {
1764 while (o != _processors.end()) {
1765 XMLProperty* id_prop = (*niter)->property(X_("id"));
1766 if (id_prop && (*o)->id() == id_prop->value()) {
1774 // If the processor (*niter) is not on the route,
1775 // create it and move it to the correct location
1777 if (o == _processors.end()) {
1779 if (add_processor_from_xml (**niter, i)) {
1780 --i; // move iterator to the newly inserted processor
1782 cerr << "Error restoring route: unable to restore processor" << endl;
1787 // Otherwise, the processor already exists; just
1788 // ensure it is at the location provided in the XML state
1791 boost::shared_ptr<Processor> tmp = (*o);
1792 _processors.erase (o); // remove the old copy
1793 _processors.insert (i, tmp); // insert the processor at the correct location
1794 --i; // move iterator to the correct processor
1797 // and make it (just) so
1799 (*i)->set_state (**niter);
1803 /* note: there is no configure_processors() call because we figure that
1804 the XML state represents a working signal route.
1807 processors_changed ();
1811 Route::curve_reallocate ()
1813 // _gain_automation_curve.finish_resize ();
1814 // _pan_automation_curve.finish_resize ();
1818 Route::silence (nframes_t nframes)
1822 _output->silence (nframes);
1825 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
1828 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1829 boost::shared_ptr<PluginInsert> pi;
1831 if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
1832 // skip plugins, they don't need anything when we're not active
1836 (*i)->silence (nframes);
1839 if (nframes == _session.get_block_size()) {
1849 Route::add_internal_return ()
1852 _intreturn.reset (new InternalReturn (_session));
1853 add_processor (_intreturn, PreFader);
1858 Route::get_return_buffer () const
1860 Glib::RWLock::ReaderLock rm (_processor_lock);
1862 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1863 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1866 BufferSet* bs = d->get_buffers ();
1875 Route::release_return_buffer () const
1877 Glib::RWLock::ReaderLock rm (_processor_lock);
1879 for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
1880 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
1883 return d->release_buffers ();
1889 Route::listen_via (boost::shared_ptr<Route> route, bool active)
1891 vector<string> ports;
1892 vector<string>::const_iterator i;
1895 Glib::RWLock::ReaderLock rm (_processor_lock);
1897 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
1899 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1901 if (d && d->target_route() == route) {
1903 /* if the target is the control outs, then make sure
1904 we take note of which i-send is doing that.
1907 if (route == _session.control_out()) {
1908 _control_outs = boost::dynamic_pointer_cast<Delivery>(d);
1911 /* already listening via the specified IO: do nothing */
1918 boost::shared_ptr<InternalSend> listener;
1921 listener.reset (new InternalSend (_session, _mute_master, route));
1923 } catch (failed_constructor& err) {
1927 if (route == _session.control_out()) {
1928 _control_outs = listener;
1931 add_processor (listener, PreFader);
1937 Route::drop_listen (boost::shared_ptr<Route> route)
1939 ProcessorStreams err;
1940 ProcessorList::iterator tmp;
1942 Glib::RWLock::ReaderLock rl(_processor_lock);
1946 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ) {
1948 boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
1950 if (d && d->target_route() == route) {
1952 remove_processor (*x, &err);
1955 /* list could have been demolished while we dropped the lock
1965 if (route == _session.control_out()) {
1966 _control_outs.reset ();
1971 Route::set_route_group (RouteGroup *rg, void *src)
1973 if (rg == _route_group) {
1978 _route_group->remove (this);
1981 if ((_route_group = rg) != 0) {
1982 _route_group->add (this);
1985 _session.set_dirty ();
1986 route_group_changed (src); /* EMIT SIGNAL */
1990 Route::drop_route_group (void *src)
1993 _session.set_dirty ();
1994 route_group_changed (src); /* EMIT SIGNAL */
1998 Route::set_comment (string cmt, void *src)
2001 comment_changed (src);
2002 _session.set_dirty ();
2006 Route::feeds (boost::shared_ptr<Route> other)
2008 // cerr << _name << endl;
2010 if (_output->connected_to (other->input())) {
2011 // cerr << "\tdirect FEEDS " << other->name() << endl;
2015 for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); r++) {
2017 boost::shared_ptr<IOProcessor> iop;
2019 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2020 if (iop->feeds (other)) {
2021 // cerr << "\tIOP " << iop->name() << " feeds " << other->name() << endl;
2024 // cerr << "\tIOP " << iop->name() << " does NOT feeds " << other->name() << endl;
2029 // cerr << "\tdoes NOT FEED " << other->name() << endl;
2034 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
2036 nframes_t now = _session.transport_frame();
2039 Glib::RWLock::ReaderLock lm (_processor_lock);
2042 automation_snapshot (now, true);
2045 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2047 if (Config->get_plugins_stop_with_transport() && can_flush_processors) {
2048 (*i)->deactivate ();
2052 (*i)->transport_stopped (now);
2056 _roll_delay = _initial_delay;
2060 Route::input_change_handler (IOChange change, void *src)
2062 if ((change & ConfigurationChanged)) {
2063 configure_processors (0);
2068 Route::output_change_handler (IOChange change, void *src)
2070 if ((change & ConfigurationChanged)) {
2072 /* XXX resize all listeners to match _main_outs? */
2074 // configure_processors (0);
2079 Route::pans_required () const
2081 if (n_outputs().n_audio() < 2) {
2085 return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
2089 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2090 bool session_state_changing, bool can_record, bool rec_monitors_input)
2092 if (n_outputs().n_total() == 0) {
2096 if (session_state_changing || !_active || n_inputs() == ChanCount::ZERO) {
2101 _amp->apply_gain_automation (false);
2102 passthru (start_frame, end_frame, nframes, 0);
2108 Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
2110 if (_roll_delay > nframes) {
2112 _roll_delay -= nframes;
2114 /* transport frame is not legal for caller to use */
2117 } else if (_roll_delay > 0) {
2119 nframes -= _roll_delay;
2120 silence (_roll_delay);
2121 /* we've written _roll_delay of samples into the
2122 output ports, so make a note of that for
2125 _main_outs->increment_output_offset (_roll_delay);
2126 transport_frame += _roll_delay;
2135 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
2136 bool can_record, bool rec_monitors_input)
2139 // automation snapshot can also be called from the non-rt context
2140 // and it uses the processor list, so we try to acquire the lock here
2141 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
2144 automation_snapshot (_session.transport_frame(), false);
2148 if (n_outputs().n_total() == 0) {
2152 if (!_active || n_inputs().n_total() == 0) {
2157 nframes_t unused = 0;
2159 if ((nframes = check_initial_delay (nframes, unused)) == 0) {
2165 passthru (start_frame, end_frame, nframes, declick);
2171 Route::silent_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
2172 bool can_record, bool rec_monitors_input)
2179 Route::toggle_monitor_input ()
2181 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
2182 i->ensure_monitor_input( ! i->monitoring_input());
2187 Route::has_external_redirects () const
2189 // FIXME: what about sends? - they don't return a signal back to ardour?
2191 boost::shared_ptr<const PortInsert> pi;
2193 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2195 if ((pi = boost::dynamic_pointer_cast<const PortInsert>(*i)) != 0) {
2197 for (PortSet::const_iterator port = pi->output()->ports().begin(); port != pi->output()->ports().end(); ++port) {
2199 string port_name = port->name();
2200 string client_name = port_name.substr (0, port_name.find(':'));
2202 /* only say "yes" if the redirect is actually in use */
2204 if (client_name != "ardour" && pi->active()) {
2215 Route::flush_processors ()
2217 /* XXX shouldn't really try to take this lock, since
2218 this is called from the RT audio thread.
2221 Glib::RWLock::ReaderLock lm (_processor_lock);
2223 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2224 (*i)->deactivate ();
2230 Route::set_meter_point (MeterPoint p, void *src)
2232 if (_meter_point != p) {
2235 // Move meter in the processors list
2236 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
2237 _processors.erase(loc);
2240 loc = _processors.begin();
2243 loc = find(_processors.begin(), _processors.end(), _amp);
2245 case MeterPostFader:
2246 loc = _processors.end();
2249 _processors.insert(loc, _meter);
2251 meter_change (src); /* EMIT SIGNAL */
2252 processors_changed (); /* EMIT SIGNAL */
2253 _session.set_dirty ();
2257 Route::put_control_outs_at (Placement p)
2259 if (!_control_outs) {
2263 // Move meter in the processors list
2264 ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
2265 _processors.erase(loc);
2269 loc = find(_processors.begin(), _processors.end(), _amp);
2270 if (loc != _processors.begin()) {
2275 loc = find(_processors.begin(), _processors.end(), _amp);
2276 assert (loc != _processors.end());
2281 _processors.insert(loc, _control_outs);
2283 processors_changed (); /* EMIT SIGNAL */
2284 _session.set_dirty ();
2288 Route::update_total_latency ()
2290 nframes_t old = _output->effective_latency();
2291 nframes_t own_latency = _output->user_latency();
2293 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2294 if ((*i)->active ()) {
2295 own_latency += (*i)->signal_latency ();
2299 #undef DEBUG_LATENCY
2300 #ifdef DEBUG_LATENCY
2301 cerr << _name << ": internal redirect latency = " << own_latency << endl;
2304 _output->set_port_latency (own_latency);
2306 if (_output->user_latency() == 0) {
2308 /* this (virtual) function is used for pure Routes,
2309 not derived classes like AudioTrack. this means
2310 that the data processed here comes from an input
2311 port, not prerecorded material, and therefore we
2312 have to take into account any input latency.
2315 own_latency += _input->signal_latency ();
2318 if (old != own_latency) {
2319 _output->set_latency_delay (own_latency);
2320 signal_latency_changed (); /* EMIT SIGNAL */
2323 #ifdef DEBUG_LATENCY
2324 cerr << _name << ": input latency = " << _input->signal_latency() << " total = "
2325 << own_latency << endl;
2328 return _output->effective_latency ();
2332 Route::set_user_latency (nframes_t nframes)
2334 _output->set_user_latency (nframes);
2335 _session.update_latency_compensation (false, false);
2339 Route::set_latency_delay (nframes_t longest_session_latency)
2341 nframes_t old = _initial_delay;
2343 if (_output->effective_latency() < longest_session_latency) {
2344 _initial_delay = longest_session_latency - _output->effective_latency();
2349 if (_initial_delay != old) {
2350 initial_delay_changed (); /* EMIT SIGNAL */
2353 if (_session.transport_stopped()) {
2354 _roll_delay = _initial_delay;
2359 Route::automation_snapshot (nframes_t now, bool force)
2361 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2362 (*i)->automation_snapshot (now, force);
2366 Route::SoloControllable::SoloControllable (std::string name, Route& r)
2367 : AutomationControl (r.session(), Evoral::Parameter (SoloAutomation),
2368 boost::shared_ptr<AutomationList>(), name)
2371 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
2376 Route::SoloControllable::set_value (float val)
2378 bool bval = ((val >= 0.5f) ? true: false);
2380 route.set_solo (bval, this);
2384 Route::SoloControllable::get_value (void) const
2386 return route.soloed() ? 1.0f : 0.0f;
2390 Route::set_block_size (nframes_t nframes)
2392 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2393 (*i)->set_block_size (nframes);
2395 _session.ensure_buffers(processor_max_streams);
2399 Route::protect_automation ()
2401 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
2402 (*i)->protect_automation();
2406 Route::set_pending_declick (int declick)
2409 /* this call is not allowed to turn off a pending declick unless "force" is true */
2411 _pending_declick = declick;
2413 // cerr << _name << ": after setting to " << declick << " pending declick = " << _pending_declick << endl;
2415 _pending_declick = 0;
2420 /** Shift automation forwards from a particular place, thereby inserting time.
2421 * Adds undo commands for any shifts that are performed.
2423 * @param pos Position to start shifting from.
2424 * @param frames Amount to shift forwards by.
2428 Route::shift (nframes64_t pos, nframes64_t frames)
2430 #ifdef THIS_NEEDS_FIXING_FOR_V3
2432 /* gain automation */
2433 XMLNode &before = _gain_control->get_state ();
2434 _gain_control->shift (pos, frames);
2435 XMLNode &after = _gain_control->get_state ();
2436 _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after));
2438 /* pan automation */
2439 for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) {
2440 Curve & c = (*i)->automation ();
2441 XMLNode &before = c.get_state ();
2442 c.shift (pos, frames);
2443 XMLNode &after = c.get_state ();
2444 _session.add_command (new MementoCommand<AutomationList> (c, &before, &after));
2447 /* redirect automation */
2449 Glib::RWLock::ReaderLock lm (redirect_lock);
2450 for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) {
2453 (*i)->what_has_automation (a);
2455 for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) {
2456 AutomationList & al = (*i)->automation_list (*j);
2457 XMLNode &before = al.get_state ();
2458 al.shift (pos, frames);
2459 XMLNode &after = al.get_state ();
2460 _session.add_command (new MementoCommand<AutomationList> (al, &before, &after));
2470 Route::save_as_template (const string& path, const string& name)
2472 XMLNode& node (state (false));
2475 IO::set_name_in_state (*node.children().front(), name);
2477 tree.set_root (&node);
2478 return tree.write (path.c_str());
2483 Route::set_name (const string& str)
2489 name = Route::ensure_track_or_route_name (str, _session);
2490 SessionObject::set_name (name);
2492 ret = (_input->set_name(name) && _output->set_name(name));
2496 Glib::RWLock::ReaderLock lm (_processor_lock);
2498 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2500 /* rename all I/O processors that have inputs or outputs */
2502 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
2504 if (iop && (iop->output() || iop->input())) {
2505 if (!iop->set_name (name)) {
2516 boost::shared_ptr<Send>
2517 Route::internal_send_for (boost::shared_ptr<const Route> target) const
2519 Glib::RWLock::ReaderLock lm (_processor_lock);
2521 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2522 boost::shared_ptr<InternalSend> send;
2524 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
2525 if (send->target_route() == target) {
2531 return boost::shared_ptr<Send>();
2535 Route::set_phase_invert (bool yn)
2537 if (_phase_invert != yn) {
2538 _phase_invert = 0xffff; // XXX all channels
2539 phase_invert_changed (); /* EMIT SIGNAL */
2544 Route::phase_invert () const
2546 return _phase_invert != 0;
2550 Route::set_denormal_protection (bool yn)
2552 if (_denormal_protection != yn) {
2553 _denormal_protection = yn;
2554 denormal_protection_changed (); /* EMIT SIGNAL */
2559 Route::denormal_protection () const
2561 return _denormal_protection;
2565 Route::set_active (bool yn)
2567 if (_active != yn) {
2569 _input->set_active (yn);
2570 _output->set_active (yn);
2571 active_changed (); // EMIT SIGNAL
2578 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2582 boost::shared_ptr<Panner>
2583 Route::panner() const
2586 return _main_outs->panner();
2589 boost::shared_ptr<AutomationControl>
2590 Route::gain_control() const
2593 return _amp->gain_control();
2596 boost::shared_ptr<AutomationControl>
2597 Route::get_control (const Evoral::Parameter& param)
2599 /* either we own the control or .... */
2601 boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(data().control (param));
2605 /* maybe one of our processors does or ... */
2607 Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
2608 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2609 if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->data().control (param))) != 0) {
2617 /* nobody does so we'll make a new one */
2619 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));