diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 583b0f59..8922cde7 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -446,6 +446,13 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaUnitInfo::GetProgramListCount& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.instance_id << ": IUnitInfo::getProgramListCount()"; + }); +} + bool Vst3Logger::log_request( bool is_host_vst, const YaAudioProcessor::SetBusArrangements& request) { diff --git a/src/common/logging/vst3.h b/src/common/logging/vst3.h index 67d0a7c0..9ca88ec8 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -110,6 +110,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaPluginFactory::SetHostContext&); bool log_request(bool is_host_vst, const YaUnitInfo::GetUnitCount&); bool log_request(bool is_host_vst, const YaUnitInfo::GetUnitInfo&); + bool log_request(bool is_host_vst, const YaUnitInfo::GetProgramListCount&); bool log_request(bool is_host_vst, const YaAudioProcessor::SetBusArrangements&); diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index f8406b39..db1b1a60 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -101,7 +101,8 @@ using ControlRequest = std::variant; + YaUnitInfo::GetUnitInfo, + YaUnitInfo::GetProgramListCount>; template void serialize(S& s, ControlRequest& payload) { diff --git a/src/common/serialization/vst3/plugin/unit-info.h b/src/common/serialization/vst3/plugin/unit-info.h index c7ae905e..e4498710 100644 --- a/src/common/serialization/vst3/plugin/unit-info.h +++ b/src/common/serialization/vst3/plugin/unit-info.h @@ -115,6 +115,22 @@ class YaUnitInfo : public Steinberg::Vst::IUnitInfo { virtual tresult PLUGIN_API getUnitInfo(int32 unitIndex, Steinberg::Vst::UnitInfo& info /*out*/) override = 0; + + /** + * Message to pass through a call to `IUnitInfo::getProgramListCount()` to + * the Wine plugin host. + */ + struct GetProgramListCount { + using Response = PrimitiveWrapper; + + native_size_t instance_id; + + template + void serialize(S& s) { + s.value8b(instance_id); + } + }; + virtual int32 PLUGIN_API getProgramListCount() override = 0; virtual tresult PLUGIN_API getProgramListInfo( int32 listIndex, diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 71fdd72a..629bd400 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -458,9 +458,8 @@ Vst3PluginProxyImpl::getUnitInfo(int32 unitIndex, } int32 PLUGIN_API Vst3PluginProxyImpl::getProgramListCount() { - // TODO: Implement - bridge.logger.log("TODO: IUnitInfo::getProgramListCount()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaUnitInfo::GetProgramListCount{.instance_id = instance_id()}); } tresult PLUGIN_API Vst3PluginProxyImpl::getProgramListInfo( diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 1bd0058c..bbf1f1f4 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -581,6 +581,11 @@ void Vst3Bridge::run() { return YaUnitInfo::GetUnitInfoResponse{.result = result, .info = info}; }, + [&](const YaUnitInfo::GetProgramListCount& request) + -> YaUnitInfo::GetProgramListCount::Response { + return object_instances[request.instance_id] + .unit_info->getProgramListCount(); + }, }); }