X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fplugin_insert.h;h=30dd04057a2402f616bdecde7159661e0f09a6bf;hb=d1cf21634f6a959618a18c25800a4c9bd32bfdc4;hp=d3936cc7975feb7df66cdc3458d38feafd8c482f;hpb=c104c9d4726f3ba1ecd352d13b88a57f2f964510;p=ardour.git diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index d3936cc797..30dd04057a 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -25,6 +25,8 @@ #include +#include "pbd/timing.h" + #include "ardour/ardour.h" #include "ardour/libardour_visibility.h" #include "ardour/chan_mapping.h" @@ -34,6 +36,7 @@ #include "ardour/parameter_descriptor.h" #include "ardour/plugin.h" #include "ardour/processor.h" +#include "ardour/readonly_control.h" #include "ardour/sidechain.h" #include "ardour/automation_control.h" @@ -49,21 +52,19 @@ class Plugin; */ class LIBARDOUR_API PluginInsert : public Processor { - public: +public: PluginInsert (Session&, boost::shared_ptr = boost::shared_ptr()); ~PluginInsert (); static const std::string port_automation_node_name; - XMLNode& state(bool); - XMLNode& get_state(void); int set_state(const XMLNode&, int version); void update_id (PBD::ID); void set_owner (SessionObject*); void set_state_dir (const std::string& d = ""); - void run (BufferSet& in, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes, bool); - void silence (framecnt_t nframes, framepos_t start_frame); + void run (BufferSet& in, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes, bool); + void silence (samplecnt_t nframes, samplepos_t start_sample); void activate (); void deactivate (); @@ -76,6 +77,11 @@ class LIBARDOUR_API PluginInsert : public Processor bool reset_parameters_to_default (); bool can_reset_all_parameters (); + bool write_immediate_event (size_t size, const uint8_t* buf); + + void automation_run (samplepos_t, pframes_t); + bool find_next_event (double, double, Evoral::ControlEvent&, bool only_active = true) const; + int set_block_size (pframes_t nframes); ChanMapping input_map (uint32_t num) const { @@ -109,6 +115,10 @@ class LIBARDOUR_API PluginInsert : public Processor #ifdef MIXBUS bool is_channelstrip () const; + bool is_nonbypassable () const; +#else + bool is_channelstrip () const { return false; } + bool is_nonbypassable () const { return false; } #endif void set_input_map (uint32_t, ChanMapping); @@ -117,6 +127,7 @@ class LIBARDOUR_API PluginInsert : public Processor bool reset_map (bool emit = true); bool sanitize_maps (); bool check_inplace (); + bool configured () const { return _configured; } // these are ports visible on the outside ChanCount output_streams() const; @@ -159,7 +170,7 @@ class LIBARDOUR_API PluginInsert : public Processor bool set_preset_out (const ChanCount&); bool add_sidechain (uint32_t n_audio = 1, uint32_t n_midi = 0); bool del_sidechain (); - void set_sidechain_latency (uint32_t, uint32_t); + void update_sidechain_name (); boost::shared_ptr sidechain () const { return _sidechain; } // end C++ class slavery! @@ -172,7 +183,9 @@ class LIBARDOUR_API PluginInsert : public Processor bool has_no_inputs() const; bool has_no_audio_inputs() const; + bool is_instrument () const; + bool has_output_presets ( ChanCount in = ChanCount (DataType::MIDI, 1), ChanCount out = ChanCount (DataType::AUDIO, 2) @@ -184,6 +197,10 @@ class LIBARDOUR_API PluginInsert : public Processor bool load_preset (Plugin::PresetRecord); + bool provides_stats () const; + bool get_stats (uint64_t& min, uint64_t& max, double& avg, double& dev) const; + void clear_stats (); + /** A control that manipulates a plugin parameter (control port). */ struct PluginControl : public AutomationControl { @@ -198,7 +215,7 @@ class LIBARDOUR_API PluginInsert : public Processor private: PluginInsert* _plugin; - bool actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override); + void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override); }; /** A control that manipulates a plugin property (message). */ @@ -211,8 +228,8 @@ class LIBARDOUR_API PluginInsert : public Processor double get_value (void) const; XMLNode& get_state(); - protected: - bool actually_set_value (double value, PBD::Controllable::GroupControlDisposition); + protected: + void actually_set_value (double value, PBD::Controllable::GroupControlDisposition); private: PluginInsert* _plugin; @@ -227,7 +244,7 @@ class LIBARDOUR_API PluginInsert : public Processor } } - framecnt_t plugin_latency () const; + samplecnt_t plugin_latency () const; bool has_sidechain () const { return _sidechain ? true : false; @@ -242,13 +259,15 @@ class LIBARDOUR_API PluginInsert : public Processor PluginType type (); + boost::shared_ptr control_output (uint32_t) const; + std::string describe_parameter (Evoral::Parameter param); - framecnt_t signal_latency () const; + samplecnt_t signal_latency () const; boost::shared_ptr get_impulse_analysis_plugin(); - void collect_signal_for_analysis (framecnt_t nframes); + void collect_signal_for_analysis (samplecnt_t nframes); bool strict_io_configured () const { return _match.strict_io; @@ -295,7 +314,10 @@ class LIBARDOUR_API PluginInsert : public Processor bool custom_cfg; ///< custom config (if not strict) }; - private: +protected: + XMLNode& state (); + +private: /* disallow copy construction */ PluginInsert (const PluginInsert&); @@ -315,8 +337,8 @@ class LIBARDOUR_API PluginInsert : public Processor boost::weak_ptr _impulseAnalysisPlugin; - framecnt_t _signal_analysis_collected_nframes; - framecnt_t _signal_analysis_collect_nframes_max; + samplecnt_t _signal_analysis_collected_nframes; + samplecnt_t _signal_analysis_collect_nframes_max; BufferSet _signal_analysis_inputs; BufferSet _signal_analysis_outputs; @@ -346,15 +368,32 @@ class LIBARDOUR_API PluginInsert : public Processor /** details of the match currently being used */ Match _match; - typedef std::map PinMappings; + /* ordered map [plugin instance ID] => ARDOUR::ChanMapping + * TODO: consider replacing with boost::flat_map<> or std::vector<>. + */ + class PinMappings : public std::map { + public: + /* this emulates C++11's std::map::at() + * return mapping for given plugin instance */ + inline ARDOUR::ChanMapping const& p (const uint32_t i) const { +#ifndef NDEBUG + const_iterator x = find (i); + assert (x != end ()); + return x->second; +#else + return find(i)->second; +#endif + } + }; + PinMappings _in_map; PinMappings _out_map; ChanMapping _thru_map; // out-idx <= in-idx - void automation_run (BufferSet& bufs, framepos_t start, framepos_t end, double speed, pframes_t nframes); - void connect_and_run (BufferSet& bufs, framepos_t start, framecnt_t end, double speed, pframes_t nframes, framecnt_t offset, bool with_auto); + void automate_and_run (BufferSet& bufs, samplepos_t start, samplepos_t end, double speed, pframes_t nframes); + void connect_and_run (BufferSet& bufs, samplepos_t start, samplecnt_t end, double speed, pframes_t nframes, samplecnt_t offset, bool with_auto); void bypass (BufferSet& bufs, pframes_t nframes); - void inplace_silence_unconnected (BufferSet&, const PinMappings&, framecnt_t nframes, framecnt_t offset) const; + void inplace_silence_unconnected (BufferSet&, const PinMappings&, samplecnt_t nframes, samplecnt_t offset) const; void create_automatable_parameters (); void control_list_automation_state_changed (Evoral::Parameter, AutoState); @@ -367,12 +406,22 @@ class LIBARDOUR_API PluginInsert : public Processor boost::shared_ptr plugin_factory (boost::shared_ptr); void add_plugin (boost::shared_ptr); + void add_sidechain_from_xml (const XMLNode& node, int version); + void start_touch (uint32_t param_id); void end_touch (uint32_t param_id); void latency_changed (); bool _latency_changed; uint32_t _bypass_port; + + typedef std::map >CtrlOutMap; + CtrlOutMap _control_outputs; + + void preset_load_set_value (uint32_t, float); + + PBD::TimingStats _timing_stats; + volatile gint _stat_reset; }; } // namespace ARDOUR