X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Froute.h;h=217ce36fe9759e8bd61776b9f4bd39493fbc89b1;hb=022818b4a796f52c0a91eea42e65aec0bc7bed43;hp=c7c0b77102f441b5d9c72369a621ff632ac932cb;hpb=449aab3c465bbbf66d221fac3d7ea559f1720357;p=ardour.git diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index c7c0b77102..217ce36fe9 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -21,15 +21,17 @@ #define __ardour_route_h__ #include +#include #include -#include #include +#include #include #include +#include -#include #include +#include #include #include #include @@ -38,13 +40,12 @@ #include #include -#include -#include #include namespace ARDOUR { class Processor; +class IOProcessor; class Send; class RouteGroup; @@ -69,7 +70,6 @@ class Route : public IO ControlOut = 0x4 }; - Route (Session&, std::string name, int input_min, int input_max, int output_min, int output_max, Flag flags = Flag(0), DataType default_type = DataType::AUDIO); Route (Session&, const XMLNode&, DataType default_type = DataType::AUDIO); @@ -90,14 +90,15 @@ class Route : public IO /* these are the core of the API of a Route. see the protected sections as well */ - virtual int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, - nframes_t offset, int declick, bool can_record, bool rec_monitors_input); + virtual int roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, + nframes_t offset, int declick, bool can_record, bool rec_monitors_input); + + virtual int no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, + nframes_t offset, bool state_changing, bool can_record, bool rec_monitors_input); - virtual int no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, - nframes_t offset, bool state_changing, bool can_record, bool rec_monitors_input); + virtual int silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, + nframes_t offset, bool can_record, bool rec_monitors_input); - virtual int silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, - nframes_t offset, bool can_record, bool rec_monitors_input); virtual void toggle_monitor_input (); virtual bool can_record() { return false; } virtual void set_record_enable (bool yn, void *src) {} @@ -107,6 +108,8 @@ class Route : public IO /* end of vfunc-based API */ + void shift (nframes64_t, nframes64_t); + /* override IO::set_gain() to provide group control */ void set_gain (gain_t val, void *src); @@ -117,7 +120,7 @@ class Route : public IO void set_solo_safe (bool yn, void *src); bool solo_safe() const { return _solo_safe; } - + void set_mute (bool yn, void *src); bool muted() const { return _muted; } bool solo_muted() const { return desired_solo_gain == 0.0; } @@ -133,17 +136,17 @@ class Route : public IO void drop_mix_group (void *); RouteGroup *mix_group () { return _mix_group; } - virtual void set_meter_point (MeterPoint, void *src); - MeterPoint meter_point() const { return _meter_point; } + virtual void set_meter_point (MeterPoint, void *src); + MeterPoint meter_point() const { return _meter_point; } /* Processors */ void flush_processors (); - template void foreach_processor (T *obj, void (T::*func)(boost::shared_ptr)) { + void foreach_processor (sigc::slot > method) { Glib::RWLock::ReaderLock lm (_processor_lock); for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - (obj->*func) (*i); + method (boost::weak_ptr (*i)); } } @@ -152,7 +155,7 @@ class Route : public IO ProcessorList::iterator i; for (i = _processors.begin(); i != _processors.end() && n; ++i, --n); if (i == _processors.end()) { - return boost::shared_ptr (); + return boost::shared_ptr (); } else { return *i; } @@ -174,7 +177,6 @@ class Route : public IO int add_processor (boost::shared_ptr, ProcessorStreams* err = 0); int add_processors (const ProcessorList&, ProcessorStreams* err = 0); int remove_processor (boost::shared_ptr, ProcessorStreams* err = 0); - int copy_processors (const Route&, Placement, ProcessorStreams* err = 0); int sort_processors (ProcessorStreams* err = 0); void disable_processors (Placement); void disable_processors (); @@ -225,7 +227,7 @@ class Route : public IO IO* control_outs() { return _control_outs; } bool feeds (boost::shared_ptr); - set > fed_by; + std::set > fed_by; struct ToggleControllable : public PBD::Controllable { enum ToggleType { @@ -256,68 +258,66 @@ class Route : public IO uint32_t remote_control_id () const; sigc::signal RemoteControlIDChanged; - void sync_order_keys (); - static sigc::signal SyncOrderKeys; + void sync_order_keys (const char* base); + static sigc::signal SyncOrderKeys; protected: friend class Session; + void catch_up_on_solo_mute_override (); void set_solo_mute (bool yn); void set_block_size (nframes_t nframes); bool has_external_redirects() const; void curve_reallocate (); protected: - Flag _flags; - - /* tight cache-line access here is more important than sheer speed of - access. - */ - - bool _muted : 1; - bool _soloed : 1; - bool _solo_safe : 1; - bool _recordable : 1; - bool _mute_affects_pre_fader : 1; - bool _mute_affects_post_fader : 1; - bool _mute_affects_control_outs : 1; - bool _mute_affects_main_outs : 1; - bool _silent : 1; - bool _declickable : 1; - int _pending_declick; + nframes_t check_initial_delay (nframes_t, nframes_t&, nframes_t&); - MeterPoint _meter_point; - - gain_t solo_gain; - gain_t mute_gain; - gain_t desired_solo_gain; - gain_t desired_mute_gain; + void passthru (nframes_t start_frame, nframes_t end_frame, + nframes_t nframes, nframes_t offset, int declick, bool meter_inputs); - - - nframes_t _initial_delay; - nframes_t _roll_delay; - ProcessorList _processors; - Glib::RWLock _processor_lock; - IO *_control_outs; - Glib::Mutex _control_outs_lock; - RouteGroup *_edit_group; - RouteGroup *_mix_group; - std::string _comment; - bool _have_internal_generator; - - boost::shared_ptr _solo_control; - boost::shared_ptr _mute_control; + virtual void process_output_buffers (BufferSet& bufs, + nframes_t start_frame, nframes_t end_frame, + nframes_t nframes, nframes_t offset, bool with_processors, int declick, + bool meter); + + Flag _flags; + int _pending_declick; + MeterPoint _meter_point; + + gain_t solo_gain; + gain_t mute_gain; + gain_t desired_solo_gain; + gain_t desired_mute_gain; - nframes_t check_initial_delay (nframes_t, nframes_t&, nframes_t&); + nframes_t _initial_delay; + nframes_t _roll_delay; + ProcessorList _processors; + Glib::RWLock _processor_lock; + IO *_control_outs; + Glib::Mutex _control_outs_lock; + RouteGroup *_edit_group; + RouteGroup *_mix_group; + std::string _comment; + bool _have_internal_generator; - void passthru (nframes_t start_frame, nframes_t end_frame, - nframes_t nframes, nframes_t offset, int declick, bool meter_inputs); + boost::shared_ptr _solo_control; + boost::shared_ptr _mute_control; - virtual void process_output_buffers (BufferSet& bufs, - nframes_t start_frame, nframes_t end_frame, - nframes_t nframes, nframes_t offset, bool with_processors, int declick, - bool meter); + /* tight cache-line access here is more important than sheer speed of access. + keep these after things that should be aligned + */ + + bool _muted : 1; + bool _soloed : 1; + bool _solo_safe : 1; + bool _recordable : 1; + bool _mute_affects_pre_fader : 1; + bool _mute_affects_post_fader : 1; + bool _mute_affects_control_outs : 1; + bool _mute_affects_main_outs : 1; + bool _silent : 1; + bool _declickable : 1; protected: @@ -345,10 +345,8 @@ class Route : public IO static uint32_t order_key_cnt; - struct ltstr - { - bool operator()(const char* s1, const char* s2) const - { + struct ltstr { + bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; @@ -359,11 +357,10 @@ class Route : public IO void input_change_handler (IOChange, void *src); void output_change_handler (IOChange, void *src); - int reset_plugin_counts (ProcessorStreams*); /* locked */ - int _reset_plugin_counts (ProcessorStreams*); /* unlocked */ - - /* processor I/O channels and plugin count handling */ + int reset_processor_counts (ProcessorStreams*); /* locked */ + int _reset_processor_counts (ProcessorStreams*); /* unlocked */ + /** processor I/O channels and plugin count handling */ struct ProcessorCount { boost::shared_ptr processor; ChanCount in; @@ -372,8 +369,9 @@ class Route : public IO ProcessorCount (boost::shared_ptr ins) : processor(ins) {} }; - int32_t apply_some_plugin_counts (std::list& iclist); - bool check_some_plugin_counts (std::list& iclist, ChanCount required_inputs, ProcessorStreams* err_streams); + int32_t apply_some_processor_counts (std::list& iclist); + bool check_some_processor_counts (std::list& iclist, + ChanCount required_inputs, ProcessorStreams* err_streams); void set_deferred_state (); void add_processor_from_xml (const XMLNode&);