From 82f102cfe3e700e6b09604b2f659f7a123a8ea87 Mon Sep 17 00:00:00 2001 From: Kevin Mitchell Date: Fri, 19 Feb 2016 00:27:12 -0800 Subject: ao_wasapi: set buffer size to device period in exclusive mode This eliminates some intermittent pops heard in a HRT MicroStreamer DAC uncorrelated with user interaction. As a bonus, this resolves #1773 which I can o longer reproduce as of this commit. Leave the 50ms buffer for shared mode since that seems to be working quite well. This is also the way exclusive mode is done in the MSDN example code: https://msdn.microsoft.com/en-us/library/windows/desktop/dd370844%28v=vs.85%29.aspx This was originally increased in c545c40 to mitigate glitches that subsequent refactorings have eliminated. --- audio/out/ao_wasapi_utils.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'audio') diff --git a/audio/out/ao_wasapi_utils.c b/audio/out/ao_wasapi_utils.c index ce084731e4..76a50cdf24 100644 --- a/audio/out/ao_wasapi_utils.c +++ b/audio/out/ao_wasapi_utils.c @@ -607,18 +607,20 @@ static HRESULT fix_format(struct ao *ao) MP_VERBOSE(state, "Device period: %.2g ms\n", (double) devicePeriod / 10000.0 ); - // integer multiple of device period close to 50ms - bufferPeriod = bufferDuration = - ceil(50.0 * 10000.0 / devicePeriod) * devicePeriod; + if (state->share_mode == AUDCLNT_SHAREMODE_SHARED) { + // for shared mode, use integer multiple of device period close to 50ms + bufferDuration = devicePeriod * ceil(50.0 * 10000.0 / devicePeriod); + bufferPeriod = 0; + } else { + // in exclusive mode, these should all be the same + bufferPeriod = bufferDuration = devicePeriod; + } // handle unsupported buffer size hopefully this shouldn't happen because of // the above integer device period // http://msdn.microsoft.com/en-us/library/windows/desktop/dd370875%28v=vs.85%29.aspx int retries=0; reinit: - if (state->share_mode == AUDCLNT_SHAREMODE_SHARED) - bufferPeriod = 0; - MP_DBG(state, "IAudioClient::Initialize\n"); hr = IAudioClient_Initialize(state->pAudioClient, state->share_mode, @@ -640,9 +642,12 @@ reinit: IAudioClient_GetBufferSize(state->pAudioClient, &state->bufferFrameCount); - bufferPeriod = bufferDuration = (REFERENCE_TIME) (0.5 + + bufferDuration = (REFERENCE_TIME) (0.5 + (10000.0 * 1000 / state->format.Format.nSamplesPerSec * state->bufferFrameCount)); + if (state->share_mode == AUDCLNT_SHAREMODE_EXCLUSIVE) + bufferPeriod = bufferDuration; + IAudioClient_Release(state->pAudioClient); state->pAudioClient = NULL; -- cgit v1.2.3