From 30bb6d3b97fff70f34ac7a24d3d5f6c606b4698b Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Fri, 8 Jan 2021 17:12:17 +0100 Subject: [PATCH] Fully implement IKeyswitchController --- src/common/serialization/vst3.h | 2 ++ .../bridges/vst3-impls/plugin-proxy.cpp | 20 +++++++++++----- src/wine-host/bridges/vst3.cpp | 23 +++++++++++++++++-- src/wine-host/bridges/vst3.h | 2 ++ 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index ab899543..a6ffa480 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -91,6 +91,8 @@ using ControlRequest = YaEditController2::OpenAboutBox, YaEditControllerHostEditing::BeginEditFromHost, YaEditControllerHostEditing::EndEditFromHost, + YaKeyswitchController::GetKeyswitchCount, + YaKeyswitchController::GetKeyswitchInfo, YaMidiMapping::GetMidiControllerAssignment, YaNoteExpressionController::GetNoteExpressionCount, YaNoteExpressionController::GetNoteExpressionInfo, diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 7e9f2f78..cf4da106 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -465,9 +465,10 @@ Vst3PluginProxyImpl::endEditFromHost(Steinberg::Vst::ParamID paramID) { int32 PLUGIN_API Vst3PluginProxyImpl::getKeyswitchCount(int32 busIndex, int16 channel) { - // TODO: Implement - bridge.logger.log("TODO: IKeyswitchController::getKeyswitchCount()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaKeyswitchController::GetKeyswitchCount{.instance_id = instance_id(), + .bus_index = busIndex, + .channel = channel}); } tresult PLUGIN_API Vst3PluginProxyImpl::getKeyswitchInfo( @@ -475,9 +476,16 @@ tresult PLUGIN_API Vst3PluginProxyImpl::getKeyswitchInfo( int16 channel, int32 keySwitchIndex, Steinberg::Vst::KeyswitchInfo& info /*out*/) { - // TODO: Implement - bridge.logger.log("TODO: IKeyswitchController::getKeyswitchInfo()"); - return Steinberg::kNotImplemented; + const GetKeyswitchInfoResponse response = + bridge.send_message(YaKeyswitchController::GetKeyswitchInfo{ + .instance_id = instance_id(), + .bus_index = busIndex, + .channel = channel, + .key_switch_index = keySwitchIndex}); + + info = response.info; + + return response.result; } tresult PLUGIN_API Vst3PluginProxyImpl::getMidiControllerAssignment( diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 7e08f538..0911d37c 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -44,6 +44,7 @@ InstanceInterfaces::InstanceInterfaces( edit_controller(object), edit_controller_2(object), edit_controller_host_editing(object), + keyswitch_controller(object), midi_mapping(object), note_expression_controller(object), plugin_base(object), @@ -411,6 +412,24 @@ void Vst3Bridge::run() { .edit_controller_host_editing->endEditFromHost( request.param_id); }, + [&](const YaKeyswitchController::GetKeyswitchCount& request) + -> YaKeyswitchController::GetKeyswitchCount::Response { + return object_instances[request.instance_id] + .keyswitch_controller->getKeyswitchCount(request.bus_index, + request.channel); + }, + [&](const YaKeyswitchController::GetKeyswitchInfo& request) + -> YaKeyswitchController::GetKeyswitchInfo::Response { + Steinberg::Vst::KeyswitchInfo info{}; + const tresult result = + object_instances[request.instance_id] + .keyswitch_controller->getKeyswitchInfo( + request.bus_index, request.channel, + request.key_switch_index, info); + + return YaKeyswitchController::GetKeyswitchInfoResponse{ + .result = result, .info = std::move(info)}; + }, [&](const YaMidiMapping::GetMidiControllerAssignment& request) -> YaMidiMapping::GetMidiControllerAssignment::Response { Steinberg::Vst::ParamID id; @@ -780,7 +799,7 @@ void Vst3Bridge::run() { }, [&](const YaUnitInfo::GetUnitInfo& request) -> YaUnitInfo::GetUnitInfo::Response { - Steinberg::Vst::UnitInfo info; + Steinberg::Vst::UnitInfo info{}; const tresult result = object_instances[request.instance_id] .unit_info->getUnitInfo(request.unit_index, info); @@ -795,7 +814,7 @@ void Vst3Bridge::run() { }, [&](const YaUnitInfo::GetProgramListInfo& request) -> YaUnitInfo::GetProgramListInfo::Response { - Steinberg::Vst::ProgramListInfo info; + Steinberg::Vst::ProgramListInfo info{}; const tresult result = object_instances[request.instance_id] .unit_info->getProgramListInfo( request.list_index, info); diff --git a/src/wine-host/bridges/vst3.h b/src/wine-host/bridges/vst3.h index f32783b0..8d8649a9 100644 --- a/src/wine-host/bridges/vst3.h +++ b/src/wine-host/bridges/vst3.h @@ -154,6 +154,8 @@ struct InstanceInterfaces { Steinberg::FUnknownPtr edit_controller_2; Steinberg::FUnknownPtr edit_controller_host_editing; + Steinberg::FUnknownPtr + keyswitch_controller; Steinberg::FUnknownPtr midi_mapping; Steinberg::FUnknownPtr note_expression_controller;