add a back-pointer to the owner of a Processor
[ardour.git] / libs / ardour / route.cc
1 /*
2     Copyright (C) 2000 Paul Davis
3
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.
8
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.
13
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.
17
18 */
19
20 #ifdef WAF_BUILD
21 #include "libardour-config.h"
22 #endif
23
24 #include <cmath>
25 #include <fstream>
26 #include <cassert>
27 #include <algorithm>
28
29 #include <boost/algorithm/string.hpp>
30
31 #include "pbd/xml++.h"
32 #include "pbd/enumwriter.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/convert.h"
36 #include "pbd/boost_debug.h"
37
38 #include "ardour/amp.h"
39 #include "ardour/audio_buffer.h"
40 #include "ardour/audio_port.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/buffer.h"
43 #include "ardour/buffer_set.h"
44 #include "ardour/capturing_processor.h"
45 #include "ardour/debug.h"
46 #include "ardour/delivery.h"
47 #include "ardour/internal_return.h"
48 #include "ardour/internal_send.h"
49 #include "ardour/meter.h"
50 #include "ardour/midi_buffer.h"
51 #include "ardour/midi_port.h"
52 #include "ardour/monitor_processor.h"
53 #include "ardour/pannable.h"
54 #include "ardour/panner_shell.h"
55 #include "ardour/plugin_insert.h"
56 #include "ardour/port.h"
57 #include "ardour/port_insert.h"
58 #include "ardour/processor.h"
59 #include "ardour/route.h"
60 #include "ardour/route_group.h"
61 #include "ardour/send.h"
62 #include "ardour/session.h"
63 #include "ardour/unknown_processor.h"
64 #include "ardour/utils.h"
65
66 #include "i18n.h"
67
68 using namespace std;
69 using namespace ARDOUR;
70 using namespace PBD;
71
72 PBD::Signal1<void,RouteSortOrderKey> Route::SyncOrderKeys;
73 PBD::Signal0<void> Route::RemoteControlIDChange;
74
75 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
76         : SessionObject (sess, name)
77         , Automatable (sess)
78         , GraphNode (sess._process_graph)
79         , _active (true)
80         , _signal_latency (0)
81         , _initial_delay (0)
82         , _roll_delay (0)
83         , _flags (flg)
84         , _pending_declick (true)
85         , _meter_point (MeterPostFader)
86         , _meter_type (MeterPeak)
87         , _self_solo (false)
88         , _soloed_by_others_upstream (0)
89         , _soloed_by_others_downstream (0)
90         , _solo_isolated (0)
91         , _denormal_protection (false)
92         , _recordable (true)
93         , _silent (false)
94         , _declickable (false)
95         , _mute_master (new MuteMaster (sess, name))
96         , _have_internal_generator (false)
97         , _solo_safe (false)
98         , _default_type (default_type)
99         , _remote_control_id (0)
100         , _in_configure_processors (false)
101         , _initial_io_setup (false)
102         , _custom_meter_position_noted (false)
103         , _last_custom_meter_was_at_end (false)
104 {
105         if (is_master()) {
106                 _meter_type = MeterK20;
107         }
108         processor_max_streams.reset();
109 }
110
111 int
112 Route::init ()
113 {
114         /* add standard controls */
115
116         _solo_control.reset (new SoloControllable (X_("solo"), shared_from_this ()));
117         _mute_control.reset (new MuteControllable (X_("mute"), shared_from_this ()));
118
119         _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
120         _mute_control->set_flags (Controllable::Flag (_mute_control->flags() | Controllable::Toggle));
121
122         add_control (_solo_control);
123         add_control (_mute_control);
124
125         /* panning */
126
127         if (!(_flags & Route::MonitorOut)) {
128                 _pannable.reset (new Pannable (_session));
129         }
130
131         /* input and output objects */
132
133         _input.reset (new IO (_session, _name, IO::Input, _default_type));
134         _output.reset (new IO (_session, _name, IO::Output, _default_type));
135
136         _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
137         _input->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::input_port_count_changing, this, _1));
138
139         _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
140         _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1));
141
142         /* add amp processor  */
143
144         _amp.reset (new Amp (_session));
145         add_processor (_amp, PostFader);
146
147         /* create standard processors: meter, main outs, monitor out;
148            they will be added to _processors by setup_invisible_processors ()
149         */
150
151         _meter.reset (new PeakMeter (_session, _name));
152         _meter->set_owner (this);
153         _meter->set_display_to_user (false);
154         _meter->activate ();
155
156         _main_outs.reset (new Delivery (_session, _output, _pannable, _mute_master, _name, Delivery::Main));
157         _main_outs->activate ();
158
159         if (is_monitor()) {
160                 /* where we listen to tracks */
161                 _intreturn.reset (new InternalReturn (_session));
162                 _intreturn->activate ();
163
164                 /* the thing that provides proper control over a control/monitor/listen bus
165                    (such as per-channel cut, dim, solo, invert, etc).
166                 */
167                 _monitor_control.reset (new MonitorProcessor (_session));
168                 _monitor_control->activate ();
169         }
170
171         if (is_master() || is_monitor() || is_auditioner()) {
172                 _mute_master->set_solo_ignore (true);
173         }
174
175         /* now that we have _meter, its safe to connect to this */
176
177         Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
178
179         {
180                 /* run a configure so that the invisible processors get set up */
181                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
182                 configure_processors (0);
183         }
184
185         return 0;
186 }
187
188 Route::~Route ()
189 {
190         DEBUG_TRACE (DEBUG::Destruction, string_compose ("route %1 destructor\n", _name));
191
192         /* do this early so that we don't get incoming signals as we are going through destruction
193          */
194
195         drop_connections ();
196
197         /* don't use clear_processors here, as it depends on the session which may
198            be half-destroyed by now
199         */
200
201         Glib::Threads::RWLock::WriterLock lm (_processor_lock);
202         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
203                 (*i)->drop_references ();
204         }
205
206         _processors.clear ();
207 }
208
209 void
210 Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
211 {
212         if (Config->get_remote_model() != UserOrdered) {
213                 return;
214         }
215
216         set_remote_control_id_internal (id, notify_class_listeners);
217 }
218
219 void
220 Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
221 {
222         /* force IDs for master/monitor busses and prevent 
223            any other route from accidentally getting these IDs
224            (i.e. legacy sessions)
225         */
226
227         if (is_master() && id != MasterBusRemoteControlID) {
228                 id = MasterBusRemoteControlID;
229         }
230
231         if (is_monitor() && id != MonitorBusRemoteControlID) {
232                 id = MonitorBusRemoteControlID;
233         }
234
235         if (id < 1) {
236                 return;
237         }
238
239         /* don't allow it to collide */
240
241         if (!is_master () && !is_monitor() && 
242             (id == MasterBusRemoteControlID || id == MonitorBusRemoteControlID)) {
243                 id += MonitorBusRemoteControlID;
244         }
245
246         if (id != remote_control_id()) {
247                 _remote_control_id = id;
248                 RemoteControlIDChanged ();
249
250                 if (notify_class_listeners) {
251                         RemoteControlIDChange ();
252                 }
253         }
254 }
255
256 uint32_t
257 Route::remote_control_id() const
258 {
259         if (is_master()) {
260                 return MasterBusRemoteControlID;
261         } 
262
263         if (is_monitor()) {
264                 return MonitorBusRemoteControlID;
265         }
266
267         return _remote_control_id;
268 }
269
270 bool
271 Route::has_order_key (RouteSortOrderKey key) const
272 {
273         return (order_keys.find (key) != order_keys.end());
274 }
275
276 uint32_t
277 Route::order_key (RouteSortOrderKey key) const
278 {
279         OrderKeys::const_iterator i = order_keys.find (key);
280
281         if (i == order_keys.end()) {
282                 return 0;
283         }
284
285         return i->second;
286 }
287
288 void
289 Route::sync_order_keys (RouteSortOrderKey base)
290 {
291         /* this is called after changes to 1 or more route order keys have been
292          * made, and we want to sync up.
293          */
294
295         OrderKeys::iterator i = order_keys.find (base);
296
297         if (i == order_keys.end()) {
298                 return;
299         }
300
301         for (OrderKeys::iterator k = order_keys.begin(); k != order_keys.end(); ++k) {
302
303                 if (k->first != base) {
304                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 set key for %2 to %3 from %4\n",
305                                                                        name(),
306                                                                        enum_2_string (k->first),
307                                                                        i->second,
308                                                                        enum_2_string (base)));
309                                                                        
310                         k->second = i->second;
311                 }
312         }
313 }
314
315 void
316 Route::set_remote_control_id_from_order_key (RouteSortOrderKey /*key*/, uint32_t rid)
317 {
318         if (is_master() || is_monitor() || is_auditioner()) {
319                 /* hard-coded remote IDs, or no remote ID */
320                 return;
321         }
322
323         if (_remote_control_id != rid) {
324                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1: set edit-based RID to %2\n", name(), rid));
325                 _remote_control_id = rid;
326                 RemoteControlIDChanged (); /* EMIT SIGNAL (per-route) */
327         }
328
329         /* don't emit the class-level RID signal RemoteControlIDChange here,
330            leave that to the entity that changed the order key, so that we
331            don't get lots of emissions for no good reasons (e.g. when changing
332            all route order keys).
333
334            See Session::sync_remote_id_from_order_keys() for the (primary|only)
335            spot where that is emitted.
336         */
337 }
338
339 void
340 Route::set_order_key (RouteSortOrderKey key, uint32_t n)
341 {
342         OrderKeys::iterator i = order_keys.find (key);
343
344         if (i != order_keys.end() && i->second == n) {
345                 return;
346         }
347
348         order_keys[key] = n;
349
350         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 order key %2 set to %3\n",
351                                                        name(), enum_2_string (key), order_key (key)));
352
353         _session.set_dirty ();
354 }
355
356 string
357 Route::ensure_track_or_route_name(string name, Session &session)
358 {
359         string newname = name;
360
361         while (!session.io_name_is_legal (newname)) {
362                 newname = bump_name_once (newname, '.');
363         }
364
365         return newname;
366 }
367
368
369 void
370 Route::inc_gain (gain_t fraction, void *src)
371 {
372         _amp->inc_gain (fraction, src);
373 }
374
375 void
376 Route::set_gain (gain_t val, void *src)
377 {
378         if (src != 0 && _route_group && src != _route_group && _route_group->is_active() && _route_group->is_gain()) {
379
380                 if (_route_group->is_relative()) {
381
382                         gain_t usable_gain = _amp->gain();
383                         if (usable_gain < 0.000001f) {
384                                 usable_gain = 0.000001f;
385                         }
386
387                         gain_t delta = val;
388                         if (delta < 0.000001f) {
389                                 delta = 0.000001f;
390                         }
391
392                         delta -= usable_gain;
393
394                         if (delta == 0.0f)
395                                 return;
396
397                         gain_t factor = delta / usable_gain;
398
399                         if (factor > 0.0f) {
400                                 factor = _route_group->get_max_factor(factor);
401                                 if (factor == 0.0f) {
402                                         _amp->gain_control()->Changed(); /* EMIT SIGNAL */
403                                         return;
404                                 }
405                         } else {
406                                 factor = _route_group->get_min_factor(factor);
407                                 if (factor == 0.0f) {
408                                         _amp->gain_control()->Changed(); /* EMIT SIGNAL */
409                                         return;
410                                 }
411                         }
412
413                         _route_group->foreach_route (boost::bind (&Route::inc_gain, _1, factor, _route_group));
414
415                 } else {
416
417                         _route_group->foreach_route (boost::bind (&Route::set_gain, _1, val, _route_group));
418                 }
419
420                 return;
421         }
422
423         if (val == _amp->gain()) {
424                 return;
425         }
426
427         _amp->set_gain (val, src);
428 }
429
430 void
431 Route::maybe_declick (BufferSet&, framecnt_t, int)
432 {
433         /* this is the "bus" implementation and they never declick.
434          */
435         return;
436 }
437
438 /** Process this route for one (sub) cycle (process thread)
439  *
440  * @param bufs Scratch buffers to use for the signal path
441  * @param start_frame Initial transport frame
442  * @param end_frame Final transport frame
443  * @param nframes Number of frames to output (to ports)
444  *
445  * Note that (end_frame - start_frame) may not be equal to nframes when the
446  * transport speed isn't 1.0 (eg varispeed).
447  */
448 void
449 Route::process_output_buffers (BufferSet& bufs,
450                                framepos_t start_frame, framepos_t end_frame, pframes_t nframes,
451                                int declick, bool gain_automation_ok)
452 {
453         bufs.set_is_silent (false);
454
455         /* figure out if we're going to use gain automation */
456         if (gain_automation_ok) {
457                 _amp->set_gain_automation_buffer (_session.gain_automation_buffer ());
458                 _amp->setup_gain_automation (start_frame, end_frame, nframes);
459         } else {
460                 _amp->apply_gain_automation (false);
461         }
462
463         /* Tell main outs what to do about monitoring.  We do this so that
464            on a transition between monitoring states we get a de-clicking gain
465            change in the _main_outs delivery.
466         */
467
468         _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence);
469
470         /* -------------------------------------------------------------------------------------------
471            GLOBAL DECLICK (for transport changes etc.)
472            ----------------------------------------------------------------------------------------- */
473
474         maybe_declick (bufs, nframes, declick);
475         _pending_declick = 0;
476
477         /* -------------------------------------------------------------------------------------------
478            DENORMAL CONTROL/PHASE INVERT
479            ----------------------------------------------------------------------------------------- */
480
481         if (_phase_invert.any ()) {
482
483                 int chn = 0;
484
485                 if (_denormal_protection || Config->get_denormal_protection()) {
486
487                         for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
488                                 Sample* const sp = i->data();
489
490                                 if (_phase_invert[chn]) {
491                                         for (pframes_t nx = 0; nx < nframes; ++nx) {
492                                                 sp[nx]  = -sp[nx];
493                                                 sp[nx] += 1.0e-27f;
494                                         }
495                                 } else {
496                                         for (pframes_t nx = 0; nx < nframes; ++nx) {
497                                                 sp[nx] += 1.0e-27f;
498                                         }
499                                 }
500                         }
501
502                 } else {
503
504                         for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i, ++chn) {
505                                 Sample* const sp = i->data();
506
507                                 if (_phase_invert[chn]) {
508                                         for (pframes_t nx = 0; nx < nframes; ++nx) {
509                                                 sp[nx] = -sp[nx];
510                                         }
511                                 }
512                         }
513                 }
514
515         } else {
516
517                 if (_denormal_protection || Config->get_denormal_protection()) {
518
519                         for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
520                                 Sample* const sp = i->data();
521                                 for (pframes_t nx = 0; nx < nframes; ++nx) {
522                                         sp[nx] += 1.0e-27f;
523                                 }
524                         }
525
526                 }
527         }
528
529         /* -------------------------------------------------------------------------------------------
530            and go ....
531            ----------------------------------------------------------------------------------------- */
532
533         /* set this to be true if the meter will already have been ::run() earlier */
534         bool const meter_already_run = metering_state() == MeteringInput;
535
536         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
537
538                 if (meter_already_run && boost::dynamic_pointer_cast<PeakMeter> (*i)) {
539                         /* don't ::run() the meter, otherwise it will have its previous peak corrupted */
540                         continue;
541                 }
542
543 #ifndef NDEBUG
544                 /* if it has any inputs, make sure they match */
545                 if (boost::dynamic_pointer_cast<UnknownProcessor> (*i) == 0 && (*i)->input_streams() != ChanCount::ZERO) {
546                         if (bufs.count() != (*i)->input_streams()) {
547                                 DEBUG_TRACE (
548                                         DEBUG::Processors, string_compose (
549                                                 "input port mismatch %1 bufs = %2 input for %3 = %4\n",
550                                                 _name, bufs.count(), (*i)->name(), (*i)->input_streams()
551                                                 )
552                                         );
553                         }
554                 }
555 #endif
556
557                 /* should we NOT run plugins here if the route is inactive?
558                    do we catch route != active somewhere higher?
559                 */
560
561                 (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
562                 bufs.set_count ((*i)->output_streams());
563         }
564 }
565
566 ChanCount
567 Route::n_process_buffers ()
568 {
569         return max (_input->n_ports(), processor_max_streams);
570 }
571
572 void
573 Route::monitor_run (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
574 {
575         assert (is_monitor());
576         BufferSet& bufs (_session.get_route_buffers (n_process_buffers()));
577         passthru (bufs, start_frame, end_frame, nframes, declick);
578 }
579
580 void
581 Route::passthru (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
582 {
583         _silent = false;
584
585         if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
586
587                 /* control/monitor bus ignores input ports when something is
588                    feeding the listen "stream". data will "arrive" into the
589                    route from the intreturn processor element.
590                 */
591
592                 bufs.silence (nframes, 0);
593         }
594
595         write_out_of_band_data (bufs, start_frame, end_frame, nframes);
596         process_output_buffers (bufs, start_frame, end_frame, nframes, declick, true);
597 }
598
599 void
600 Route::passthru_silence (framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick)
601 {
602         BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
603
604         bufs.set_count (_input->n_ports());
605         write_out_of_band_data (bufs, start_frame, end_frame, nframes);
606         process_output_buffers (bufs, start_frame, end_frame, nframes, declick, false);
607 }
608
609 void
610 Route::set_listen (bool yn, void* src)
611 {
612         if (_solo_safe) {
613                 return;
614         }
615
616         if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
617                 _route_group->foreach_route (boost::bind (&Route::set_listen, _1, yn, _route_group));
618                 return;
619         }
620
621         if (_monitor_send) {
622                 if (yn != _monitor_send->active()) {
623                         if (yn) {
624                                 _monitor_send->activate ();
625                                 _mute_master->set_soloed (true);
626                         } else {
627                                 _monitor_send->deactivate ();
628                                 _mute_master->set_soloed (false);
629                         }
630
631                         listen_changed (src); /* EMIT SIGNAL */
632                 }
633         }
634 }
635
636 bool
637 Route::listening_via_monitor () const
638 {
639         if (_monitor_send) {
640                 return _monitor_send->active ();
641         } else {
642                 return false;
643         }
644 }
645
646 void
647 Route::set_solo_safe (bool yn, void *src)
648 {
649         if (_solo_safe != yn) {
650                 _solo_safe = yn;
651                 solo_safe_changed (src);
652         }
653 }
654
655 bool
656 Route::solo_safe() const
657 {
658         return _solo_safe;
659 }
660
661 void
662 Route::set_solo (bool yn, void *src)
663 {
664         if (_solo_safe) {
665                 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
666                 return;
667         }
668
669         if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
670                 _route_group->foreach_route (boost::bind (&Route::set_solo, _1, yn, _route_group));
671                 return;
672         }
673
674         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n", 
675                                                   name(), yn, src, (src == _route_group), self_soloed()));
676
677         if (self_soloed() != yn) {
678                 set_self_solo (yn);
679                 set_mute_master_solo ();
680                 solo_changed (true, src); /* EMIT SIGNAL */
681                 _solo_control->Changed (); /* EMIT SIGNAL */
682         }
683 }
684
685 void
686 Route::set_self_solo (bool yn)
687 {
688         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
689         _self_solo = yn;
690 }
691
692 void
693 Route::mod_solo_by_others_upstream (int32_t delta)
694 {
695         if (_solo_safe) {
696                 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
697                 return;
698         }
699
700         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n", 
701                                                   name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
702
703         uint32_t old_sbu = _soloed_by_others_upstream;
704
705         if (delta < 0) {
706                 if (_soloed_by_others_upstream >= (uint32_t) abs (delta)) {
707                         _soloed_by_others_upstream += delta;
708                 } else {
709                         _soloed_by_others_upstream = 0;
710                 }
711         } else {
712                 _soloed_by_others_upstream += delta;
713         }
714
715         DEBUG_TRACE (DEBUG::Solo, string_compose (
716                              "%1 SbU delta %2 = %3 old = %4 sbd %5 ss %6 exclusive %7\n",
717                              name(), delta, _soloed_by_others_upstream, old_sbu,
718                              _soloed_by_others_downstream, _self_solo, Config->get_exclusive_solo()));
719
720         /* push the inverse solo change to everything that feeds us.
721
722            This is important for solo-within-group. When we solo 1 track out of N that
723            feed a bus, that track will cause mod_solo_by_upstream (+1) to be called
724            on the bus. The bus then needs to call mod_solo_by_downstream (-1) on all
725            tracks that feed it. This will silence them if they were audible because
726            of a bus solo, but the newly soloed track will still be audible (because
727            it is self-soloed).
728
729            but .. do this only when we are being told to solo-by-upstream (i.e delta = +1),
730            not in reverse.
731         */
732
733         if ((_self_solo || _soloed_by_others_downstream) &&
734             ((old_sbu == 0 && _soloed_by_others_upstream > 0) ||
735              (old_sbu > 0 && _soloed_by_others_upstream == 0))) {
736
737                 if (delta > 0 || !Config->get_exclusive_solo()) {
738                         DEBUG_TRACE (DEBUG::Solo, "\t ... INVERT push\n");
739                         for (FedBy::iterator i = _fed_by.begin(); i != _fed_by.end(); ++i) {
740                                 boost::shared_ptr<Route> sr = i->r.lock();
741                                 if (sr) {
742                                         sr->mod_solo_by_others_downstream (-delta);
743                                 }
744                         }
745                 }
746         }
747
748         set_mute_master_solo ();
749         solo_changed (false, this);
750 }
751
752 void
753 Route::mod_solo_by_others_downstream (int32_t delta)
754 {
755         if (_solo_safe) {
756                 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
757                 return;
758         }
759
760         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n", 
761                                                   name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
762
763         if (delta < 0) {
764                 if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
765                         _soloed_by_others_downstream += delta;
766                 } else {
767                         _soloed_by_others_downstream = 0;
768                 }
769         } else {
770                 _soloed_by_others_downstream += delta;
771         }
772
773         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 SbD delta %2 = %3\n", name(), delta, _soloed_by_others_downstream));
774
775         set_mute_master_solo ();
776         solo_changed (false, this);
777 }
778
779 void
780 Route::set_mute_master_solo ()
781 {
782         _mute_master->set_soloed (self_soloed() || soloed_by_others_downstream() || soloed_by_others_upstream());
783 }
784
785 void
786 Route::set_solo_isolated (bool yn, void *src)
787 {
788         if (is_master() || is_monitor() || is_auditioner()) {
789                 return;
790         }
791
792         if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_solo()) {
793                 _route_group->foreach_route (boost::bind (&Route::set_solo_isolated, _1, yn, _route_group));
794                 return;
795         }
796
797         /* forward propagate solo-isolate status to everything fed by this route, but not those via sends only */
798
799         boost::shared_ptr<RouteList> routes = _session.get_routes ();
800         for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
801
802                 if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
803                         continue;
804                 }
805
806                 bool sends_only;
807                 bool does_feed = direct_feeds_according_to_graph (*i, &sends_only); // we will recurse anyway, so don't use ::feeds()
808
809                 if (does_feed && !sends_only) {
810                         (*i)->set_solo_isolated (yn, (*i)->route_group());
811                 }
812         }
813
814         /* XXX should we back-propagate as well? (April 2010: myself and chris goddard think not) */
815
816         bool changed = false;
817
818         if (yn) {
819                 if (_solo_isolated == 0) {
820                         _mute_master->set_solo_ignore (true);
821                         changed = true;
822                 }
823                 _solo_isolated++;
824         } else {
825                 if (_solo_isolated > 0) {
826                         _solo_isolated--;
827                         if (_solo_isolated == 0) {
828                                 _mute_master->set_solo_ignore (false);
829                                 changed = true;
830                         }
831                 }
832         }
833
834         if (changed) {
835                 solo_isolated_changed (src);
836         }
837 }
838
839 bool
840 Route::solo_isolated () const
841 {
842         return _solo_isolated > 0;
843 }
844
845 void
846 Route::set_mute_points (MuteMaster::MutePoint mp)
847 {
848         _mute_master->set_mute_points (mp);
849         mute_points_changed (); /* EMIT SIGNAL */
850
851         if (_mute_master->muted_by_self()) {
852                 mute_changed (this); /* EMIT SIGNAL */
853                 _mute_control->Changed (); /* EMIT SIGNAL */
854         }
855 }
856
857 void
858 Route::set_mute (bool yn, void *src)
859 {
860         if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_mute()) {
861                 _route_group->foreach_route (boost::bind (&Route::set_mute, _1, yn, _route_group));
862                 return;
863         }
864
865         if (muted() != yn) {
866                 _mute_master->set_muted_by_self (yn);
867                 /* allow any derived classes to respond to the mute change
868                    before anybody else knows about it.
869                 */
870                 act_on_mute ();
871                 /* tell everyone else */
872                 mute_changed (src); /* EMIT SIGNAL */
873                 _mute_control->Changed (); /* EMIT SIGNAL */
874         }
875 }
876
877 bool
878 Route::muted () const
879 {
880         return _mute_master->muted_by_self();
881 }
882
883 #if 0
884 static void
885 dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
886 {
887         cerr << name << " {" << endl;
888         for (list<boost::shared_ptr<Processor> >::const_iterator p = procs.begin();
889                         p != procs.end(); ++p) {
890                 cerr << "\t" << (*p)->name() << " ID = " << (*p)->id() << " @ " << (*p) << endl;
891         }
892         cerr << "}" << endl;
893 }
894 #endif
895
896 /** Supposing that we want to insert a Processor at a given Placement, return
897  *  the processor to add the new one before (or 0 to add at the end).
898  */
899 boost::shared_ptr<Processor>
900 Route::before_processor_for_placement (Placement p)
901 {
902         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
903
904         ProcessorList::iterator loc;
905         
906         if (p == PreFader) {
907                 /* generic pre-fader: insert immediately before the amp */
908                 loc = find (_processors.begin(), _processors.end(), _amp);
909         } else {
910                 /* generic post-fader: insert right before the main outs */
911                 loc = find (_processors.begin(), _processors.end(), _main_outs);
912         }
913
914         return loc != _processors.end() ? *loc : boost::shared_ptr<Processor> ();
915 }
916
917 /** Supposing that we want to insert a Processor at a given index, return
918  *  the processor to add the new one before (or 0 to add at the end).
919  */
920 boost::shared_ptr<Processor>
921 Route::before_processor_for_index (int index)
922 {
923         if (index == -1) {
924                 return boost::shared_ptr<Processor> ();
925         }
926
927         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
928         
929         ProcessorList::iterator i = _processors.begin ();
930         int j = 0;
931         while (i != _processors.end() && j < index) {
932                 if ((*i)->display_to_user()) {
933                         ++j;
934                 }
935                 
936                 ++i;
937         }
938
939         return (i != _processors.end() ? *i : boost::shared_ptr<Processor> ());
940 }
941
942 /** Add a processor either pre- or post-fader
943  *  @return 0 on success, non-0 on failure.
944  */
945 int
946 Route::add_processor (boost::shared_ptr<Processor> processor, Placement placement, ProcessorStreams* err, bool activation_allowed)
947 {
948         return add_processor (processor, before_processor_for_placement (placement), err, activation_allowed);
949 }
950
951
952 /** Add a processor to a route such that it ends up with a given index into the visible processors.
953  *  @param index Index to add the processor at, or -1 to add at the end of the list.
954  *  @return 0 on success, non-0 on failure.
955  */
956 int
957 Route::add_processor_by_index (boost::shared_ptr<Processor> processor, int index, ProcessorStreams* err, bool activation_allowed)
958 {
959         return add_processor (processor, before_processor_for_index (index), err, activation_allowed);
960 }
961
962 /** Add a processor to the route.
963  *  @param before An existing processor in the list, or 0; the new processor will be inserted immediately before it (or at the end).
964  *  @return 0 on success, non-0 on failure.
965  */
966 int
967 Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<Processor> before, ProcessorStreams* err, bool activation_allowed)
968 {
969         assert (processor != _meter);
970         assert (processor != _main_outs);
971
972         DEBUG_TRACE (DEBUG::Processors, string_compose (
973                              "%1 adding processor %2\n", name(), processor->name()));
974
975         if (!AudioEngine::instance()->connected() || !processor) {
976                 return 1;
977         }
978
979         {
980                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
981                 ProcessorState pstate (this);
982
983                 boost::shared_ptr<PluginInsert> pi;
984                 boost::shared_ptr<PortInsert> porti;
985
986                 if (processor == _amp) {
987                         /* Ensure that only one amp is in the list at any time */
988                         ProcessorList::iterator check = find (_processors.begin(), _processors.end(), processor);
989                         if (check != _processors.end()) {
990                                 if (before == _amp) {
991                                         /* Already in position; all is well */
992                                         return 0;
993                                 } else {
994                                         _processors.erase (check);
995                                 }
996                         }
997                 }
998
999                 assert (find (_processors.begin(), _processors.end(), processor) == _processors.end ());
1000
1001                 ProcessorList::iterator loc;
1002                 if (before) {
1003                         /* inserting before a processor; find it */
1004                         loc = find (_processors.begin(), _processors.end(), before);
1005                         if (loc == _processors.end ()) {
1006                                 /* Not found */
1007                                 return 1;
1008                         }
1009                 } else {
1010                         /* inserting at end */
1011                         loc = _processors.end ();
1012                 }
1013
1014                 _processors.insert (loc, processor);
1015                 processor->set_owner (this);
1016
1017                 // Set up processor list channels.  This will set processor->[input|output]_streams(),
1018                 // configure redirect ports properly, etc.
1019
1020                 {
1021                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1022
1023                         if (configure_processors_unlocked (err)) {
1024                                 pstate.restore ();
1025                                 configure_processors_unlocked (0); // it worked before we tried to add it ...
1026                                 return -1;
1027                         }
1028                 }
1029
1030                 if ((pi = boost::dynamic_pointer_cast<PluginInsert>(processor)) != 0) {
1031
1032                         if (pi->has_no_inputs ()) {
1033                                 /* generator plugin */
1034                                 _have_internal_generator = true;
1035                         }
1036
1037                 }
1038
1039                 if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
1040                         processor->activate ();
1041                 }
1042
1043                 processor->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1044
1045                 _output->set_user_latency (0);
1046         }
1047
1048         reset_instrument_info ();
1049         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1050         set_processor_positions ();
1051
1052         return 0;
1053 }
1054
1055 bool
1056 Route::add_processor_from_xml_2X (const XMLNode& node, int version)
1057 {
1058         const XMLProperty *prop;
1059
1060         try {
1061                 boost::shared_ptr<Processor> processor;
1062
1063                 /* bit of a hack: get the `placement' property from the <Redirect> tag here
1064                    so that we can add the processor in the right place (pre/post-fader)
1065                 */
1066
1067                 XMLNodeList const & children = node.children ();
1068                 XMLNodeList::const_iterator i = children.begin ();
1069
1070                 while (i != children.end() && (*i)->name() != X_("Redirect")) {
1071                         ++i;
1072                 }
1073
1074                 Placement placement = PreFader;
1075
1076                 if (i != children.end()) {
1077                         if ((prop = (*i)->property (X_("placement"))) != 0) {
1078                                 placement = Placement (string_2_enum (prop->value(), placement));
1079                         }
1080                 }
1081
1082                 if (node.name() == "Insert") {
1083
1084                         if ((prop = node.property ("type")) != 0) {
1085
1086                                 if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
1087                                                 prop->value() == "lv2" ||
1088                                                 prop->value() == "windows-vst" ||
1089                                                 prop->value() == "lxvst" ||
1090                                                 prop->value() == "audiounit") {
1091
1092                                         processor.reset (new PluginInsert (_session));
1093
1094                                 } else {
1095
1096                                         processor.reset (new PortInsert (_session, _pannable, _mute_master));
1097                                 }
1098
1099                         }
1100
1101                 } else if (node.name() == "Send") {
1102
1103                         processor.reset (new Send (_session, _pannable, _mute_master));
1104
1105                 } else {
1106
1107                         error << string_compose(_("unknown Processor type \"%1\"; ignored"), node.name()) << endmsg;
1108                         return false;
1109                 }
1110
1111                 if (processor->set_state (node, version)) {
1112                         return false;
1113                 }
1114
1115                 return (add_processor (processor, placement) == 0);
1116         }
1117
1118         catch (failed_constructor &err) {
1119                 warning << _("processor could not be created. Ignored.") << endmsg;
1120                 return false;
1121         }
1122 }
1123
1124 int
1125 Route::add_processors (const ProcessorList& others, boost::shared_ptr<Processor> before, ProcessorStreams* err)
1126 {
1127         /* NOTE: this is intended to be used ONLY when copying
1128            processors from another Route. Hence the subtle
1129            differences between this and ::add_processor()
1130         */
1131
1132         ProcessorList::iterator loc;
1133
1134         if (before) {
1135                 loc = find(_processors.begin(), _processors.end(), before);
1136         } else {
1137                 /* nothing specified - at end */
1138                 loc = _processors.end ();
1139         }
1140
1141         if (!_session.engine().connected()) {
1142                 return 1;
1143         }
1144
1145         if (others.empty()) {
1146                 return 0;
1147         }
1148
1149         {
1150                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1151                 ProcessorState pstate (this);
1152
1153                 for (ProcessorList::const_iterator i = others.begin(); i != others.end(); ++i) {
1154
1155                         if (*i == _meter) {
1156                                 continue;
1157                         }
1158
1159                         boost::shared_ptr<PluginInsert> pi;
1160
1161                         if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1162                                 pi->set_count (1);
1163                         }
1164
1165                         _processors.insert (loc, *i);
1166                         (*i)->set_owner (this);
1167
1168                         if ((*i)->active()) {
1169                                 (*i)->activate ();
1170                         }
1171
1172                         {
1173                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1174                                 if (configure_processors_unlocked (err)) {
1175                                         pstate.restore ();
1176                                         configure_processors_unlocked (0); // it worked before we tried to add it ...
1177                                         return -1;
1178                                 }
1179                         }
1180
1181                         (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
1182                 }
1183
1184                 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
1185                         boost::shared_ptr<PluginInsert> pi;
1186
1187                         if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1188                                 if (pi->has_no_inputs ()) {
1189                                         _have_internal_generator = true;
1190                                         break;
1191                                 }
1192                         }
1193                 }
1194
1195                 _output->set_user_latency (0);
1196         }
1197
1198         reset_instrument_info ();
1199         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1200         set_processor_positions ();
1201
1202         return 0;
1203 }
1204
1205 void
1206 Route::placement_range(Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end)
1207 {
1208         if (p == PreFader) {
1209                 start = _processors.begin();
1210                 end = find(_processors.begin(), _processors.end(), _amp);
1211         } else {
1212                 start = find(_processors.begin(), _processors.end(), _amp);
1213                 ++start;
1214                 end = _processors.end();
1215         }
1216 }
1217
1218 /** Turn off all processors with a given placement
1219  * @param p Placement of processors to disable
1220  */
1221 void
1222 Route::disable_processors (Placement p)
1223 {
1224         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1225
1226         ProcessorList::iterator start, end;
1227         placement_range(p, start, end);
1228
1229         for (ProcessorList::iterator i = start; i != end; ++i) {
1230                 (*i)->deactivate ();
1231         }
1232
1233         _session.set_dirty ();
1234 }
1235
1236 /** Turn off all redirects
1237  */
1238 void
1239 Route::disable_processors ()
1240 {
1241         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1242
1243         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1244                 (*i)->deactivate ();
1245         }
1246
1247         _session.set_dirty ();
1248 }
1249
1250 /** Turn off all redirects with a given placement
1251  * @param p Placement of redirects to disable
1252  */
1253 void
1254 Route::disable_plugins (Placement p)
1255 {
1256         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1257
1258         ProcessorList::iterator start, end;
1259         placement_range(p, start, end);
1260
1261         for (ProcessorList::iterator i = start; i != end; ++i) {
1262                 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1263                         (*i)->deactivate ();
1264                 }
1265         }
1266
1267         _session.set_dirty ();
1268 }
1269
1270 /** Turn off all plugins
1271  */
1272 void
1273 Route::disable_plugins ()
1274 {
1275         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1276
1277         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1278                 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1279                         (*i)->deactivate ();
1280                 }
1281         }
1282
1283         _session.set_dirty ();
1284 }
1285
1286
1287 void
1288 Route::ab_plugins (bool forward)
1289 {
1290         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1291
1292         if (forward) {
1293
1294                 /* forward = turn off all active redirects, and mark them so that the next time
1295                    we go the other way, we will revert them
1296                 */
1297
1298                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1299                         if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1300                                 continue;
1301                         }
1302
1303                         if ((*i)->active()) {
1304                                 (*i)->deactivate ();
1305                                 (*i)->set_next_ab_is_active (true);
1306                         } else {
1307                                 (*i)->set_next_ab_is_active (false);
1308                         }
1309                 }
1310
1311         } else {
1312
1313                 /* backward = if the redirect was marked to go active on the next ab, do so */
1314
1315                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1316
1317                         if (!boost::dynamic_pointer_cast<PluginInsert> (*i)) {
1318                                 continue;
1319                         }
1320
1321                         if ((*i)->get_next_ab_is_active()) {
1322                                 (*i)->activate ();
1323                         } else {
1324                                 (*i)->deactivate ();
1325                         }
1326                 }
1327         }
1328
1329         _session.set_dirty ();
1330 }
1331
1332
1333 /** Remove processors with a given placement.
1334  * @param p Placement of processors to remove.
1335  */
1336 void
1337 Route::clear_processors (Placement p)
1338 {
1339         if (!_session.engine().connected()) {
1340                 return;
1341         }
1342
1343         bool already_deleting = _session.deletion_in_progress();
1344         if (!already_deleting) {
1345                 _session.set_deletion_in_progress();
1346         }
1347
1348         {
1349                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1350                 ProcessorList new_list;
1351                 ProcessorStreams err;
1352                 bool seen_amp = false;
1353
1354                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1355
1356                         if (*i == _amp) {
1357                                 seen_amp = true;
1358                         }
1359
1360                         if ((*i) == _amp || (*i) == _meter || (*i) == _main_outs) {
1361
1362                                 /* you can't remove these */
1363
1364                                 new_list.push_back (*i);
1365
1366                         } else {
1367                                 if (seen_amp) {
1368
1369                                         switch (p) {
1370                                         case PreFader:
1371                                                 new_list.push_back (*i);
1372                                                 break;
1373                                         case PostFader:
1374                                                 (*i)->drop_references ();
1375                                                 break;
1376                                         }
1377
1378                                 } else {
1379
1380                                         switch (p) {
1381                                         case PreFader:
1382                                                 (*i)->drop_references ();
1383                                                 break;
1384                                         case PostFader:
1385                                                 new_list.push_back (*i);
1386                                                 break;
1387                                         }
1388                                 }
1389                         }
1390                 }
1391
1392                 _processors = new_list;
1393
1394                 {
1395                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1396                         configure_processors_unlocked (&err); // this can't fail
1397                 }
1398         }
1399
1400         processor_max_streams.reset();
1401         _have_internal_generator = false;
1402         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1403         set_processor_positions ();
1404
1405         reset_instrument_info ();
1406
1407         if (!already_deleting) {
1408                 _session.clear_deletion_in_progress();
1409         }
1410 }
1411
1412 int
1413 Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStreams* err, bool need_process_lock)
1414 {
1415         // TODO once the export point can be configured properly, do something smarter here
1416         if (processor == _capturing_processor) {
1417                 _capturing_processor.reset();
1418         }
1419
1420         /* these can never be removed */
1421
1422         if (processor == _amp || processor == _meter || processor == _main_outs) {
1423                 return 0;
1424         }
1425
1426         if (!_session.engine().connected()) {
1427                 return 1;
1428         }
1429
1430         processor_max_streams.reset();
1431
1432         {
1433                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1434                 ProcessorState pstate (this);
1435
1436                 ProcessorList::iterator i;
1437                 bool removed = false;
1438
1439                 for (i = _processors.begin(); i != _processors.end(); ) {
1440                         if (*i == processor) {
1441
1442                                 /* move along, see failure case for configure_processors()
1443                                    where we may need to reconfigure the processor.
1444                                 */
1445
1446                                 /* stop redirects that send signals to JACK ports
1447                                    from causing noise as a result of no longer being
1448                                    run.
1449                                 */
1450
1451                                 boost::shared_ptr<IOProcessor> iop;
1452
1453                                 if ((iop = boost::dynamic_pointer_cast<IOProcessor> (*i)) != 0) {
1454                                         iop->disconnect ();
1455                                 }
1456
1457                                 i = _processors.erase (i);
1458                                 removed = true;
1459                                 break;
1460
1461                         } else {
1462                                 ++i;
1463                         }
1464
1465                         _output->set_user_latency (0);
1466                 }
1467
1468                 if (!removed) {
1469                         /* what? */
1470                         return 1;
1471                 } 
1472
1473                 if (need_process_lock) {
1474                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1475
1476                         if (configure_processors_unlocked (err)) {
1477                                 pstate.restore ();
1478                                 /* we know this will work, because it worked before :) */
1479                                 configure_processors_unlocked (0);
1480                                 return -1;
1481                         }
1482                 } else {
1483                         if (configure_processors_unlocked (err)) {
1484                                 pstate.restore ();
1485                                 /* we know this will work, because it worked before :) */
1486                                 configure_processors_unlocked (0);
1487                                 return -1;
1488                         }
1489                 }
1490
1491                 _have_internal_generator = false;
1492
1493                 for (i = _processors.begin(); i != _processors.end(); ++i) {
1494                         boost::shared_ptr<PluginInsert> pi;
1495
1496                         if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1497                                 if (pi->has_no_inputs ()) {
1498                                         _have_internal_generator = true;
1499                                         break;
1500                                 }
1501                         }
1502                 }
1503         }
1504
1505         reset_instrument_info ();
1506         processor->drop_references ();
1507         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1508         set_processor_positions ();
1509
1510         return 0;
1511 }
1512
1513 int
1514 Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams* err)
1515 {
1516         ProcessorList deleted;
1517
1518         if (!_session.engine().connected()) {
1519                 return 1;
1520         }
1521
1522         processor_max_streams.reset();
1523
1524         {
1525                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1526                 ProcessorState pstate (this);
1527
1528                 ProcessorList::iterator i;
1529                 boost::shared_ptr<Processor> processor;
1530
1531                 for (i = _processors.begin(); i != _processors.end(); ) {
1532
1533                         processor = *i;
1534
1535                         /* these can never be removed */
1536
1537                         if (processor == _amp || processor == _meter || processor == _main_outs) {
1538                                 ++i;
1539                                 continue;
1540                         }
1541
1542                         /* see if its in the list of processors to delete */
1543
1544                         if (find (to_be_deleted.begin(), to_be_deleted.end(), processor) == to_be_deleted.end()) {
1545                                 ++i;
1546                                 continue;
1547                         }
1548
1549                         /* stop IOProcessors that send to JACK ports
1550                            from causing noise as a result of no longer being
1551                            run.
1552                         */
1553
1554                         boost::shared_ptr<IOProcessor> iop;
1555
1556                         if ((iop = boost::dynamic_pointer_cast<IOProcessor> (processor)) != 0) {
1557                                 iop->disconnect ();
1558                         }
1559
1560                         deleted.push_back (processor);
1561                         i = _processors.erase (i);
1562                 }
1563
1564                 if (deleted.empty()) {
1565                         /* none of those in the requested list were found */
1566                         return 0;
1567                 }
1568
1569                 _output->set_user_latency (0);
1570
1571                 {
1572                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1573
1574                         if (configure_processors_unlocked (err)) {
1575                                 pstate.restore ();
1576                                 /* we know this will work, because it worked before :) */
1577                                 configure_processors_unlocked (0);
1578                                 return -1;
1579                         }
1580                 }
1581
1582                 _have_internal_generator = false;
1583
1584                 for (i = _processors.begin(); i != _processors.end(); ++i) {
1585                         boost::shared_ptr<PluginInsert> pi;
1586
1587                         if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
1588                                 if (pi->has_no_inputs ()) {
1589                                         _have_internal_generator = true;
1590                                         break;
1591                                 }
1592                         }
1593                 }
1594         }
1595
1596         /* now try to do what we need to so that those that were removed will be deleted */
1597
1598         for (ProcessorList::iterator i = deleted.begin(); i != deleted.end(); ++i) {
1599                 (*i)->drop_references ();
1600         }
1601
1602         reset_instrument_info ();
1603         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1604         set_processor_positions ();
1605
1606         return 0;
1607 }
1608
1609 void
1610 Route::reset_instrument_info ()
1611 {
1612         boost::shared_ptr<Processor> instr = the_instrument();
1613         if (instr) {
1614                 _instrument_info.set_internal_instrument (instr);
1615         }
1616 }
1617
1618 /** Caller must hold process lock */
1619 int
1620 Route::configure_processors (ProcessorStreams* err)
1621 {
1622         assert (!AudioEngine::instance()->process_lock().trylock());
1623
1624         if (!_in_configure_processors) {
1625                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1626                 return configure_processors_unlocked (err);
1627         }
1628
1629         return 0;
1630 }
1631
1632 ChanCount
1633 Route::input_streams () const
1634 {
1635         return _input->n_ports ();
1636 }
1637
1638 list<pair<ChanCount, ChanCount> >
1639 Route::try_configure_processors (ChanCount in, ProcessorStreams* err)
1640 {
1641         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1642
1643         return try_configure_processors_unlocked (in, err);
1644 }
1645
1646 list<pair<ChanCount, ChanCount> >
1647 Route::try_configure_processors_unlocked (ChanCount in, ProcessorStreams* err)
1648 {
1649         // Check each processor in order to see if we can configure as requested
1650         ChanCount out;
1651         list<pair<ChanCount, ChanCount> > configuration;
1652         uint32_t index = 0;
1653
1654         DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
1655         DEBUG_TRACE (DEBUG::Processors, "{\n");
1656
1657         for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
1658
1659                 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1660                         DEBUG_TRACE (DEBUG::Processors, "--- CONFIGURE ABORTED due to unknown processor.\n");
1661                         DEBUG_TRACE (DEBUG::Processors, "}\n");
1662                         return list<pair<ChanCount, ChanCount> > ();
1663                 }
1664
1665                 if ((*p)->can_support_io_configuration(in, out)) {
1666                         DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID=%2 in=%3 out=%4\n",(*p)->name(), (*p)->id(), in, out));
1667                         configuration.push_back(make_pair(in, out));
1668                         in = out;
1669                 } else {
1670                         if (err) {
1671                                 err->index = index;
1672                                 err->count = in;
1673                         }
1674                         DEBUG_TRACE (DEBUG::Processors, "---- CONFIGURATION FAILED.\n");
1675                         DEBUG_TRACE (DEBUG::Processors, string_compose ("---- %1 cannot support in=%2 out=%3\n", (*p)->name(), in, out));
1676                         DEBUG_TRACE (DEBUG::Processors, "}\n");
1677                         return list<pair<ChanCount, ChanCount> > ();
1678                 }
1679         }
1680
1681         DEBUG_TRACE (DEBUG::Processors, "}\n");
1682
1683         return configuration;
1684 }
1685
1686 /** Set the input/output configuration of each processor in the processors list.
1687  *  Caller must hold process lock.
1688  *  Return 0 on success, otherwise configuration is impossible.
1689  */
1690 int
1691 Route::configure_processors_unlocked (ProcessorStreams* err)
1692 {
1693         assert (!AudioEngine::instance()->process_lock().trylock());
1694
1695         if (_in_configure_processors) {
1696                 return 0;
1697         }
1698
1699         /* put invisible processors where they should be */
1700         setup_invisible_processors ();
1701
1702         _in_configure_processors = true;
1703
1704         list<pair<ChanCount, ChanCount> > configuration = try_configure_processors_unlocked (input_streams (), err);
1705
1706         if (configuration.empty ()) {
1707                 _in_configure_processors = false;
1708                 return -1;
1709         }
1710
1711         ChanCount out;
1712         bool seen_mains_out = false;
1713         processor_out_streams = _input->n_ports();
1714         processor_max_streams.reset();
1715
1716         list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
1717         for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
1718
1719                 if (boost::dynamic_pointer_cast<UnknownProcessor> (*p)) {
1720                         break;
1721                 }
1722
1723                 (*p)->configure_io(c->first, c->second);
1724                 processor_max_streams = ChanCount::max(processor_max_streams, c->first);
1725                 processor_max_streams = ChanCount::max(processor_max_streams, c->second);
1726                 out = c->second;
1727
1728                 if (boost::dynamic_pointer_cast<Delivery> (*p)
1729                                 && boost::dynamic_pointer_cast<Delivery> (*p)->role() == Delivery::Main) {
1730                         /* main delivery will increase port count to match input.
1731                          * the Delivery::Main is usually the last processor - followed only by
1732                          * 'MeterOutput'.
1733                          */
1734                         seen_mains_out = true;
1735                 }
1736                 if (!seen_mains_out) {
1737                         processor_out_streams = out;
1738                 }
1739         }
1740
1741
1742         if (_meter) {
1743                 _meter->reset_max_channels (processor_max_streams);
1744         }
1745
1746         /* make sure we have sufficient scratch buffers to cope with the new processor
1747            configuration 
1748         */
1749         _session.ensure_buffers (n_process_buffers ());
1750
1751         DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
1752
1753         _in_configure_processors = false;
1754         return 0;
1755 }
1756
1757 /** Set all visible processors to a given active state (except Fader, whose state is not changed)
1758  *  @param state New active state for those processors.
1759  */
1760 void
1761 Route::all_visible_processors_active (bool state)
1762 {
1763         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1764
1765         if (_processors.empty()) {
1766                 return;
1767         }
1768         
1769         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1770                 if (!(*i)->display_to_user() || boost::dynamic_pointer_cast<Amp> (*i)) {
1771                         continue;
1772                 }
1773                 
1774                 if (state) {
1775                         (*i)->activate ();
1776                 } else {
1777                         (*i)->deactivate ();
1778                 }
1779         }
1780
1781         _session.set_dirty ();
1782 }
1783
1784 int
1785 Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err)
1786 {
1787         /* "new_order" is an ordered list of processors to be positioned according to "placement".
1788            NOTE: all processors in "new_order" MUST be marked as display_to_user(). There maybe additional
1789            processors in the current actual processor list that are hidden. Any visible processors
1790            in the current list but not in "new_order" will be assumed to be deleted.
1791         */
1792
1793         {
1794                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
1795                 ProcessorState pstate (this);
1796
1797                 ProcessorList::iterator oiter;
1798                 ProcessorList::const_iterator niter;
1799                 ProcessorList as_it_will_be;
1800
1801                 oiter = _processors.begin();
1802                 niter = new_order.begin();
1803
1804                 while (niter !=  new_order.end()) {
1805
1806                         /* if the next processor in the old list is invisible (i.e. should not be in the new order)
1807                            then append it to the temp list.
1808
1809                            Otherwise, see if the next processor in the old list is in the new list. if not,
1810                            its been deleted. If its there, append it to the temp list.
1811                         */
1812
1813                         if (oiter == _processors.end()) {
1814
1815                                 /* no more elements in the old list, so just stick the rest of
1816                                    the new order onto the temp list.
1817                                 */
1818
1819                                 as_it_will_be.insert (as_it_will_be.end(), niter, new_order.end());
1820                                 while (niter != new_order.end()) {
1821                                         ++niter;
1822                                 }
1823                                 break;
1824
1825                         } else {
1826
1827                                 if (!(*oiter)->display_to_user()) {
1828
1829                                         as_it_will_be.push_back (*oiter);
1830
1831                                 } else {
1832
1833                                         /* visible processor: check that its in the new order */
1834
1835                                         if (find (new_order.begin(), new_order.end(), (*oiter)) == new_order.end()) {
1836                                                 /* deleted: do nothing, shared_ptr<> will clean up */
1837                                         } else {
1838                                                 /* ignore this one, and add the next item from the new order instead */
1839                                                 as_it_will_be.push_back (*niter);
1840                                                 ++niter;
1841                                         }
1842                                 }
1843
1844                                 /* now remove from old order - its taken care of no matter what */
1845                                 oiter = _processors.erase (oiter);
1846                         }
1847
1848                 }
1849
1850                 _processors.insert (oiter, as_it_will_be.begin(), as_it_will_be.end());
1851
1852                 /* If the meter is in a custom position, find it and make a rough note of its position */
1853                 maybe_note_meter_position ();
1854
1855                 {
1856                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1857
1858                         if (configure_processors_unlocked (err)) {
1859                                 pstate.restore ();
1860                                 return -1;
1861                         }
1862                 }
1863         }
1864
1865         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
1866         set_processor_positions ();
1867
1868         return 0;
1869 }
1870
1871 XMLNode&
1872 Route::get_state()
1873 {
1874         return state(true);
1875 }
1876
1877 XMLNode&
1878 Route::get_template()
1879 {
1880         return state(false);
1881 }
1882
1883 XMLNode&
1884 Route::state(bool full_state)
1885 {
1886         XMLNode *node = new XMLNode("Route");
1887         ProcessorList::iterator i;
1888         char buf[32];
1889
1890         id().print (buf, sizeof (buf));
1891         node->add_property("id", buf);
1892         node->add_property ("name", _name);
1893         node->add_property("default-type", _default_type.to_string());
1894
1895         if (_flags) {
1896                 node->add_property("flags", enum_2_string (_flags));
1897         }
1898
1899         node->add_property("active", _active?"yes":"no");
1900         string p;
1901         boost::to_string (_phase_invert, p);
1902         node->add_property("phase-invert", p);
1903         node->add_property("denormal-protection", _denormal_protection?"yes":"no");
1904         node->add_property("meter-point", enum_2_string (_meter_point));
1905
1906         node->add_property("meter-type", enum_2_string (_meter_type));
1907
1908         if (_route_group) {
1909                 node->add_property("route-group", _route_group->name());
1910         }
1911
1912         string order_string;
1913         OrderKeys::iterator x = order_keys.begin();
1914
1915         while (x != order_keys.end()) {
1916                 order_string += enum_2_string ((*x).first);
1917                 order_string += '=';
1918                 snprintf (buf, sizeof(buf), "%" PRId32, (*x).second);
1919                 order_string += buf;
1920
1921                 ++x;
1922
1923                 if (x == order_keys.end()) {
1924                         break;
1925                 }
1926
1927                 order_string += ':';
1928         }
1929         node->add_property ("order-keys", order_string);
1930         node->add_property ("self-solo", (_self_solo ? "yes" : "no"));
1931         snprintf (buf, sizeof (buf), "%d", _soloed_by_others_upstream);
1932         node->add_property ("soloed-by-upstream", buf);
1933         snprintf (buf, sizeof (buf), "%d", _soloed_by_others_downstream);
1934         node->add_property ("soloed-by-downstream", buf);
1935         node->add_property ("solo-isolated", solo_isolated() ? "yes" : "no");
1936         node->add_property ("solo-safe", _solo_safe ? "yes" : "no");
1937
1938         node->add_child_nocopy (_input->state (full_state));
1939         node->add_child_nocopy (_output->state (full_state));
1940         node->add_child_nocopy (_solo_control->get_state ());
1941         node->add_child_nocopy (_mute_control->get_state ());
1942         node->add_child_nocopy (_mute_master->get_state ());
1943
1944         XMLNode* remote_control_node = new XMLNode (X_("RemoteControl"));
1945         snprintf (buf, sizeof (buf), "%d", _remote_control_id);
1946         remote_control_node->add_property (X_("id"), buf);
1947         node->add_child_nocopy (*remote_control_node);
1948
1949         if (_comment.length()) {
1950                 XMLNode *cmt = node->add_child ("Comment");
1951                 cmt->add_content (_comment);
1952         }
1953
1954         if (_pannable) {
1955                 node->add_child_nocopy (_pannable->state (full_state));
1956         }
1957
1958         for (i = _processors.begin(); i != _processors.end(); ++i) {
1959                 if (!full_state) {
1960                         /* template save: do not include internal sends functioning as 
1961                            aux sends because the chance of the target ID
1962                            in the session where this template is used
1963                            is not very likely.
1964
1965                            similarly, do not save listen sends which connect to
1966                            the monitor section, because these will always be
1967                            added if necessary.
1968                         */
1969                         boost::shared_ptr<InternalSend> is;
1970
1971                         if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
1972                                 if (is->role() == Delivery::Listen) {
1973                                         continue;
1974                                 }
1975                         }
1976                 }
1977                 node->add_child_nocopy((*i)->state (full_state));
1978         }
1979
1980         if (_extra_xml) {
1981                 node->add_child_copy (*_extra_xml);
1982         }
1983
1984         if (_custom_meter_position_noted) {
1985                 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
1986                 if (after) {
1987                         after->id().print (buf, sizeof (buf));
1988                         node->add_property (X_("processor-after-last-custom-meter"), buf);
1989                 }
1990
1991                 node->add_property (X_("last-custom-meter-was-at-end"), _last_custom_meter_was_at_end ? "yes" : "no");
1992         }
1993
1994         return *node;
1995 }
1996
1997 int
1998 Route::set_state (const XMLNode& node, int version)
1999 {
2000         if (version < 3000) {
2001                 return set_state_2X (node, version);
2002         }
2003
2004         XMLNodeList nlist;
2005         XMLNodeConstIterator niter;
2006         XMLNode *child;
2007         const XMLProperty *prop;
2008
2009         if (node.name() != "Route"){
2010                 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2011                 return -1;
2012         }
2013
2014         if ((prop = node.property (X_("name"))) != 0) {
2015                 Route::set_name (prop->value());
2016         }
2017
2018         set_id (node);
2019         _initial_io_setup = true;
2020
2021         if ((prop = node.property (X_("flags"))) != 0) {
2022                 _flags = Flag (string_2_enum (prop->value(), _flags));
2023         } else {
2024                 _flags = Flag (0);
2025         }
2026
2027         if (is_master() || is_monitor() || is_auditioner()) {
2028                 _mute_master->set_solo_ignore (true);
2029         }
2030
2031         if (is_monitor()) {
2032                 /* monitor bus does not get a panner, but if (re)created
2033                    via XML, it will already have one by the time we
2034                    call ::set_state(). so ... remove it.
2035                 */
2036                 unpan ();
2037         }
2038
2039         /* add all processors (except amp, which is always present) */
2040
2041         nlist = node.children();
2042         XMLNode processor_state (X_("processor_state"));
2043
2044         Stateful::save_extra_xml (node);
2045
2046         for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2047
2048                 child = *niter;
2049
2050                 if (child->name() == IO::state_node_name) {
2051                         if ((prop = child->property (X_("direction"))) == 0) {
2052                                 continue;
2053                         }
2054
2055                         if (prop->value() == "Input") {
2056                                 _input->set_state (*child, version);
2057                         } else if (prop->value() == "Output") {
2058                                 _output->set_state (*child, version);
2059                         }
2060                 }
2061
2062                 if (child->name() == X_("Processor")) {
2063                         processor_state.add_child_copy (*child);
2064                 }
2065
2066                 if (child->name() == X_("Pannable")) {
2067                         if (_pannable) {
2068                                 _pannable->set_state (*child, version);
2069                         } else {
2070                                 warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
2071                         }
2072                 }
2073         }
2074
2075         if ((prop = node.property (X_("meter-point"))) != 0) {
2076                 MeterPoint mp = MeterPoint (string_2_enum (prop->value (), _meter_point));
2077                 set_meter_point (mp, true);
2078                 if (_meter) {
2079                         _meter->set_display_to_user (_meter_point == MeterCustom);
2080                 }
2081         }
2082
2083         if ((prop = node.property (X_("meter-type"))) != 0) {
2084                 _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
2085         }
2086
2087         _initial_io_setup = false;
2088
2089         set_processor_state (processor_state);
2090
2091         // this looks up the internal instrument in processors
2092         reset_instrument_info();
2093
2094         if ((prop = node.property ("self-solo")) != 0) {
2095                 set_self_solo (string_is_affirmative (prop->value()));
2096         }
2097
2098         if ((prop = node.property ("soloed-by-upstream")) != 0) {
2099                 _soloed_by_others_upstream = 0; // needed for mod_.... () to work
2100                 mod_solo_by_others_upstream (atoi (prop->value()));
2101         }
2102
2103         if ((prop = node.property ("soloed-by-downstream")) != 0) {
2104                 _soloed_by_others_downstream = 0; // needed for mod_.... () to work
2105                 mod_solo_by_others_downstream (atoi (prop->value()));
2106         }
2107
2108         if ((prop = node.property ("solo-isolated")) != 0) {
2109                 set_solo_isolated (string_is_affirmative (prop->value()), this);
2110         }
2111
2112         if ((prop = node.property ("solo-safe")) != 0) {
2113                 set_solo_safe (string_is_affirmative (prop->value()), this);
2114         }
2115
2116         if ((prop = node.property (X_("phase-invert"))) != 0) {
2117                 set_phase_invert (boost::dynamic_bitset<> (prop->value ()));
2118         }
2119
2120         if ((prop = node.property (X_("denormal-protection"))) != 0) {
2121                 set_denormal_protection (string_is_affirmative (prop->value()));
2122         }
2123
2124         if ((prop = node.property (X_("active"))) != 0) {
2125                 bool yn = string_is_affirmative (prop->value());
2126                 _active = !yn; // force switch
2127                 set_active (yn, this);
2128         }
2129
2130         if ((prop = node.property (X_("order-keys"))) != 0) {
2131
2132                 int32_t n;
2133
2134                 string::size_type colon, equal;
2135                 string remaining = prop->value();
2136
2137                 while (remaining.length()) {
2138
2139                         if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2140                                 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2141                                       << endmsg;
2142                         } else {
2143                                 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2144                                         error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2145                                               << endmsg;
2146                                 } else {
2147                                         string keyname = remaining.substr (0, equal);
2148                                         RouteSortOrderKey sk;
2149
2150                                         if (keyname == "signal") {
2151                                                 sk = MixerSort;
2152                                         } else if (keyname == "editor") {
2153                                                 sk = EditorSort;
2154                                         } else {
2155                                                 sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
2156                                         }
2157
2158                                         set_order_key (sk, n);
2159                                 }
2160                         }
2161
2162                         colon = remaining.find_first_of (':');
2163
2164                         if (colon != string::npos) {
2165                                 remaining = remaining.substr (colon+1);
2166                         } else {
2167                                 break;
2168                         }
2169                 }
2170         }
2171
2172         if ((prop = node.property (X_("processor-after-last-custom-meter"))) != 0) {
2173                 PBD::ID id (prop->value ());
2174                 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2175                 ProcessorList::const_iterator i = _processors.begin ();
2176                 while (i != _processors.end() && (*i)->id() != id) {
2177                         ++i;
2178                 }
2179
2180                 if (i != _processors.end ()) {
2181                         _processor_after_last_custom_meter = *i;
2182                         _custom_meter_position_noted = true;
2183                 }
2184         }
2185
2186         if ((prop = node.property (X_("last-custom-meter-was-at-end"))) != 0) {
2187                 _last_custom_meter_was_at_end = string_is_affirmative (prop->value ());
2188         }
2189
2190         for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2191                 child = *niter;
2192
2193                 if (child->name() == X_("Comment")) {
2194
2195                         /* XXX this is a terrible API design in libxml++ */
2196
2197                         XMLNode *cmt = *(child->children().begin());
2198                         _comment = cmt->content();
2199
2200                 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2201                         if (prop->value() == "solo") {
2202                                 _solo_control->set_state (*child, version);
2203                         } else if (prop->value() == "mute") {
2204                                 _mute_control->set_state (*child, version);
2205                         }
2206
2207                 } else if (child->name() == X_("RemoteControl")) {
2208                         if ((prop = child->property (X_("id"))) != 0) {
2209                                 int32_t x;
2210                                 sscanf (prop->value().c_str(), "%d", &x);
2211                                 set_remote_control_id_internal (x);
2212                         }
2213
2214                 } else if (child->name() == X_("MuteMaster")) {
2215                         _mute_master->set_state (*child, version);
2216                 }
2217         }
2218
2219         return 0;
2220 }
2221
2222 int
2223 Route::set_state_2X (const XMLNode& node, int version)
2224 {
2225         XMLNodeList nlist;
2226         XMLNodeConstIterator niter;
2227         XMLNode *child;
2228         const XMLProperty *prop;
2229
2230         /* 2X things which still remain to be handled:
2231          * default-type
2232          * automation
2233          * controlouts
2234          */
2235
2236         if (node.name() != "Route") {
2237                 error << string_compose(_("Bad node sent to Route::set_state() [%1]"), node.name()) << endmsg;
2238                 return -1;
2239         }
2240
2241         if ((prop = node.property (X_("flags"))) != 0) {
2242                 string f = prop->value ();
2243                 boost::replace_all (f, "ControlOut", "MonitorOut");
2244                 _flags = Flag (string_2_enum (f, _flags));
2245         } else {
2246                 _flags = Flag (0);
2247         }
2248
2249         if (is_master() || is_monitor() || is_auditioner()) {
2250                 _mute_master->set_solo_ignore (true);
2251         }
2252
2253         if ((prop = node.property (X_("phase-invert"))) != 0) {
2254                 boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
2255                 if (string_is_affirmative (prop->value ())) {
2256                         p.set ();
2257                 }
2258                 set_phase_invert (p);
2259         }
2260
2261         if ((prop = node.property (X_("denormal-protection"))) != 0) {
2262                 set_denormal_protection (string_is_affirmative (prop->value()));
2263         }
2264
2265         if ((prop = node.property (X_("soloed"))) != 0) {
2266                 bool yn = string_is_affirmative (prop->value());
2267
2268                 /* XXX force reset of solo status */
2269
2270                 set_solo (yn, this);
2271         }
2272
2273         if ((prop = node.property (X_("muted"))) != 0) {
2274
2275                 bool first = true;
2276                 bool muted = string_is_affirmative (prop->value());
2277
2278                 if (muted) {
2279
2280                         string mute_point;
2281
2282                         if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
2283
2284                                 if (string_is_affirmative (prop->value())){
2285                                         mute_point = mute_point + "PreFader";
2286                                         first = false;
2287                                 }
2288                         }
2289
2290                         if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
2291
2292                                 if (string_is_affirmative (prop->value())){
2293
2294                                         if (!first) {
2295                                                 mute_point = mute_point + ",";
2296                                         }
2297
2298                                         mute_point = mute_point + "PostFader";
2299                                         first = false;
2300                                 }
2301                         }
2302
2303                         if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
2304
2305                                 if (string_is_affirmative (prop->value())){
2306
2307                                         if (!first) {
2308                                                 mute_point = mute_point + ",";
2309                                         }
2310
2311                                         mute_point = mute_point + "Listen";
2312                                         first = false;
2313                                 }
2314                         }
2315
2316                         if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
2317
2318                                 if (string_is_affirmative (prop->value())){
2319
2320                                         if (!first) {
2321                                                 mute_point = mute_point + ",";
2322                                         }
2323
2324                                         mute_point = mute_point + "Main";
2325                                 }
2326                         }
2327
2328                         _mute_master->set_mute_points (mute_point);
2329                         _mute_master->set_muted_by_self (true);
2330                 }
2331         }
2332
2333         if ((prop = node.property (X_("meter-point"))) != 0) {
2334                 _meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
2335         }
2336
2337         /* do not carry over edit/mix groups from 2.X because (a) its hard (b) they
2338            don't mean the same thing.
2339         */
2340
2341         if ((prop = node.property (X_("order-keys"))) != 0) {
2342
2343                 int32_t n;
2344
2345                 string::size_type colon, equal;
2346                 string remaining = prop->value();
2347
2348                 while (remaining.length()) {
2349
2350                         if ((equal = remaining.find_first_of ('=')) == string::npos || equal == remaining.length()) {
2351                                 error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2352                                         << endmsg;
2353                         } else {
2354                                 if (sscanf (remaining.substr (equal+1).c_str(), "%d", &n) != 1) {
2355                                         error << string_compose (_("badly formed order key string in state file! [%1] ... ignored."), remaining)
2356                                                 << endmsg;
2357                                 } else {
2358                                         string keyname = remaining.substr (0, equal);
2359                                         RouteSortOrderKey sk;
2360
2361                                         if (keyname == "signal") {
2362                                                 sk = MixerSort;
2363                                         } else if (keyname == "editor") {
2364                                                 sk = EditorSort;
2365                                         } else {
2366                                                 sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
2367                                         }
2368
2369                                         set_order_key (sk, n);
2370                                 }
2371                         }
2372
2373                         colon = remaining.find_first_of (':');
2374
2375                         if (colon != string::npos) {
2376                                 remaining = remaining.substr (colon+1);
2377                         } else {
2378                                 break;
2379                         }
2380                 }
2381         }
2382
2383         /* IOs */
2384
2385         nlist = node.children ();
2386         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2387
2388                 child = *niter;
2389
2390                 if (child->name() == IO::state_node_name) {
2391
2392                         /* there is a note in IO::set_state_2X() about why we have to call
2393                            this directly.
2394                            */
2395
2396                         _input->set_state_2X (*child, version, true);
2397                         _output->set_state_2X (*child, version, false);
2398
2399                         if ((prop = child->property (X_("name"))) != 0) {
2400                                 Route::set_name (prop->value ());
2401                         }
2402
2403                         set_id (*child);
2404
2405                         if ((prop = child->property (X_("active"))) != 0) {
2406                                 bool yn = string_is_affirmative (prop->value());
2407                                 _active = !yn; // force switch
2408                                 set_active (yn, this);
2409                         }
2410
2411                         if ((prop = child->property (X_("gain"))) != 0) {
2412                                 gain_t val;
2413
2414                                 if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
2415                                         _amp->gain_control()->set_value (val);
2416                                 }
2417                         }
2418
2419                         /* Set up Panners in the IO */
2420                         XMLNodeList io_nlist = child->children ();
2421
2422                         XMLNodeConstIterator io_niter;
2423                         XMLNode *io_child;
2424
2425                         for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
2426
2427                                 io_child = *io_niter;
2428
2429                                 if (io_child->name() == X_("Panner")) {
2430                                         _main_outs->panner_shell()->set_state(*io_child, version);
2431                                 } else if (io_child->name() == X_("Automation")) {
2432                                         /* IO's automation is for the fader */
2433                                         _amp->set_automation_xml_state (*io_child, Evoral::Parameter (GainAutomation));
2434                                 }
2435                         }
2436                 }
2437         }
2438
2439         XMLNodeList redirect_nodes;
2440
2441         for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2442
2443                 child = *niter;
2444
2445                 if (child->name() == X_("Send") || child->name() == X_("Insert")) {
2446                         redirect_nodes.push_back(child);
2447                 }
2448
2449         }
2450
2451         set_processor_state_2X (redirect_nodes, version);
2452
2453         Stateful::save_extra_xml (node);
2454
2455         for (niter = nlist.begin(); niter != nlist.end(); ++niter){
2456                 child = *niter;
2457
2458                 if (child->name() == X_("Comment")) {
2459
2460                         /* XXX this is a terrible API design in libxml++ */
2461
2462                         XMLNode *cmt = *(child->children().begin());
2463                         _comment = cmt->content();
2464
2465                 } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
2466                         if (prop->value() == X_("solo")) {
2467                                 _solo_control->set_state (*child, version);
2468                         } else if (prop->value() == X_("mute")) {
2469                                 _mute_control->set_state (*child, version);
2470                         }
2471
2472                 } else if (child->name() == X_("RemoteControl")) {
2473                         if ((prop = child->property (X_("id"))) != 0) {
2474                                 int32_t x;
2475                                 sscanf (prop->value().c_str(), "%d", &x);
2476                                 set_remote_control_id_internal (x);
2477                         }
2478
2479                 }
2480         }
2481
2482         return 0;
2483 }
2484
2485 XMLNode&
2486 Route::get_processor_state ()
2487 {
2488         XMLNode* root = new XMLNode (X_("redirects"));
2489         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2490                 root->add_child_nocopy ((*i)->state (true));
2491         }
2492
2493         return *root;
2494 }
2495
2496 void
2497 Route::set_processor_state_2X (XMLNodeList const & nList, int version)
2498 {
2499         /* We don't bother removing existing processors not in nList, as this
2500            method will only be called when creating a Route from scratch, not
2501            for undo purposes.  Just put processors in at the appropriate place
2502            in the list.
2503         */
2504
2505         for (XMLNodeConstIterator i = nList.begin(); i != nList.end(); ++i) {
2506                 add_processor_from_xml_2X (**i, version);
2507         }
2508 }
2509
2510 void
2511 Route::set_processor_state (const XMLNode& node)
2512 {
2513         const XMLNodeList &nlist = node.children();
2514         XMLNodeConstIterator niter;
2515         ProcessorList new_order;
2516         bool must_configure = false;
2517
2518         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2519
2520                 XMLProperty* prop = (*niter)->property ("type");
2521
2522                 if (prop->value() == "amp") {
2523                         _amp->set_state (**niter, Stateful::current_state_version);
2524                         new_order.push_back (_amp);
2525                 } else if (prop->value() == "meter") {
2526                         _meter->set_state (**niter, Stateful::current_state_version);
2527                         new_order.push_back (_meter);
2528                 } else if (prop->value() == "main-outs") {
2529                         _main_outs->set_state (**niter, Stateful::current_state_version);
2530                 } else if (prop->value() == "intreturn") {
2531                         if (!_intreturn) {
2532                                 _intreturn.reset (new InternalReturn (_session));
2533                                 must_configure = true;
2534                         }
2535                         _intreturn->set_state (**niter, Stateful::current_state_version);
2536                 } else if (is_monitor() && prop->value() == "monitor") {
2537                         if (!_monitor_control) {
2538                                 _monitor_control.reset (new MonitorProcessor (_session));
2539                                 must_configure = true;
2540                         }
2541                         _monitor_control->set_state (**niter, Stateful::current_state_version);
2542                 } else if (prop->value() == "capture") {
2543                         /* CapturingProcessor should never be restored, it's always
2544                            added explicitly when needed */
2545                 } else {
2546                         ProcessorList::iterator o;
2547
2548                         for (o = _processors.begin(); o != _processors.end(); ++o) {
2549                                 XMLProperty* id_prop = (*niter)->property(X_("id"));
2550                                 if (id_prop && (*o)->id() == id_prop->value()) {
2551                                         (*o)->set_state (**niter, Stateful::current_state_version);
2552                                         new_order.push_back (*o);
2553                                         break;
2554                                 }
2555                         }
2556
2557                         // If the processor (*niter) is not on the route then create it
2558
2559                         if (o == _processors.end()) {
2560
2561                                 boost::shared_ptr<Processor> processor;
2562
2563                                 if (prop->value() == "intsend") {
2564
2565                                         processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
2566
2567                                 } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
2568                                            prop->value() == "lv2" ||
2569                                            prop->value() == "windows-vst" ||
2570                                            prop->value() == "lxvst" ||
2571                                            prop->value() == "audiounit") {
2572
2573                                         processor.reset (new PluginInsert(_session));
2574
2575                                 } else if (prop->value() == "port") {
2576
2577                                         processor.reset (new PortInsert (_session, _pannable, _mute_master));
2578
2579                                 } else if (prop->value() == "send") {
2580
2581                                         processor.reset (new Send (_session, _pannable, _mute_master));
2582
2583                                 } else {
2584                                         error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
2585                                         continue;
2586                                 }
2587
2588                                 if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
2589                                         /* This processor could not be configured.  Turn it into a UnknownProcessor */
2590                                         processor.reset (new UnknownProcessor (_session, **niter));
2591                                 }
2592
2593                                 /* we have to note the monitor send here, otherwise a new one will be created
2594                                    and the state of this one will be lost.
2595                                 */
2596                                 boost::shared_ptr<InternalSend> isend = boost::dynamic_pointer_cast<InternalSend> (processor);
2597                                 if (isend && isend->role() == Delivery::Listen) {
2598                                         _monitor_send = isend;
2599                                 }
2600
2601                                 /* it doesn't matter if invisible processors are added here, as they
2602                                    will be sorted out by setup_invisible_processors () shortly.
2603                                 */
2604
2605                                 new_order.push_back (processor);
2606                                 must_configure = true;
2607                         }
2608                 }
2609         }
2610
2611         {
2612                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
2613                 _processors = new_order;
2614
2615                 if (must_configure) {
2616                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2617                         configure_processors_unlocked (0);
2618                 }
2619
2620                 for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
2621
2622                         (*i)->set_owner (this);
2623                         (*i)->ActiveChanged.connect_same_thread (*this, boost::bind (&Session::update_latency_compensation, &_session, false));
2624
2625                         boost::shared_ptr<PluginInsert> pi;
2626
2627                         if ((pi = boost::dynamic_pointer_cast<PluginInsert>(*i)) != 0) {
2628                                 if (pi->has_no_inputs ()) {
2629                                         _have_internal_generator = true;
2630                                         break;
2631                                 }
2632                         }
2633                 }
2634         }
2635
2636         reset_instrument_info ();
2637         processors_changed (RouteProcessorChange ());
2638         set_processor_positions ();
2639 }
2640
2641 void
2642 Route::curve_reallocate ()
2643 {
2644 //      _gain_automation_curve.finish_resize ();
2645 //      _pan_automation_curve.finish_resize ();
2646 }
2647
2648 void
2649 Route::silence (framecnt_t nframes)
2650 {
2651         Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
2652         if (!lm.locked()) {
2653                 return;
2654         }
2655
2656         silence_unlocked (nframes);
2657 }
2658
2659 void
2660 Route::silence_unlocked (framecnt_t nframes)
2661 {
2662         /* Must be called with the processor lock held */
2663
2664         if (!_silent) {
2665
2666                 _output->silence (nframes);
2667
2668                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2669                         boost::shared_ptr<PluginInsert> pi;
2670
2671                         if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
2672                                 // skip plugins, they don't need anything when we're not active
2673                                 continue;
2674                         }
2675
2676                         (*i)->silence (nframes);
2677                 }
2678
2679                 if (nframes == _session.get_block_size()) {
2680                         // _silent = true;
2681                 }
2682         }
2683 }
2684
2685 void
2686 Route::add_internal_return ()
2687 {
2688         if (!_intreturn) {
2689                 _intreturn.reset (new InternalReturn (_session));
2690                 add_processor (_intreturn, PreFader);
2691         }
2692 }
2693
2694 void
2695 Route::add_send_to_internal_return (InternalSend* send)
2696 {
2697         Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2698
2699         for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2700                 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2701
2702                 if (d) {
2703                         return d->add_send (send);
2704                 }
2705         }
2706 }
2707
2708 void
2709 Route::remove_send_from_internal_return (InternalSend* send)
2710 {
2711         Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2712
2713         for (ProcessorList::const_iterator x = _processors.begin(); x != _processors.end(); ++x) {
2714                 boost::shared_ptr<InternalReturn> d = boost::dynamic_pointer_cast<InternalReturn>(*x);
2715
2716                 if (d) {
2717                         return d->remove_send (send);
2718                 }
2719         }
2720 }
2721
2722 void
2723 Route::enable_monitor_send ()
2724 {
2725         /* Caller must hold process lock */
2726         assert (!AudioEngine::instance()->process_lock().trylock());
2727
2728         /* master never sends to monitor section via the normal mechanism */
2729         assert (!is_master ());
2730
2731         /* make sure we have one */
2732         if (!_monitor_send) {
2733                 _monitor_send.reset (new InternalSend (_session, _pannable, _mute_master, _session.monitor_out(), Delivery::Listen));
2734                 _monitor_send->set_display_to_user (false);
2735         }
2736
2737         /* set it up */
2738         configure_processors (0);
2739 }
2740
2741 /** Add an aux send to a route.
2742  *  @param route route to send to.
2743  *  @param before Processor to insert before, or 0 to insert at the end.
2744  */
2745 int
2746 Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor> before)
2747 {
2748         assert (route != _session.monitor_out ());
2749
2750         {
2751                 Glib::Threads::RWLock::ReaderLock rm (_processor_lock);
2752
2753                 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2754
2755                         boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend> (*x);
2756
2757                         if (d && d->target_route() == route) {
2758                                 /* already listening via the specified IO: do nothing */
2759                                 return 0;
2760                         }
2761                 }
2762         }
2763
2764         try {
2765
2766                 boost::shared_ptr<InternalSend> listener;
2767
2768                 {
2769                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2770                         listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
2771                 }
2772
2773                 add_processor (listener, before);
2774
2775         } catch (failed_constructor& err) {
2776                 return -1;
2777         }
2778
2779         return 0;
2780 }
2781
2782 void
2783 Route::remove_aux_or_listen (boost::shared_ptr<Route> route)
2784 {
2785         ProcessorStreams err;
2786         ProcessorList::iterator tmp;
2787
2788         {
2789                 Glib::Threads::RWLock::ReaderLock rl(_processor_lock);
2790
2791                 /* have to do this early because otherwise processor reconfig
2792                  * will put _monitor_send back in the list
2793                  */
2794
2795                 if (route == _session.monitor_out()) {
2796                         _monitor_send.reset ();
2797                 }
2798
2799           again:
2800                 for (ProcessorList::iterator x = _processors.begin(); x != _processors.end(); ++x) {
2801                         
2802                         boost::shared_ptr<InternalSend> d = boost::dynamic_pointer_cast<InternalSend>(*x);
2803                         
2804                         if (d && d->target_route() == route) {
2805                                 rl.release ();
2806                                 remove_processor (*x, &err, false);
2807                                 rl.acquire ();
2808
2809                                 /* list could have been demolished while we dropped the lock
2810                                    so start over.
2811                                 */
2812                                 
2813                                 goto again;
2814                         }
2815                 }
2816         }
2817 }
2818
2819 void
2820 Route::set_comment (string cmt, void *src)
2821 {
2822         _comment = cmt;
2823         comment_changed (src);
2824         _session.set_dirty ();
2825 }
2826
2827 bool
2828 Route::add_fed_by (boost::shared_ptr<Route> other, bool via_sends_only)
2829 {
2830         FeedRecord fr (other, via_sends_only);
2831
2832         pair<FedBy::iterator,bool> result =  _fed_by.insert (fr);
2833
2834         if (!result.second) {
2835
2836                 /* already a record for "other" - make sure sends-only information is correct */
2837                 if (!via_sends_only && result.first->sends_only) {
2838                         FeedRecord* frp = const_cast<FeedRecord*>(&(*result.first));
2839                         frp->sends_only = false;
2840                 }
2841         }
2842
2843         return result.second;
2844 }
2845
2846 void
2847 Route::clear_fed_by ()
2848 {
2849         _fed_by.clear ();
2850 }
2851
2852 bool
2853 Route::feeds (boost::shared_ptr<Route> other, bool* via_sends_only)
2854 {
2855         const FedBy& fed_by (other->fed_by());
2856
2857         for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
2858                 boost::shared_ptr<Route> sr = f->r.lock();
2859
2860                 if (sr && (sr.get() == this)) {
2861
2862                         if (via_sends_only) {
2863                                 *via_sends_only = f->sends_only;
2864                         }
2865
2866                         return true;
2867                 }
2868         }
2869
2870         return false;
2871 }
2872
2873 bool
2874 Route::direct_feeds_according_to_reality (boost::shared_ptr<Route> other, bool* via_send_only)
2875 {
2876         DEBUG_TRACE (DEBUG::Graph, string_compose ("Feeds? %1\n", _name));
2877
2878         if (_output->connected_to (other->input())) {
2879                 DEBUG_TRACE (DEBUG::Graph, string_compose ("\tdirect FEEDS %2\n", other->name()));
2880                 if (via_send_only) {
2881                         *via_send_only = false;
2882                 }
2883
2884                 return true;
2885         }
2886
2887
2888         for (ProcessorList::iterator r = _processors.begin(); r != _processors.end(); ++r) {
2889
2890                 boost::shared_ptr<IOProcessor> iop;
2891
2892                 if ((iop = boost::dynamic_pointer_cast<IOProcessor>(*r)) != 0) {
2893                         if (iop->feeds (other)) {
2894                                 DEBUG_TRACE (DEBUG::Graph,  string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
2895                                 if (via_send_only) {
2896                                         *via_send_only = true;
2897                                 }
2898                                 return true;
2899                         } else {
2900                                 DEBUG_TRACE (DEBUG::Graph,  string_compose ("\tIOP %1 does NOT feed %2\n", iop->name(), other->name()));
2901                         }
2902                 } else {
2903                         DEBUG_TRACE (DEBUG::Graph,  string_compose ("\tPROC %1 is not an IOP\n", (*r)->name()));
2904                 }
2905
2906         }
2907
2908         DEBUG_TRACE (DEBUG::Graph,  string_compose ("\tdoes NOT feed %1\n", other->name()));
2909         return false;
2910 }
2911
2912 bool
2913 Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* via_send_only)
2914 {
2915         return _session._current_route_graph.has (shared_from_this (), other, via_send_only);
2916 }
2917
2918 /** Called from the (non-realtime) butler thread when the transport is stopped */
2919 void
2920 Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
2921 {
2922         framepos_t now = _session.transport_frame();
2923
2924         {
2925                 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
2926
2927                 Automatable::transport_stopped (now);
2928
2929                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
2930
2931                         if (!_have_internal_generator && (Config->get_plugins_stop_with_transport() && can_flush_processors)) {
2932                                 (*i)->flush ();
2933                         }
2934
2935                         (*i)->transport_stopped (now);
2936                 }
2937         }
2938
2939         _roll_delay = _initial_delay;
2940 }
2941
2942 void
2943 Route::input_change_handler (IOChange change, void * /*src*/)
2944 {
2945         bool need_to_queue_solo_change = true;
2946
2947         if ((change.type & IOChange::ConfigurationChanged)) {
2948                 /* This is called with the process lock held if change 
2949                    contains ConfigurationChanged 
2950                 */
2951                 need_to_queue_solo_change = false;
2952                 configure_processors (0);
2953                 _phase_invert.resize (_input->n_ports().n_audio ());
2954                 io_changed (); /* EMIT SIGNAL */
2955         }
2956
2957         if (!_input->connected() && _soloed_by_others_upstream) {
2958                 if (need_to_queue_solo_change) {
2959                         _session.cancel_solo_after_disconnect (shared_from_this(), true);
2960                 } else {
2961                         cancel_solo_after_disconnect (true);
2962                 }
2963         }
2964 }
2965
2966 void
2967 Route::output_change_handler (IOChange change, void * /*src*/)
2968 {
2969         bool need_to_queue_solo_change = true;
2970         if (_initial_io_setup) {
2971                 return;
2972         }
2973
2974         if ((change.type & IOChange::ConfigurationChanged)) {
2975                 /* This is called with the process lock held if change 
2976                    contains ConfigurationChanged 
2977                 */
2978                 need_to_queue_solo_change = false;
2979                 configure_processors (0);
2980                 io_changed (); /* EMIT SIGNAL */
2981         }
2982
2983         if (!_output->connected() && _soloed_by_others_downstream) {
2984                 if (need_to_queue_solo_change) {
2985                         _session.cancel_solo_after_disconnect (shared_from_this(), false);
2986                 } else {
2987                         cancel_solo_after_disconnect (false);
2988                 }
2989         }
2990 }
2991
2992 void
2993 Route::cancel_solo_after_disconnect (bool upstream)
2994 {
2995         if (upstream) {
2996                 _soloed_by_others_upstream = 0;
2997         } else {
2998                 _soloed_by_others_downstream = 0;
2999         }
3000         set_mute_master_solo ();
3001         solo_changed (false, this);
3002 }
3003
3004 uint32_t
3005 Route::pans_required () const
3006 {
3007         if (n_outputs().n_audio() < 2) {
3008                 return 0;
3009         }
3010
3011         return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
3012 }
3013
3014 int
3015 Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
3016 {
3017         Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3018
3019         if (!lm.locked()) {
3020                 return 0;
3021         }
3022
3023         if (n_outputs().n_total() == 0) {
3024                 return 0;
3025         }
3026
3027         if (!_active || n_inputs() == ChanCount::ZERO)  {
3028                 silence_unlocked (nframes);
3029                 return 0;
3030         }
3031
3032         if (session_state_changing) {
3033                 if (_session.transport_speed() != 0.0f) {
3034                         /* we're rolling but some state is changing (e.g. our diskstream contents)
3035                            so we cannot use them. Be silent till this is over.
3036
3037                            XXX note the absurdity of ::no_roll() being called when we ARE rolling!
3038                         */
3039                         silence_unlocked (nframes);
3040                         return 0;
3041                 }
3042                 /* we're really not rolling, so we're either delivery silence or actually
3043                    monitoring, both of which are safe to do while session_state_changing is true.
3044                 */
3045         }
3046
3047         BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3048
3049         fill_buffers_with_input (bufs, _input, nframes);
3050
3051         if (_meter_point == MeterInput) {
3052                 _meter->run (bufs, start_frame, end_frame, nframes, true);
3053         }
3054
3055         _amp->apply_gain_automation (false);
3056         passthru (bufs, start_frame, end_frame, nframes, 0);
3057
3058         return 0;
3059 }
3060
3061 int
3062 Route::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& /* need_butler */)
3063 {
3064         Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3065         if (!lm.locked()) {
3066                 return 0;
3067         }
3068
3069         if (n_outputs().n_total() == 0) {
3070                 return 0;
3071         }
3072
3073         if (!_active || n_inputs().n_total() == 0) {
3074                 silence_unlocked (nframes);
3075                 return 0;
3076         }
3077
3078         framepos_t unused = 0;
3079
3080         if ((nframes = check_initial_delay (nframes, unused)) == 0) {
3081                 return 0;
3082         }
3083
3084         _silent = false;
3085
3086         BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
3087
3088         fill_buffers_with_input (bufs, _input, nframes);
3089
3090         if (_meter_point == MeterInput) {
3091                 _meter->run (bufs, start_frame, end_frame, nframes, true);
3092         }
3093
3094         passthru (bufs, start_frame, end_frame, nframes, declick);
3095
3096         return 0;
3097 }
3098
3099 int
3100 Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
3101 {
3102         silence (nframes);
3103         return 0;
3104 }
3105
3106 void
3107 Route::flush_processors ()
3108 {
3109         /* XXX shouldn't really try to take this lock, since
3110            this is called from the RT audio thread.
3111         */
3112
3113         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3114
3115         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3116                 (*i)->flush ();
3117         }
3118 }
3119
3120 void
3121 Route::set_meter_point (MeterPoint p, bool force)
3122 {
3123         if (_meter_point == p && !force) {
3124                 return;
3125         }
3126
3127         bool meter_was_visible_to_user = _meter->display_to_user ();
3128
3129         {
3130                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3131
3132                 maybe_note_meter_position ();
3133
3134                 _meter_point = p;
3135
3136                 if (_meter_point != MeterCustom) {
3137
3138                         _meter->set_display_to_user (false);
3139
3140                         setup_invisible_processors ();
3141
3142                 } else {
3143
3144                         _meter->set_display_to_user (true);
3145
3146                         /* If we have a previous position for the custom meter, try to put it there */
3147                         if (_custom_meter_position_noted) {
3148                                 boost::shared_ptr<Processor> after = _processor_after_last_custom_meter.lock ();
3149                                 
3150                                 if (after) {
3151                                         ProcessorList::iterator i = find (_processors.begin(), _processors.end(), after);
3152                                         if (i != _processors.end ()) {
3153                                                 _processors.remove (_meter);
3154                                                 _processors.insert (i, _meter);
3155                                         }
3156                                 } else if (_last_custom_meter_was_at_end) {
3157                                         _processors.remove (_meter);
3158                                         _processors.push_back (_meter);
3159                                 }
3160                         }
3161                 }
3162
3163                 /* Set up the meter for its new position */
3164
3165                 ProcessorList::iterator loc = find (_processors.begin(), _processors.end(), _meter);
3166                 
3167                 ChanCount m_in;
3168                 
3169                 if (loc == _processors.begin()) {
3170                         m_in = _input->n_ports();
3171                 } else {
3172                         ProcessorList::iterator before = loc;
3173                         --before;
3174                         m_in = (*before)->output_streams ();
3175                 }
3176                 
3177                 _meter->reflect_inputs (m_in);
3178                 
3179                 /* we do not need to reconfigure the processors, because the meter
3180                    (a) is always ready to handle processor_max_streams
3181                    (b) is always an N-in/N-out processor, and thus moving
3182                    it doesn't require any changes to the other processors.
3183                 */
3184         }
3185
3186         meter_change (); /* EMIT SIGNAL */
3187
3188         bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user);
3189
3190         processors_changed (RouteProcessorChange (RouteProcessorChange::MeterPointChange, meter_visibly_changed)); /* EMIT SIGNAL */
3191 }
3192
3193 void
3194 Route::listen_position_changed ()
3195 {
3196         {
3197                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
3198                 ProcessorState pstate (this);
3199
3200                 {
3201                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3202
3203                         if (configure_processors_unlocked (0)) {
3204                                 pstate.restore ();
3205                                 configure_processors_unlocked (0); // it worked before we tried to add it ...
3206                                 return;
3207                         }
3208                 }
3209         }
3210
3211         processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
3212         _session.set_dirty ();
3213 }
3214
3215 boost::shared_ptr<CapturingProcessor>
3216 Route::add_export_point()
3217 {
3218         if (!_capturing_processor) {
3219
3220                 _capturing_processor.reset (new CapturingProcessor (_session));
3221                 _capturing_processor->activate ();
3222
3223                 {
3224                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3225                         configure_processors (0);
3226                 }
3227
3228         }
3229
3230         return _capturing_processor;
3231 }
3232
3233 framecnt_t
3234 Route::update_signal_latency ()
3235 {
3236         framecnt_t l = _output->user_latency();
3237
3238         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3239                 if ((*i)->active ()) {
3240                         l += (*i)->signal_latency ();
3241                 }
3242         }
3243
3244         DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l));
3245
3246         if (_signal_latency != l) {
3247                 _signal_latency = l;
3248                 signal_latency_changed (); /* EMIT SIGNAL */
3249         }
3250
3251         return _signal_latency;
3252 }
3253
3254 void
3255 Route::set_user_latency (framecnt_t nframes)
3256 {
3257         _output->set_user_latency (nframes);
3258         _session.update_latency_compensation ();
3259 }
3260
3261 void
3262 Route::set_latency_compensation (framecnt_t longest_session_latency)
3263 {
3264         framecnt_t old = _initial_delay;
3265
3266         if (_signal_latency < longest_session_latency) {
3267                 _initial_delay = longest_session_latency - _signal_latency;
3268         } else {
3269                 _initial_delay = 0;
3270         }
3271
3272         DEBUG_TRACE (DEBUG::Latency, string_compose (
3273                              "%1: compensate for maximum latency of %2,"
3274                              "given own latency of %3, using initial delay of %4\n",
3275                              name(), longest_session_latency, _signal_latency, _initial_delay));
3276
3277         if (_initial_delay != old) {
3278                 initial_delay_changed (); /* EMIT SIGNAL */
3279         }
3280
3281         if (_session.transport_stopped()) {
3282                 _roll_delay = _initial_delay;
3283         }
3284 }
3285
3286 Route::SoloControllable::SoloControllable (std::string name, boost::shared_ptr<Route> r)
3287         : AutomationControl (r->session(), Evoral::Parameter (SoloAutomation),
3288                              boost::shared_ptr<AutomationList>(), name)
3289         , _route (r)
3290 {
3291         boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(SoloAutomation)));
3292         set_list (gl);
3293 }
3294
3295 void
3296 Route::SoloControllable::set_value (double val)
3297 {
3298         bool bval = ((val >= 0.5f) ? true: false);
3299
3300         boost::shared_ptr<RouteList> rl (new RouteList);
3301
3302         boost::shared_ptr<Route> r = _route.lock ();
3303         if (!r) {
3304                 return;
3305         }
3306
3307         rl->push_back (r);
3308
3309         if (Config->get_solo_control_is_listen_control()) {
3310                 _session.set_listen (rl, bval);
3311         } else {
3312                 _session.set_solo (rl, bval);
3313         }
3314 }
3315
3316 double
3317 Route::SoloControllable::get_value () const
3318 {
3319         boost::shared_ptr<Route> r = _route.lock ();
3320         if (!r) {
3321                 return 0;
3322         }
3323
3324         if (Config->get_solo_control_is_listen_control()) {
3325                 return r->listening_via_monitor() ? 1.0f : 0.0f;
3326         } else {
3327                 return r->self_soloed() ? 1.0f : 0.0f;
3328         }
3329 }
3330
3331 Route::MuteControllable::MuteControllable (std::string name, boost::shared_ptr<Route> r)
3332         : AutomationControl (r->session(), Evoral::Parameter (MuteAutomation),
3333                              boost::shared_ptr<AutomationList>(), name)
3334         , _route (r)
3335 {
3336         boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(MuteAutomation)));
3337         set_list (gl);
3338 }
3339
3340 void
3341 Route::MuteControllable::set_value (double val)
3342 {
3343         bool bval = ((val >= 0.5f) ? true: false);
3344
3345         boost::shared_ptr<RouteList> rl (new RouteList);
3346
3347         boost::shared_ptr<Route> r = _route.lock ();
3348         if (!r) {
3349                 return;
3350         }
3351
3352         rl->push_back (r);
3353         _session.set_mute (rl, bval);
3354 }
3355
3356 double
3357 Route::MuteControllable::get_value () const
3358 {
3359         boost::shared_ptr<Route> r = _route.lock ();
3360         if (!r) {
3361                 return 0;
3362         }
3363
3364         return r->muted() ? 1.0f : 0.0f;
3365 }
3366
3367 void
3368 Route::set_block_size (pframes_t nframes)
3369 {
3370         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3371                 (*i)->set_block_size (nframes);
3372         }
3373
3374         _session.ensure_buffers (n_process_buffers ());
3375 }
3376
3377 void
3378 Route::protect_automation ()
3379 {
3380         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i)
3381                 (*i)->protect_automation();
3382 }
3383
3384 /** @param declick 1 to set a pending declick fade-in,
3385  *                -1 to set a pending declick fade-out
3386  */
3387 void
3388 Route::set_pending_declick (int declick)
3389 {
3390         if (_declickable) {
3391                 /* this call is not allowed to turn off a pending declick */
3392                 if (declick) {
3393                         _pending_declick = declick;
3394                 }
3395         } else {
3396                 _pending_declick = 0;
3397         }
3398 }
3399
3400 /** Shift automation forwards from a particular place, thereby inserting time.
3401  *  Adds undo commands for any shifts that are performed.
3402  *
3403  * @param pos Position to start shifting from.
3404  * @param frames Amount to shift forwards by.
3405  */
3406
3407 void
3408 Route::shift (framepos_t pos, framecnt_t frames)
3409 {
3410         /* gain automation */
3411         {
3412                 boost::shared_ptr<AutomationControl> gc = _amp->gain_control();
3413
3414                 XMLNode &before = gc->alist()->get_state ();
3415                 gc->alist()->shift (pos, frames);
3416                 XMLNode &after = gc->alist()->get_state ();
3417                 _session.add_command (new MementoCommand<AutomationList> (*gc->alist().get(), &before, &after));
3418         }
3419
3420         /* pan automation */
3421         if (_pannable) {
3422                 ControlSet::Controls& c (_pannable->controls());
3423
3424                 for (ControlSet::Controls::const_iterator ci = c.begin(); ci != c.end(); ++ci) {
3425                         boost::shared_ptr<AutomationControl> pc = boost::dynamic_pointer_cast<AutomationControl> (ci->second);
3426                         if (pc) {
3427                                 boost::shared_ptr<AutomationList> al = pc->alist();
3428                                 XMLNode& before = al->get_state ();
3429                                 al->shift (pos, frames);
3430                                 XMLNode& after = al->get_state ();
3431                                 _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3432                         }
3433                 }
3434         }
3435
3436         /* redirect automation */
3437         {
3438                 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3439                 for (ProcessorList::iterator i = _processors.begin (); i != _processors.end (); ++i) {
3440
3441                         set<Evoral::Parameter> parameters = (*i)->what_can_be_automated();
3442
3443                         for (set<Evoral::Parameter>::const_iterator p = parameters.begin (); p != parameters.end (); ++p) {
3444                                 boost::shared_ptr<AutomationControl> ac = (*i)->automation_control (*p);
3445                                 if (ac) {
3446                                         boost::shared_ptr<AutomationList> al = ac->alist();
3447                                         XMLNode &before = al->get_state ();
3448                                         al->shift (pos, frames);
3449                                         XMLNode &after = al->get_state ();
3450                                         _session.add_command (new MementoCommand<AutomationList> (*al.get(), &before, &after));
3451                                 }
3452                         }
3453                 }
3454         }
3455 }
3456
3457
3458 int
3459 Route::save_as_template (const string& path, const string& name)
3460 {
3461         XMLNode& node (state (false));
3462         XMLTree tree;
3463
3464         IO::set_name_in_state (*node.children().front(), name);
3465
3466         tree.set_root (&node);
3467         return tree.write (path.c_str());
3468 }
3469
3470
3471 bool
3472 Route::set_name (const string& str)
3473 {
3474         bool ret;
3475         string ioproc_name;
3476         string name;
3477
3478         name = Route::ensure_track_or_route_name (str, _session);
3479         SessionObject::set_name (name);
3480
3481         ret = (_input->set_name(name) && _output->set_name(name));
3482
3483         if (ret) {
3484                 /* rename the main outs. Leave other IO processors
3485                  * with whatever name they already have, because its
3486                  * just fine as it is (it will not contain the route
3487                  * name if its a port insert, port send or port return).
3488                  */
3489
3490                 if (_main_outs) {
3491                         if (_main_outs->set_name (name)) {
3492                                 /* XXX returning false here is stupid because
3493                                    we already changed the route name.
3494                                 */
3495                                 return false;
3496                         }
3497                 }
3498         }
3499
3500         return ret;
3501 }
3502
3503 /** Set the name of a route in an XML description.
3504  *  @param node XML <Route> node to set the name in.
3505  *  @param name New name.
3506  */
3507 void
3508 Route::set_name_in_state (XMLNode& node, string const & name)
3509 {
3510         node.add_property (X_("name"), name);
3511
3512         XMLNodeList children = node.children();
3513         for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
3514                 
3515                 if ((*i)->name() == X_("IO")) {
3516
3517                         IO::set_name_in_state (**i, name);
3518
3519                 } else if ((*i)->name() == X_("Processor")) {
3520
3521                         XMLProperty* role = (*i)->property (X_("role"));
3522                         if (role && role->value() == X_("Main")) {
3523                                 (*i)->add_property (X_("name"), name);
3524                         }
3525                         
3526                 } else if ((*i)->name() == X_("Diskstream")) {
3527
3528                         (*i)->add_property (X_("playlist"), string_compose ("%1.1", name).c_str());
3529                         (*i)->add_property (X_("name"), name);
3530                         
3531                 }
3532         }
3533 }
3534
3535 boost::shared_ptr<Send>
3536 Route::internal_send_for (boost::shared_ptr<const Route> target) const
3537 {
3538         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3539
3540         for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3541                 boost::shared_ptr<InternalSend> send;
3542
3543                 if ((send = boost::dynamic_pointer_cast<InternalSend>(*i)) != 0) {
3544                         if (send->target_route() == target) {
3545                                 return send;
3546                         }
3547                 }
3548         }
3549
3550         return boost::shared_ptr<Send>();
3551 }
3552
3553 /** @param c Audio channel index.
3554  *  @param yn true to invert phase, otherwise false.
3555  */
3556 void
3557 Route::set_phase_invert (uint32_t c, bool yn)
3558 {
3559         if (_phase_invert[c] != yn) {
3560                 _phase_invert[c] = yn;
3561                 phase_invert_changed (); /* EMIT SIGNAL */
3562                 _session.set_dirty ();
3563         }
3564 }
3565
3566 void
3567 Route::set_phase_invert (boost::dynamic_bitset<> p)
3568 {
3569         if (_phase_invert != p) {
3570                 _phase_invert = p;
3571                 phase_invert_changed (); /* EMIT SIGNAL */
3572                 _session.set_dirty ();
3573         }
3574 }
3575
3576 bool
3577 Route::phase_invert (uint32_t c) const
3578 {
3579         return _phase_invert[c];
3580 }
3581
3582 boost::dynamic_bitset<>
3583 Route::phase_invert () const
3584 {
3585         return _phase_invert;
3586 }
3587
3588 void
3589 Route::set_denormal_protection (bool yn)
3590 {
3591         if (_denormal_protection != yn) {
3592                 _denormal_protection = yn;
3593                 denormal_protection_changed (); /* EMIT SIGNAL */
3594         }
3595 }
3596
3597 bool
3598 Route::denormal_protection () const
3599 {
3600         return _denormal_protection;
3601 }
3602
3603 void
3604 Route::set_active (bool yn, void* src)
3605 {
3606         if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_route_active()) {
3607                 _route_group->foreach_route (boost::bind (&Route::set_active, _1, yn, _route_group));
3608                 return;
3609         }
3610
3611         if (_active != yn) {
3612                 _active = yn;
3613                 _input->set_active (yn);
3614                 _output->set_active (yn);
3615                 active_changed (); // EMIT SIGNAL
3616                 _session.set_dirty ();
3617         }
3618 }
3619
3620 void
3621 Route::meter ()
3622 {
3623         Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3624
3625         assert (_meter);
3626
3627         _meter->meter ();
3628
3629         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3630
3631                 boost::shared_ptr<Send> s;
3632                 boost::shared_ptr<Return> r;
3633
3634                 if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
3635                         s->meter()->meter();
3636                 } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
3637                         r->meter()->meter ();
3638                 }
3639         }
3640 }
3641
3642 boost::shared_ptr<Pannable>
3643 Route::pannable() const
3644 {
3645         return _pannable;
3646 }
3647
3648 boost::shared_ptr<Panner>
3649 Route::panner() const
3650 {
3651         /* may be null ! */
3652         return _main_outs->panner_shell()->panner();
3653 }
3654
3655 boost::shared_ptr<PannerShell>
3656 Route::panner_shell() const
3657 {
3658         return _main_outs->panner_shell();
3659 }
3660
3661 boost::shared_ptr<AutomationControl>
3662 Route::gain_control() const
3663 {
3664         return _amp->gain_control();
3665 }
3666
3667 boost::shared_ptr<AutomationControl>
3668 Route::get_control (const Evoral::Parameter& param)
3669 {
3670         /* either we own the control or .... */
3671
3672         boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(control (param));
3673
3674         if (!c) {
3675
3676                 /* maybe one of our processors does or ... */
3677
3678                 Glib::Threads::RWLock::ReaderLock rm (_processor_lock, Glib::Threads::TRY_LOCK);
3679                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3680                         if ((c = boost::dynamic_pointer_cast<AutomationControl>((*i)->control (param))) != 0) {
3681                                 break;
3682                         }
3683                 }
3684         }
3685
3686         if (!c) {
3687
3688                 /* nobody does so we'll make a new one */
3689
3690                 c = boost::dynamic_pointer_cast<AutomationControl>(control_factory(param));
3691                 add_control(c);
3692         }
3693
3694         return c;
3695 }
3696
3697 boost::shared_ptr<Processor>
3698 Route::nth_plugin (uint32_t n)
3699 {
3700         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3701         ProcessorList::iterator i;
3702
3703         for (i = _processors.begin(); i != _processors.end(); ++i) {
3704                 if (boost::dynamic_pointer_cast<PluginInsert> (*i)) {
3705                         if (n-- == 0) {
3706                                 return *i;
3707                         }
3708                 }
3709         }
3710
3711         return boost::shared_ptr<Processor> ();
3712 }
3713
3714 boost::shared_ptr<Processor>
3715 Route::nth_send (uint32_t n)
3716 {
3717         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3718         ProcessorList::iterator i;
3719
3720         for (i = _processors.begin(); i != _processors.end(); ++i) {
3721                 if (boost::dynamic_pointer_cast<Send> (*i)) {
3722                         if (n-- == 0) {
3723                                 return *i;
3724                         }
3725                 }
3726         }
3727
3728         return boost::shared_ptr<Processor> ();
3729 }
3730
3731 bool
3732 Route::has_io_processor_named (const string& name)
3733 {
3734         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3735         ProcessorList::iterator i;
3736
3737         for (i = _processors.begin(); i != _processors.end(); ++i) {
3738                 if (boost::dynamic_pointer_cast<Send> (*i) ||
3739                     boost::dynamic_pointer_cast<PortInsert> (*i)) {
3740                         if ((*i)->name() == name) {
3741                                 return true;
3742                         }
3743                 }
3744         }
3745
3746         return false;
3747 }
3748
3749 MuteMaster::MutePoint
3750 Route::mute_points () const
3751 {
3752         return _mute_master->mute_points ();
3753 }
3754
3755 void
3756 Route::set_processor_positions ()
3757 {
3758         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3759
3760         bool had_amp = false;
3761         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3762                 (*i)->set_pre_fader (!had_amp);
3763                 if (boost::dynamic_pointer_cast<Amp> (*i)) {
3764                         had_amp = true;
3765                 }
3766         }
3767 }
3768
3769 /** Called when there is a proposed change to the input port count */
3770 bool
3771 Route::input_port_count_changing (ChanCount to)
3772 {
3773         list<pair<ChanCount, ChanCount> > c = try_configure_processors (to, 0);
3774         if (c.empty()) {
3775                 /* The processors cannot be configured with the new input arrangement, so
3776                    block the change.
3777                 */
3778                 return true;
3779         }
3780
3781         /* The change is ok */
3782         return false;
3783 }
3784
3785 /** Called when there is a proposed change to the output port count */
3786 bool
3787 Route::output_port_count_changing (ChanCount to)
3788 {
3789         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3790                 if (processor_out_streams.get(*t) > to.get(*t)) {
3791                         return true;
3792                 }
3793         }
3794         /* The change is ok */
3795         return false;
3796 }
3797
3798 list<string>
3799 Route::unknown_processors () const
3800 {
3801         list<string> p;
3802
3803         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
3804         for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3805                 if (boost::dynamic_pointer_cast<UnknownProcessor const> (*i)) {
3806                         p.push_back ((*i)->name ());
3807                 }
3808         }
3809
3810         return p;
3811 }
3812
3813
3814 framecnt_t
3815 Route::update_port_latencies (PortSet& from, PortSet& to, bool playback, framecnt_t our_latency) const
3816 {
3817         /* we assume that all our input ports feed all our output ports. its not
3818            universally true, but the alternative is way too corner-case to worry about.
3819         */
3820
3821         LatencyRange all_connections;
3822
3823         if (from.empty()) {
3824                 all_connections.min = 0;
3825                 all_connections.max = 0;
3826         } else {
3827                 all_connections.min = ~((pframes_t) 0);
3828                 all_connections.max = 0;
3829                 
3830                 /* iterate over all "from" ports and determine the latency range for all of their
3831                    connections to the "outside" (outside of this Route).
3832                 */
3833                 
3834                 for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3835                         
3836                         LatencyRange range;
3837                         
3838                         p->get_connected_latency_range (range, playback);
3839                         
3840                         all_connections.min = min (all_connections.min, range.min);
3841                         all_connections.max = max (all_connections.max, range.max);
3842                 }
3843         }
3844
3845         /* set the "from" port latencies to the max/min range of all their connections */
3846
3847         for (PortSet::iterator p = from.begin(); p != from.end(); ++p) {
3848                 p->set_private_latency_range (all_connections, playback);
3849         }
3850
3851         /* set the ports "in the direction of the flow" to the same value as above plus our own signal latency */
3852
3853         all_connections.min += our_latency;
3854         all_connections.max += our_latency;
3855
3856         for (PortSet::iterator p = to.begin(); p != to.end(); ++p) {
3857                 p->set_private_latency_range (all_connections, playback);
3858         }
3859
3860         return all_connections.max;
3861 }
3862
3863 framecnt_t
3864 Route::set_private_port_latencies (bool playback) const
3865 {
3866         framecnt_t own_latency = 0;
3867
3868         /* Processor list not protected by lock: MUST BE CALLED FROM PROCESS THREAD
3869            OR LATENCY CALLBACK.
3870
3871            This is called (early) from the latency callback. It computes the REAL
3872            latency associated with each port and stores the result as the "private"
3873            latency of the port. A later call to Route::set_public_port_latencies()
3874            sets all ports to the same value to reflect the fact that we do latency
3875            compensation and so all signals are delayed by the same amount as they
3876            flow through ardour.
3877         */
3878
3879         for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
3880                 if ((*i)->active ()) {
3881                         own_latency += (*i)->signal_latency ();
3882                 }
3883         }
3884
3885         if (playback) {
3886                 /* playback: propagate latency from "outside the route" to outputs to inputs */
3887                 return update_port_latencies (_output->ports (), _input->ports (), true, own_latency);
3888         } else {
3889                 /* capture: propagate latency from "outside the route" to inputs to outputs */
3890                 return update_port_latencies (_input->ports (), _output->ports (), false, own_latency);
3891         }
3892 }
3893
3894 void
3895 Route::set_public_port_latencies (framecnt_t value, bool playback) const
3896 {
3897         /* this is called to set the JACK-visible port latencies, which take
3898            latency compensation into account.
3899         */
3900
3901         LatencyRange range;
3902
3903         range.min = value;
3904         range.max = value;
3905
3906         {
3907                 const PortSet& ports (_input->ports());
3908                 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3909                         p->set_public_latency_range (range, playback);
3910                 }
3911         }
3912
3913         {
3914                 const PortSet& ports (_output->ports());
3915                 for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
3916                         p->set_public_latency_range (range, playback);
3917                 }
3918         }
3919 }
3920
3921 /** Put the invisible processors in the right place in _processors.
3922  *  Must be called with a writer lock on _processor_lock held.
3923  */
3924 void
3925 Route::setup_invisible_processors ()
3926 {
3927 #ifndef NDEBUG
3928         Glib::Threads::RWLock::WriterLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
3929         assert (!lm.locked ());
3930 #endif
3931
3932         if (!_main_outs) {
3933                 /* too early to be doing this stuff */
3934                 return;
3935         }
3936
3937         /* we'll build this new list here and then use it */
3938
3939         ProcessorList new_processors;
3940
3941         /* find visible processors */
3942
3943         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
3944                 if ((*i)->display_to_user ()) {
3945                         new_processors.push_back (*i);
3946                 }
3947         }
3948
3949         /* find the amp */
3950
3951         ProcessorList::iterator amp = new_processors.begin ();
3952         while (amp != new_processors.end() && boost::dynamic_pointer_cast<Amp> (*amp) == 0) {
3953                 ++amp;
3954         }
3955
3956         assert (amp != _processors.end ());
3957
3958         /* and the processor after the amp */
3959
3960         ProcessorList::iterator after_amp = amp;
3961         ++after_amp;
3962
3963         /* METER */
3964
3965         if (_meter) {
3966                 switch (_meter_point) {
3967                 case MeterInput:
3968                         assert (!_meter->display_to_user ());
3969                         new_processors.push_front (_meter);
3970                         break;
3971                 case MeterPreFader:
3972                         assert (!_meter->display_to_user ());
3973                         new_processors.insert (amp, _meter);
3974                         break;
3975                 case MeterPostFader:
3976                         /* do nothing here */
3977                         break;
3978                 case MeterOutput:
3979                         /* do nothing here */
3980                         break;
3981                 case MeterCustom:
3982                         /* the meter is visible, so we don't touch it here */
3983                         break;
3984                 }
3985         }
3986
3987         /* MAIN OUTS */
3988
3989         assert (_main_outs);
3990         assert (!_main_outs->display_to_user ());
3991         new_processors.push_back (_main_outs);
3992
3993         /* iterator for the main outs */
3994
3995         ProcessorList::iterator main = new_processors.end();
3996         --main;
3997
3998         /* OUTPUT METERING */
3999
4000         if (_meter && (_meter_point == MeterOutput || _meter_point == MeterPostFader)) {
4001                 assert (!_meter->display_to_user ());
4002
4003                 /* add the processor just before or just after the main outs */
4004
4005                 ProcessorList::iterator meter_point = main;
4006
4007                 if (_meter_point == MeterOutput) {
4008                         ++meter_point;
4009                 }
4010                 new_processors.insert (meter_point, _meter);
4011         }
4012
4013         /* MONITOR SEND */
4014
4015         if (_monitor_send && !is_monitor ()) {
4016                 assert (!_monitor_send->display_to_user ());
4017                 if (Config->get_solo_control_is_listen_control()) {
4018                         switch (Config->get_listen_position ()) {
4019                         case PreFaderListen:
4020                                 switch (Config->get_pfl_position ()) {
4021                                 case PFLFromBeforeProcessors:
4022                                         new_processors.push_front (_monitor_send);
4023                                         break;
4024                                 case PFLFromAfterProcessors:
4025                                         new_processors.insert (amp, _monitor_send);
4026                                         break;
4027                                 }
4028                                 _monitor_send->set_can_pan (false);
4029                                 break;
4030                         case AfterFaderListen:
4031                                 switch (Config->get_afl_position ()) {
4032                                 case AFLFromBeforeProcessors:
4033                                         new_processors.insert (after_amp, _monitor_send);
4034                                         break;
4035                                 case AFLFromAfterProcessors:
4036                                         new_processors.insert (new_processors.end(), _monitor_send);
4037                                         break;
4038                                 }
4039                                 _monitor_send->set_can_pan (true);
4040                                 break;
4041                         }
4042                 }  else {
4043                         new_processors.insert (new_processors.end(), _monitor_send);
4044                         _monitor_send->set_can_pan (false);
4045                 }
4046         }
4047
4048         /* MONITOR CONTROL */
4049
4050         if (_monitor_control && is_monitor ()) {
4051                 assert (!_monitor_control->display_to_user ());
4052                 new_processors.push_front (_monitor_control);
4053         }
4054
4055         /* INTERNAL RETURN */
4056
4057         /* doing this here means that any monitor control will come just after
4058            the return.
4059         */
4060
4061         if (_intreturn) {
4062                 assert (!_intreturn->display_to_user ());
4063                 new_processors.push_front (_intreturn);
4064         }
4065
4066         /* EXPORT PROCESSOR */
4067
4068         if (_capturing_processor) {
4069                 assert (!_capturing_processor->display_to_user ());
4070                 new_processors.push_front (_capturing_processor);
4071         }
4072
4073         _processors = new_processors;
4074
4075         DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: setup_invisible_processors\n", _name));
4076         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4077                 DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1\n", (*i)->name ()));
4078         }
4079 }
4080
4081 void
4082 Route::unpan ()
4083 {
4084         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
4085         Glib::Threads::RWLock::ReaderLock lp (_processor_lock);
4086
4087         _pannable.reset ();
4088
4089         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4090                 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
4091                 if (d) {
4092                         d->unpan ();
4093                 }
4094         }
4095 }
4096
4097 /** If the meter point is `Custom', make a note of where the meter is.
4098  *  This is so that if the meter point is subsequently set to something else,
4099  *  and then back to custom, we can put the meter back where it was last time
4100  *  custom was enabled.
4101  *
4102  *  Must be called with the _processor_lock held.
4103  */
4104 void
4105 Route::maybe_note_meter_position ()
4106 {
4107         if (_meter_point != MeterCustom) {
4108                 return;
4109         }
4110         
4111         _custom_meter_position_noted = true;
4112         for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4113                 if (boost::dynamic_pointer_cast<PeakMeter> (*i)) {
4114                         ProcessorList::iterator j = i;
4115                         ++j;
4116                         if (j != _processors.end ()) {
4117                                 _processor_after_last_custom_meter = *j;
4118                                 _last_custom_meter_was_at_end = false;
4119                         } else {
4120                                 _last_custom_meter_was_at_end = true;
4121                         }
4122                 }
4123         }
4124 }
4125
4126 boost::shared_ptr<Processor>
4127 Route::processor_by_id (PBD::ID id) const
4128 {
4129         Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
4130         for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4131                 if ((*i)->id() == id) {
4132                         return *i;
4133                 }
4134         }
4135
4136         return boost::shared_ptr<Processor> ();
4137 }
4138
4139 /** @return the monitoring state, or in other words what data we are pushing
4140  *  into the route (data from the inputs, data from disk or silence)
4141  */
4142 MonitorState
4143 Route::monitoring_state () const
4144 {
4145         return MonitoringInput;
4146 }
4147
4148 /** @return what we should be metering; either the data coming from the input
4149  *  IO or the data that is flowing through the route.
4150  */
4151 MeterState
4152 Route::metering_state () const
4153 {
4154         return MeteringRoute;
4155 }
4156
4157 bool
4158 Route::has_external_redirects () const
4159 {
4160         for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4161
4162                 /* ignore inactive processors and obviously ignore the main
4163                  * outs since everything has them and we don't care.
4164                  */
4165                  
4166                 if ((*i)->active() && (*i) != _main_outs && (*i)->does_routing()) {
4167                         return true;;
4168                 }
4169         }
4170
4171         return false;
4172 }
4173
4174 boost::shared_ptr<Processor>
4175 Route::the_instrument () const
4176 {
4177         Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4178         return the_instrument_unlocked ();
4179 }
4180
4181 boost::shared_ptr<Processor>
4182 Route::the_instrument_unlocked () const
4183 {
4184         for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
4185                 if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
4186                         if ((*i)->input_streams().n_midi() > 0 &&
4187                             (*i)->output_streams().n_audio() > 0) {
4188                                 return (*i);
4189                         }
4190                 }
4191         }
4192         return boost::shared_ptr<Processor>();
4193 }
4194
4195
4196
4197 void
4198 Route::non_realtime_locate (framepos_t pos)
4199 {
4200         if (_pannable) {
4201                 _pannable->transport_located (pos);
4202         }
4203
4204         {
4205                 Glib::Threads::RWLock::WriterLock lm (_processor_lock);
4206                 
4207                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
4208                         (*i)->transport_located (pos);
4209                 }
4210         }
4211 }
4212
4213 void
4214 Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes)
4215 {
4216         size_t n_buffers;
4217         size_t i;
4218         
4219         /* MIDI 
4220          *  
4221          * We don't currently mix MIDI input together, so we don't need the
4222          * complex logic of the audio case.
4223          */
4224
4225         n_buffers = bufs.count().n_midi ();
4226
4227         for (i = 0; i < n_buffers; ++i) {
4228
4229                 boost::shared_ptr<MidiPort> source_port = io->midi (i);
4230                 MidiBuffer& buf (bufs.get_midi (i));
4231                 
4232                 if (source_port) {
4233                         buf.copy (source_port->get_midi_buffer(nframes));
4234                 } else {
4235                         buf.silence (nframes);
4236                 }
4237         }
4238
4239         /* AUDIO */
4240
4241         n_buffers = bufs.count().n_audio();
4242
4243         size_t n_ports = io->n_ports().n_audio();
4244         float scaling = 1.0f;
4245
4246         if (n_ports > n_buffers) {
4247                 scaling = ((float) n_buffers) / n_ports;
4248         }
4249         
4250         for (i = 0; i < n_ports; ++i) {
4251                 
4252                 /* if there are more ports than buffers, map them onto buffers
4253                  * in a round-robin fashion
4254                  */
4255
4256                 boost::shared_ptr<AudioPort> source_port = io->audio (i);
4257                 AudioBuffer& buf (bufs.get_audio (i%n_buffers));
4258                         
4259
4260                 if (i < n_buffers) {
4261                         
4262                         /* first time through just copy a channel into
4263                            the output buffer.
4264                         */
4265
4266                         buf.read_from (source_port->get_audio_buffer (nframes), nframes);
4267
4268                         if (scaling != 1.0f) {
4269                                 buf.apply_gain (scaling, nframes);
4270                         }
4271                         
4272                 } else {
4273                         
4274                         /* on subsequent times around, merge data from
4275                          * the port with what is already there 
4276                          */
4277
4278                         if (scaling != 1.0f) {
4279                                 buf.accumulate_with_gain_from (source_port->get_audio_buffer (nframes), nframes, 0, scaling);
4280                         } else {
4281                                 buf.accumulate_from (source_port->get_audio_buffer (nframes), nframes);
4282                         }
4283                 }
4284         }
4285
4286         /* silence any remaining buffers */
4287
4288         for (; i < n_buffers; ++i) {
4289                 AudioBuffer& buf (bufs.get_audio (i));
4290                 buf.silence (nframes);
4291         }
4292
4293         /* establish the initial setup of the buffer set, reflecting what was
4294            copied into it. unless, of course, we are the auditioner, in which
4295            case nothing was fed into it from the inputs at all.
4296         */
4297
4298         if (!is_auditioner()) {
4299                 bufs.set_count (io->n_ports());
4300         }
4301 }