X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Flv2_plugin.h;h=5154cd4d3e710cc8148e3a3322f2c44ed9096ef0;hb=490311bc081b12d328e6e02cac8170538e96fb2f;hp=cf764b34d28e48116adef09141378d7f51b3e8d8;hpb=1e6694f41af3ba3b25fb19ed802f6806b0b6f0ef;p=ardour.git diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index cf764b34d2..5154cd4d3e 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 @@ -26,19 +26,29 @@ #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 (); @@ -49,24 +59,28 @@ 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 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; } @@ -99,11 +113,6 @@ class LV2Plugin : public ARDOUR::Plugin boost::shared_ptr get_scale_points(uint32_t port_index) const; - /// Return the URID of midi:MidiEvent - static uint32_t midi_event_type (bool event_api) { - return event_api ? _midi_event_type_ev : _midi_event_type; - } - void set_insert_info(const PluginInsert* insert); int set_state (const XMLNode& node, int version); @@ -115,9 +124,10 @@ class LV2Plugin : public ARDOUR::Plugin bool has_editor () const; bool has_message_output () const; - uint32_t atom_eventTransfer() const; - - void write_from_ui(uint32_t index, uint32_t protocol, uint32_t size, uint8_t* body); + 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, @@ -125,35 +135,76 @@ class LV2Plugin : public ARDOUR::Plugin 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; + Worker* _worker; framecnt_t _sample_rate; float* _control_data; float* _shadow_data; float* _defaults; LV2_Evbuf** _ev_buffers; - float* _latency_control_port; + 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, - PORT_OUTPUT = 1 << 1, - PORT_AUDIO = 1 << 2, - PORT_CONTROL = 1 << 3, - PORT_EVENT = 1 << 4, - PORT_MESSAGE = 1 << 5 + 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 @@ -163,16 +214,16 @@ class LV2Plugin : public ARDOUR::Plugin uint32_t size; }; - void write_to_ui(uint32_t index, - uint32_t protocol, - uint32_t size, - uint8_t* body); + bool write_to_ui(uint32_t index, + uint32_t protocol, + uint32_t size, + const uint8_t* body); - void write_to(RingBuffer* dest, + bool write_to(RingBuffer* dest, uint32_t index, uint32_t protocol, uint32_t size, - uint8_t* body); + const uint8_t* body); // Created on demand so the space is only consumed if necessary RingBuffer* _to_ui; @@ -186,18 +237,20 @@ class LV2Plugin : public ARDOUR::Plugin LV2_Feature _data_access_feature; LV2_Feature _instance_access_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; - static uint32_t _midi_event_type_ev; - static uint32_t _midi_event_type; - static uint32_t _sequence_type; - static uint32_t _event_transfer_type; - static uint32_t _state_path_type; - const std::string plugin_dir () const; const std::string scratch_dir () const; const std::string file_dir () const; @@ -206,7 +259,8 @@ class LV2Plugin : public ARDOUR::Plugin 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 (); @@ -219,14 +273,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;