+ 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;
+ 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;
+ 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;
+ framecnt_t _max_latency;
+ framecnt_t _current_latency;
+
+ 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, ///< 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
+ 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)
+ PORT_CTRLER = 1 << 11, ///< Port prop auto:AutomationController (can be self set)
+ PORT_NOAUTO = 1 << 12 ///< Port don't allow to automate
+ } PortFlag;
+
+ typedef unsigned PortFlags;
+
+ std::vector<PortFlags> _port_flags;
+ std::vector<size_t> _port_minimumSize;