X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Flv2_plugin.h;h=4cd34b30266ef6405c37a926c5089d5ec6480c81;hb=df59a000b79f891f17ec8a05b390982dac67e5ff;hp=b720c3614633474f1ec5eb2fb8c4baf934479dba;hpb=e05405acb35853bc3a760c3768a5548ab2cf8ad2;p=ardour.git diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index b720c36146..4cd34b3026 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -1,5 +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 @@ -15,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__ @@ -25,59 +24,61 @@ #include #include -#include - -#include "pbd/stateful.h" - -#include -#include - #include "ardour/plugin.h" #include "ardour/uri_map.h" +#include "ardour/worker.h" +#include "pbd/ringbuffer.h" 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 LV2World; class Session; -class LV2Plugin : public ARDOUR::Plugin +class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee { public: LV2Plugin (ARDOUR::AudioEngine& engine, ARDOUR::Session& session, - ARDOUR::LV2World& world, - SLV2Plugin plugin, + const void* c_plugin, framecnt_t sample_rate); LV2Plugin (const LV2Plugin &); ~LV2Plugin (); std::string unique_id () const; - - const char* label () const { return slv2_value_as_string(_name); } - const char* name () const { return slv2_value_as_string(_name); } - const char* maker () const { - return _author ? slv2_value_as_string (_author) : "Unknown"; - } - - uint32_t parameter_count () const { return slv2_plugin_get_num_ports(_plugin); } - 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; - - const void* extension_data (const char* uri) { - return _instance->lv2_descriptor->extension_data (uri); - } - - SLV2Plugin slv2_plugin () { return _plugin; } - SLV2UI slv2_ui () { return _ui; } - SLV2Port slv2_port (uint32_t i) { return slv2_plugin_get_port_by_index (_plugin, i); } - bool is_external_ui () const; + const char* uri () const; + const char* label () const; + 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; + 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; + + const void* c_plugin(); + const void* c_ui(); + const void* c_ui_type(); + + bool is_external_ui () 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; } @@ -90,8 +91,8 @@ class LV2Plugin : public ARDOUR::Plugin int set_block_size (pframes_t /*nframes*/) { return 0; } int connect_and_run (BufferSet& bufs, - ChanMapping in, ChanMapping out, - pframes_t nframes, framecnt_t offset); + ChanMapping in, ChanMapping out, + pframes_t nframes, framecnt_t offset); std::string describe_parameter (Evoral::Parameter); std::string state_node_name () const { return "lv2"; } @@ -102,12 +103,15 @@ 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; - static uint32_t midi_event_type () { return _midi_event_type; } + boost::shared_ptr + get_scale_points(uint32_t port_index) const; + + void set_insert_info(const PluginInsert* insert); int set_state (const XMLNode& node, int version); bool save_preset (std::string uri); @@ -116,27 +120,113 @@ 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: - void* _module; - LV2World& _world; - LV2_Feature** _features; - SLV2Plugin _plugin; - SLV2UI _ui; - SLV2Value _name; - SLV2Value _author; - SLV2Instance _instance; - framecnt_t _sample_rate; - float* _control_data; - float* _shadow_data; - float* _defaults; - float* _latency_control_port; - bool _was_activated; - bool _supports_persist; - std::vector _port_is_input; - + struct Impl; + 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; + /// 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); } LV2_DataAccess; @@ -144,25 +234,31 @@ class LV2Plugin : public ARDOUR::Plugin LV2_DataAccess _data_access_extension_data; LV2_Feature _data_access_feature; LV2_Feature _instance_access_feature; - LV2_Feature _persist_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; - static URIMap _uri_map; - static uint32_t _midi_event_type; + mutable unsigned _state_version; - static int lv2_persist_store_callback (void* callback_data, - uint32_t key, - const void* value, - size_t size, - uint32_t type, - uint32_t flags); + bool _was_activated; + bool _has_state_interface; - static const void* lv2_persist_retrieve_callback (void* callback_data, - uint32_t key, - size_t* size, - uint32_t* type, - uint32_t* flags); + 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; - void init (LV2World& world, SLV2Plugin plugin, framecnt_t rate); + static char* lv2_state_make_path (void* host_data, + const char* path); + + void init (const void* c_plugin, framecnt_t rate); + void allocate_atom_event_buffers (); void run (pframes_t nsamples); void latency_compute_run (); @@ -173,43 +269,16 @@ class LV2Plugin : public ARDOUR::Plugin }; -/** The SLV2World, and various cached (as symbols, fast) URIs. - * - * This object represents everything ardour 'knows' about LV2 - * (ie understood extensions/features/etc) - */ -class LV2World { -public: - LV2World (); - ~LV2World (); - - SLV2World world; - SLV2Value input_class; ///< Input port - SLV2Value output_class; ///< Output port - SLV2Value audio_class; ///< Audio port - SLV2Value control_class; ///< Control port - SLV2Value event_class; ///< Event port - SLV2Value midi_class; ///< MIDI event - SLV2Value in_place_broken; - SLV2Value integer; - SLV2Value toggled; - SLV2Value srate; - SLV2Value gtk_gui; - SLV2Value external_gui; - SLV2Value logarithmic; -}; - - class LV2PluginInfo : public PluginInfo { public: - LV2PluginInfo (void* slv2_world, void* slv2_plugin); + LV2PluginInfo (const void* c_plugin); ~LV2PluginInfo (); - static PluginInfoList* discover (void* slv2_world); + + static PluginInfoList* discover (); PluginPtr load (Session& session); - void* _lv2_world; - void* _slv2_plugin; + const void* _c_plugin; }; typedef boost::shared_ptr LV2PluginInfoPtr;