From 08826230923dfb70e4558a41179ac0744e69fdb8 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 2 Nov 2025 09:50:16 -0800 Subject: [PATCH] Clamp the audio drain delay to 100 ms Fixes https://github.com/libsdl-org/SDL/issues/9829 --- src/audio/SDL_audio.c | 6 +++++- src/audio/alsa/SDL_alsa_audio.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 54da689a92..e084f24cfc 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -1298,7 +1298,11 @@ void SDL_PlaybackAudioThreadShutdown(SDL_AudioDevice *device) const int frames = device->buffer_size / SDL_AUDIO_FRAMESIZE(device->spec); // Wait for the audio to drain if device didn't die. if (!SDL_GetAtomicInt(&device->zombie)) { - SDL_Delay(((frames * 1000) / device->spec.freq) * 2); + int delay = ((frames * 1000) / device->spec.freq) * 2; + if (delay > 100) { + delay = 100; + } + SDL_Delay(delay); } current_audio.impl.ThreadDeinit(device); SDL_AudioThreadFinalize(device); diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c index 07b1b556f4..e292b3673f 100644 --- a/src/audio/alsa/SDL_alsa_audio.c +++ b/src/audio/alsa/SDL_alsa_audio.c @@ -485,7 +485,11 @@ static void ALSA_CloseDevice(SDL_AudioDevice *device) if (device->hidden) { if (device->hidden->pcm) { // Wait for the submitted audio to drain. ALSA_snd_pcm_drop() can hang, so don't use that. - SDL_Delay(((device->sample_frames * 1000) / device->spec.freq) * 2); + int delay = ((device->sample_frames * 1000) / device->spec.freq) * 2; + if (delay > 100) { + delay = 100; + } + SDL_Delay(delay); ALSA_snd_pcm_close(device->hidden->pcm); } SDL_free(device->hidden->mixbuf);