diff options
author | Kevin Mitchell <kevmitch@gmail.com> | 2016-02-19 00:27:12 -0800 |
---|---|---|
committer | Kevin Mitchell <kevmitch@gmail.com> | 2016-02-26 15:43:51 -0800 |
commit | 82f102cfe3e700e6b09604b2f659f7a123a8ea87 (patch) | |
tree | f5a516174b788381f41e74cb278dbfa9fac7062f /audio/out/ao_wasapi_utils.c | |
parent | 84a3c21beb2f3360e4fda13179846406b4a24f7c (diff) | |
download | mpv-82f102cfe3e700e6b09604b2f659f7a123a8ea87.tar.bz2 mpv-82f102cfe3e700e6b09604b2f659f7a123a8ea87.tar.xz |
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.
Diffstat (limited to 'audio/out/ao_wasapi_utils.c')
-rw-r--r-- | audio/out/ao_wasapi_utils.c | 19 |
1 files changed, 12 insertions, 7 deletions
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; |