From ccc5688f0c4b63397ee2e0250d717326ed556f37 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Thu, 17 Dec 2020 22:16:20 +0100 Subject: [PATCH] Implement IEditController::getParameterInfo() --- src/common/logging/vst3.cpp | 25 +++++++++ src/common/logging/vst3.h | 4 ++ src/common/serialization/vst3.h | 1 + .../vst3/plugin/edit-controller.h | 53 +++++++++++++++++++ .../bridges/vst3-impls/plugin-proxy.cpp | 12 +++-- src/wine-host/bridges/vst3.cpp | 12 ++++- 6 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 76503b80..73eb1dca 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -16,6 +16,8 @@ #include "vst3.h" +#include + #include "src/common/serialization/vst3.h" Vst3Logger::Vst3Logger(Logger& generic_logger) : logger(generic_logger) {} @@ -283,6 +285,16 @@ void Vst3Logger::log_request( }); } +void Vst3Logger::log_request( + bool is_host_vst, + const YaEditController2::GetParameterInfo& request) { + log_request_base(is_host_vst, [&](auto& message) { + message << "::getParameterInfo(paramIndex = " << request.param_index + << ", &info)"; + }); +} + void Vst3Logger::log_request(bool is_host_vst, const YaPluginBase::Initialize& request) { log_request_base(is_host_vst, [&](auto& message) { @@ -434,6 +446,19 @@ void Vst3Logger::log_response( }); } +void Vst3Logger::log_response( + bool is_host_vst, + const YaEditController2::GetParameterInfoResponse& 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.updated_info.title); + message << ", "; + } + }); +} + 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 88b0ad94..9bdd923b 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -83,6 +83,8 @@ class Vst3Logger { const YaEditController2::SetComponentState&); void log_request(bool is_host_vst, const YaEditController2::GetParameterCount&); + void log_request(bool is_host_vst, + const YaEditController2::GetParameterInfo&); 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&); @@ -102,6 +104,8 @@ class Vst3Logger { void log_response(bool is_host_vst, const YaComponent::GetBusInfoResponse&); void log_response(bool is_host_vst, const YaComponent::GetRoutingInfoResponse&); + void log_response(bool is_host_vst, + const YaEditController2::GetParameterInfoResponse&); 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 3bfe17af..5e43b064 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -77,6 +77,7 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.object(result); + s.object(updated_info); + } + }; + + /** + * Message to pass through a call to + * `IEditController::getParameterINfo(param_index, &info)` to the Wine + * plugin host. + */ + struct GetParameterInfo { + using Response = GetParameterInfoResponse; + + native_size_t instance_id; + + int32 param_index; + Steinberg::Vst::ParameterInfo info; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(param_index); + s.object(info); + } + }; + virtual tresult PLUGIN_API getParameterInfo(int32 paramIndex, Steinberg::Vst::ParameterInfo& info /*out*/) override = 0; @@ -163,3 +200,19 @@ class YaEditController2 : public Steinberg::Vst::IEditController, }; #pragma GCC diagnostic pop + +namespace Steinberg { +namespace Vst { +template +void serialize(S& s, ParameterInfo& info) { + s.value4b(info.id); + s.container2b(info.title); + s.container2b(info.shortTitle); + s.container2b(info.units); + s.value4b(info.stepCount); + s.value8b(info.defaultNormalizedValue); + s.value4b(info.unitId); + s.value4b(info.flags); +} +} // namespace Vst +} // namespace Steinberg diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 97d1f022..c1290b9d 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -202,9 +202,15 @@ int32 PLUGIN_API Vst3PluginProxyImpl::getParameterCount() { tresult PLUGIN_API Vst3PluginProxyImpl::getParameterInfo( int32 paramIndex, Steinberg::Vst::ParameterInfo& info /*out*/) { - // TODO: Implement - bridge.logger.log("TODO IEditController::getParameterInfo()"); - return Steinberg::kNotImplemented; + const GetParameterInfoResponse response = + bridge.send_message(YaEditController2::GetParameterInfo{ + .instance_id = arguments.instance_id, + .param_index = paramIndex, + .info = info}); + + info = response.updated_info; + + return response.result; } tresult PLUGIN_API Vst3PluginProxyImpl::getParamStringByValue( diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 70b2f8da..31766450 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -237,11 +237,21 @@ void Vst3Bridge::run() { return object_instances[request.instance_id] .edit_controller->setComponentState(&request.state); }, - [&](YaEditController2::GetParameterCount& request) + [&](const YaEditController2::GetParameterCount& request) -> YaEditController2::GetParameterCount::Response { return object_instances[request.instance_id] .edit_controller->getParameterCount(); }, + [&](YaEditController2::GetParameterInfo& request) + -> YaEditController2::GetParameterInfo::Response { + const tresult result = + object_instances[request.instance_id] + .edit_controller->getParameterInfo(request.param_index, + request.info); + + return YaEditController2::GetParameterInfoResponse{ + .result = result, .updated_info = request.info}; + }, [&](YaPluginBase::Initialize& request) -> YaPluginBase::Initialize::Response { // If we got passed a host context, we'll create a proxy object