From 79df8fecc2673ea025ec2631768766934ccbf781 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sat, 5 Dec 2020 13:49:38 +0100 Subject: [PATCH] Serialize the factory info --- .../serialization/vst3/plugin-factory.cpp | 17 +++++++++++---- .../serialization/vst3/plugin-factory.h | 21 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/common/serialization/vst3/plugin-factory.cpp b/src/common/serialization/vst3/plugin-factory.cpp index e310c3a5..b08abaad 100644 --- a/src/common/serialization/vst3/plugin-factory.cpp +++ b/src/common/serialization/vst3/plugin-factory.cpp @@ -26,6 +26,10 @@ YaPluginFactory::YaPluginFactory( // TODO: We should only copy the interfaces that we support. This should use // the same list as that used in `createInstance()`. known_iids.insert(factory->iid); + if (Steinberg::PFactoryInfo info; + factory->getFactoryInfo(&info) == Steinberg::kResultOk) { + factory_info = info; + } auto factory2 = Steinberg::FUnknownPtr(factory); if (!factory2) { @@ -75,9 +79,13 @@ tresult PLUGIN_API YaPluginFactory::queryInterface(Steinberg::FIDString _iid, } tresult PLUGIN_API -YaPluginFactory::getFactoryInfo(Steinberg::PFactoryInfo* /*info*/) { - // TODO: Implement - return 0; +YaPluginFactory::getFactoryInfo(Steinberg::PFactoryInfo* info) { + if (info && factory_info) { + *info = *factory_info; + return Steinberg::kResultOk; + } else { + return Steinberg::kNotInitialized; + } } int32 PLUGIN_API YaPluginFactory::countClasses() { @@ -126,6 +134,7 @@ YaPluginFactory::getClassInfoUnicode(int32 /*index*/, tresult PLUGIN_API YaPluginFactory::setHostContext(Steinberg::FUnknown* /*context*/) { - // TODO: Implement + // TODO: I guess this should do a callback and set the Wine host's host + // context, right? return 0; } diff --git a/src/common/serialization/vst3/plugin-factory.h b/src/common/serialization/vst3/plugin-factory.h index 67194869..74c8fec0 100644 --- a/src/common/serialization/vst3/plugin-factory.h +++ b/src/common/serialization/vst3/plugin-factory.h @@ -18,7 +18,9 @@ #include +#include #include +#include #include #include "../../bitsery/ext/vst3.h" @@ -29,6 +31,8 @@ using Steinberg::int32, Steinberg::tresult; // TODO: After implementing one or two more of these, abstract away some of the // nasty bits +// TODO: Should we have some clearer way to indicate to us which fields are +// going to return copied results directly and which make a callback? #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" @@ -82,13 +86,30 @@ class YaPluginFactory : public Steinberg::IPluginFactory3 { */ std::set known_iids; + // For `IPluginFactory::getFactoryInfo` + std::optional factory_info; + 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.ext(factory_info, bitsery::ext::StdOptional{}, + [](S& s, Steinberg::PFactoryInfo& info) { s.object(info); }); } }; #pragma GCC diagnostic pop + +// Serialization functions have to live in the same namespace as the objects +// they're serializing +namespace Steinberg { +template +void serialize(S& s, PFactoryInfo& factory_info) { + s.text1b(factory_info.vendor); + s.text1b(factory_info.url); + s.text1b(factory_info.email); + s.value4b(factory_info.flags); +} +} // namespace Steinberg