From 91a96249fc8d98403899c4ce98826edd75dab623 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Fri, 25 Dec 2020 23:59:26 +0100 Subject: [PATCH] Implement IEditController2::setKnobMode --- src/common/logging/vst3.cpp | 9 +++++++++ src/common/logging/vst3.h | 1 + src/common/serialization/vst3.h | 1 + .../vst3/plugin/edit-controller-2.h | 18 ++++++++++++++++++ src/plugin/bridges/vst3-impls/plugin-proxy.cpp | 5 ++--- src/wine-host/bridges/vst3.cpp | 6 ++++++ src/wine-host/bridges/vst3.h | 1 + 7 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 7c68b823..257bff76 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -253,6 +253,15 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaEditController2::SetKnobMode& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.instance_id + << ": IEditController2::setKnobMode(mode = " << request.mode + << ")"; + }); +} + bool Vst3Logger::log_request( bool is_host_vst, const YaPlugView::IsPlatformTypeSupported& request) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 65c52e31..552b095a 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -88,6 +88,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaEditController::SetComponentHandler&); bool log_request(bool is_host_vst, const YaEditController::CreateView&); + bool log_request(bool is_host_vst, const YaEditController2::SetKnobMode&); bool log_request(bool is_host_vst, const YaPlugView::IsPlatformTypeSupported&); bool log_request(bool is_host_vst, const YaPlugView::Attached&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 61d93ab3..cff9d4dd 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -81,6 +81,7 @@ using ControlRequest = std::variant + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(mode); + } + }; + virtual tresult PLUGIN_API setKnobMode(Steinberg::Vst::KnobMode mode) override = 0; virtual tresult PLUGIN_API openHelp(TBool onlyCheck) override = 0; diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index de929ccc..e2abaa51 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -394,9 +394,8 @@ Vst3PluginProxyImpl::createView(Steinberg::FIDString name) { tresult PLUGIN_API Vst3PluginProxyImpl::setKnobMode(Steinberg::Vst::KnobMode mode) { - // TODO: Implement - bridge.logger.log("TODO: IEditController2::setKnobMode()"); - return Steinberg::kNotImplemented; + return bridge.send_message(YaEditController2::SetKnobMode{ + .instance_id = instance_id(), .mode = mode}); } tresult PLUGIN_API Vst3PluginProxyImpl::openHelp(TBool onlyCheck) { diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index e6464be2..0e4eb535 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -34,6 +34,7 @@ InstanceInterfaces::InstanceInterfaces( component(object), connection_point(object), edit_controller(object), + edit_controller_2(object), plugin_base(object) {} Vst3Bridge::Vst3Bridge(MainContext& main_context, @@ -335,6 +336,11 @@ void Vst3Bridge::run() { request.instance_id) : std::nullopt)}; }, + [&](const YaEditController2::SetKnobMode& request) + -> YaEditController2::SetKnobMode::Response { + return object_instances[request.instance_id] + .edit_controller_2->setKnobMode(request.mode); + }, [&](const YaPlugView::IsPlatformTypeSupported& request) -> YaPlugView::IsPlatformTypeSupported::Response { // The host will of course want to pass an X11 window ID for the diff --git a/src/wine-host/bridges/vst3.h b/src/wine-host/bridges/vst3.h index 929a55d9..fe31615d 100644 --- a/src/wine-host/bridges/vst3.h +++ b/src/wine-host/bridges/vst3.h @@ -113,6 +113,7 @@ struct InstanceInterfaces { Steinberg::FUnknownPtr component; Steinberg::FUnknownPtr connection_point; Steinberg::FUnknownPtr edit_controller; + Steinberg::FUnknownPtr edit_controller_2; Steinberg::FUnknownPtr plugin_base; };