#include LV2_Descriptor descriptor; template class LV2Wrapper { public: LV2Wrapper() { LV2_Descriptor d = { Plugin::URI, LV2Wrapper::instantiate, LV2Wrapper::connect_port, LV2Wrapper::activate, LV2Wrapper::run, LV2Wrapper::deactivate, LV2Wrapper::destroy, LV2Wrapper::extension_data }; descriptor = d; } private: static LV2_Handle instantiate( const LV2_Descriptor * d, double rate, const char * path, const LV2_Feature * const * features) { return new Plugin{rate}; } static void connect_port( LV2_Handle instance, uint32_t port, void * data) { auto accel = static_cast(instance); accel->connect_port(port, data); } static void activate(LV2_Handle instance) { auto accel = static_cast(instance); accel->activate(); } static void run(LV2_Handle instance, uint32_t num_samples) { auto accel = static_cast(instance); accel->run(num_samples); } static void deactivate(LV2_Handle instance) { auto accel = static_cast(instance); accel->deactivate(); } static void destroy(LV2_Handle instance) { delete static_cast(instance); } static const void * extension_data(const char * uri) { return nullptr; } }; LV2_SYMBOL_EXPORT const LV2_Descriptor * lv2_descriptor(uint32_t idx) { if (idx == 0) return &descriptor; return nullptr; }