2 Copyright (C) 2000-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #ifndef __ardour_route_h__
21 #define __ardour_route_h__
30 #include <boost/shared_ptr.hpp>
31 #include <boost/weak_ptr.hpp>
33 #include <glibmm/thread.h>
34 #include "pbd/fastlog.h"
35 #include "pbd/xml++.h"
37 #include "pbd/stateful.h"
38 #include "pbd/controllable.h"
39 #include "pbd/destructible.h"
41 #include "ardour/ardour.h"
42 #include "ardour/io.h"
43 #include "ardour/types.h"
44 #include "ardour/mute_master.h"
45 #include "ardour/route_group_member.h"
46 #include "ardour/graphnode.h"
47 #include "ardour/automatable.h"
59 class MonitorProcessor
;
61 class Route
: public SessionObject
, public Automatable
, public RouteGroupMember
, public GraphNode
65 typedef std::list
<boost::shared_ptr
<Processor
> > ProcessorList
;
73 Route (Session
&, std::string name
, Flag flags
= Flag(0), DataType default_type
= DataType::AUDIO
);
78 boost::shared_ptr
<IO
> input() const { return _input
; }
79 boost::shared_ptr
<IO
> output() const { return _output
; }
81 ChanCount
n_inputs() const { return _input
->n_ports(); }
82 ChanCount
n_outputs() const { return _output
->n_ports(); }
84 bool active() const { return _active
; }
85 void set_active (bool yn
);
87 static std::string
ensure_track_or_route_name(std::string
, Session
&);
89 std::string
comment() { return _comment
; }
90 void set_comment (std::string str
, void *src
);
92 bool set_name (const std::string
& str
);
94 int32_t order_key (std::string
const &) const;
95 void set_order_key (std::string
const &, int32_t);
97 bool is_hidden() const { return _flags
& Hidden
; }
98 bool is_master() const { return _flags
& MasterOut
; }
99 bool is_monitor() const { return _flags
& MonitorOut
; }
101 /* these are the core of the API of a Route. see the protected sections as well */
103 virtual int roll (nframes_t nframes
, sframes_t start_frame
, sframes_t end_frame
,
104 int declick
, bool can_record
, bool rec_monitors_input
, bool& need_butler
);
106 virtual int no_roll (nframes_t nframes
, sframes_t start_frame
, sframes_t end_frame
,
107 bool state_changing
, bool can_record
, bool rec_monitors_input
);
109 virtual int silent_roll (nframes_t nframes
, sframes_t start_frame
, sframes_t end_frame
,
110 bool can_record
, bool rec_monitors_input
, bool& need_butler
);
112 virtual void toggle_monitor_input ();
113 virtual bool can_record() { return false; }
115 virtual void set_record_enable (bool /*yn*/, void * /*src*/) {}
116 virtual bool record_enabled() const { return false; }
117 virtual void handle_transport_stopped (bool abort
, bool did_locate
, bool flush_processors
);
118 virtual void set_pending_declick (int);
120 /* end of vfunc-based API */
122 void shift (nframes64_t
, nframes64_t
);
124 void set_gain (gain_t val
, void *src
);
125 void inc_gain (gain_t delta
, void *src
);
127 void set_mute_points (MuteMaster::MutePoint
);
128 MuteMaster::MutePoint
mute_points () const;
131 void set_mute (bool yn
, void* src
);
133 /* controls use set_solo() to modify this route's solo state
136 void set_solo (bool yn
, void *src
);
137 bool soloed () const { return self_soloed () || soloed_by_others (); }
139 bool soloed_by_others () const { return _soloed_by_others_upstream
||_soloed_by_others_downstream
; }
140 bool soloed_by_others_upstream () const { return _soloed_by_others_upstream
; }
141 bool soloed_by_others_downstream () const { return _soloed_by_others_downstream
; }
142 bool self_soloed () const { return _self_solo
; }
144 void set_solo_isolated (bool yn
, void *src
);
145 bool solo_isolated() const;
147 void set_solo_safe (bool yn
, void *src
);
148 bool solo_safe() const;
150 void set_listen (bool yn
, void* src
);
151 bool listening () const;
153 void set_phase_invert (bool yn
);
154 bool phase_invert() const;
156 void set_denormal_protection (bool yn
);
157 bool denormal_protection() const;
159 void set_meter_point (MeterPoint
);
160 void infer_meter_point () const;
161 MeterPoint
meter_point() const { return _meter_point
; }
166 boost::shared_ptr
<Amp
> amp() const { return _amp
; }
167 PeakMeter
& peak_meter() { return *_meter
.get(); }
168 const PeakMeter
& peak_meter() const { return *_meter
.get(); }
169 boost::shared_ptr
<PeakMeter
> shared_peak_meter() const { return _meter
; }
171 void flush_processors ();
173 void foreach_processor (boost::function
<void(boost::weak_ptr
<Processor
>)> method
) {
174 Glib::RWLock::ReaderLock
lm (_processor_lock
);
175 for (ProcessorList::iterator i
= _processors
.begin(); i
!= _processors
.end(); ++i
) {
176 method (boost::weak_ptr
<Processor
> (*i
));
180 boost::shared_ptr
<Processor
> nth_processor (uint32_t n
) {
181 Glib::RWLock::ReaderLock
lm (_processor_lock
);
182 ProcessorList::iterator i
;
183 for (i
= _processors
.begin(); i
!= _processors
.end() && n
; ++i
, --n
) {}
184 if (i
== _processors
.end()) {
185 return boost::shared_ptr
<Processor
> ();
191 boost::shared_ptr
<Processor
> nth_plugin (uint32_t n
);
192 boost::shared_ptr
<Processor
> nth_send (uint32_t n
);
194 bool processor_is_prefader (boost::shared_ptr
<Processor
> p
);
196 bool has_io_processor_named (const std::string
&);
197 ChanCount
max_processor_streams () const { return processor_max_streams
; }
199 /* special processors */
201 boost::shared_ptr
<Delivery
> monitor_send() const { return _monitor_send
; }
202 boost::shared_ptr
<Delivery
> main_outs() const { return _main_outs
; }
203 boost::shared_ptr
<InternalReturn
> internal_return() const { return _intreturn
; }
204 boost::shared_ptr
<MonitorProcessor
> monitor_control() const { return _monitor_control
; }
205 boost::shared_ptr
<Send
> internal_send_for (boost::shared_ptr
<const Route
> target
) const;
206 void add_internal_return ();
207 BufferSet
* get_return_buffer () const;
208 void release_return_buffer () const;
209 void put_monitor_send_at (Placement
);
211 /** A record of the stream configuration at some point in the processor list.
212 * Used to return where and why an processor list configuration request failed.
214 struct ProcessorStreams
{
215 ProcessorStreams(size_t i
=0, ChanCount c
=ChanCount()) : index(i
), count(c
) {}
217 uint32_t index
; ///< Index of processor where configuration failed
218 ChanCount count
; ///< Input requested of processor
221 int add_processor (boost::shared_ptr
<Processor
>, Placement placement
, ProcessorStreams
* err
= 0);
222 int add_processor (boost::shared_ptr
<Processor
>, ProcessorList::iterator iter
, ProcessorStreams
* err
= 0, bool activation_allowed
= true);
223 int add_processors (const ProcessorList
&, boost::shared_ptr
<Processor
> before
, ProcessorStreams
* err
= 0);
224 int add_processors (const ProcessorList
&, ProcessorList::iterator iter
, ProcessorStreams
* err
= 0);
225 int remove_processor (boost::shared_ptr
<Processor
>, ProcessorStreams
* err
= 0);
226 int remove_processors (const ProcessorList
&, ProcessorStreams
* err
= 0);
227 int reorder_processors (const ProcessorList
& new_order
, ProcessorStreams
* err
= 0);
228 void disable_processors (Placement
);
229 void disable_processors ();
230 void disable_plugins (Placement
);
231 void disable_plugins ();
232 void ab_plugins (bool forward
);
233 void clear_processors (Placement
);
234 void all_processors_flip();
235 void all_processors_active (Placement
, bool state
);
237 virtual nframes_t
update_total_latency();
238 void set_latency_delay (nframes_t
);
239 void set_user_latency (nframes_t
);
240 nframes_t
initial_delay() const { return _initial_delay
; }
242 PBD::Signal0
<void> active_changed
;
243 PBD::Signal0
<void> phase_invert_changed
;
244 PBD::Signal0
<void> denormal_protection_changed
;
245 PBD::Signal1
<void,void*> listen_changed
;
246 PBD::Signal2
<void,bool,void*> solo_changed
;
247 PBD::Signal1
<void,void*> solo_safe_changed
;
248 PBD::Signal1
<void,void*> solo_isolated_changed
;
249 PBD::Signal1
<void,void*> comment_changed
;
250 PBD::Signal1
<void,void*> mute_changed
;
251 PBD::Signal0
<void> mute_points_changed
;
253 /** the processors have changed; the parameter indicates what changed */
254 PBD::Signal1
<void,RouteProcessorChange
> processors_changed
;
255 PBD::Signal1
<void,void*> record_enable_changed
;
256 /** the metering point has changed */
257 PBD::Signal0
<void> meter_change
;
258 PBD::Signal0
<void> signal_latency_changed
;
259 PBD::Signal0
<void> initial_delay_changed
;
260 PBD::Signal0
<void> order_key_changed
;
262 /* gui's call this for their own purposes. */
264 PBD::Signal2
<void,std::string
,void*> gui_changed
;
268 XMLNode
& get_state();
269 int set_state (const XMLNode
&, int version
);
270 virtual XMLNode
& get_template();
272 XMLNode
& get_processor_state ();
273 virtual void set_processor_state (const XMLNode
&);
275 int save_as_template (const std::string
& path
, const std::string
& name
);
277 PBD::Signal1
<void,void*> SelectedChanged
;
279 int listen_via (boost::shared_ptr
<Route
>, Placement p
, bool active
, bool aux
);
280 void drop_listen (boost::shared_ptr
<Route
>);
283 * return true if this route feeds the first argument via at least one
284 * (arbitrarily long) signal pathway.
286 bool feeds (boost::shared_ptr
<Route
>, bool* via_send_only
= 0);
289 * return true if this route feeds the first argument directly, via
290 * either its main outs or a send.
292 bool direct_feeds (boost::shared_ptr
<Route
>, bool* via_send_only
= 0);
295 boost::weak_ptr
<Route
> r
;
298 FeedRecord (boost::shared_ptr
<Route
> rp
, bool sendsonly
)
300 , sends_only (sendsonly
) {}
303 struct FeedRecordCompare
{
304 bool operator() (const FeedRecord
& a
, const FeedRecord
& b
) const {
309 typedef std::set
<FeedRecord
,FeedRecordCompare
> FedBy
;
311 const FedBy
& fed_by() const { return _fed_by
; }
312 void clear_fed_by ();
313 bool add_fed_by (boost::shared_ptr
<Route
>, bool sends_only
);
314 bool not_fed() const { return _fed_by
.empty(); }
316 /* Controls (not all directly owned by the Route */
318 boost::shared_ptr
<AutomationControl
> get_control (const Evoral::Parameter
& param
);
320 struct SoloControllable
: public AutomationControl
{
321 SoloControllable (std::string name
, Route
&);
322 void set_value (float);
323 float get_value (void) const;
328 struct MuteControllable
: public AutomationControl
{
329 MuteControllable (std::string name
, Route
&);
330 void set_value (float);
331 float get_value (void) const;
336 boost::shared_ptr
<AutomationControl
> solo_control() const {
337 return _solo_control
;
340 boost::shared_ptr
<AutomationControl
> mute_control() const {
341 return _mute_control
;
344 boost::shared_ptr
<MuteMaster
> mute_master() const {
348 /* Route doesn't own these items, but sub-objects that it does own have them
349 and to make UI code a bit simpler, we provide direct access to them
353 boost::shared_ptr
<Panner
> panner() const;
354 boost::shared_ptr
<AutomationControl
> gain_control() const;
356 void automation_snapshot (nframes_t now
, bool force
=false);
357 void protect_automation ();
359 void set_remote_control_id (uint32_t id
, bool notify_class_listeners
= true);
360 uint32_t remote_control_id () const;
362 /* for things concerned about *this* route's RID */
364 PBD::Signal0
<void> RemoteControlIDChanged
;
366 /* for things concerned about any route's RID changes */
368 static PBD::Signal0
<void> RemoteControlIDChange
;
370 void sync_order_keys (std::string
const &);
371 static PBD::Signal1
<void,std::string
const &> SyncOrderKeys
;
374 friend class Session
;
376 void catch_up_on_solo_mute_override ();
377 void mod_solo_by_others_upstream (int32_t);
378 void mod_solo_by_others_downstream (int32_t);
379 bool has_external_redirects() const;
380 void curve_reallocate ();
381 void just_meter_input (sframes_t start_frame
, sframes_t end_frame
, nframes_t nframes
);
382 virtual void set_block_size (nframes_t nframes
);
385 nframes_t
check_initial_delay (nframes_t
, nframes_t
&);
387 void passthru (sframes_t start_frame
, sframes_t end_frame
,
388 nframes_t nframes
, int declick
);
390 virtual void write_out_of_band_data (BufferSet
& /* bufs */, sframes_t
/* start_frame */, sframes_t
/* end_frame */,
391 nframes_t
/* nframes */) {}
393 virtual void process_output_buffers (BufferSet
& bufs
,
394 sframes_t start_frame
, sframes_t end_frame
,
395 nframes_t nframes
, bool with_processors
, int declick
);
397 boost::shared_ptr
<IO
> _input
;
398 boost::shared_ptr
<IO
> _output
;
401 nframes_t _initial_delay
;
402 nframes_t _roll_delay
;
404 ProcessorList _processors
;
405 mutable Glib::RWLock _processor_lock
;
406 boost::shared_ptr
<Delivery
> _main_outs
;
407 boost::shared_ptr
<Delivery
> _monitor_send
;
408 boost::shared_ptr
<InternalReturn
> _intreturn
;
409 boost::shared_ptr
<MonitorProcessor
> _monitor_control
;
412 int _pending_declick
;
413 MeterPoint _meter_point
;
414 uint32_t _phase_invert
;
416 uint32_t _soloed_by_others_upstream
;
417 uint32_t _soloed_by_others_downstream
;
418 uint32_t _solo_isolated
;
420 bool _denormal_protection
;
422 bool _recordable
: 1;
424 bool _declickable
: 1;
426 boost::shared_ptr
<SoloControllable
> _solo_control
;
427 boost::shared_ptr
<MuteControllable
> _mute_control
;
428 boost::shared_ptr
<MuteMaster
> _mute_master
;
430 std::string _comment
;
431 bool _have_internal_generator
;
433 DataType _default_type
;
436 virtual ChanCount
input_streams () const;
439 virtual XMLNode
& state(bool);
441 int configure_processors (ProcessorStreams
*);
443 void passthru_silence (sframes_t start_frame
, sframes_t end_frame
,
444 nframes_t nframes
, int declick
);
446 void silence (nframes_t
);
447 void silence_unlocked (nframes_t
);
449 ChanCount processor_max_streams
;
450 uint32_t _remote_control_id
;
452 uint32_t pans_required() const;
453 ChanCount
n_process_buffers ();
455 virtual int _set_state (const XMLNode
&, int, bool call_base
);
457 boost::shared_ptr
<Amp
> _amp
;
458 boost::shared_ptr
<PeakMeter
> _meter
;
461 int _set_state_2X (const XMLNode
&, int);
462 void set_processor_state_2X (XMLNodeList
const &, int);
464 static uint32_t order_key_cnt
;
466 typedef std::map
<std::string
, long> OrderKeys
;
467 OrderKeys order_keys
;
469 void input_change_handler (IOChange
, void *src
);
470 void output_change_handler (IOChange
, void *src
);
472 bool _in_configure_processors
;
474 int configure_processors_unlocked (ProcessorStreams
*);
476 bool add_processor_from_xml (const XMLNode
&, ProcessorList::iterator iter
);
477 bool add_processor_from_xml_2X (const XMLNode
&, int, ProcessorList::iterator iter
);
479 void placement_range (Placement p
, ProcessorList::iterator
& start
, ProcessorList::iterator
& end
);
481 void set_self_solo (bool yn
);
482 void set_mute_master_solo ();
484 void set_processor_positions ();
487 } // namespace ARDOUR
489 #endif /* __ardour_route_h__ */