diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index b8c88840..5452a09e 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -108,7 +108,10 @@ using ControlRequest = std::variant; + YaUnitInfo::GetSelectedUnit, + YaUnitInfo::SelectUnit, + YaUnitInfo::GetUnitByBus, + YaUnitInfo::SetUnitProgramData>; template void serialize(S& s, ControlRequest& payload) { diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 7916333a..39221270 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -542,9 +542,8 @@ Steinberg::Vst::UnitID PLUGIN_API Vst3PluginProxyImpl::getSelectedUnit() { tresult PLUGIN_API Vst3PluginProxyImpl::selectUnit(Steinberg::Vst::UnitID unitId) { - // TODO: Implement - bridge.logger.log("TODO: IUnitInfo::selectUnit()"); - return Steinberg::kNotImplemented; + return bridge.send_message(YaUnitInfo::SelectUnit{ + .instance_id = instance_id(), .unit_id = unitId}); } tresult PLUGIN_API @@ -553,16 +552,25 @@ Vst3PluginProxyImpl::getUnitByBus(Steinberg::Vst::MediaType type, int32 busIndex, int32 channel, Steinberg::Vst::UnitID& unitId /*out*/) { - // TODO: Implement - bridge.logger.log("TODO: IUnitInfo::getUnitByBus()"); - return Steinberg::kNotImplemented; + const GetUnitByBusResponse response = bridge.send_message( + YaUnitInfo::GetUnitByBus{.instance_id = instance_id(), + .type = type, + .dir = dir, + .bus_index = busIndex, + .channel = channel}); + + unitId = response.unit_id; + + return response.result; } tresult PLUGIN_API Vst3PluginProxyImpl::setUnitProgramData(int32 listOrUnitId, int32 programIndex, Steinberg::IBStream* data) { - // TODO: Implement - bridge.logger.log("TODO: IUnitInfo::setUnitProgramData()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaUnitInfo::SetUnitProgramData{.instance_id = instance_id(), + .list_or_unit_id = listOrUnitId, + .program_index = programIndex, + .data = data}); } diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 17a2a650..35852cea 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -644,6 +644,30 @@ void Vst3Bridge::run() { return object_instances[request.instance_id] .unit_info->getSelectedUnit(); }, + [&](const YaUnitInfo::SelectUnit& request) + -> YaUnitInfo::SelectUnit::Response { + return object_instances[request.instance_id] + .unit_info->selectUnit(request.unit_id); + }, + [&](const YaUnitInfo::GetUnitByBus& request) + -> YaUnitInfo::GetUnitByBus::Response { + Steinberg::Vst::UnitID unit_id; + const tresult result = + object_instances[request.instance_id] + .unit_info->getUnitByBus(request.type, request.dir, + request.bus_index, + request.channel, unit_id); + + return YaUnitInfo::GetUnitByBusResponse{.result = result, + .unit_id = unit_id}; + }, + [&](YaUnitInfo::SetUnitProgramData& request) + -> YaUnitInfo::SetUnitProgramData::Response { + return object_instances[request.instance_id] + .unit_info->setUnitProgramData(request.list_or_unit_id, + request.program_index, + &request.data); + }, }); }