diff --git a/src/common/logging/vst3.cpp b/src/common/logging/vst3.cpp index 00ad16e2..ffa03067 100644 --- a/src/common/logging/vst3.cpp +++ b/src/common/logging/vst3.cpp @@ -482,6 +482,16 @@ bool Vst3Logger::log_request(bool is_host_vst, }); } +bool Vst3Logger::log_request(bool is_host_vst, + const YaUnitInfo::HasProgramPitchNames& request) { + return log_request_base(is_host_vst, [&](auto& message) { + message << request.instance_id + << ": IUnitInfo::hasProgramPitchNames(listId = " + << request.list_id + << ", programIndex = " << request.program_index << ")"; + }); +} + 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 c80c3f8a..ff0c9017 100644 --- a/src/common/logging/vst3.h +++ b/src/common/logging/vst3.h @@ -114,6 +114,7 @@ class Vst3Logger { bool log_request(bool is_host_vst, const YaUnitInfo::GetProgramListInfo&); bool log_request(bool is_host_vst, const YaUnitInfo::GetProgramName&); bool log_request(bool is_host_vst, const YaUnitInfo::GetProgramInfo&); + bool log_request(bool is_host_vst, const YaUnitInfo::HasProgramPitchNames&); 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 f27b5299..aa2da1ad 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -105,7 +105,8 @@ using ControlRequest = std::variant; + YaUnitInfo::GetProgramInfo, + YaUnitInfo::HasProgramPitchNames>; 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 57265d22..9fb5dedb 100644 --- a/src/common/serialization/vst3/plugin/unit-info.h +++ b/src/common/serialization/vst3/plugin/unit-info.h @@ -254,6 +254,28 @@ class YaUnitInfo : public Steinberg::Vst::IUnitInfo { int32 programIndex, Steinberg::Vst::CString attributeId /*in*/, Steinberg::Vst::String128 attributeValue /*out*/) override = 0; + + /** + * Message to pass through a call to + * `IUnitInfo::hasProgramPitchNames(list_id, program_index)` to the Wine + * plugin host. + */ + struct HasProgramPitchNames { + using Response = UniversalTResult; + + native_size_t instance_id; + + Steinberg::Vst::ProgramListID list_id; + int32 program_index; + + template + void serialize(S& s) { + s.value8b(instance_id); + s.value4b(list_id); + s.value4b(program_index); + } + }; + virtual tresult PLUGIN_API hasProgramPitchNames(Steinberg::Vst::ProgramListID listId, int32 programIndex) override = 0; diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 7319faf2..32d05195 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -512,9 +512,10 @@ tresult PLUGIN_API Vst3PluginProxyImpl::getProgramInfo( tresult PLUGIN_API Vst3PluginProxyImpl::hasProgramPitchNames(Steinberg::Vst::ProgramListID listId, int32 programIndex) { - // TODO: Implement - bridge.logger.log("TODO: IUnitInfo::hasProgramPitchNames()"); - return Steinberg::kNotImplemented; + return bridge.send_message( + YaUnitInfo::HasProgramPitchNames{.instance_id = instance_id(), + .list_id = listId, + .program_index = programIndex}); } tresult PLUGIN_API Vst3PluginProxyImpl::getProgramPitchName( diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index b84ce2e7..86026b2e 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -621,6 +621,12 @@ void Vst3Bridge::run() { .attribute_value = tchar_pointer_to_u16string(attribute_value)}; }, + [&](const YaUnitInfo::HasProgramPitchNames& request) + -> YaUnitInfo::HasProgramPitchNames::Response { + return object_instances[request.instance_id] + .unit_info->hasProgramPitchNames(request.list_id, + request.program_index); + }, }); }