MTC: map between timecodes
[ardour.git] / libs / ardour / ardour / lv2_plugin.h
index d96a15a17361698c6d3d4285fa31ab65a3d62917..1090f3030737b7d6e196860423cc707293fe8248 100644 (file)
@@ -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
 
 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;
 
@@ -39,7 +46,7 @@ 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 ();
@@ -50,25 +57,28 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        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; }
 
@@ -101,10 +111,7 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        boost::shared_ptr<Plugin::ScalePoints>
        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;
-       }
+       static uint32_t midi_event_type() { return _midi_event_type; }
 
        void set_insert_info(const PluginInsert* insert);
 
@@ -119,7 +126,10 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
        uint32_t atom_eventTransfer() const;
 
-       void write_from_ui(uint32_t index, uint32_t protocol, uint32_t size, uint8_t* body);
+       void write_from_ui(uint32_t       index,
+                          uint32_t       protocol,
+                          uint32_t       size,
+                          const uint8_t* body);
 
        typedef void UIMessageSink(void*       controller,
                                   uint32_t    index,
@@ -132,17 +142,19 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
        Worker* worker() { return _worker; }
 
-       void work(uint32_t size, const void* data);
-       void work_response(uint32_t size, const void* data);
+       int work(uint32_t size, const void* data);
+       int work_response(uint32_t size, const void* data);
 
        static URIMap _uri_map;
 
-       static uint32_t _midi_event_type_ev;
        static uint32_t _midi_event_type;
        static uint32_t _chunk_type;
        static uint32_t _sequence_type;
        static uint32_t _event_transfer_type;
        static uint32_t _path_type;
+       static uint32_t _log_Error;
+       static uint32_t _log_Warning;
+       static uint32_t _log_Note;
 
   private:
        struct Impl;
@@ -155,16 +167,25 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        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
        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_MESSAGE = 1 << 5,
+               PORT_ATOM    = 1 << 6
        } PortFlag;
 
        typedef unsigned PortFlags;
@@ -179,16 +200,16 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
                uint32_t size;
        };
 
-       void write_to_ui(uint32_t index,
-                        uint32_t protocol,
-                        uint32_t size,
-                        uint8_t* body);
+       void write_to_ui(uint32_t       index,
+                        uint32_t       protocol,
+                        uint32_t       size,
+                        const uint8_t* body);
 
        void write_to(RingBuffer<uint8_t>* 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<uint8_t>* _to_ui;
@@ -202,7 +223,13 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        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;
+
+       // Options passed to plugin
+       int32_t _block_length;
+       int32_t _seq_size;
 
        mutable unsigned _state_version;
 
@@ -217,7 +244,8 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
        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 ();
@@ -230,14 +258,14 @@ class LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
 
 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<LV2PluginInfo> LV2PluginInfoPtr;