diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 59fc75ec..8e568463 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -90,6 +90,7 @@ using ControlRequest = YaNoteExpressionController::GetNoteExpressionInfo, YaNoteExpressionController::GetNoteExpressionStringByValue, YaNoteExpressionController::GetNoteExpressionValueByString, + YaParameterFinder::FindParameter, YaPlugView::IsPlatformTypeSupported, YaPlugView::Attached, YaPlugView::Removed, diff --git a/src/common/serialization/vst3/plug-view-proxy.cpp b/src/common/serialization/vst3/plug-view-proxy.cpp index 5160ae31..d873367a 100644 --- a/src/common/serialization/vst3/plug-view-proxy.cpp +++ b/src/common/serialization/vst3/plug-view-proxy.cpp @@ -21,10 +21,13 @@ Vst3PlugViewProxy::ConstructArgs::ConstructArgs() {} Vst3PlugViewProxy::ConstructArgs::ConstructArgs( Steinberg::IPtr object, size_t owner_instance_id) - : owner_instance_id(owner_instance_id), plug_view_args(object) {} + : owner_instance_id(owner_instance_id), + plug_view_args(object), + parameter_finder_args(object) {} Vst3PlugViewProxy::Vst3PlugViewProxy(const ConstructArgs&& args) : YaPlugView(std::move(args.plug_view_args)), + YaParameterFinder(std::move(args.parameter_finder_args)), arguments(std::move(args)){FUNKNOWN_CTOR} Vst3PlugViewProxy::~Vst3PlugViewProxy() { @@ -44,6 +47,10 @@ tresult PLUGIN_API Vst3PlugViewProxy::queryInterface(Steinberg::FIDString _iid, QUERY_INTERFACE(_iid, obj, Steinberg::IPlugView::iid, Steinberg::IPlugView) } + if (YaParameterFinder::supported()) { + QUERY_INTERFACE(_iid, obj, Steinberg::Vst::IParameterFinder::iid, + Steinberg::Vst::IParameterFinder) + } *obj = nullptr; return Steinberg::kNoInterface; diff --git a/src/common/serialization/vst3/plug-view-proxy.h b/src/common/serialization/vst3/plug-view-proxy.h index bd185d68..4bb2f45c 100644 --- a/src/common/serialization/vst3/plug-view-proxy.h +++ b/src/common/serialization/vst3/plug-view-proxy.h @@ -30,7 +30,7 @@ * `IEditController::createView()`, and it works exactly the same as * `Vst3PluginProxy`. */ -class Vst3PlugViewProxy : public YaPlugView { +class Vst3PlugViewProxy : public YaPlugView, public YaParameterFinder { public: /** * These are the arguments for constructing a @@ -55,10 +55,13 @@ class Vst3PlugViewProxy : public YaPlugView { YaPlugView::ConstructArgs plug_view_args; + YaParameterFinder::ConstructArgs parameter_finder_args; + template void serialize(S& s) { s.value8b(owner_instance_id); s.object(plug_view_args); + s.object(parameter_finder_args); } }; diff --git a/src/common/serialization/vst3/plug-view/parameter-finder.h b/src/common/serialization/vst3/plug-view/parameter-finder.h index 94569727..fdfca513 100644 --- a/src/common/serialization/vst3/plug-view/parameter-finder.h +++ b/src/common/serialization/vst3/plug-view/parameter-finder.h @@ -99,7 +99,7 @@ class YaParameterFinder : public Steinberg::Vst::IParameterFinder { virtual tresult PLUGIN_API findParameter(int32 xPos, int32 yPos, - Steinberg::Vst::ParamID& resultTag /*out*/) = 0; + Steinberg::Vst::ParamID& resultTag /*out*/) override = 0; protected: ConstructArgs arguments; diff --git a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp index 5493b56a..1b8fba92 100644 --- a/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plug-view-proxy.cpp @@ -157,3 +157,18 @@ Vst3PlugViewProxyImpl::checkSizeConstraint(Steinberg::ViewRect* rect) { return Steinberg::kInvalidArgument; } } + +tresult PLUGIN_API Vst3PlugViewProxyImpl::findParameter( + int32 xPos, + int32 yPos, + Steinberg::Vst::ParamID& resultTag /*out*/) { + const FindParameterResponse response = + bridge.send_message(YaParameterFinder::FindParameter{ + .owner_instance_id = owner_instance_id(), + .x_pos = xPos, + .y_pos = yPos}); + + resultTag = response.result_tag; + + return response.result; +} diff --git a/src/plugin/bridges/vst3-impls/plug-view-proxy.h b/src/plugin/bridges/vst3-impls/plug-view-proxy.h index e610a312..c50ba98f 100644 --- a/src/plugin/bridges/vst3-impls/plug-view-proxy.h +++ b/src/plugin/bridges/vst3-impls/plug-view-proxy.h @@ -57,6 +57,12 @@ class Vst3PlugViewProxyImpl : public Vst3PlugViewProxy { tresult PLUGIN_API canResize() override; tresult PLUGIN_API checkSizeConstraint(Steinberg::ViewRect* rect) override; + // From `IParameterFinder` + tresult PLUGIN_API + findParameter(int32 xPos, + int32 yPos, + Steinberg::Vst::ParamID& resultTag /*out*/) override; + /** * The `IPlugFrame` object passed by the host passed to us in * `IPlugView::setFrame()`. When the plugin makes a callback on the diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index bc704b1b..81b7822f 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -449,6 +449,17 @@ void Vst3Bridge::run() { .result = result, .value_normalized = value_normalized}; }, + [&](const YaParameterFinder::FindParameter& request) + -> YaParameterFinder::FindParameter::Response { + Steinberg::Vst::ParamID result_tag; + const tresult result = + object_instances[request.owner_instance_id] + .plug_view_instance->parameter_finder->findParameter( + request.x_pos, request.y_pos, result_tag); + + return YaParameterFinder::FindParameterResponse{ + .result = result, .result_tag = result_tag}; + }, [&](const YaPlugView::IsPlatformTypeSupported& request) -> YaPlugView::IsPlatformTypeSupported::Response { // The host will of course want to pass an X11 window ID for the