Update recorded MIDI regions as notes arrive. Fixes one cause of infinite note-lengt...
[ardour.git] / libs / ardour / ardour / lv2_plugin.h
index d20ece65bdb83acee97151cf79e0837def61560a..329af1151fbef3449a48f8fdf27bb6273439d432 100644 (file)
 #include <string>
 #include <dlfcn.h>
 
-#include <sigc++/signal.h>
 
-#include <pbd/stateful.h> 
+#include "pbd/stateful.h"
 
 #include <jack/types.h>
 #include <slv2/slv2.h>
-#include <ardour/plugin.h>
+#include "ardour/plugin.h"
+#include "ardour/uri_map.h"
 
 namespace ARDOUR {
 class AudioEngine;
@@ -47,7 +47,7 @@ class LV2Plugin : public ARDOUR::Plugin
        ~LV2Plugin ();
 
        /* Plugin interface */
-       
+
        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); }
@@ -60,12 +60,20 @@ class LV2Plugin : public ARDOUR::Plugin
        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; }
+       bool       is_external_ui() const;
        SLV2Port   slv2_port(uint32_t i) { return slv2_plugin_get_port_by_index(_plugin, i); }
-       
-       std::set<Parameter> automatable() const;
 
-       void activate () { 
+       const char* port_symbol(uint32_t port);
+
+       const LV2_Feature* const* features() { return _features; }
+
+       std::set<Evoral::Parameter> automatable() const;
+
+       void activate () {
                if (!_was_activated) {
                        slv2_instance_activate(_instance);
                        _was_activated = true;
@@ -86,10 +94,13 @@ class LV2Plugin : public ARDOUR::Plugin
                _instance = NULL;
        }
 
-       void set_block_size (nframes_t nframes) {}
-       
-       int         connect_and_run (BufferSet& bufs, uint32_t& in, uint32_t& out, nframes_t nframes, nframes_t offset);
-       std::string describe_parameter (Parameter);
+       int  set_block_size (nframes_t /*nframes*/) { return 0; }
+
+       int connect_and_run (BufferSet& bufs,
+                       ChanMapping in, ChanMapping out,
+                       nframes_t nframes, nframes_t offset);
+
+       std::string describe_parameter (Evoral::Parameter);
        std::string state_node_name() const { return "lv2"; }
        void        print_parameter (uint32_t, char*, uint32_t len) const;
 
@@ -100,18 +111,22 @@ class LV2Plugin : public ARDOUR::Plugin
        bool parameter_is_output(uint32_t) const;
        bool parameter_is_toggled(uint32_t) const;
 
+       static uint32_t midi_event_type() { return _midi_event_type; }
+
        XMLNode& get_state();
-       int      set_state(const XMLNode& node);
-       bool     save_preset(std::string name);
+       int      set_state(const XMLNode& node, int version);
+       bool     save_preset(std::string uri);
+       bool     load_preset(const std::string& uri);
+       virtual std::vector<Plugin::PresetRecord> get_presets();
 
-       bool has_editor() const { return false; }
+       bool has_editor() const;
 
-       int require_output_streams (uint32_t);
-       
   private:
        void*                    _module;
        LV2World&                _world;
+       LV2_Feature**            _features;
        SLV2Plugin               _plugin;
+       SLV2UI                   _ui;
        SLV2Value                _name;
        SLV2Value                _author;
        SLV2Instance             _instance;
@@ -121,7 +136,16 @@ class LV2Plugin : public ARDOUR::Plugin
        float*                   _defaults;
        float*                   _latency_control_port;
        bool                     _was_activated;
-       vector<bool>             _port_is_input;
+       std::vector<bool>        _port_is_input;
+       std::map<std::string,uint32_t> _port_indices;
+
+       typedef struct { const void* (*extension_data)(const char* uri); } LV2_DataAccess;
+       LV2_DataAccess _data_access_extension_data;
+       LV2_Feature _data_access_feature;
+       LV2_Feature _instance_access_feature;
+
+       static URIMap   _uri_map;
+       static uint32_t _midi_event_type;
 
        void init (LV2World& world, SLV2Plugin plugin, nframes_t rate);
        void run (nframes_t nsamples);
@@ -149,14 +173,17 @@ struct LV2World {
        SLV2Value integer;
        SLV2Value toggled;
        SLV2Value srate;
+       SLV2Value gtk_gui;
+       SLV2Value external_gui;
+       SLV2Value logarithmic;
 };
 
 
 class LV2PluginInfo : public PluginInfo {
-public:        
+public:
        LV2PluginInfo (void* slv2_world, void* slv2_plugin);;
        ~LV2PluginInfo ();;
-       static PluginInfoList discover (void* slv2_world);
+       static PluginInfoList* discover (void* slv2_world);
 
        PluginPtr load (Session& session);