From b634666e130b93461076d1cded32d98752a67187 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Mon, 19 May 2014 08:59:23 -0500 Subject: [PATCH] mmdevapi: Make buffer size divisible by number of periods. --- dlls/mmdevapi/tests/render.c | 2 +- dlls/winealsa.drv/mmdevdrv.c | 2 ++ dlls/winecoreaudio.drv/mmdevdrv.c | 2 ++ dlls/wineoss.drv/mmdevdrv.c | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c index 078eab73da9..3cadceeafed 100644 --- a/dlls/mmdevapi/tests/render.c +++ b/dlls/mmdevapi/tests/render.c @@ -935,7 +935,7 @@ static void test_clock(int share) if (share) ok(gbsize == bufsize, "BufferSize %u at rate %u\n", gbsize, pwfx->nSamplesPerSec); - else todo_wine + else ok(gbsize == parts * fragment || gbsize == MulDiv(bufsize, 1, 1024) * 1024, "BufferSize %u misfits fragment size %u at rate %u\n", gbsize, fragment, pwfx->nSamplesPerSec); diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 3cfad3ae0d2..30531a888fc 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -1416,6 +1416,8 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface, * ALSA period 220 vs. 221 frames in mmdevapi and * buffer 883 vs. 2205 frames in mmdevapi! */ This->bufsize_frames = MulDiv(duration, fmt->nSamplesPerSec, 10000000); + if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE) + This->bufsize_frames -= This->bufsize_frames % This->mmdev_period_frames; This->hidden_frames = This->alsa_period_frames + This->mmdev_period_frames + MulDiv(fmt->nSamplesPerSec, EXTRA_SAFE_RT, 10000000); diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 5e322296354..c181713c707 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -1235,6 +1235,8 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface, This->period_frames = MulDiv(period, This->fmt->nSamplesPerSec, 10000000); This->bufsize_frames = MulDiv(duration, fmt->nSamplesPerSec, 10000000); + if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE) + This->bufsize_frames -= This->bufsize_frames % This->period_frames; if(This->dataflow == eCapture){ int i, nbuffs = (This->bufsize_frames / This->period_frames) + 1; diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index eab4723e234..e11e6dcfe73 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1099,6 +1099,8 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface, This->period_frames = MulDiv(fmt->nSamplesPerSec, period, 10000000); This->bufsize_frames = MulDiv(duration, fmt->nSamplesPerSec, 10000000); + if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE) + This->bufsize_frames -= This->bufsize_frames % This->period_frames; This->local_buffer = HeapAlloc(GetProcessHeap(), 0, This->bufsize_frames * fmt->nBlockAlign); if(!This->local_buffer){