Maarten Lankhorst : dsound:
Give rougher estimates for fraglen to satisfy alsa.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jun 22 07:35:43 CDT 2007
Module: wine
Branch: master
Commit: 95912460021f5891b2a1ebf2c41e364f42fdbcd2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=95912460021f5891b2a1ebf2c41e364f42fdbcd2
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Fri Jun 8 13:57:51 2007 +0200
dsound: Give rougher estimates for fraglen to satisfy alsa.
---
dlls/dsound/primary.c | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index f229757..3e3fce4 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -44,8 +44,20 @@ static void DSOUND_RecalcPrimary(DirectSoundDevice *device)
nBlockAlign = device->pwfx->nBlockAlign;
if (device->hwbuf) {
DWORD fraglen;
- /* let fragment size approximate the timer delay */
- fraglen = (device->pwfx->nSamplesPerSec * DS_TIME_DEL / 1000) * nBlockAlign;
+ /* Alsa doesn't have continuous buffers, instead it has buffers with power of 2,
+ * If DS_TIME_DEL is about 10 ms, 512 * nBlockAlign is roughly correct */
+ fraglen = 512 * nBlockAlign;
+
+ /* Compensate for only being rougly accurate */
+ if (device->pwfx->nSamplesPerSec <= 26000)
+ fraglen /= 2;
+
+ if (device->pwfx->nSamplesPerSec <= 12000)
+ fraglen /= 2;
+
+ if (device->pwfx->nSamplesPerSec >= 80000)
+ fraglen *= 2;
+
/* reduce fragment size until an integer number of them fits in the buffer */
/* (FIXME: this may or may not be a good idea) */
while (device->buflen % fraglen) fraglen -= nBlockAlign;
More information about the wine-cvs
mailing list