prototype online self-automating LV2 plugin interface
[ardour.git] / libs / ardour / ardour / lv2_plugin.h
index 82912a947d3fdaab22e066f429e05a78eab41961..aacef82e5b6b6ac4488f4fc457a36347f075a85e 100644 (file)
 #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
@@ -91,12 +95,14 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        const LV2_Feature* const* features () { return _features; }
 
        std::set<Evoral::Parameter> automatable () const;
+       virtual void set_automation_control (uint32_t, boost::shared_ptr<AutomationControl>);
 
        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,
                             ChanMapping in, ChanMapping out,
@@ -119,7 +125,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        boost::shared_ptr<ScalePoints>
        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);
@@ -146,42 +153,16 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
        Worker* worker() { return _worker; }
 
+       URIMap&       uri_map()       { return _uri_map; }
+       const URIMap& uri_map() const { return _uri_map; }
+
        int work(uint32_t size, const void* data);
        int work_response(uint32_t size, const void* data);
 
-       void set_property(uint32_t key, const Variant& value);
-       void get_supported_properties(std::vector<ParameterDescriptor>& descs);
-       void announce_property_values();
-
-       static URIMap _uri_map;
-
-       struct URIDs {
-               uint32_t atom_Chunk;
-               uint32_t atom_Path;
-               uint32_t atom_Sequence;
-               uint32_t atom_eventTransfer;
-               uint32_t atom_URID;
-               uint32_t atom_Blank;
-               uint32_t atom_Object;
-               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;
-               uint32_t patch_Get;
-               uint32_t patch_Set;
-               uint32_t patch_property;
-               uint32_t patch_value;
-       };
-
-       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;
@@ -201,8 +182,12 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        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;
+       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;
 
        friend const void* lv2plugin_get_port_value(const char* port_symbol,
                                                    void*       user_data,
@@ -218,7 +203,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
                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_PATCHMSG = 1 << 8   ///< Event port supports patch:Message
+               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)
        } PortFlag;
 
        typedef unsigned PortFlags;
@@ -227,6 +214,27 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        std::vector<size_t>            _port_minimumSize;
        std::map<std::string,uint32_t> _port_indices;
 
+       PropertyDescriptors _property_descriptors;
+
+       struct AutomationCtrl {
+               AutomationCtrl (const AutomationCtrl &other)
+                       : ac (other.ac)
+                       , guard (other.guard)
+               { }
+
+               AutomationCtrl (boost::shared_ptr<ARDOUR::AutomationControl> c)
+                       : ac (c)
+                       , guard (false)
+               { }
+               boost::shared_ptr<ARDOUR::AutomationControl> ac;
+               bool guard;
+       };
+
+       typedef boost::shared_ptr<AutomationCtrl> AutomationCtrlPtr;
+       typedef std::map<uint32_t, AutomationCtrlPtr> AutomationCtrlMap;
+       AutomationCtrlMap _ctrl_map;
+       AutomationCtrlPtr get_automation_control (uint32_t);
+
        /// Message send to/from UI via ports
        struct UIMessage {
                uint32_t index;
@@ -263,7 +271,6 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        LV2_Feature    _def_state_feature;
 
        // Options passed to plugin
-       int32_t _block_length;
        int32_t _seq_size;
 
        mutable unsigned _state_version;
@@ -283,6 +290,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        void allocate_atom_event_buffers ();
        void run (pframes_t nsamples);
 
+       void load_supported_properties(PropertyDescriptors& descs);
+
        void latency_compute_run ();
        std::string do_save_preset (std::string);
        void do_remove_preset (std::string);
@@ -299,6 +308,9 @@ public:
        static PluginInfoList* discover ();
 
        PluginPtr load (Session& session);
+       std::vector<Plugin::PresetRecord> get_presets (bool user_only) const;
+       virtual bool in_category (const std::string &c) const;
+       virtual bool is_instrument() const;
 
        char * _plugin_uri;
 };