From bc0c13778f886655dca730ae7b13bc8605b75923 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Fri, 18 Dec 2020 21:53:04 +0100 Subject: [PATCH] Implement IEditController::getParamNormalized() --- src/common/logging/vst3.cpp | 10 +++++ src/common/logging/vst3.h | 2 + src/common/serialization/vst3.h | 1 + .../vst3/plugin/edit-controller.h | 40 +++++++++++++++++++ .../bridges/vst3-impls/plugin-proxy.cpp | 5 +-- src/wine-host/bridges/vst3.cpp | 4 ++ 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index f5bdc1b8..620b65a6 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -355,6 +355,16 @@ void Vst3Logger::log_request( }); } +void Vst3Logger::log_request( + bool is_host_vst, + const YaEditController2::GetParamNormalized& request) { + log_request_base(is_host_vst, [&](auto& message) { + message << request.instance_id + << ": IEditController::getParamNormalized(id = " << request.id + << ")"; + }); +} + void Vst3Logger::log_request(bool is_host_vst, const YaPluginBase::Initialize& request) { log_request_base(is_host_vst, [&](auto& message) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index f098ad92..2c0600e0 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -94,6 +94,8 @@ class Vst3Logger { const YaEditController2::NormalizedParamToPlain&); void log_request(bool is_host_vst, const YaEditController2::PlainParamToNormalized&); + void log_request(bool is_host_vst, + const YaEditController2::GetParamNormalized&); void log_request(bool is_host_vst, const YaPluginBase::Initialize&); void log_request(bool is_host_vst, const YaPluginBase::Terminate&); void log_request(bool is_host_vst, const YaPluginFactory::Construct&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index f0e3b2c1..e36e4e8b 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -83,6 +83,7 @@ using ControlRequest = std::variant; + + native_size_t instance_id; + + Steinberg::Vst::ParamID id; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(id); + } + }; + virtual Steinberg::Vst::ParamValue PLUGIN_API getParamNormalized(Steinberg::Vst::ParamID id) override = 0; + + /** + * Message to pass through a call to + * `IEditController::setParamNormalized(id, value)` to the Wine plugin host. + */ + struct SetParamNormalized { + using Response = UniversalTResult; + + native_size_t instance_id; + + Steinberg::Vst::ParamID id; + Steinberg::Vst::ParamValue value; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(id); + s.value8b(value); + } + }; + virtual tresult PLUGIN_API setParamNormalized(Steinberg::Vst::ParamID id, Steinberg::Vst::ParamValue value) override = 0; diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index c04f4e9f..0eed3a5d 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -292,9 +292,8 @@ Vst3PluginProxyImpl::plainParamToNormalized( Steinberg::Vst::ParamValue PLUGIN_API Vst3PluginProxyImpl::getParamNormalized(Steinberg::Vst::ParamID id) { - // TODO: Implement - bridge.logger.log("TODO IEditController::getParamNormalized()"); - return Steinberg::kNotImplemented; + return bridge.send_message(YaEditController2::GetParamNormalized{ + .instance_id = instance_id(), .id = id}); } tresult PLUGIN_API diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 5c1e73c2..d5ca8487 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -318,6 +318,10 @@ void Vst3Bridge::run() { .edit_controller->plainParamToNormalized( request.id, request.plain_value); }, + [&](const YaEditController2::GetParamNormalized& request) { + return object_instances[request.instance_id] + .edit_controller->getParamNormalized(request.id); + }, [&](YaPluginBase::Initialize& request) -> YaPluginBase::Initialize::Response { // If we got passed a host context, we'll create a proxy object