From f6b9ebb838ad4751aa117181fe28f2ff49e84954 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 26 Jan 2024 23:24:43 -0500 Subject: [PATCH] wasapi: If GetDeviceBuf can't get a full buffer, go back to waiting. Reference Issue #8924. (cherry picked from commit f931b25f4cd6180f98590b9697d3e6ad58b63bd0) --- src/audio/wasapi/SDL_wasapi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c index cb69d4dd5..cf90efc0f 100644 --- a/src/audio/wasapi/SDL_wasapi.c +++ b/src/audio/wasapi/SDL_wasapi.c @@ -172,13 +172,18 @@ static SDL_bool RecoverWasapiIfLost(_THIS) return lost ? RecoverWasapiDevice(this) : SDL_TRUE; } +static void WASAPI_WaitDevice(_THIS); + static Uint8 *WASAPI_GetDeviceBuf(_THIS) { /* get an endpoint buffer from WASAPI. */ BYTE *buffer = NULL; while (RecoverWasapiIfLost(this) && this->hidden->render) { - if (!WasapiFailed(this, IAudioRenderClient_GetBuffer(this->hidden->render, this->spec.samples, &buffer))) { + const HRESULT ret = IAudioRenderClient_GetBuffer(this->hidden->render, this->spec.samples, &buffer); + if (ret == AUDCLNT_E_BUFFER_TOO_LARGE) { + WASAPI_WaitDevice(this); /* see if we can wait on the buffer to drain some more first... */ + } else if (!WasapiFailed(this, ret)) { return (Uint8 *)buffer; } SDL_assert(buffer == NULL);