DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit fcf03070778661bdfc649761a2bbc4576fc1f9b6
parent ed7bc8408125b781b98c8b11caadd51b5b289011
Author: falkTX <falktx@falktx.com>
Date:   Wed, 22 Sep 2021 19:30:39 +0100

A few more VST3 details, passing carla-discovery now

Signed-off-by: falkTX <falktx@falktx.com>

Diffstat:
Mdistrho/src/DistrhoPluginVST3.cpp | 227++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 197 insertions(+), 30 deletions(-)

diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp @@ -43,6 +43,7 @@ static constexpr const uint32_t dpf_id_ctrl = d_cconst('c', 't', 'r', 'l'); static constexpr const uint32_t dpf_id_proc = d_cconst('p', 'r', 'o', 'c'); static constexpr const uint32_t dpf_id_view = d_cconst('v', 'i', 'e', 'w'); +// plugin uids, values are filled in during plugin init static dpf_tuid dpf_tuid_class = { dpf_id_entry, dpf_id_clas, 0, 0 }; static dpf_tuid dpf_tuid_component = { dpf_id_entry, dpf_id_comp, 0, 0 }; static dpf_tuid dpf_tuid_controller = { dpf_id_entry, dpf_id_ctrl, 0, 0 }; @@ -178,25 +179,138 @@ struct ProcessorComponent : ComponentAdapter static ScopedPointer<PluginExporter> gPluginInfo; -static void gPluginInit() -{ - if (gPluginInfo != nullptr) - return; +// -------------------------------------------------------------------------------------------------------------------- +// dpf_component - d_lastBufferSize = 512; - d_lastSampleRate = 44100.0; - gPluginInfo = new PluginExporter(nullptr, nullptr, nullptr); - d_lastBufferSize = 0; - d_lastSampleRate = 0.0; +struct v3_component_cpp : v3_funknown { + v3_plugin_base base; + v3_component comp; +}; - dpf_tuid_class[3] = dpf_tuid_component[3] = dpf_tuid_controller[3] - = dpf_tuid_processor[3] = dpf_tuid_view[3] = gPluginInfo->getUniqueId(); -} +struct dpf_component : v3_component_cpp { + dpf_component() + { + static const uint8_t* kSupportedFactories[] = { + v3_funknown_iid, + v3_plugin_base_iid, + v3_component_iid + }; + + // ------------------------------------------------------------------------------------------------------------ + // v3_funknown + + query_interface = []V3_API(void* self, const v3_tuid iid, void** iface) -> v3_result + { + d_stdout("dpf_component::query_interface => %s | %p %p %p", __PRETTY_FUNCTION__ + 41, self, iid, iface); + *iface = NULL; + DISTRHO_SAFE_ASSERT_RETURN(self != nullptr, V3_NO_INTERFACE); + + for (const uint8_t* factory_iid : kSupportedFactories) + { + if (v3_tuid_match(factory_iid, iid)) + { + *iface = self; + return V3_OK; + } + } + + return V3_NO_INTERFACE; + }; + + // we only support 1 plugin per binary, so don't have to care here + ref = []V3_API(void* self) -> uint32_t + { + d_stdout("dpf_component::ref => %s | %p", __PRETTY_FUNCTION__ + 41, self); + return 1; + }; + + unref = []V3_API(void* self) -> uint32_t + { + d_stdout("dpf_component::unref => %s | %p", __PRETTY_FUNCTION__ + 41, self); + return 0; + }; + + // ------------------------------------------------------------------------------------------------------------ + // v3_plugin_base + + base.initialise = []V3_API(void* self, struct v3_plugin_base::v3_funknown *context) -> v3_result + { + d_stdout("dpf_component::initialise => %s | %p %p", __PRETTY_FUNCTION__ + 41, self, context); + return V3_OK; + }; + + base.terminate = []V3_API(void* self) -> v3_result + { + d_stdout("dpf_component::terminate => %s | %p", __PRETTY_FUNCTION__ + 41, self); + return V3_OK; + }; + + // ------------------------------------------------------------------------------------------------------------ + // v3_component + + comp.get_controller_class_id = []V3_API(void* self, v3_tuid class_id) -> v3_result + { + d_stdout("dpf_component::get_controller_class_id => %s | %p %p", __PRETTY_FUNCTION__ + 41, self, class_id); + return V3_NOT_IMPLEMENTED; + }; + + comp.set_io_mode = []V3_API(void* self, int32_t io_mode) -> v3_result + { + d_stdout("dpf_component::set_io_mode => %s | %p %i", __PRETTY_FUNCTION__ + 41, self, io_mode); + return V3_INTERNAL_ERR; + }; + + comp.get_bus_count = []V3_API(void* self, int32_t media_type, int32_t bus_direction) -> int32_t + { + d_stdout("dpf_component::get_bus_count => %s | %p %i %i", __PRETTY_FUNCTION__ + 41, self, media_type, bus_direction); + return 0; + }; + + comp.get_bus_info = []V3_API(void* self, int32_t media_type, int32_t bus_direction, + int32_t bus_idx, v3_bus_info* bus_info) -> v3_result + { + d_stdout("dpf_component::get_bus_info => %s | %p %i %i %i %p", __PRETTY_FUNCTION__ + 41, self, media_type, bus_direction, bus_idx, bus_info); + return V3_INTERNAL_ERR; + }; + + comp.get_routing_info = []V3_API(void* self, v3_routing_info* input, v3_routing_info* output) -> v3_result + { + d_stdout("dpf_component::get_routing_info => %s | %p %p %p", __PRETTY_FUNCTION__ + 41, self, input, output); + return V3_INTERNAL_ERR; + }; + + comp.activate_bus = []V3_API(void* self, int32_t media_type, int32_t bus_direction, + int32_t bus_idx, v3_bool state) -> v3_result + { + d_stdout("dpf_component::activate_bus => %s | %p %i %i %i %u", __PRETTY_FUNCTION__ + 41, self, media_type, bus_direction, bus_idx, state); + return V3_INTERNAL_ERR; + }; + + comp.set_active = []V3_API(void* self, v3_bool state) -> v3_result + { + d_stdout("dpf_component::set_active => %s | %p %u", __PRETTY_FUNCTION__ + 41, self, state); + return V3_INTERNAL_ERR; + }; + + comp.set_state = []V3_API(void* self, v3_bstream**) -> v3_result + { + d_stdout("dpf_component::set_state => %s | %p", __PRETTY_FUNCTION__ + 41, self); + return V3_INTERNAL_ERR; + }; + + comp.get_state = []V3_API(void* self, v3_bstream**) -> v3_result + { + d_stdout("dpf_component::get_state => %s | %p", __PRETTY_FUNCTION__ + 41, self); + return V3_INTERNAL_ERR; + }; + } +}; // -------------------------------------------------------------------------------------------------------------------- // dpf_factory -struct v3_plugin_factory_cpp : v3_funknown, v3_plugin_factory { +struct v3_plugin_factory_cpp : v3_funknown { + v3_plugin_factory v1; v3_plugin_factory_2 v2; v3_plugin_factory_3 v3; }; @@ -207,7 +321,8 @@ struct dpf_factory : v3_plugin_factory_cpp { static const uint8_t* kSupportedFactories[] = { v3_funknown_iid, v3_plugin_factory_iid, - v3_plugin_factory_2_iid + v3_plugin_factory_2_iid /*, + v3_plugin_factory_3_iid */ }; // ------------------------------------------------------------------------------------------------------------ @@ -215,6 +330,7 @@ struct dpf_factory : v3_plugin_factory_cpp { query_interface = []V3_API(void* self, const v3_tuid iid, void** iface) -> v3_result { + d_stdout("dpf_factory::query_interface => %s | %p %p %p", __PRETTY_FUNCTION__ + 37, self, iid, iface); *iface = NULL; DISTRHO_SAFE_ASSERT_RETURN(self != nullptr, V3_NO_INTERFACE); @@ -231,27 +347,39 @@ struct dpf_factory : v3_plugin_factory_cpp { }; // we only support 1 plugin per binary, so don't have to care here - ref = []V3_API(void*) -> uint32_t { return 1; }; - unref = []V3_API(void*) -> uint32_t { return 0; }; + ref = []V3_API(void* self) -> uint32_t + { + d_stdout("dpf_factory::ref => %s | %p", __PRETTY_FUNCTION__ + 37, self); + return 1; + }; + + unref = []V3_API(void* self) -> uint32_t + { + d_stdout("dpf_factory::unref => %s | %p", __PRETTY_FUNCTION__ + 37, self); + return 0; + }; // ------------------------------------------------------------------------------------------------------------ // v3_plugin_factory - get_factory_info = []V3_API(void*, struct v3_factory_info* const info) -> v3_result + v1.get_factory_info = []V3_API(void* self, struct v3_factory_info* const info) -> v3_result { + d_stdout("dpf_factory::get_factory_info => %s | %p %p", __PRETTY_FUNCTION__ + 37, self, info); DISTRHO_NAMESPACE::strncpy(info->vendor, gPluginInfo->getMaker(), sizeof(info->vendor)); DISTRHO_NAMESPACE::strncpy(info->url, gPluginInfo->getHomePage(), sizeof(info->url)); DISTRHO_NAMESPACE::strncpy(info->email, "", sizeof(info->email)); // TODO return V3_OK; }; - num_classes = []V3_API(void*) -> int32_t + v1.num_classes = []V3_API(void* self) -> int32_t { + d_stdout("dpf_factory::num_classes => %s | %p", __PRETTY_FUNCTION__ + 37, self); return 1; }; - get_class_info = []V3_API(void*, int32_t /*idx*/, struct v3_class_info* const info) -> v3_result + v1.get_class_info = []V3_API(void* self, int32_t idx, struct v3_class_info* const info) -> v3_result { + d_stdout("dpf_factory::get_class_info => %s | %p %i %p", __PRETTY_FUNCTION__ + 37, self, idx, info); memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); info->cardinality = 0x7FFFFFFF; DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", sizeof(info->category)); @@ -259,21 +387,31 @@ struct dpf_factory : v3_plugin_factory_cpp { return V3_OK; }; - create_instance = []V3_API(void* self, const v3_tuid class_id, const v3_tuid iid, void** instance) -> v3_result + v1.create_instance = []V3_API(void* self, const v3_tuid class_id, const v3_tuid iid, void** instance) -> v3_result { - d_stdout("%s %i %p %p %p %p", __PRETTY_FUNCTION__, __LINE__, self, class_id, iid, instance); + d_stdout("dpf_factory::create_instance => %s | %p %p %p %p", __PRETTY_FUNCTION__ + 37, self, class_id, iid, instance); DISTRHO_SAFE_ASSERT_RETURN(v3_tuid_match(class_id, *(v3_tuid*)&dpf_tuid_class) && v3_tuid_match(iid, v3_component_iid), V3_NO_INTERFACE); - *instance = nullptr; // new ComponentAdapter(); - return V3_INTERNAL_ERR; + static dpf_component* component = nullptr; + + if (component == nullptr) + { + component = new dpf_component(); + *instance = &component; + return V3_OK; + } + + *instance = nullptr; + return V3_NO_INTERFACE; }; // ------------------------------------------------------------------------------------------------------------ // v3_plugin_factory_2 - v2.get_class_info_2 = []V3_API(void*, int32_t /*idx*/, struct v3_class_info_2 *info) -> v3_result + v2.get_class_info_2 = []V3_API(void* self, int32_t idx, struct v3_class_info_2* info) -> v3_result { + d_stdout("dpf_factory::get_class_info_2 => %s | %p %i %p", __PRETTY_FUNCTION__ + 37, self, idx, info); // get_class_info memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); info->cardinality = 0x7FFFFFFF; @@ -283,15 +421,28 @@ struct dpf_factory : v3_plugin_factory_cpp { info->class_flags = 0; DISTRHO_NAMESPACE::strncpy(info->sub_categories, "", sizeof(info->sub_categories)); // TODO DISTRHO_NAMESPACE::strncpy(info->vendor, gPluginInfo->getMaker(), sizeof(info->vendor)); - DISTRHO_NAMESPACE::strncpy(info->version, "", sizeof(info->version)); // TODO + std::snprintf(info->version, sizeof(info->version), "%u", gPluginInfo->getVersion()); // TODO DISTRHO_NAMESPACE::strncpy(info->sdk_version, "Travesty", sizeof(info->sdk_version)); // TESTING use "VST 3.7" ? return V3_OK; }; + + // ------------------------------------------------------------------------------------------------------------ + // v3_plugin_factory_3 + + v3.get_class_info_utf16 = []V3_API(void* self, int32_t idx, struct v3_class_info_3* info) -> v3_result + { + d_stdout("dpf_factory::get_class_info_utf16 => %s | %p %i %p", __PRETTY_FUNCTION__ + 37, self, idx, info); + return V3_INTERNAL_ERR; + }; + + v3.set_host_context = []V3_API (void* self, struct v3_funknown* host) -> v3_result + { + d_stdout("dpf_factory::set_host_context => %s | %p %p", __PRETTY_FUNCTION__ + 37, self, host); + return V3_INTERNAL_ERR; + }; } }; -static const dpf_factory dpf_factory; - END_NAMESPACE_DISTRHO // -------------------------------------------------------------------------------------------------------------------- @@ -303,8 +454,12 @@ const void* GetPluginFactory(void); const void* GetPluginFactory(void) { USE_NAMESPACE_DISTRHO; - static const struct v3_plugin_factory_2* const factory = (v3_plugin_factory_2*)&dpf_factory; - return &factory; + static const dpf_factory factory; + static const struct v3_plugin_factory_2* factories[] = { + (const v3_plugin_factory_2*)&factory, + nullptr + }; + return factories; } // -------------------------------------------------------------------------------------------------------------------- @@ -327,7 +482,19 @@ bool ENTRYFNNAME(void*); bool ENTRYFNNAME(void*) { USE_NAMESPACE_DISTRHO; - gPluginInit(); + + if (gPluginInfo == nullptr) + { + d_lastBufferSize = 512; + d_lastSampleRate = 44100.0; + gPluginInfo = new PluginExporter(nullptr, nullptr, nullptr); + d_lastBufferSize = 0; + d_lastSampleRate = 0.0; + + dpf_tuid_class[3] = dpf_tuid_component[3] = dpf_tuid_controller[3] + = dpf_tuid_processor[3] = dpf_tuid_view[3] = gPluginInfo->getUniqueId(); + } + return true; }