Browse Source

wasapi: If GetDeviceBuf can't get a full buffer, go back to waiting.

Reference Issue #8924.
Ryan C. Gordon 1 year ago
parent
commit
f931b25f4c
1 changed files with 6 additions and 1 deletions
  1. 6 1
      src/audio/wasapi/SDL_wasapi.c

+ 6 - 1
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);