From 585d1e736cc260de066bd97a207811c400fa1cf2 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 17 Dec 2020 22:42:23 +0100 Subject: [PATCH] Implement IEditController::getParamStringByValue() --- src/common/logging/vst3.cpp | 23 ++++++++++ src/common/logging/vst3.h | 4 ++ src/common/serialization/vst3.h | 1 + .../vst3/plugin/edit-controller.h | 43 ++++++++++++++++++- .../bridges/vst3-impls/plugin-proxy.cpp | 13 ++++-- src/wine-host/bridges/vst3.cpp | 12 ++++++ 6 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 73eb1dca..044462b5 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -295,6 +295,17 @@ void Vst3Logger::log_request( }); } +void Vst3Logger::log_request( + bool is_host_vst, + const YaEditController2::GetParamStringByValue& request) { + log_request_base(is_host_vst, [&](auto& message) { + message << "::getParamStringByValue(id = " << request.id + << ", valueNormalized = " << request.value_normalized + << ", &string)"; + }); +} + void Vst3Logger::log_request(bool is_host_vst, const YaPluginBase::Initialize& request) { log_request_base(is_host_vst, [&](auto& message) { @@ -459,6 +470,18 @@ void Vst3Logger::log_response( }); } +void Vst3Logger::log_response( + bool is_host_vst, + const YaEditController2::GetParamStringByValueResponse& response) { + log_response_base(is_host_vst, [&](auto& message) { + message << response.result.string(); + if (response.result == Steinberg::kResultOk) { + std::string title = VST3::StringConvert::convert(response.string); + message << ", \"" << title << "\""; + } + }); +} + void Vst3Logger::log_response(bool is_host_vst, const YaPluginFactory::ConstructArgs& args) { log_response_base(is_host_vst, [&](auto& message) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 9bdd923b..36b0cb65 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -85,6 +85,8 @@ class Vst3Logger { const YaEditController2::GetParameterCount&); void log_request(bool is_host_vst, const YaEditController2::GetParameterInfo&); + void log_request(bool is_host_vst, + const YaEditController2::GetParamStringByValue&); 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&); @@ -106,6 +108,8 @@ class Vst3Logger { const YaComponent::GetRoutingInfoResponse&); void log_response(bool is_host_vst, const YaEditController2::GetParameterInfoResponse&); + void log_response(bool is_host_vst, + const YaEditController2::GetParamStringByValueResponse&); void log_response(bool is_host_vst, const YaPluginFactory::ConstructArgs&); void log_response(bool is_host_vst, const Configuration&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 5e43b064..83835b92 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -78,6 +78,7 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.object(result); + s.container2b(string, std::extent_v); + } + }; + + /** + * Message to pass through a call to + * `IEditController::getParamStringByValue(id, value_normalized, &string)` + * to the Wine plugin host. + */ + struct GetParamStringByValue { + using Response = GetParamStringByValueResponse; + + native_size_t instance_id; + + Steinberg::Vst::ParamID id; + Steinberg::Vst::ParamValue value_normalized; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(id); + s.value8b(value_normalized); + } + }; + virtual tresult PLUGIN_API getParamStringByValue( Steinberg::Vst::ParamID id, Steinberg::Vst::ParamValue valueNormalized /*in*/, diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index c1290b9d..1006be26 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -217,9 +217,16 @@ tresult PLUGIN_API Vst3PluginProxyImpl::getParamStringByValue( Steinberg::Vst::ParamID id, Steinberg::Vst::ParamValue valueNormalized /*in*/, Steinberg::Vst::String128 string /*out*/) { - // TODO: Implement - bridge.logger.log("TODO IEditController::getParamStringByValue()"); - return Steinberg::kNotImplemented; + const GetParamStringByValueResponse response = + bridge.send_message(YaEditController2::GetParamStringByValue{ + .instance_id = arguments.instance_id, + .id = id, + .value_normalized = valueNormalized}); + + std::copy(response.string.begin(), response.string.end(), string); + string[response.string.size()] = 0; + + return response.result; } tresult PLUGIN_API Vst3PluginProxyImpl::getParamValueByString( diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 31766450..62267f3c 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -252,6 +252,18 @@ void Vst3Bridge::run() { return YaEditController2::GetParameterInfoResponse{ .result = result, .updated_info = request.info}; }, + [&](YaEditController2::GetParamStringByValue& request) + -> YaEditController2::GetParamStringByValue::Response { + Steinberg::Vst::String128 string{0}; + const tresult result = + object_instances[request.instance_id] + .edit_controller->getParamStringByValue( + request.id, request.value_normalized, string); + + return YaEditController2::GetParamStringByValueResponse{ + .result = result, + .string = tchar_pointer_to_u16string(string)}; + }, [&](YaPluginBase::Initialize& request) -> YaPluginBase::Initialize::Response { // If we got passed a host context, we'll create a proxy object