Commit 0d0fee7569803ddc41985bfc249418b02dd8cd97

Ryan C. Gordon 2021-07-27T14:12:18

wasapi: Open capture devices the way we used to. This should work around the regression in #3234, since it basically reverts the problem change, but only for capture devices. Fixes #3234.

diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c
index 72b2ca9..190cf81 100644
--- a/src/audio/wasapi/SDL_wasapi.c
+++ b/src/audio/wasapi/SDL_wasapi.c
@@ -496,6 +496,7 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream)
     const SDL_AudioSpec oldspec = this->spec;
     const AUDCLNT_SHAREMODE sharemode = AUDCLNT_SHAREMODE_SHARED;
     UINT32 bufsize = 0;  /* this is in sample frames, not samples, not bytes. */
+    REFERENCE_TIME duration = 0;
     REFERENCE_TIME default_period = 0;
     IAudioClient *client = this->hidden->client;
     IAudioRenderClient *render = NULL;
@@ -545,7 +546,11 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream)
         return SDL_SetError("WASAPI: Unsupported audio format");
     }
 
-    ret = IAudioClient_GetDevicePeriod(client, &default_period, NULL);
+    if (this->iscapture) {
+        ret = IAudioClient_GetDevicePeriod(client, NULL, &duration);
+    } else {
+        ret = IAudioClient_GetDevicePeriod(client, &default_period, NULL);
+    }
     if (FAILED(ret)) {
         return WIN_SetErrorFromHRESULT("WASAPI can't determine minimum device period", ret);
     }
@@ -567,7 +572,12 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream)
 #endif
 
     streamflags |= AUDCLNT_STREAMFLAGS_EVENTCALLBACK;
-    ret = IAudioClient_Initialize(client, sharemode, streamflags, 0, 0, waveformat, NULL);
+    if (this->iscapture) {
+        ret = IAudioClient_Initialize(client, sharemode, streamflags, duration, sharemode == AUDCLNT_SHAREMODE_SHARED ? 0 : duration, waveformat, NULL);
+    } else {
+        ret = IAudioClient_Initialize(client, sharemode, streamflags, 0, 0, waveformat, NULL);
+    }
+
     if (FAILED(ret)) {
         return WIN_SetErrorFromHRESULT("WASAPI can't initialize audio client", ret);
     }
@@ -584,7 +594,9 @@ WASAPI_PrepDevice(_THIS, const SDL_bool updatestream)
 
     /* Match the callback size to the period size to cut down on the number of
        interrupts waited for in each call to WaitDevice */
-    {
+    if (this->iscapture) {
+        this->spec.samples = ((Uint16) bufsize) / 2;  /* fill half of the DMA buffer on each run. */
+    } else {
         const float period_millis = default_period / 10000.0f;
         const float period_frames = period_millis * this->spec.freq / 1000.0f;
         this->spec.samples = (Uint16)SDL_ceilf(period_frames);