variable plugin port config.
[ardour.git] / libs / ardour / ardour / lv2_plugin.h
index 093d77817b7f72503a28e5526733029b945a2d97..34e68fdc7f22419a3da03ab7d04eb318a261bc19 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
@@ -67,6 +71,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        uint32_t    num_ports () const;
        uint32_t    parameter_count () const;
        float       default_value (uint32_t port);
+       framecnt_t  max_latency () const;
        framecnt_t  signal_latency () const;
        void        set_parameter (uint32_t port, float val);
        float       get_parameter (uint32_t port) const;
@@ -75,6 +80,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        int         get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const;
        uint32_t    nth_parameter (uint32_t port, bool& ok) const;
 
+       IOPortDescription describe_io_port (DataType dt, bool input, uint32_t id) const;
+
        const void* extension_data (const char* uri) const;
 
        const void* c_plugin();
@@ -91,6 +98,7 @@ 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 ();
@@ -182,6 +190,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        uint32_t      _patch_port_out_index;
        URIMap&       _uri_map;
        bool          _no_sample_accurate_ctrl;
+       bool          _can_write_automation;
+       framecnt_t    _max_latency;
+       framecnt_t    _current_latency;
 
        friend const void* lv2plugin_get_port_value(const char* port_symbol,
                                                    void*       user_data,
@@ -197,7 +208,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;
@@ -208,6 +221,25 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
        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;
@@ -230,6 +262,10 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        RingBuffer<uint8_t>* _to_ui;
        RingBuffer<uint8_t>* _from_ui;
 
+#ifdef LV2_EXTENDED
+       const LV2_Inline_Display_Interface* _display_interface;
+#endif
+
        typedef struct {
                const void* (*extension_data) (const char* uri);
        } LV2_DataAccess;
@@ -242,6 +278,9 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        LV2_Feature    _work_schedule_feature;
        LV2_Feature    _options_feature;
        LV2_Feature    _def_state_feature;
+#ifdef LV2_EXTENDED
+       LV2_Feature    _queue_draw_feature;
+#endif
 
        // Options passed to plugin
        int32_t _seq_size;
@@ -265,6 +304,11 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
        void load_supported_properties(PropertyDescriptors& descs);
 
+#ifdef LV2_EXTENDED
+       bool has_inline_display ();
+       Plugin::Display_Image_Surface* render_inline_display (uint32_t, uint32_t);
+#endif
+
        void latency_compute_run ();
        std::string do_save_preset (std::string);
        void do_remove_preset (std::string);
@@ -281,7 +325,7 @@ public:
        static PluginInfoList* discover ();
 
        PluginPtr load (Session& session);
-       virtual std::vector<Plugin::PresetRecord> get_presets(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;