From 3553b080fe8c72f47f7bb4d9b8953964fe61422a Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Tue, 29 Dec 2020 22:00:22 +0100 Subject: [PATCH] Implement IUnitData With this all VST 3.0.0 interfaces are finally supported. --- src/common/serialization/vst3.h | 3 +++ .../serialization/vst3/plugin-proxy.cpp | 6 +++++ src/common/serialization/vst3/plugin-proxy.h | 3 +++ .../bridges/vst3-impls/plugin-proxy.cpp | 25 +++++++++++++++++++ src/plugin/bridges/vst3-impls/plugin-proxy.h | 8 ++++++ src/wine-host/bridges/vst3.cpp | 21 ++++++++++++++++ src/wine-host/bridges/vst3.h | 1 + 7 files changed, 67 insertions(+) diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index 9ae4dec4..5d925107 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -103,6 +103,9 @@ using ControlRequest = std::variant @@ -100,6 +102,7 @@ class Vst3PluginProxy : public YaAudioProcessor, s.object(edit_controller_2_args); s.object(plugin_base_args); s.object(program_list_data_args); + s.object(unit_data_args); s.object(unit_info_args); } }; diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 9d21e1cf..e5aca967 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -475,6 +475,31 @@ Vst3PluginProxyImpl::setProgramData(Steinberg::Vst::ProgramListID listId, .data = data}); } +tresult PLUGIN_API +Vst3PluginProxyImpl::unitDataSupported(Steinberg::Vst::UnitID unitId) { + return bridge.send_message(YaUnitData::UnitDataSupported{ + .instance_id = instance_id(), .unit_id = unitId}); +} + +tresult PLUGIN_API +Vst3PluginProxyImpl::getUnitData(Steinberg::Vst::UnitID unitId, + Steinberg::IBStream* data) { + const GetUnitDataResponse response = + bridge.send_message(YaUnitData::GetUnitData{ + .instance_id = instance_id(), .unit_id = unitId}); + + assert(response.data.write_back(data) == Steinberg::kResultOk); + + return response.result; +} + +tresult PLUGIN_API +Vst3PluginProxyImpl::setUnitData(Steinberg::Vst::UnitID unitId, + Steinberg::IBStream* data) { + return bridge.send_message(YaUnitData::SetUnitData{ + .instance_id = instance_id(), .unit_id = unitId, .data = data}); +} + int32 PLUGIN_API Vst3PluginProxyImpl::getUnitCount() { return bridge.send_message( YaUnitInfo::GetUnitCount{.instance_id = instance_id()}); diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.h b/src/plugin/bridges/vst3-impls/plugin-proxy.h index dcd35d34..4a04db6c 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.h +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.h @@ -134,6 +134,14 @@ class Vst3PluginProxyImpl : public Vst3PluginProxy { int32 programIndex, Steinberg::IBStream* data) override; + // From `IUnitData` + tresult PLUGIN_API + unitDataSupported(Steinberg::Vst::UnitID unitId) override; + tresult PLUGIN_API getUnitData(Steinberg::Vst::UnitID unitId, + Steinberg::IBStream* data) override; + tresult PLUGIN_API setUnitData(Steinberg::Vst::UnitID unitId, + Steinberg::IBStream* data) override; + // From `IUnitInfo` int32 PLUGIN_API getUnitCount() override; tresult PLUGIN_API diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 2b59b904..8e89907d 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -36,6 +36,7 @@ InstanceInterfaces::InstanceInterfaces( edit_controller(object), edit_controller_2(object), plugin_base(object), + unit_data(object), program_list_data(object), unit_info(object) {} @@ -587,6 +588,26 @@ void Vst3Bridge::run() { .program_list_data->setProgramData( request.list_id, request.program_index, &request.data); }, + [&](const YaUnitData::UnitDataSupported& request) + -> YaUnitData::UnitDataSupported::Response { + return object_instances[request.instance_id] + .unit_data->unitDataSupported(request.unit_id); + }, + [&](const YaUnitData::GetUnitData& request) + -> YaUnitData::GetUnitData::Response { + VectorStream data{}; + const tresult result = + object_instances[request.instance_id] + .unit_data->getUnitData(request.unit_id, &data); + + return YaUnitData::GetUnitDataResponse{.result = result, + .data = std::move(data)}; + }, + [&](YaUnitData::SetUnitData& request) + -> YaUnitData::SetUnitData::Response { + return object_instances[request.instance_id] + .unit_data->setUnitData(request.unit_id, &request.data); + }, [&](const YaPluginFactory::Construct&) -> YaPluginFactory::Construct::Response { return YaPluginFactory::ConstructArgs( diff --git a/src/wine-host/bridges/vst3.h b/src/wine-host/bridges/vst3.h index f674b199..20ab77a0 100644 --- a/src/wine-host/bridges/vst3.h +++ b/src/wine-host/bridges/vst3.h @@ -115,6 +115,7 @@ struct InstanceInterfaces { Steinberg::FUnknownPtr edit_controller; Steinberg::FUnknownPtr edit_controller_2; Steinberg::FUnknownPtr plugin_base; + Steinberg::FUnknownPtr unit_data; Steinberg::FUnknownPtr program_list_data; Steinberg::FUnknownPtr unit_info; };