From 7887efa69f5db3e45cd76d7e33629ece6ed19eb0 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Fri, 17 Oct 2025 00:18:20 +0900 Subject: [PATCH] [APU] fix potential semaphore leak on invalid client index --- src/xenia/apu/audio_system.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/xenia/apu/audio_system.cc b/src/xenia/apu/audio_system.cc index e5c4fd3c9..ba53454b3 100644 --- a/src/xenia/apu/audio_system.cc +++ b/src/xenia/apu/audio_system.cc @@ -248,6 +248,14 @@ void AudioSystem::SubmitFrame(size_t index, float* samples) { "(in_use={}, driver={:p})", index, index < kMaximumClientCount ? clients_[index].in_use : false, index < kMaximumClientCount ? (void*)clients_[index].driver : nullptr); + + // Submit silence instead of dropping the frame to maintain the callback + // chain. If we don't submit anything, the audio driver's OnBufferEnd + // callback will never fire, causing the semaphore to leak. + if (index < kMaximumClientCount && clients_[index].driver) { + static float silence[apu::AudioDriver::kFrameSamplesMax] = {0}; + (clients_[index].driver)->SubmitFrame(silence); + } return; } (clients_[index].driver)->SubmitFrame(samples);