From 9bf311c6c71b73c211e7943eb3f46790c3ec331a Mon Sep 17 00:00:00 2001 From: nmzik Date: Fri, 30 Oct 2026 01:05:28 +0100 Subject: [PATCH] ngs2: report voice setup channels from the setup query Co-authored-by: Phr3d13 --- src/libs/libAudio.cpp | 1 + src/libs/ngs2.cpp | 19 +++++++++++++++++++ src/libs/ngs2.h | 2 ++ tests/Ngs2SamplerTests.cpp | 8 ++++++++ 4 files changed, 30 insertions(+) diff --git a/src/libs/libAudio.cpp b/src/libs/libAudio.cpp index 0512b7047..137cc767d 100644 --- a/src/libs/libAudio.cpp +++ b/src/libs/libAudio.cpp @@ -1162,6 +1162,7 @@ LIB_DEFINE(InitAudio_1_Ngs2) { LIB_FUNC("AbYvTOZ8Pts", Ngs2::Ngs2VoiceRunCommands); LIB_FUNC("-TOuuAQ-buE", Ngs2::Ngs2VoiceGetState); LIB_FUNC("rEh728kXk3w", Ngs2::Ngs2VoiceGetStateFlags); + LIB_FUNC("9eic4AmjGVI", Ngs2::Ngs2VoiceQueryInfo); LIB_FUNC("i0VnXM-C9fc", Ngs2::Ngs2SystemRender); LIB_FUNC("l4Q2dWEH6UM", Ngs2::Ngs2SystemSetGrainSamples); LIB_FUNC("hyVLT2VlOYk", Ngs2::Ngs2ParseWaveformData); diff --git a/src/libs/ngs2.cpp b/src/libs/ngs2.cpp index 5344dbc94..30735103b 100644 --- a/src/libs/ngs2.cpp +++ b/src/libs/ngs2.cpp @@ -2783,6 +2783,25 @@ int KYTY_SYSV_ABI Ngs2VoiceGetStateFlags(uintptr_t voice_handle, uint32_t* state return OK; } +int KYTY_SYSV_ABI Ngs2VoiceQueryInfo(uintptr_t voice_handle, uint32_t query_id, void* info, + size_t info_size) { + PRINT_NAME(); + + struct SetupInfo { + uint32_t channels, flags; + }; + EXIT_NOT_IMPLEMENTED(voice_handle == 0 || info == nullptr); + EXIT_NOT_IMPLEMENTED(query_id != 0x4001 || info_size != sizeof(SetupInfo)); + + auto* voice = reinterpret_cast(voice_handle); + + Common::LockGuard lock(voice->rack->ngs->mutex); + + *static_cast(info) = {voice->channels, 0}; + + return OK; +} + int KYTY_SYSV_ABI Ngs2SystemLock(uintptr_t system_handle) { PRINT_NAME(); diff --git a/src/libs/ngs2.h b/src/libs/ngs2.h index bb4cf236c..8df719eb9 100644 --- a/src/libs/ngs2.h +++ b/src/libs/ngs2.h @@ -60,6 +60,8 @@ int KYTY_SYSV_ABI Ngs2VoiceRunCommands(uintptr_t voice_handle, const void* comma int KYTY_SYSV_ABI Ngs2VoiceGetState(uintptr_t voice_handle, Ngs2VoiceState* state, size_t state_size); int KYTY_SYSV_ABI Ngs2VoiceGetStateFlags(uintptr_t voice_handle, uint32_t* state_flags); +int KYTY_SYSV_ABI Ngs2VoiceQueryInfo(uintptr_t voice_handle, uint32_t query_id, void* info, + size_t info_size); int KYTY_SYSV_ABI Ngs2SystemRender(uintptr_t system_handle, const Ngs2RenderBufferInfo* buffer_info, uint32_t num_buffer_info); int KYTY_SYSV_ABI Ngs2ParseWaveformData(const void* data, size_t data_size, Ngs2WaveformInfo* info); diff --git a/tests/Ngs2SamplerTests.cpp b/tests/Ngs2SamplerTests.cpp index 9dad0b446..011eaf1a6 100644 --- a/tests/Ngs2SamplerTests.cpp +++ b/tests/Ngs2SamplerTests.cpp @@ -1158,6 +1158,13 @@ void TestDeferredSamplerSetup() { "sampler did not play after deferred stream setup"); } +void TestSetupQuery() { + Fixture f(48000, 2); + uint32_t info[2] = {99, 99}; + Ngs2VoiceQueryInfo(reinterpret_cast(&f.voice), 0x4001, info, sizeof(info)); + Check(info[0] == 2 && info[1] == 0, "setup query did not report the voice channels"); +} + void TestPlayStateBeforeRender() { Fixture f(48000); const int16_t pcm[] = {8192, -16384}; @@ -1888,6 +1895,7 @@ int main() { TestMonoRateAndRouting(); TestMatrixOutputChannels(); TestCustomPcmStillPlays(); + TestSetupQuery(); TestPlayStateBeforeRender(); TestStatePublication(); TestStopThenPlayBeforeRender();