remove newly unused code
[ardour.git] / libs / ardour / ardour / route.h
1 /*
2     Copyright (C) 2000-2002 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 #ifndef __ardour_route_h__
21 #define __ardour_route_h__
22
23 #include <cmath>
24 #include <cstring>
25 #include <list>
26 #include <map>
27 #include <set>
28 #include <string>
29
30 #include <boost/shared_ptr.hpp>
31 #include <boost/weak_ptr.hpp>
32 #include <boost/dynamic_bitset.hpp>
33 #include <boost/enable_shared_from_this.hpp>
34
35 #include <glibmm/threads.h>
36 #include "pbd/fastlog.h"
37 #include "pbd/xml++.h"
38 #include "pbd/undo.h"
39 #include "pbd/stateful.h"
40 #include "pbd/controllable.h"
41 #include "pbd/destructible.h"
42
43 #include "ardour/ardour.h"
44 #include "ardour/instrument_info.h"
45 #include "ardour/io.h"
46 #include "ardour/libardour_visibility.h"
47 #include "ardour/types.h"
48 #include "ardour/mute_master.h"
49 #include "ardour/route_group_member.h"
50 #include "ardour/graphnode.h"
51 #include "ardour/automatable.h"
52 #include "ardour/unknown_processor.h"
53
54 namespace ARDOUR {
55
56 class Amp;
57 class DelayLine;
58 class Delivery;
59 class IOProcessor;
60 class Panner;
61 class PannerShell;
62 class PortSet;
63 class Processor;
64 class RouteGroup;
65 class Send;
66 class InternalReturn;
67 class MonitorProcessor;
68 class Pannable;
69 class CapturingProcessor;
70 class InternalSend;
71
72 class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
73 {
74   public:
75
76         typedef std::list<boost::shared_ptr<Processor> > ProcessorList;
77
78         enum Flag {
79                 Auditioner = 0x1,
80                 MasterOut = 0x2,
81                 MonitorOut = 0x4
82         };
83
84         Route (Session&, std::string name, Flag flags = Flag(0), DataType default_type = DataType::AUDIO);
85         virtual ~Route();
86
87         virtual int init ();
88
89         boost::shared_ptr<IO> input() const { return _input; }
90         boost::shared_ptr<IO> output() const { return _output; }
91
92         ChanCount n_inputs() const { return _input->n_ports(); }
93         ChanCount n_outputs() const { return _output->n_ports(); }
94
95         bool active() const { return _active; }
96         void set_active (bool yn, void *);
97
98         static std::string ensure_track_or_route_name(std::string, Session &);
99
100         std::string comment() { return _comment; }
101         void set_comment (std::string str, void *src);
102
103         bool set_name (const std::string& str);
104         static void set_name_in_state (XMLNode &, const std::string &);
105
106         uint32_t order_key () const;
107         bool has_order_key () const;
108         void set_order_key (uint32_t);
109
110         bool is_auditioner() const { return _flags & Auditioner; }
111         bool is_master() const { return _flags & MasterOut; }
112         bool is_monitor() const { return _flags & MonitorOut; }
113
114         virtual MonitorState monitoring_state () const;
115         virtual MeterState metering_state () const;
116
117         /* these are the core of the API of a Route. see the protected sections as well */
118
119         virtual int roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
120                           int declick, bool& need_butler);
121
122         virtual int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
123                              bool state_changing);
124
125         virtual int silent_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
126                                  bool& need_butler);
127
128         virtual bool can_record() { return false; }
129
130         virtual void set_record_enabled (bool /*yn*/, void * /*src*/) {}
131         virtual bool record_enabled() const { return false; }
132         virtual void set_record_safe (bool yn, void *src) {}
133         virtual bool record_safe () const {return false; }
134         virtual void nonrealtime_handle_transport_stopped (bool abort, bool did_locate, bool flush_processors);
135         virtual void realtime_handle_transport_stopped () {}
136         virtual void realtime_locate () {}
137         virtual void non_realtime_locate (framepos_t);
138         virtual void set_pending_declick (int);
139
140         /* end of vfunc-based API */
141
142         void shift (framepos_t, framecnt_t);
143
144         void set_gain (gain_t val, void *src);
145         void inc_gain (gain_t delta, void *src);
146
147         void set_trim (gain_t val, void *src);
148         void inc_trim (gain_t delta, void *src);
149
150         void set_mute_points (MuteMaster::MutePoint);
151         MuteMaster::MutePoint mute_points () const;
152
153         bool muted () const;
154         void set_mute (bool yn, void* src);
155
156         bool muted_by_others() const;
157
158         /* controls use set_solo() to modify this route's solo state
159          */
160
161         void set_solo (bool yn, void *src);
162         bool soloed () const { return self_soloed () || soloed_by_others (); }
163
164         bool soloed_by_others () const { return _soloed_by_others_upstream||_soloed_by_others_downstream; }
165         bool soloed_by_others_upstream () const { return _soloed_by_others_upstream; }
166         bool soloed_by_others_downstream () const { return _soloed_by_others_downstream; }
167         bool self_soloed () const { return _self_solo; }
168
169         void set_solo_isolated (bool yn, void *src);
170         bool solo_isolated() const;
171
172         void set_solo_safe (bool yn, void *src);
173         bool solo_safe() const;
174
175         void set_listen (bool yn, void* src);
176         bool listening_via_monitor () const;
177         void enable_monitor_send ();
178
179         void set_phase_invert (uint32_t, bool yn);
180         void set_phase_invert (boost::dynamic_bitset<>);
181         bool phase_invert (uint32_t) const;
182         boost::dynamic_bitset<> phase_invert () const;
183
184         void set_denormal_protection (bool yn);
185         bool denormal_protection() const;
186
187         void         set_meter_point (MeterPoint, bool force = false);
188         bool         apply_processor_changes_rt ();
189         void         emit_pending_signals ();
190         MeterPoint   meter_point() const { return _pending_meter_point; }
191
192         void         set_meter_type (MeterType t) { _meter_type = t; }
193         MeterType    meter_type() const { return _meter_type; }
194
195         /* Processors */
196
197         boost::shared_ptr<Amp> amp() const  { return _amp; }
198         boost::shared_ptr<Amp> trim() const { return _trim; }
199         PeakMeter&       peak_meter()       { return *_meter.get(); }
200         const PeakMeter& peak_meter() const { return *_meter.get(); }
201         boost::shared_ptr<PeakMeter> shared_peak_meter() const { return _meter; }
202         boost::shared_ptr<DelayLine> delay_line() const  { return _delayline; }
203
204         void flush_processors ();
205
206         void foreach_processor (boost::function<void(boost::weak_ptr<Processor>)> method) {
207                 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
208                 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
209                         method (boost::weak_ptr<Processor> (*i));
210                 }
211         }
212
213         boost::shared_ptr<Processor> nth_processor (uint32_t n) {
214                 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
215                 ProcessorList::iterator i;
216                 for (i = _processors.begin(); i != _processors.end() && n; ++i, --n) {}
217                 if (i == _processors.end()) {
218                         return boost::shared_ptr<Processor> ();
219                 } else {
220                         return *i;
221                 }
222         }
223
224         boost::shared_ptr<Processor> processor_by_id (PBD::ID) const;
225
226         boost::shared_ptr<Processor> nth_plugin (uint32_t n);
227         boost::shared_ptr<Processor> nth_send (uint32_t n);
228
229         bool has_io_processor_named (const std::string&);
230         ChanCount max_processor_streams () const { return processor_max_streams; }
231
232         std::list<std::string> unknown_processors () const;
233
234         /* special processors */
235
236         boost::shared_ptr<InternalSend>     monitor_send() const { return _monitor_send; }
237         boost::shared_ptr<Delivery>         main_outs() const { return _main_outs; }
238         boost::shared_ptr<InternalReturn>   internal_return() const { return _intreturn; }
239         boost::shared_ptr<MonitorProcessor> monitor_control() const { return _monitor_control; }
240         boost::shared_ptr<Send>             internal_send_for (boost::shared_ptr<const Route> target) const;
241         void add_internal_return ();
242         void add_send_to_internal_return (InternalSend *);
243         void remove_send_from_internal_return (InternalSend *);
244         void listen_position_changed ();
245         boost::shared_ptr<CapturingProcessor> add_export_point(/* Add some argument for placement later */);
246
247         /** A record of the stream configuration at some point in the processor list.
248          * Used to return where and why an processor list configuration request failed.
249          */
250         struct ProcessorStreams {
251                 ProcessorStreams(size_t i=0, ChanCount c=ChanCount()) : index(i), count(c) {}
252
253                 uint32_t  index; ///< Index of processor where configuration failed
254                 ChanCount count; ///< Input requested of processor
255         };
256
257         int add_processor (boost::shared_ptr<Processor>, Placement placement, ProcessorStreams* err = 0, bool activation_allowed = true);
258         int add_processor_by_index (boost::shared_ptr<Processor>, int, ProcessorStreams* err = 0, bool activation_allowed = true);
259         int add_processor (boost::shared_ptr<Processor>, boost::shared_ptr<Processor>, ProcessorStreams* err = 0, bool activation_allowed = true);
260         int add_processors (const ProcessorList&, boost::shared_ptr<Processor>, ProcessorStreams* err = 0);
261         boost::shared_ptr<Processor> before_processor_for_placement (Placement);
262         boost::shared_ptr<Processor> before_processor_for_index (int);
263         bool processors_reorder_needs_configure (const ProcessorList& new_order);
264         int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0, bool need_process_lock = true);
265         int remove_processors (const ProcessorList&, ProcessorStreams* err = 0);
266         int reorder_processors (const ProcessorList& new_order, ProcessorStreams* err = 0);
267         void disable_processors (Placement);
268         void disable_processors ();
269         void disable_plugins (Placement);
270         void disable_plugins ();
271         void ab_plugins (bool forward);
272         void clear_processors (Placement);
273         void all_visible_processors_active (bool);
274
275         framecnt_t set_private_port_latencies (bool playback) const;
276         void       set_public_port_latencies (framecnt_t, bool playback) const;
277
278         framecnt_t   update_signal_latency();
279         virtual void set_latency_compensation (framecnt_t);
280
281         void set_user_latency (framecnt_t);
282         framecnt_t initial_delay() const { return _initial_delay; }
283         framecnt_t signal_latency() const { return _signal_latency; }
284
285         PBD::Signal0<void>       active_changed;
286         PBD::Signal0<void>       phase_invert_changed;
287         PBD::Signal0<void>       denormal_protection_changed;
288         PBD::Signal1<void,void*> listen_changed;
289         PBD::Signal2<void,bool,void*> solo_changed;
290         PBD::Signal1<void,void*> solo_safe_changed;
291         PBD::Signal1<void,void*> solo_isolated_changed;
292         PBD::Signal1<void,void*> comment_changed;
293         PBD::Signal1<void,void*> mute_changed;
294         PBD::Signal0<void>       mute_points_changed;
295
296         /** track numbers - assigned by session
297          * nubers > 0 indicate tracks (audio+midi)
298          * nubers < 0 indicate busses
299          * zero is reserved for unnumbered special busses.
300          * */
301         PBD::Signal0<void> track_number_changed;
302         int64_t track_number() const { return _track_number; }
303
304         void set_track_number(int64_t tn) {
305                 if (tn == _track_number) { return; }
306                 _track_number = tn;
307                 track_number_changed();
308                 PropertyChanged (ARDOUR::Properties::name);
309         }
310
311         /** the processors have changed; the parameter indicates what changed */
312         PBD::Signal1<void,RouteProcessorChange> processors_changed;
313         PBD::Signal1<void,void*> record_enable_changed;
314         /** the metering point has changed */
315         PBD::Signal0<void>       meter_change;
316         PBD::Signal0<void>       signal_latency_changed;
317         PBD::Signal0<void>       initial_delay_changed;
318
319         /** Emitted with the process lock held */
320         PBD::Signal0<void>       io_changed;
321
322         /* gui's call this for their own purposes. */
323
324         PBD::Signal2<void,std::string,void*> gui_changed;
325
326         /* stateful */
327
328         XMLNode& get_state();
329         virtual int set_state (const XMLNode&, int version);
330         virtual XMLNode& get_template();
331
332         XMLNode& get_processor_state ();
333         virtual void set_processor_state (const XMLNode&);
334
335         int save_as_template (const std::string& path, const std::string& name);
336
337         PBD::Signal1<void,void*> SelectedChanged;
338
339         int add_aux_send (boost::shared_ptr<Route>, boost::shared_ptr<Processor>);
340         void remove_aux_or_listen (boost::shared_ptr<Route>);
341
342         /**
343          * return true if this route feeds the first argument via at least one
344          * (arbitrarily long) signal pathway.
345          */
346         bool feeds (boost::shared_ptr<Route>, bool* via_send_only = 0);
347
348         /**
349          * return true if this route feeds the first argument directly, via
350          * either its main outs or a send.  This is checked by the actual
351          * connections, rather than by what the graph is currently doing.
352          */
353         bool direct_feeds_according_to_reality (boost::shared_ptr<Route>, bool* via_send_only = 0);
354
355         /**
356          * return true if this route feeds the first argument directly, via
357          * either its main outs or a send, according to the graph that
358          * is currently being processed.
359          */
360         bool direct_feeds_according_to_graph (boost::shared_ptr<Route>, bool* via_send_only = 0);
361
362         struct FeedRecord {
363                 boost::weak_ptr<Route> r;
364                 bool sends_only;
365
366                 FeedRecord (boost::shared_ptr<Route> rp, bool sendsonly)
367                 : r (rp)
368                 , sends_only (sendsonly) {}
369         };
370
371         struct FeedRecordCompare {
372                 bool operator() (const FeedRecord& a, const FeedRecord& b) const {
373                         return a.r < b.r;
374                 }
375         };
376
377         typedef std::set<FeedRecord,FeedRecordCompare> FedBy;
378
379         const FedBy& fed_by() const { return _fed_by; }
380         void clear_fed_by ();
381         bool add_fed_by (boost::shared_ptr<Route>, bool sends_only);
382
383         /* Controls (not all directly owned by the Route */
384
385         boost::shared_ptr<AutomationControl> get_control (const Evoral::Parameter& param);
386
387         class SoloControllable : public AutomationControl {
388         public:
389                 SoloControllable (std::string name, boost::shared_ptr<Route>);
390                 void set_value (double);
391                 double get_value () const;
392
393         private:
394                 boost::weak_ptr<Route> _route;
395         };
396
397         struct MuteControllable : public AutomationControl {
398         public:
399                 MuteControllable (std::string name, boost::shared_ptr<Route>);
400                 void set_value (double);
401                 double get_value () const;
402
403                 /* Pretend to change value, but do not affect actual route mute. */
404                 void set_superficial_value(bool muted);
405
406         private:
407                 boost::weak_ptr<Route> _route;
408         };
409
410         boost::shared_ptr<SoloControllable> solo_control() const {
411                 return _solo_control;
412         }
413
414         boost::shared_ptr<MuteControllable> mute_control() const {
415                 return _mute_control;
416         }
417
418         boost::shared_ptr<MuteMaster> mute_master() const {
419                 return _mute_master;
420         }
421
422         /* Route doesn't own these items, but sub-objects that it does own have them
423            and to make UI code a bit simpler, we provide direct access to them
424            here.
425         */
426
427         boost::shared_ptr<Panner> panner() const;  /* may return null */
428         boost::shared_ptr<PannerShell> panner_shell() const;
429         boost::shared_ptr<AutomationControl> gain_control() const;
430         boost::shared_ptr<Pannable> pannable() const;
431
432         /**
433            Return the first processor that accepts has at least one MIDI input
434            and at least one audio output. In the vast majority of cases, this
435            will be "the instrument". This does not preclude other MIDI->audio
436            processors later in the processing chain, but that would be a
437            special case not covered by this utility function.
438         */
439         boost::shared_ptr<Processor> the_instrument() const;
440         InstrumentInfo& instrument_info() { return _instrument_info; }
441
442         void protect_automation ();
443
444         enum {
445                 /* These numbers are taken from MIDI Machine Control,
446                    which can only control up to 317 tracks without
447                    doing sysex segmentation.
448                 */
449                 MasterBusRemoteControlID = 318,
450                 MonitorBusRemoteControlID = 319,
451         };
452
453         void     set_remote_control_id (uint32_t id, bool notify_class_listeners = true);
454         uint32_t remote_control_id () const;
455         void     set_remote_control_id_explicit (uint32_t order_key);
456
457         /* for things concerned about *this* route's RID */
458
459         PBD::Signal0<void> RemoteControlIDChanged;
460
461         /* for things concerned about *any* route's RID changes */
462
463         static PBD::Signal0<void> RemoteControlIDChange;
464         static PBD::Signal0<void> SyncOrderKeys;
465
466         bool has_external_redirects() const;
467
468         /* can only be executed by a route for which is_monitor() is true
469            (i.e. the monitor out)
470         */
471         void monitor_run (framepos_t start_frame, framepos_t end_frame,
472                           pframes_t nframes, int declick);
473
474   protected:
475         friend class Session;
476
477         void catch_up_on_solo_mute_override ();
478         void mod_solo_by_others_upstream (int32_t);
479         void mod_solo_by_others_downstream (int32_t);
480         void curve_reallocate ();
481         virtual void set_block_size (pframes_t nframes);
482
483   protected:
484         virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; }
485
486         void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pframes_t nframes);
487
488         void passthru (BufferSet&, framepos_t start_frame, framepos_t end_frame,
489                         pframes_t nframes, int declick);
490
491         virtual void write_out_of_band_data (BufferSet& /* bufs */, framepos_t /* start_frame */, framepos_t /* end_frame */,
492                                              framecnt_t /* nframes */) {}
493
494         virtual void process_output_buffers (BufferSet& bufs,
495                                              framepos_t start_frame, framepos_t end_frame,
496                                              pframes_t nframes, int declick,
497                                              bool gain_automation_ok);
498
499         virtual void bounce_process (BufferSet& bufs,
500                                      framepos_t start_frame, framecnt_t nframes,
501                                                                                                                          boost::shared_ptr<Processor> endpoint, bool include_endpoint,
502                                      bool for_export, bool for_freeze);
503
504         framecnt_t   bounce_get_latency (boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) const;
505         ChanCount    bounce_get_output_streams (ChanCount &cc, boost::shared_ptr<Processor> endpoint, bool include_endpoint, bool for_export, bool for_freeze) const;
506
507         boost::shared_ptr<IO> _input;
508         boost::shared_ptr<IO> _output;
509
510         bool           _active;
511         framecnt_t     _signal_latency;
512         framecnt_t     _signal_latency_at_amp_position;
513         framecnt_t     _signal_latency_at_trim_position;
514         framecnt_t     _initial_delay;
515         framecnt_t     _roll_delay;
516
517         ProcessorList  _processors;
518         mutable Glib::Threads::RWLock   _processor_lock;
519         boost::shared_ptr<Delivery> _main_outs;
520         boost::shared_ptr<InternalSend> _monitor_send;
521         boost::shared_ptr<InternalReturn> _intreturn;
522         boost::shared_ptr<MonitorProcessor> _monitor_control;
523         boost::shared_ptr<Pannable> _pannable;
524
525         enum {
526                 EmitNone = 0x00,
527                 EmitMeterChanged = 0x01,
528                 EmitMeterVisibilityChange = 0x02,
529                 EmitRtProcessorChange = 0x04
530         };
531
532         ProcessorList  _pending_processor_order;
533         gint           _pending_process_reorder; // atomic
534         gint           _pending_signals; // atomic
535
536         Flag           _flags;
537         int            _pending_declick;
538         MeterPoint     _meter_point;
539         MeterPoint     _pending_meter_point;
540         MeterType      _meter_type;
541         boost::dynamic_bitset<> _phase_invert;
542         bool           _self_solo;
543         uint32_t       _soloed_by_others_upstream;
544         uint32_t       _soloed_by_others_downstream;
545         bool           _solo_isolated;
546         uint32_t       _solo_isolated_by_upstream;
547
548         void mod_solo_isolated_by_upstream (bool, void*);
549
550         bool           _denormal_protection;
551
552         bool _recordable : 1;
553         bool _silent : 1;
554         bool _declickable : 1;
555
556         boost::shared_ptr<SoloControllable> _solo_control;
557         boost::shared_ptr<MuteControllable> _mute_control;
558         boost::shared_ptr<MuteMaster> _mute_master;
559
560         virtual void act_on_mute () {}
561
562         std::string    _comment;
563         bool           _have_internal_generator;
564         bool           _solo_safe;
565         DataType       _default_type;
566         FedBy          _fed_by;
567
568         InstrumentInfo _instrument_info;
569
570         virtual ChanCount input_streams () const;
571
572   protected:
573         virtual XMLNode& state(bool);
574
575         int configure_processors (ProcessorStreams*);
576
577         void passthru_silence (framepos_t start_frame, framepos_t end_frame,
578                                pframes_t nframes, int declick);
579
580         void silence (framecnt_t);
581         void silence_unlocked (framecnt_t);
582
583         ChanCount processor_max_streams;
584         ChanCount processor_out_streams;
585
586         uint32_t pans_required() const;
587         ChanCount n_process_buffers ();
588
589         virtual void maybe_declick (BufferSet&, framecnt_t, int);
590
591         boost::shared_ptr<Amp>       _amp;
592         boost::shared_ptr<Amp>       _trim;
593         boost::shared_ptr<PeakMeter> _meter;
594         boost::shared_ptr<DelayLine> _delayline;
595
596         boost::shared_ptr<Processor> the_instrument_unlocked() const;
597
598   private:
599         int set_state_2X (const XMLNode&, int);
600         void set_processor_state_2X (XMLNodeList const &, int);
601
602         uint32_t _order_key;
603         bool _has_order_key;
604         uint32_t _remote_control_id;
605
606         int64_t _track_number;
607
608         void input_change_handler (IOChange, void *src);
609         void output_change_handler (IOChange, void *src);
610
611         bool input_port_count_changing (ChanCount);
612         bool output_port_count_changing (ChanCount);
613
614         bool _in_configure_processors;
615         bool _initial_io_setup;
616
617         int configure_processors_unlocked (ProcessorStreams*);
618         bool set_meter_point_unlocked ();
619         void apply_processor_order (const ProcessorList& new_order);
620
621         std::list<std::pair<ChanCount, ChanCount> > try_configure_processors (ChanCount, ProcessorStreams *);
622         std::list<std::pair<ChanCount, ChanCount> > try_configure_processors_unlocked (ChanCount, ProcessorStreams *);
623
624         bool add_processor_from_xml_2X (const XMLNode&, int);
625
626         void placement_range (Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end);
627
628         void set_self_solo (bool yn);
629         void set_mute_master_solo ();
630
631         void set_processor_positions ();
632         framecnt_t update_port_latencies (PortSet& ports, PortSet& feeders, bool playback, framecnt_t) const;
633
634         void setup_invisible_processors ();
635         void unpan ();
636
637         boost::shared_ptr<CapturingProcessor> _capturing_processor;
638
639         /** A handy class to keep processor state while we attempt a reconfiguration
640          *  that may fail.
641          */
642         class ProcessorState {
643         public:
644                 ProcessorState (Route* r)
645                         : _route (r)
646                         , _processors (r->_processors)
647                         , _processor_max_streams (r->processor_max_streams)
648                 { }
649
650                 void restore () {
651                         _route->_processors = _processors;
652                         _route->processor_max_streams = _processor_max_streams;
653                 }
654
655         private:
656                 /* this should perhaps be a shared_ptr, but ProcessorStates will
657                    not hang around long enough for it to matter.
658                 */
659                 Route* _route;
660                 ProcessorList _processors;
661                 ChanCount _processor_max_streams;
662         };
663
664         friend class ProcessorState;
665
666         /* no copy construction */
667         Route (Route const &);
668
669         void maybe_note_meter_position ();
670
671         /** true if we've made a note of a custom meter position in these variables */
672         bool _custom_meter_position_noted;
673         /** the processor that came after the meter when it was last set to a custom position,
674             or 0.
675         */
676         boost::weak_ptr<Processor> _processor_after_last_custom_meter;
677
678         void reset_instrument_info ();
679
680         void set_remote_control_id_internal (uint32_t id, bool notify_class_listeners = true);
681 };
682
683 } // namespace ARDOUR
684
685 #endif /* __ardour_route_h__ */