From 7341fab0ead638866944be6b2acbc76de42ffc28 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sun, 13 Dec 2020 22:17:06 +0100 Subject: [PATCH] Implement IComponent::setActive() --- src/common/logging/vst3.cpp | 11 ++++++++++- src/common/logging/vst3.h | 1 + src/common/serialization/vst3.h | 1 + src/common/serialization/vst3/component.h | 19 +++++++++++++++++++ src/plugin/bridges/vst3-impls/component.cpp | 7 ++++--- src/wine-host/bridges/vst3.cpp | 5 +++++ 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 4ef9e8e5..d7387559 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -120,7 +120,16 @@ void Vst3Logger::log_request(bool is_host_vst, message << "::activateBus(type = " << request.type << ", dir = " << request.dir << ", index = " << request.index - << ", state = " << (request.state ? "true" : "false") << ">)"; + << ", state = " << (request.state ? "true" : "false") << ")"; + }); +} + +void Vst3Logger::log_request(bool is_host_vst, + const YaComponent::SetActive& request) { + log_request_base(is_host_vst, [&](auto& message) { + message << "::setActive(state = " << (request.state ? "true" : "false") + << ")"; }); } diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index ffcd7002..bba8ff86 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -65,6 +65,7 @@ class Vst3Logger { void log_request(bool is_host_vst, const YaComponent::GetBusInfo&); void log_request(bool is_host_vst, const YaComponent::GetRoutingInfo&); void log_request(bool is_host_vst, const YaComponent::ActivateBus&); + void log_request(bool is_host_vst, const YaComponent::SetActive&); 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 11cf13f3..490851dd 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -66,6 +66,7 @@ using ControlRequest = std::variant; diff --git a/src/common/serialization/vst3/component.h b/src/common/serialization/vst3/component.h index 0ec6f177..6e505634 100644 --- a/src/common/serialization/vst3/component.h +++ b/src/common/serialization/vst3/component.h @@ -330,6 +330,25 @@ class YaComponent : public Steinberg::Vst::IComponent { Steinberg::Vst::BusDirection dir, int32 index, TBool state) override = 0; + + /** + * Message to pass through a call to `IComponent::setActive(state)` to the + * Wine plugin host. + */ + struct SetActive { + using Response = UniversalTResult; + + native_size_t instance_id; + + TBool state; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value1b(state); + } + }; + virtual tresult PLUGIN_API setActive(TBool state) override = 0; virtual tresult PLUGIN_API setState(Steinberg::IBStream* state) override = 0; diff --git a/src/plugin/bridges/vst3-impls/component.cpp b/src/plugin/bridges/vst3-impls/component.cpp index 206b89c9..15e8686d 100644 --- a/src/plugin/bridges/vst3-impls/component.cpp +++ b/src/plugin/bridges/vst3-impls/component.cpp @@ -134,9 +134,10 @@ YaComponentPluginImpl::activateBus(Steinberg::Vst::MediaType type, } tresult PLUGIN_API YaComponentPluginImpl::setActive(TBool state) { - // TODO: Implement - bridge.logger.log("TODO: IComponent::setActive()"); - return Steinberg::kNotImplemented; + return bridge + .send_message(YaComponent::SetActive{ + .instance_id = arguments.instance_id, .state = state}) + .native(); } tresult PLUGIN_API YaComponentPluginImpl::setState(Steinberg::IBStream* state) { diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 8baee5ae..b1c236dc 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -148,6 +148,11 @@ void Vst3Bridge::run() { .component->activateBus(request.type, request.dir, request.index, request.state); }, + [&](const YaComponent::SetActive& request) + -> YaComponent::SetActive::Response { + return component_instances[request.instance_id] + .component->setActive(request.state); + }, [&](const YaPluginFactory::Construct&) -> YaPluginFactory::Construct::Response { return YaPluginFactory::ConstructArgs(