X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Flv2_plugin.h;h=c3d437b6f741f9585e6031dce6773dbf16305bef;hb=7872e4033f236356f0b5a10d0a4eb889adca52d2;hp=a9cb2cb260043aba1d96dab58f686e586033d8ae;hpb=b0e4f81eb3a38b7236ec39f11d5211840a064d15;p=ardour.git diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index a9cb2cb260..c3d437b6f7 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -20,15 +20,27 @@ #ifndef __ardour_lv2_plugin_h__ #define __ardour_lv2_plugin_h__ +#include #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 @@ -51,6 +63,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee LV2Plugin (const LV2Plugin &); ~LV2Plugin (); + static bool force_state_save; + std::string unique_id () const; const char* uri () const; const char* label () const; @@ -60,6 +74,7 @@ class LIBARDOUR_API 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; @@ -67,6 +82,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee std::string get_parameter_docs(uint32_t which) const; int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const; uint32_t nth_parameter (uint32_t port, bool& ok) const; + bool get_layout (uint32_t which, UILayoutHint&) const; + + IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const; const void* extension_data (const char* uri) const; @@ -84,14 +102,17 @@ class LIBARDOUR_API 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); @@ -109,10 +130,13 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee bool parameter_is_output (uint32_t) const; bool parameter_is_toggled (uint32_t) const; - boost::shared_ptr + uint32_t designated_bypass_port (); + + 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); @@ -134,36 +158,21 @@ class LIBARDOUR_API 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; } - int work(uint32_t size, const void* data); - int work_response(uint32_t size, const void* data); + URIMap& uri_map() { return _uri_map; } + const URIMap& uri_map() const { return _uri_map; } - 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; - }; + int work(Worker& worker, uint32_t size, const void* data); + int work_response(uint32_t size, const void* data); - 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; @@ -171,6 +180,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee void* _module; LV2_Feature** _features; Worker* _worker; + Worker* _state_worker; framecnt_t _sample_rate; float* _control_data; float* _shadow_data; @@ -182,7 +192,17 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee float* _latency_control_port; ///< Special output set by ardour framepos_t _next_cycle_start; ///< Expected start frame of next run cycle double _next_cycle_speed; ///< Expected start frame of next run cycle + double _next_cycle_beat; ///< Expected bar_beat of next run cycle + double _current_bpm; 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, @@ -197,7 +217,12 @@ class LIBARDOUR_API 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; @@ -206,6 +231,27 @@ class LIBARDOUR_API 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; @@ -228,6 +274,28 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee RingBuffer* _to_ui; RingBuffer* _from_ui; + Glib::Threads::Mutex _work_mutex; + +#ifdef LV2_EXTENDED + static void queue_draw (LV2_Inline_Display_Handle); + static void midnam_update (LV2_Midnam_Handle); + static void bankpatch_notify (LV2_BankPatch_Handle, uint8_t, uint32_t, uint8_t); + + const LV2_Inline_Display_Interface* _display_interface; + bool _inline_display_in_gui; + const LV2_Midnam_Interface* _midname_interface; + + uint32_t _bankpatch[16]; + bool seen_bankpatch; + bool knows_bank_patch () { return seen_bankpatch; } + uint32_t bank_patch (uint8_t chn) { + assert (chn < 16); + if (chn > 15) return UINT32_MAX; + return _bankpatch[chn]; + } + +#endif + typedef struct { const void* (*extension_data) (const char* uri); } LV2_DataAccess; @@ -240,9 +308,13 @@ class LIBARDOUR_API 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; + LV2_Feature _midnam_feature; + LV2_Feature _bankpatch_feature; +#endif // Options passed to plugin - int32_t _block_length; int32_t _seq_size; mutable unsigned _state_version; @@ -260,7 +332,20 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee void init (const void* c_plugin, framecnt_t rate); void allocate_atom_event_buffers (); - void run (pframes_t nsamples); + void run (pframes_t nsamples, bool sync_work = false); + + void load_supported_properties(PropertyDescriptors& descs); + +#ifdef LV2_EXTENDED + bool has_inline_display (); + bool inline_display_in_gui (); + Plugin::Display_Image_Surface* render_inline_display (uint32_t, uint32_t); + + bool has_midnam (); + bool read_midnam (); + std::string midnam_model (); + bool _midnam_dirty; +#endif void latency_compute_run (); std::string do_save_preset (std::string); @@ -270,16 +355,19 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee }; -class LIBARDOUR_API 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;