diff --git a/src/libs/libAudio.cpp b/src/libs/libAudio.cpp index 137cc767d..06ea9dcc7 100644 --- a/src/libs/libAudio.cpp +++ b/src/libs/libAudio.cpp @@ -1163,6 +1163,7 @@ LIB_DEFINE(InitAudio_1_Ngs2) { LIB_FUNC("-TOuuAQ-buE", Ngs2::Ngs2VoiceGetState); LIB_FUNC("rEh728kXk3w", Ngs2::Ngs2VoiceGetStateFlags); LIB_FUNC("9eic4AmjGVI", Ngs2::Ngs2VoiceQueryInfo); + LIB_FUNC("WCayTgob7-o", Ngs2::Ngs2VoiceGetPortInfo); 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 30735103b..5f0be1ef4 100644 --- a/src/libs/ngs2.cpp +++ b/src/libs/ngs2.cpp @@ -2802,6 +2802,31 @@ int KYTY_SYSV_ABI Ngs2VoiceQueryInfo(uintptr_t voice_handle, uint32_t query_id, return OK; } +int KYTY_SYSV_ABI Ngs2VoiceGetPortInfo(uintptr_t voice_handle, uint32_t port, void* info, + size_t info_size) { + PRINT_NAME(); + + struct PortInfo { + int32_t matrix; + float volume; + uint32_t delay_samples, input; + uintptr_t dest; + }; + EXIT_NOT_IMPLEMENTED(voice_handle == 0 || info == nullptr || info_size != sizeof(PortInfo)); + + auto* voice = reinterpret_cast(voice_handle); + + Common::LockGuard lock(voice->rack->ngs->mutex); + + EXIT_NOT_IMPLEMENTED(port >= voice->ports.size()); + const auto& p = voice->ports[port]; + + *static_cast(info) = {p.matrix, p.volume, 0, p.input, + reinterpret_cast(p.dest)}; + + 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 8df719eb9..b111aee26 100644 --- a/src/libs/ngs2.h +++ b/src/libs/ngs2.h @@ -62,6 +62,8 @@ int KYTY_SYSV_ABI Ngs2VoiceGetState(uintptr_t voice_handle, Ngs2VoiceState* stat 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 Ngs2VoiceGetPortInfo(uintptr_t voice_handle, uint32_t port, 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 011eaf1a6..59d72a018 100644 --- a/tests/Ngs2SamplerTests.cpp +++ b/tests/Ngs2SamplerTests.cpp @@ -1165,6 +1165,22 @@ void TestSetupQuery() { Check(info[0] == 2 && info[1] == 0, "setup query did not report the voice channels"); } +void TestPortInfo() { + Fixture f(48000); + Ngs2VoiceInternal dest; + f.voice.ports.push_back({&dest, 1, 0.5f, 0}); + struct { + int32_t matrix; + float volume; + uint32_t delay_samples, input; + uintptr_t dest; + } info {99, 99, 99, 99, 99}; + Ngs2VoiceGetPortInfo(reinterpret_cast(&f.voice), 0, &info, sizeof(info)); + Check(info.matrix == 0 && info.volume == 0.5f && info.delay_samples == 0 && info.input == 1 && + info.dest == reinterpret_cast(&dest), + "port info did not report the port routing and volume"); +} + void TestPlayStateBeforeRender() { Fixture f(48000); const int16_t pcm[] = {8192, -16384}; @@ -1896,6 +1912,7 @@ int main() { TestMatrixOutputChannels(); TestCustomPcmStillPlays(); TestSetupQuery(); + TestPortInfo(); TestPlayStateBeforeRender(); TestStatePublication(); TestStopThenPlayBeforeRender();