From 4659a84bd1aebeeeac94793afb046a4059e8366d Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 29 Mar 2024 00:55:38 -0400 Subject: [PATCH] coreaudio: fix race condition when closing an input device. --- src/audio/coreaudio/SDL_coreaudio.m | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/audio/coreaudio/SDL_coreaudio.m b/src/audio/coreaudio/SDL_coreaudio.m index 17cfe79f6707b..8de8d96c052b0 100644 --- a/src/audio/coreaudio/SDL_coreaudio.m +++ b/src/audio/coreaudio/SDL_coreaudio.m @@ -621,7 +621,12 @@ static void InputBufferReadyCallback(void *inUserData, AudioQueueRef inAQ, Audio SDL_assert(device->hidden->current_buffer == NULL); // shouldn't have anything pending device->hidden->current_buffer = inBuffer; SDL_CaptureAudioThreadIterate(device); - SDL_assert(device->hidden->current_buffer == NULL); // CaptureFromDevice/FlushCapture should have enqueued and cleaned it out. + + // buffer is unexpectedly here? We're probably dying, but try to requeue this buffer anyhow. + if (device->hidden->current_buffer != NULL) { + SDL_assert(SDL_AtomicGet(&device->shutdown) != 0); + COREAUDIO_FlushCapture(device); // just flush it manually, which will requeue it. + } } static void COREAUDIO_CloseDevice(SDL_AudioDevice *device)