X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Froute.h;h=3d4f7f139a19287a4c9d025c2e62a7aedd92ed29;hb=14004b75a6d18a74fa59ac06c203af693164b774;hp=4157541229b9d8f08f43142113f18cd9513acbcd;hpb=11792ed95dc9b9435045f1830eb4cf298e6d475d;p=ardour.git diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 4157541229..3d4f7f139a 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -43,6 +43,7 @@ #include "ardour/types.h" #include "ardour/mute_master.h" #include "ardour/route_group_member.h" +#include "ardour/graphnode.h" namespace ARDOUR { @@ -54,8 +55,9 @@ class Processor; class RouteGroup; class Send; class InternalReturn; +class MonitorProcessor; -class Route : public SessionObject, public AutomatableControls, public RouteGroupMember +class Route : public SessionObject, public AutomatableControls, public RouteGroupMember, public GraphNode { public: @@ -64,13 +66,14 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou enum Flag { Hidden = 0x1, MasterOut = 0x2, - ControlOut = 0x4 + MonitorOut = 0x4 }; Route (Session&, std::string name, Flag flags = Flag(0), DataType default_type = DataType::AUDIO); - Route (Session&, const XMLNode&, DataType default_type = DataType::AUDIO); virtual ~Route(); + virtual int init (); + boost::shared_ptr input() const { return _input; } boost::shared_ptr output() const { return _output; } @@ -80,7 +83,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou bool active() const { return _active; } void set_active (bool yn); - static std::string ensure_track_or_route_name(std::string, Session &); std::string comment() { return _comment; } @@ -93,18 +95,18 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou bool is_hidden() const { return _flags & Hidden; } bool is_master() const { return _flags & MasterOut; } - bool is_control() const { return _flags & ControlOut; } + bool is_monitor() const { return _flags & MonitorOut; } /* these are the core of the API of a Route. see the protected sections as well */ virtual int roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, - int declick, bool can_record, bool rec_monitors_input); + int declick, bool can_record, bool rec_monitors_input, bool& need_butler); virtual int no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, bool state_changing, bool can_record, bool rec_monitors_input); virtual int silent_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, - bool can_record, bool rec_monitors_input); + bool can_record, bool rec_monitors_input, bool& need_butler); virtual void toggle_monitor_input (); virtual bool can_record() { return false; } @@ -122,9 +124,10 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou void inc_gain (gain_t delta, void *src); void set_mute_points (MuteMaster::MutePoint); - MuteMaster::MutePoint mute_points() const { return _mute_points; } - void set_mute (bool yn, void* src); + MuteMaster::MutePoint mute_points () const; + bool muted () const; + void set_mute (bool yn, void* src); /* controls use set_solo() to modify this route's solo state */ @@ -132,7 +135,9 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou void set_solo (bool yn, void *src); bool soloed () const { return self_soloed () || soloed_by_others (); } - bool soloed_by_others () const { return !_solo_isolated && _soloed_by_others; } + bool soloed_by_others () const { return _soloed_by_others_upstream||_soloed_by_others_downstream; } + bool soloed_by_others_upstream () const { return _soloed_by_others_upstream; } + bool soloed_by_others_downstream () const { return _soloed_by_others_downstream; } bool self_soloed () const { return _self_solo; } void set_solo_isolated (bool yn, void *src); @@ -150,7 +155,8 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou void set_denormal_protection (bool yn); bool denormal_protection() const; - void set_meter_point (MeterPoint, void *src); + void set_meter_point (MeterPoint); + void infer_meter_point () const; MeterPoint meter_point() const { return _meter_point; } void meter (); @@ -186,18 +192,20 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou bool processor_is_prefader (boost::shared_ptr p); + bool has_io_processor_named (const std::string&); ChanCount max_processor_streams () const { return processor_max_streams; } /* special processors */ - boost::shared_ptr control_outs() const { return _control_outs; } - boost::shared_ptr main_outs() const { return _main_outs; } - boost::shared_ptr internal_return() const { return _intreturn; } - boost::shared_ptr internal_send_for (boost::shared_ptr target) const; + boost::shared_ptr monitor_send() const { return _monitor_send; } + boost::shared_ptr main_outs() const { return _main_outs; } + boost::shared_ptr internal_return() const { return _intreturn; } + boost::shared_ptr monitor_control() const { return _monitor_control; } + boost::shared_ptr internal_send_for (boost::shared_ptr target) const; void add_internal_return (); BufferSet* get_return_buffer () const; void release_return_buffer () const; - void put_control_outs_at (Placement); + void put_monitor_send_at (Placement); /** A record of the stream configuration at some point in the processor list. * Used to return where and why an processor list configuration request failed. @@ -210,7 +218,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou }; int add_processor (boost::shared_ptr, Placement placement, ProcessorStreams* err = 0); - int add_processor (boost::shared_ptr, ProcessorList::iterator iter, ProcessorStreams* err = 0); + int add_processor (boost::shared_ptr, ProcessorList::iterator iter, ProcessorStreams* err = 0, bool activation_allowed = true); int add_processors (const ProcessorList&, boost::shared_ptr before, ProcessorStreams* err = 0); int add_processors (const ProcessorList&, ProcessorList::iterator iter, ProcessorStreams* err = 0); int remove_processor (boost::shared_ptr, ProcessorStreams* err = 0); @@ -234,7 +242,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou PBD::Signal0 phase_invert_changed; PBD::Signal0 denormal_protection_changed; PBD::Signal1 listen_changed; - PBD::Signal1 solo_changed; + PBD::Signal2 solo_changed; PBD::Signal1 solo_safe_changed; PBD::Signal1 solo_isolated_changed; PBD::Signal1 comment_changed; @@ -245,7 +253,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou PBD::Signal1 processors_changed; PBD::Signal1 record_enable_changed; /** the metering point has changed */ - PBD::Signal1 meter_change; + PBD::Signal0 meter_change; PBD::Signal0 signal_latency_changed; PBD::Signal0 initial_delay_changed; @@ -269,8 +277,39 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou int listen_via (boost::shared_ptr, Placement p, bool active, bool aux); void drop_listen (boost::shared_ptr); - bool feeds (boost::shared_ptr, bool* via_send_only = 0); - std::set > fed_by; + /** + * return true if this route feeds the first argument via at least one + * (arbitrarily long) signal pathway. + */ + bool feeds (boost::shared_ptr, bool* via_send_only = 0); + + /** + * return true if this route feeds the first argument directly, via + * either its main outs or a send. + */ + bool direct_feeds (boost::shared_ptr, bool* via_send_only = 0); + + struct FeedRecord { + boost::weak_ptr r; + bool sends_only; + + FeedRecord (boost::shared_ptr rp, bool sendsonly) + : r (rp) + , sends_only (sendsonly) {} + }; + + struct FeedRecordCompare { + bool operator() (const FeedRecord& a, const FeedRecord& b) const { + return a.r < b.r; + } + }; + + typedef std::set FedBy; + + const FedBy& fed_by() const { return _fed_by; } + void clear_fed_by (); + bool add_fed_by (boost::shared_ptr, bool sends_only); + bool not_fed() const { return _fed_by.empty(); } /* Controls (not all directly owned by the Route */ @@ -333,11 +372,12 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou friend class Session; void catch_up_on_solo_mute_override (); - void mod_solo_by_others (int32_t); - void set_block_size (nframes_t nframes); + void mod_solo_by_others_upstream (int32_t); + void mod_solo_by_others_downstream (int32_t); bool has_external_redirects() const; void curve_reallocate (); void just_meter_input (sframes_t start_frame, sframes_t end_frame, nframes_t nframes); + virtual void set_block_size (nframes_t nframes); protected: nframes_t check_initial_delay (nframes_t, nframes_t&); @@ -362,15 +402,17 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou ProcessorList _processors; mutable Glib::RWLock _processor_lock; boost::shared_ptr _main_outs; - boost::shared_ptr _control_outs; + boost::shared_ptr _monitor_send; boost::shared_ptr _intreturn; + boost::shared_ptr _monitor_control; Flag _flags; int _pending_declick; MeterPoint _meter_point; uint32_t _phase_invert; bool _self_solo; - uint32_t _soloed_by_others; + uint32_t _soloed_by_others_upstream; + uint32_t _soloed_by_others_downstream; uint32_t _solo_isolated; bool _denormal_protection; @@ -382,21 +424,25 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou boost::shared_ptr _solo_control; boost::shared_ptr _mute_control; boost::shared_ptr _mute_master; - MuteMaster::MutePoint _mute_points; - + std::string _comment; bool _have_internal_generator; bool _solo_safe; DataType _default_type; + FedBy _fed_by; - protected: + virtual ChanCount input_streams () const; + protected: virtual XMLNode& state(bool); + int configure_processors (ProcessorStreams*); + void passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick); - void silence (nframes_t nframes); + void silence (nframes_t); + void silence_unlocked (nframes_t); ChanCount processor_max_streams; uint32_t _remote_control_id; @@ -410,7 +456,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou boost::shared_ptr _meter; private: - void init (); int _set_state_2X (const XMLNode&, int); void set_processor_state_2X (XMLNodeList const &, int); @@ -424,7 +469,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou bool _in_configure_processors; - int configure_processors (ProcessorStreams*); int configure_processors_unlocked (ProcessorStreams*); bool add_processor_from_xml (const XMLNode&, ProcessorList::iterator iter); @@ -433,7 +477,9 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou void placement_range (Placement p, ProcessorList::iterator& start, ProcessorList::iterator& end); void set_self_solo (bool yn); - void set_delivery_solo (); + void set_mute_master_solo (); + + void set_processor_positions (); }; } // namespace ARDOUR