From 0d0fee7569803ddc41985bfc249418b02dd8cd97 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 27 Jul 2021 14:12:18 -0400 Subject: [PATCH] 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. --- src/audio/wasapi/SDL_wasapi.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/audio/wasapi/SDL_wasapi.c b/src/audio/wasapi/SDL_wasapi.c index 72b2ca911..190cf8192 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);