From f3e706a39a1c9b992dbb13fb1201767cfd85e025 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sat, 26 Dec 2020 21:33:19 +0100 Subject: [PATCH] Implement IUnitInfo::getUnitCount --- src/common/logging/vst3.cpp | 7 +++++++ src/common/logging/vst3.h | 1 + src/common/serialization/vst3.h | 3 ++- src/common/serialization/vst3/plugin/unit-info.h | 15 +++++++++++++++ src/plugin/bridges/vst3-impls/plugin-proxy.cpp | 5 ++--- src/wine-host/bridges/vst3.cpp | 11 +++++++++-- src/wine-host/bridges/vst3.h | 1 + 7 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index ec1d4544..26c51aa2 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -430,6 +430,13 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaUnitInfo::GetUnitCount& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.instance_id << ": IUnitInfo::getUnitCount()"; + }); +} + bool Vst3Logger::log_request( bool is_host_vst, const YaAudioProcessor::SetBusArrangements& request) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 26abcf35..9e9c261d 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -108,6 +108,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaPluginBase::Terminate&); bool log_request(bool is_host_vst, const YaPluginFactory::Construct&); bool log_request(bool is_host_vst, const YaPluginFactory::SetHostContext&); + bool log_request(bool is_host_vst, const YaUnitInfo::GetUnitCount&); bool log_request(bool is_host_vst, const YaAudioProcessor::SetBusArrangements&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 86e6d6a1..270a0bfc 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -99,7 +99,8 @@ using ControlRequest = std::variant; + YaPluginFactory::SetHostContext, + YaUnitInfo::GetUnitCount>; template void serialize(S& s, ControlRequest& payload) { diff --git a/src/common/serialization/vst3/plugin/unit-info.h b/src/common/serialization/vst3/plugin/unit-info.h index d421530d..561ff788 100644 --- a/src/common/serialization/vst3/plugin/unit-info.h +++ b/src/common/serialization/vst3/plugin/unit-info.h @@ -62,6 +62,21 @@ class YaUnitInfo : public Steinberg::Vst::IUnitInfo { inline bool supported() const { return arguments.supported; } + /** + * Message to pass through a call to `IUnitInfo::getUnitCount()` to the Wine + * plugin host. + */ + struct GetUnitCount { + using Response = UniversalTResult; + + native_size_t instance_id; + + template + void serialize(S& s) { + s.value8b(instance_id); + } + }; + virtual int32 PLUGIN_API getUnitCount() override = 0; virtual tresult PLUGIN_API getUnitInfo(int32 unitIndex, diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 79e39057..44b1aa06 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -441,9 +441,8 @@ tresult PLUGIN_API Vst3PluginProxyImpl::terminate() { } int32 PLUGIN_API Vst3PluginProxyImpl::getUnitCount() { - // TODO: Implement - bridge.logger.log("TODO: IUnitInfo::getUnitCount()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaUnitInfo::GetUnitCount{.instance_id = instance_id()}); } tresult PLUGIN_API diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 5f86f1c1..4bbd69e7 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -35,7 +35,8 @@ InstanceInterfaces::InstanceInterfaces( connection_point(object), edit_controller(object), edit_controller_2(object), - plugin_base(object) {} + plugin_base(object), + unit_info(object) {} Vst3Bridge::Vst3Bridge(MainContext& main_context, std::string plugin_dll_path, @@ -564,7 +565,13 @@ void Vst3Bridge::run() { assert(factory_3); return factory_3->setHostContext(plugin_factory_host_context); - }}); + }, + [&](const YaUnitInfo::GetUnitCount& request) + -> YaUnitInfo::GetUnitCount::Response { + return object_instances[request.instance_id] + .unit_info->getUnitCount(); + }, + }); } void Vst3Bridge::handle_x11_events() { diff --git a/src/wine-host/bridges/vst3.h b/src/wine-host/bridges/vst3.h index fe31615d..f159090b 100644 --- a/src/wine-host/bridges/vst3.h +++ b/src/wine-host/bridges/vst3.h @@ -115,6 +115,7 @@ struct InstanceInterfaces { Steinberg::FUnknownPtr edit_controller; Steinberg::FUnknownPtr edit_controller_2; Steinberg::FUnknownPtr plugin_base; + Steinberg::FUnknownPtr unit_info; }; /**