X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Flv2_plugin.h;h=6b4b1a1c67461e073cd2c8f169a0349e20a1b67e;hb=ff9e1dfe602ab7b54d49849373fb2ce265c4f4a0;hp=6396e300385efdb286af6289075fd000ac08f3a4;hpb=0bd3105f50f3c82586e0924a4be9977425caaf90;p=ardour.git diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 6396e30038..6b4b1a1c67 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -1,6 +1,5 @@ - /* - Copyright (C) 2008-2011 Paul Davis + Copyright (C) 2008-2012 Paul Davis Author: David Robillard This program is free software; you can redistribute it and/or modify @@ -16,7 +15,6 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ #ifndef __ardour_lv2_plugin_h__ @@ -26,26 +24,31 @@ #include #include -#include - -#include "pbd/stateful.h" - -#include - #include "ardour/plugin.h" #include "ardour/uri_map.h" +#include "ardour/worker.h" +#include "pbd/ringbuffer.h" + +typedef struct LV2_Evbuf_Impl LV2_Evbuf; namespace ARDOUR { +// a callback function for lilv_state_new_from_instance(). friend of LV2Plugin +// so we can pass an LV2Plugin* in user_data and access its private members. +const void* lv2plugin_get_port_value(const char* port_symbol, + void* user_data, + uint32_t* size, + uint32_t* type); + class AudioEngine; class Session; -class LV2Plugin : public ARDOUR::Plugin +class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee { public: LV2Plugin (ARDOUR::AudioEngine& engine, ARDOUR::Session& session, - void* c_plugin, + const void* c_plugin, framecnt_t sample_rate); LV2Plugin (const LV2Plugin &); ~LV2Plugin (); @@ -56,24 +59,29 @@ class LV2Plugin : public ARDOUR::Plugin const char* name () const; const char* maker () const; - uint32_t num_ports () const; - uint32_t parameter_count () const; - float default_value (uint32_t port); - framecnt_t signal_latency () const; - void set_parameter (uint32_t port, float val); - float get_parameter (uint32_t port) const; - int get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const; - uint32_t nth_parameter (uint32_t port, bool& ok) const; + uint32_t num_ports () const; + uint32_t parameter_count () const; + float default_value (uint32_t port); + framecnt_t signal_latency () const; + void set_parameter (uint32_t port, float val); + float get_parameter (uint32_t port) const; + std::string get_docs() const; + 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; const void* extension_data (const char* uri) const; - void* c_plugin(); - void* c_ui(); - void* c_ui_type(); + const void* c_plugin(); + const void* c_ui(); + 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; + uint32_t port_index (const char* symbol) const; const LV2_Feature* const* features () { return _features; } @@ -98,7 +106,7 @@ class LV2Plugin : public ARDOUR::Plugin bool parameter_is_audio (uint32_t) const; bool parameter_is_control (uint32_t) const; - bool parameter_is_midi (uint32_t) const; + bool parameter_is_event (uint32_t) const; bool parameter_is_input (uint32_t) const; bool parameter_is_output (uint32_t) const; bool parameter_is_toggled (uint32_t) const; @@ -106,8 +114,6 @@ class LV2Plugin : public ARDOUR::Plugin boost::shared_ptr get_scale_points(uint32_t port_index) const; - static uint32_t midi_event_type () { return _midi_event_type; } - void set_insert_info(const PluginInsert* insert); int set_state (const XMLNode& node, int version); @@ -117,24 +123,112 @@ class LV2Plugin : public ARDOUR::Plugin std::string current_preset () const; bool has_editor () const; + bool has_message_output () const; + + bool write_from_ui(uint32_t index, + uint32_t protocol, + uint32_t size, + const uint8_t* body); + + typedef void UIMessageSink(void* controller, + uint32_t index, + uint32_t size, + uint32_t format, + const void* buffer); + + void enable_ui_emmission(); + 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); + + 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; private: struct Impl; - Impl* _impl; - void* _module; - LV2_Feature** _features; - framecnt_t _sample_rate; - float* _control_data; - float* _shadow_data; - float* _defaults; - float* _latency_control_port; - bool _was_activated; - bool _has_state_interface; - std::vector _port_is_input; - + Impl* _impl; + void* _module; + LV2_Feature** _features; + Worker* _worker; + framecnt_t _sample_rate; + float* _control_data; + float* _shadow_data; + float* _defaults; + LV2_Evbuf** _ev_buffers; + LV2_Evbuf** _atom_ev_buffers; + float* _bpm_control_port; ///< Special input set by ardour + float* _freewheel_control_port; ///< Special input set by ardour + 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 + PBD::ID _insert_id; + + friend const void* lv2plugin_get_port_value(const char* port_symbol, + void* user_data, + uint32_t* size, + uint32_t* type); + + typedef enum { + PORT_INPUT = 1, ///< Input port + PORT_OUTPUT = 1 << 1, ///< Output port + PORT_AUDIO = 1 << 2, ///< Audio (buffer of float) + PORT_CONTROL = 1 << 3, ///< Control (single float) + 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 + } PortFlag; + + typedef unsigned PortFlags; + + std::vector _port_flags; + std::vector _port_minimumSize; std::map _port_indices; - PBD::ID _insert_id; + /// Message send to/from UI via ports + struct UIMessage { + uint32_t index; + uint32_t protocol; + uint32_t size; + }; + + bool write_to_ui(uint32_t index, + uint32_t protocol, + uint32_t size, + const uint8_t* body); + + bool write_to(RingBuffer* dest, + uint32_t index, + uint32_t protocol, + uint32_t size, + const uint8_t* body); + + // Created on demand so the space is only consumed if necessary + RingBuffer* _to_ui; + RingBuffer* _from_ui; typedef struct { const void* (*extension_data) (const char* uri); @@ -143,38 +237,31 @@ class LV2Plugin : public ARDOUR::Plugin LV2_DataAccess _data_access_extension_data; LV2_Feature _data_access_feature; LV2_Feature _instance_access_feature; - LV2_Feature _map_path_feature; LV2_Feature _make_path_feature; + LV2_Feature _log_feature; + LV2_Feature _work_schedule_feature; + LV2_Feature _options_feature; + LV2_Feature _def_state_feature; + + // Options passed to plugin + int32_t _block_length; + int32_t _seq_size; + + mutable unsigned _state_version; + + bool _was_activated; + bool _has_state_interface; + + const std::string plugin_dir () const; + const std::string scratch_dir () const; + const std::string file_dir () const; + const std::string state_dir (unsigned num) const; - static URIMap _uri_map; - static uint32_t _midi_event_type; - static uint32_t _state_path_type; - - const std::string state_dir () const; - - static int - lv2_state_store_callback (void* handle, - uint32_t key, - const void* value, - size_t size, - uint32_t type, - uint32_t flags); - - static const void* - lv2_state_retrieve_callback (void* handle, - uint32_t key, - size_t* size, - uint32_t* type, - uint32_t* flags); - - static char* lv2_state_abstract_path (void* host_data, - const char* absolute_path); - static char* lv2_state_absolute_path (void* host_data, - const char* abstract_path); static char* lv2_state_make_path (void* host_data, const char* path); - void init (void* c_plugin, framecnt_t rate); + void init (const void* c_plugin, framecnt_t rate); + void allocate_atom_event_buffers (); void run (pframes_t nsamples); void latency_compute_run (); @@ -187,14 +274,14 @@ class LV2Plugin : public ARDOUR::Plugin class LV2PluginInfo : public PluginInfo { public: - LV2PluginInfo (void* c_plugin); + LV2PluginInfo (const void* c_plugin); ~LV2PluginInfo (); static PluginInfoList* discover (); PluginPtr load (Session& session); - void* _c_plugin; + const void* _c_plugin; }; typedef boost::shared_ptr LV2PluginInfoPtr;