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);