Andrew Eikum : dsound: Ensure primary buffer' s buffer is large enough to hold the entire prebuffer.

Alexandre Julliard julliard at winehq.org
Mon May 14 14:26:06 CDT 2012


Module: wine
Branch: master
Commit: 8327e6f4234bcc073c6d2979286341ff6103b220
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8327e6f4234bcc073c6d2979286341ff6103b220

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon May 14 12:31:17 2012 -0500

dsound: Ensure primary buffer's buffer is large enough to hold the entire prebuffer.

---

 dlls/dsound/primary.c |   36 ++++++++++++++----------------------
 1 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index 153f1a1..7fed78e 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -58,18 +58,6 @@ static DWORD DSOUND_fraglen(DirectSoundDevice *device)
     return ret;
 }
 
-static void DSOUND_RecalcPrimary(DirectSoundDevice *device)
-{
-    TRACE("(%p)\n", device);
-
-    device->fraglen = DSOUND_fraglen(device);
-    device->helfrags = device->buflen / device->fraglen;
-    TRACE("fraglen=%d helfrags=%d\n", device->fraglen, device->helfrags);
-
-    /* calculate the 10ms write lead */
-    device->writelead = (device->pwfx->nSamplesPerSec / 100) * device->pwfx->nBlockAlign;
-}
-
 HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave)
 {
     UINT prebuf_frames;
@@ -153,18 +141,23 @@ HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave)
 
 static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device)
 {
-	DWORD buflen;
 	LPBYTE newbuf;
 
 	TRACE("(%p)\n", device);
 
+	device->fraglen = DSOUND_fraglen(device);
+
 	/* on original windows, the buffer it set to a fixed size, no matter what the settings are.
 	   on windows this size is always fixed (tested on win-xp) */
 	if (!device->buflen)
 		device->buflen = ds_hel_buflen;
-	buflen = device->buflen;
-	buflen -= buflen % device->pwfx->nBlockAlign;
-	device->buflen = buflen;
+	device->buflen -= device->buflen % device->pwfx->nBlockAlign;
+	while(device->buflen < device->fraglen * device->prebuf){
+		device->buflen += ds_hel_buflen;
+		device->buflen -= device->buflen % device->pwfx->nBlockAlign;
+	}
+
+	device->helfrags = device->buflen / device->fraglen;
 
 	device->mix_buffer_len = DSOUND_bufpos_to_mixpos(device, device->buflen);
 	device->mix_buffer = HeapAlloc(GetProcessHeap(), 0, device->mix_buffer_len);
@@ -174,13 +167,11 @@ static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device)
 	if (device->state == STATE_PLAYING) device->state = STATE_STARTING;
 	else if (device->state == STATE_STOPPING) device->state = STATE_STOPPED;
 
-    TRACE("desired buflen=%d, old buffer=%p\n", buflen, device->buffer);
-
     /* reallocate emulated primary buffer */
     if (device->buffer)
-        newbuf = HeapReAlloc(GetProcessHeap(),0,device->buffer, buflen);
+        newbuf = HeapReAlloc(GetProcessHeap(),0,device->buffer, device->buflen);
     else
-        newbuf = HeapAlloc(GetProcessHeap(),0, buflen);
+        newbuf = HeapAlloc(GetProcessHeap(),0, device->buflen);
 
     if (!newbuf) {
         ERR("failed to allocate primary buffer\n");
@@ -188,11 +179,12 @@ static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device)
         /* but the old buffer might still exist and must be re-prepared */
     }
 
-    DSOUND_RecalcPrimary(device);
+    device->writelead = (device->pwfx->nSamplesPerSec / 100) * device->pwfx->nBlockAlign;
 
     device->buffer = newbuf;
 
-    TRACE("fraglen=%d\n", device->fraglen);
+    TRACE("buflen: %u, fraglen: %u, helfrags: %u, mix_buffer_len: %u\n",
+            device->buflen, device->fraglen, device->helfrags, device->mix_buffer_len);
 
 	device->mixfunction = mixfunctions[device->pwfx->wBitsPerSample/8 - 1];
 	device->normfunction = normfunctions[device->pwfx->wBitsPerSample/8 - 1];




More information about the wine-cvs mailing list