#include #include #include #include #include // LV2 #include #include #include #include #include "nam_plugin.hpp" // LV2 Functions static LV2_Handle instantiate( const LV2_Descriptor*, double rate, const char*, const LV2_Feature* const* features ) { LV2_URID_Map* map = nullptr; LV2_Log_Logger logger = {}; for (size_t i = 0; features[i]; ++i) { if (std::string(features[i]->URI) == std::string(LV2_URID__map)) map = static_cast(features[i]->data); else if (std::string(features[i]->URI) == std::string(LV2_LOG__log)) logger.log = static_cast(features[i]->data); } lv2_log_logger_set_map(&logger, map); if (!map) { lv2_log_error(&logger, "Missing required feature: `%s`", LV2_URID__map); return nullptr; } try { auto nam = std::make_unique(static_cast(rate)); nam->map_uris(map); return static_cast(nam.release()); } catch(const std::exception& e) { lv2_log_error(&logger, "Failed to instantiate plugin: %s", e.what()); return nullptr; } } static void connect_port(LV2_Handle instance, uint32_t port, void* data) { auto nam = static_cast(instance); *(reinterpret_cast(&nam->ports)+port) = data; } static void activate(LV2_Handle) {} static void run(LV2_Handle instance, uint32_t n_samples) { static_cast(instance)->process(n_samples); } static void deactivate(LV2_Handle) {} static void cleanup(LV2_Handle instance) { delete static_cast(instance); } static const void* extension_data(const char*) { return nullptr; } static const LV2_Descriptor descriptor = { NAM::Plugin::URI.data(), instantiate, connect_port, activate, run, deactivate, cleanup, extension_data }; LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor(uint32_t index) { return index == 0 ? &descriptor : nullptr; }