Fully implement IParameterFinder

With this we're at VST 3.0.2 support.
This commit is contained in:
Robbert van der Helm
2021-01-03 23:46:13 +01:00
parent 52d4fe2f08
commit 8924124abb
7 changed files with 46 additions and 3 deletions
+1
View File
@@ -90,6 +90,7 @@ using ControlRequest =
YaNoteExpressionController::GetNoteExpressionInfo,
YaNoteExpressionController::GetNoteExpressionStringByValue,
YaNoteExpressionController::GetNoteExpressionValueByString,
YaParameterFinder::FindParameter,
YaPlugView::IsPlatformTypeSupported,
YaPlugView::Attached,
YaPlugView::Removed,
@@ -21,10 +21,13 @@ Vst3PlugViewProxy::ConstructArgs::ConstructArgs() {}
Vst3PlugViewProxy::ConstructArgs::ConstructArgs(
Steinberg::IPtr<Steinberg::FUnknown> 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;
@@ -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 <typename S>
void serialize(S& s) {
s.value8b(owner_instance_id);
s.object(plug_view_args);
s.object(parameter_finder_args);
}
};
@@ -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;
@@ -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;
}
@@ -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
+11
View File
@@ -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