X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Flv2_plugin.h;h=9d4e2d1f68719ad308b31fcd20971b7732604ec6;hb=5c32fc3babdd3ed7d715b6aeb24a72f3a0f550a0;hp=4cd34b30266ef6405c37a926c5089d5ec6480c81;hpb=2b80aee20a01f70afe9997fd39c4ca8d19c8caf8;p=ardour.git diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 4cd34b3026..9d4e2d1f68 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -23,12 +23,23 @@ #include #include #include +#include #include "ardour/plugin.h" #include "ardour/uri_map.h" #include "ardour/worker.h" #include "pbd/ringbuffer.h" +#ifdef LV2_EXTENDED // -> needs to eventually go upstream to lv2plug.in +#include "ardour/lv2_extensions.h" +#endif + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +typedef struct LV2_Evbuf_Impl LV2_Evbuf; + namespace ARDOUR { // a callback function for lilv_state_new_from_instance(). friend of LV2Plugin @@ -41,7 +52,7 @@ const void* lv2plugin_get_port_value(const char* port_symbol, class AudioEngine; class Session; -class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee +class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee { public: LV2Plugin (ARDOUR::AudioEngine& engine, @@ -60,6 +71,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee uint32_t num_ports () const; uint32_t parameter_count () const; float default_value (uint32_t port); + framecnt_t max_latency () const; framecnt_t signal_latency () const; void set_parameter (uint32_t port, float val); float get_parameter (uint32_t port) const; @@ -68,6 +80,8 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const; uint32_t nth_parameter (uint32_t port, bool& ok) const; + IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const; + const void* extension_data (const char* uri) const; const void* c_plugin(); @@ -75,6 +89,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee const void* c_ui_type(); bool is_external_ui () const; + bool is_external_kx () const; bool ui_is_resizable () const; const char* port_symbol (uint32_t port) const; @@ -83,14 +98,17 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee const LV2_Feature* const* features () { return _features; } std::set automatable () const; + virtual void set_automation_control (uint32_t, boost::shared_ptr); void activate (); void deactivate (); void cleanup (); - int set_block_size (pframes_t /*nframes*/) { return 0; } + int set_block_size (pframes_t); + bool requires_fixed_sized_buffers () const; int connect_and_run (BufferSet& bufs, + framepos_t start, framepos_t end, double speed, ChanMapping in, ChanMapping out, pframes_t nframes, framecnt_t offset); @@ -108,10 +126,11 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee bool parameter_is_output (uint32_t) const; bool parameter_is_toggled (uint32_t) const; - boost::shared_ptr + boost::shared_ptr get_scale_points(uint32_t port_index) const; - void set_insert_info(const PluginInsert* insert); + void set_insert_id(PBD::ID id); + void set_state_dir (const std::string& d = ""); int set_state (const XMLNode& node, int version); bool save_preset (std::string uri); @@ -133,36 +152,21 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee uint32_t format, const void* buffer); - void enable_ui_emmission(); + void enable_ui_emission(); void emit_to_ui(void* controller, UIMessageSink sink); Worker* worker() { return _worker; } + URIMap& uri_map() { return _uri_map; } + const URIMap& uri_map() const { return _uri_map; } + int work(uint32_t size, const void* data); int work_response(uint32_t size, const void* data); - static URIMap _uri_map; - - struct URIDs { - uint32_t atom_Chunk; - uint32_t atom_Path; - uint32_t atom_Sequence; - uint32_t atom_eventTransfer; - uint32_t log_Error; - uint32_t log_Note; - uint32_t log_Warning; - uint32_t midi_MidiEvent; - uint32_t time_Position; - uint32_t time_bar; - uint32_t time_barBeat; - uint32_t time_beatUnit; - uint32_t time_beatsPerBar; - uint32_t time_beatsPerMinute; - uint32_t time_frame; - uint32_t time_speed; - }; - - static URIDs urids; + void set_property(uint32_t key, const Variant& value); + const PropertyDescriptors& get_supported_properties() const { return _property_descriptors; } + const ParameterDescriptor& get_property_descriptor(uint32_t id) const; + void announce_property_values(); private: struct Impl; @@ -182,6 +186,14 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee framepos_t _next_cycle_start; ///< Expected start frame of next run cycle double _next_cycle_speed; ///< Expected start frame of next run cycle PBD::ID _insert_id; + std::string _plugin_state_dir; + uint32_t _patch_port_in_index; + uint32_t _patch_port_out_index; + URIMap& _uri_map; + bool _no_sample_accurate_ctrl; + bool _can_write_automation; + framecnt_t _max_latency; + framecnt_t _current_latency; friend const void* lv2plugin_get_port_value(const char* port_symbol, void* user_data, @@ -196,7 +208,12 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee PORT_EVENT = 1 << 4, ///< Old event API event port PORT_SEQUENCE = 1 << 5, ///< New atom API event port PORT_MIDI = 1 << 6, ///< Event port understands MIDI - PORT_POSITION = 1 << 7 ///< Event port understands position + PORT_POSITION = 1 << 7, ///< Event port understands position + PORT_PATCHMSG = 1 << 8, ///< Event port supports patch:Message + PORT_AUTOCTRL = 1 << 9, ///< Event port supports auto:AutomationControl + PORT_CTRLED = 1 << 10, ///< Port prop auto:AutomationControlled (can be self controlled) + PORT_CTRLER = 1 << 11, ///< Port prop auto:AutomationController (can be self set) + PORT_NOAUTO = 1 << 12 ///< Port don't allow to automate } PortFlag; typedef unsigned PortFlags; @@ -205,6 +222,27 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee std::vector _port_minimumSize; std::map _port_indices; + PropertyDescriptors _property_descriptors; + + struct AutomationCtrl { + AutomationCtrl (const AutomationCtrl &other) + : ac (other.ac) + , guard (other.guard) + { } + + AutomationCtrl (boost::shared_ptr c) + : ac (c) + , guard (false) + { } + boost::shared_ptr ac; + bool guard; + }; + + typedef boost::shared_ptr AutomationCtrlPtr; + typedef std::map AutomationCtrlMap; + AutomationCtrlMap _ctrl_map; + AutomationCtrlPtr get_automation_control (uint32_t); + /// Message send to/from UI via ports struct UIMessage { uint32_t index; @@ -227,6 +265,10 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee RingBuffer* _to_ui; RingBuffer* _from_ui; +#ifdef LV2_EXTENDED + const LV2_Inline_Display_Interface* _display_interface; +#endif + typedef struct { const void* (*extension_data) (const char* uri); } LV2_DataAccess; @@ -239,9 +281,11 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee LV2_Feature _work_schedule_feature; LV2_Feature _options_feature; LV2_Feature _def_state_feature; +#ifdef LV2_EXTENDED + LV2_Feature _queue_draw_feature; +#endif // Options passed to plugin - int32_t _block_length; int32_t _seq_size; mutable unsigned _state_version; @@ -261,6 +305,13 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee void allocate_atom_event_buffers (); void run (pframes_t nsamples); + void load_supported_properties(PropertyDescriptors& descs); + +#ifdef LV2_EXTENDED + bool has_inline_display (); + Plugin::Display_Image_Surface* render_inline_display (uint32_t, uint32_t); +#endif + void latency_compute_run (); std::string do_save_preset (std::string); void do_remove_preset (std::string); @@ -269,16 +320,19 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee }; -class LV2PluginInfo : public PluginInfo { +class LIBARDOUR_API LV2PluginInfo : public PluginInfo , public boost::enable_shared_from_this { public: - LV2PluginInfo (const void* c_plugin); + LV2PluginInfo (const char* plugin_uri); ~LV2PluginInfo (); static PluginInfoList* discover (); PluginPtr load (Session& session); + std::vector get_presets (bool user_only) const; + virtual bool in_category (const std::string &c) const; + virtual bool is_instrument() const; - const void* _c_plugin; + char * _plugin_uri; }; typedef boost::shared_ptr LV2PluginInfoPtr;