From 481975860c53a53c9ecee002594efae8151c91c3 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 17 Dec 2020 13:20:16 +0100 Subject: [PATCH] Use the new simple supports flags for the factory This is both more type safe and as it turns out much more manageable. --- src/common/communication/vst3.h | 2 -- .../serialization/vst3/plugin-factory.cpp | 15 +++++------ .../serialization/vst3/plugin-factory.h | 26 +++++++------------ 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/common/communication/vst3.h b/src/common/communication/vst3.h index 3f73f95a..714a738a 100644 --- a/src/common/communication/vst3.h +++ b/src/common/communication/vst3.h @@ -77,8 +77,6 @@ class Vst3MessageHandler : public AdHocSocketHandler { * -> host callbacks isntead. Optional since it only has to be set on the * plugin's side. * - * TODO: Is it feasible to move `logging` to the constructor instead? - * * @relates Vst3MessageHandler::receive_messages */ template diff --git a/src/common/serialization/vst3/plugin-factory.cpp b/src/common/serialization/vst3/plugin-factory.cpp index 831c1c36..7a2a33a0 100644 --- a/src/common/serialization/vst3/plugin-factory.cpp +++ b/src/common/serialization/vst3/plugin-factory.cpp @@ -25,7 +25,6 @@ YaPluginFactory::ConstructArgs::ConstructArgs() {} YaPluginFactory::ConstructArgs::ConstructArgs( Steinberg::IPtr factory) { - known_iids.insert(factory->iid); // `IPluginFactory::getFactoryInfo` if (Steinberg::PFactoryInfo info; factory->getFactoryInfo(&info) == Steinberg::kResultOk) { @@ -47,7 +46,7 @@ YaPluginFactory::ConstructArgs::ConstructArgs( return; } - known_iids.insert(factory2->iid); + supports_plugin_factory_2 = true; // `IpluginFactory2::getClassInfo2` class_infos_2.resize(num_classes); for (int i = 0; i < num_classes; i++) { @@ -62,7 +61,7 @@ YaPluginFactory::ConstructArgs::ConstructArgs( return; } - known_iids.insert(factory3->iid); + supports_plugin_factory_3 = true; // `IpluginFactory3::getClassInfoUnicode` class_infos_unicode.resize(num_classes); for (int i = 0; i < num_classes; i++) { @@ -90,15 +89,13 @@ tresult PLUGIN_API YaPluginFactory::queryInterface(Steinberg::FIDString _iid, void** obj) { QUERY_INTERFACE(_iid, obj, Steinberg::FUnknown::iid, Steinberg::IPluginFactory) - if (arguments.known_iids.contains(Steinberg::IPluginFactory::iid)) { - QUERY_INTERFACE(_iid, obj, Steinberg::IPluginFactory::iid, - Steinberg::IPluginFactory) - } - if (arguments.known_iids.contains(Steinberg::IPluginFactory2::iid)) { + QUERY_INTERFACE(_iid, obj, Steinberg::IPluginFactory::iid, + Steinberg::IPluginFactory) + if (arguments.supports_plugin_factory_2) { QUERY_INTERFACE(_iid, obj, Steinberg::IPluginFactory2::iid, Steinberg::IPluginFactory2) } - if (arguments.known_iids.contains(Steinberg::IPluginFactory3::iid)) { + if (arguments.supports_plugin_factory_3) { QUERY_INTERFACE(_iid, obj, Steinberg::IPluginFactory3::iid, Steinberg::IPluginFactory3) } diff --git a/src/common/serialization/vst3/plugin-factory.h b/src/common/serialization/vst3/plugin-factory.h index 933f0bf8..259ff23f 100644 --- a/src/common/serialization/vst3/plugin-factory.h +++ b/src/common/serialization/vst3/plugin-factory.h @@ -16,10 +16,7 @@ #pragma once -#include - #include -#include #include #include @@ -27,15 +24,12 @@ #include "base.h" #include "host-application.h" -// TODO: After implementing one or two more of these, abstract away some of the -// nasty bits - #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" /** * Wraps around `IPluginFactory{1,2,3}` for serialization purposes. See - * `README.md` for more information on how this works. + * `docs/vst3.md` for more information on how this works. */ class YaPluginFactory : public Steinberg::IPluginFactory3 { public: @@ -53,12 +47,14 @@ class YaPluginFactory : public Steinberg::IPluginFactory3 { ConstructArgs(Steinberg::IPtr factory); /** - * The IIDs that the interface we serialized supports. - * - * TODO: Replace this with a set of boolean flags, just like we're doing - * with the other interfaces. + * Whether `factory` supported `IPluginFactory2`. */ - std::set known_iids; + bool supports_plugin_factory_2; + + /** + * Whether `factory` supported `IPluginFactory3`. + */ + bool supports_plugin_factory_3; /** * For `IPluginFactory::getFactoryInfo`. @@ -92,10 +88,8 @@ class YaPluginFactory : public Steinberg::IPluginFactory3 { template void serialize(S& s) { - s.ext(known_iids, bitsery::ext::StdSet{32}, - [](S& s, Steinberg::FUID& iid) { - s.ext(iid, bitsery::ext::FUID{}); - }); + s.value1b(supports_plugin_factory_2); + s.value1b(supports_plugin_factory_3); s.ext(factory_info, bitsery::ext::StdOptional{}); s.value4b(num_classes); s.container(class_infos_1, 2048,