From 34b2fa8905fb9592a72ea74e9100a1e39f2d27de Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sun, 13 Dec 2020 16:18:13 +0100 Subject: [PATCH] Implement IComponent::getBusCount() --- src/common/logging/vst3.cpp | 8 ++++++++ src/common/logging/vst3.h | 1 + src/common/serialization/vst3.h | 1 + src/common/serialization/vst3/component.h | 21 +++++++++++++++++++++ src/plugin/bridges/vst3-impls/component.cpp | 7 ++++--- src/wine-host/bridges/vst3.cpp | 5 +++++ 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index f9a2c25a..98c3ec0e 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -80,6 +80,14 @@ void Vst3Logger::log_request(bool is_host_vst, }); } +void Vst3Logger::log_request(bool is_host_vst, + const YaComponent::GetBusCount& request) { + log_request_base(is_host_vst, [&](auto& message) { + message << "::getBusCount(" + << request.type << ", " << request.dir << ")"; + }); +} + void Vst3Logger::log_request(bool is_host_vst, const YaPluginFactory::Construct&) { log_request_base(is_host_vst, diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 468887c6..a272f1f6 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -61,6 +61,7 @@ class Vst3Logger { void log_request(bool is_host_vst, const YaComponent::Initialize&); void log_request(bool is_host_vst, const YaComponent::Terminate&); void log_request(bool is_host_vst, const YaComponent::SetIoMode&); + void log_request(bool is_host_vst, const YaComponent::GetBusCount&); void log_request(bool is_host_vst, const YaPluginFactory::Construct&); void log_request(bool is_host_vst, const YaPluginFactory::SetHostContext&); void log_request(bool is_host_vst, const WantsConfiguration&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index d5f875ad..5996ebe6 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -62,6 +62,7 @@ using ControlRequest = std::variant; diff --git a/src/common/serialization/vst3/component.h b/src/common/serialization/vst3/component.h index 8bb5cb2b..9545d59a 100644 --- a/src/common/serialization/vst3/component.h +++ b/src/common/serialization/vst3/component.h @@ -192,6 +192,27 @@ class YaComponent : public Steinberg::Vst::IComponent { virtual tresult PLUGIN_API setIoMode(Steinberg::Vst::IoMode mode) override = 0; + + /** + * Message to pass through a call to `IComponent::getBusCount(type, dir)` to + * the Wine plugin host. + */ + struct GetBusCount { + using Response = UniversalTResult; + + native_size_t instance_id; + + Steinberg::Vst::BusType type; + Steinberg::Vst::BusDirection dir; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(type); + s.value4b(dir); + } + }; + virtual int32 PLUGIN_API getBusCount(Steinberg::Vst::MediaType type, Steinberg::Vst::BusDirection dir) override = 0; diff --git a/src/plugin/bridges/vst3-impls/component.cpp b/src/plugin/bridges/vst3-impls/component.cpp index 09c056b2..5f6b9c24 100644 --- a/src/plugin/bridges/vst3-impls/component.cpp +++ b/src/plugin/bridges/vst3-impls/component.cpp @@ -83,9 +83,10 @@ YaComponentPluginImpl::setIoMode(Steinberg::Vst::IoMode mode) { int32 PLUGIN_API YaComponentPluginImpl::getBusCount(Steinberg::Vst::MediaType type, Steinberg::Vst::BusDirection dir) { - // TODO: Implement - bridge.logger.log("TODO: IComponent::getBusCount()"); - return Steinberg::kNotImplemented; + return bridge + .send_message(YaComponent::GetBusCount{ + .instance_id = arguments.instance_id, .type = type, .dir = dir}) + .native(); } tresult PLUGIN_API diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 4611d348..97e817e4 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -112,6 +112,11 @@ void Vst3Bridge::run() { return component_instances[request.instance_id]->setIoMode( request.mode); }, + [&](const YaComponent::GetBusCount& request) + -> YaComponent::GetBusCount::Response { + return component_instances[request.instance_id]->getBusCount( + request.type, request.dir); + }, [&](const YaPluginFactory::Construct&) -> YaPluginFactory::Construct::Response { return YaPluginFactory::ConstructArgs(