Maarten Lankhorst : dsound: Use an inline for ring buffer pointer difference calculation.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 22 05:56:37 CST 2007


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

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Wed Feb 21 20:17:22 2007 +0100

dsound: Use an inline for ring buffer pointer difference calculation.

---

 dlls/dsound/mixer.c |   54 +++++++++++++++++++++++++-------------------------
 1 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c
index 8eba8c0..b961cf6 100644
--- a/dlls/dsound/mixer.c
+++ b/dlls/dsound/mixer.c
@@ -724,6 +724,19 @@ void DSOUND_ForceRemix(IDirectSoundBufferImpl *dsb)
 }
 
 /**
+ * Calculate the distance between two buffer offsets, taking wraparound
+ * into account.
+ */
+static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)
+{
+	if (ptr1 >= ptr2) {
+		return ptr1 - ptr2;
+	} else {
+		return buflen + ptr1 - ptr2;
+	}
+}
+
+/**
  * Mix some frames from the given secondary buffer "dsb" into the device
  * primary buffer.
  *
@@ -744,18 +757,10 @@ static DWORD DSOUND_MixOne(IDirectSoundBufferImpl *dsb, DWORD playpos, DWORD wri
 	/* determine this buffer's write position */
 	DWORD buf_writepos = DSOUND_CalcPlayPosition(dsb, writepos, writepos);
 	/* determine how much already-mixed data exists */
-	DWORD buf_done =
-		((dsb->buf_mixpos < buf_writepos) ? dsb->buflen : 0) +
-		dsb->buf_mixpos - buf_writepos;
-	DWORD primary_done =
-		((dsb->primary_mixpos < writepos) ? dsb->device->buflen : 0) +
-		dsb->primary_mixpos - writepos;
-	DWORD adv_done =
-		((dsb->device->mixpos < writepos) ? dsb->device->buflen : 0) +
-		dsb->device->mixpos - writepos;
-	DWORD played =
-		((buf_writepos < dsb->playpos) ? dsb->buflen : 0) +
-		buf_writepos - dsb->playpos;
+	DWORD buf_done = DSOUND_BufPtrDiff(dsb->buflen, dsb->buf_mixpos, buf_writepos);
+	DWORD primary_done = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->primary_mixpos, writepos);
+	DWORD adv_done = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->device->mixpos, writepos);
+	DWORD played = DSOUND_BufPtrDiff(dsb->buflen, buf_writepos, dsb->playpos);
 	DWORD buf_left = dsb->buflen - buf_writepos;
 	int still_behind;
 
@@ -883,9 +888,7 @@ post_mix:
 	 * advance its underrun detector...*/
 	if (still_behind) return 0;
 	if ((mixlen - len) < primary_done) return 0;
-	slen = ((dsb->primary_mixpos < dsb->device->mixpos) ?
-		dsb->device->buflen : 0) + dsb->primary_mixpos -
-		dsb->device->mixpos;
+	slen = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->primary_mixpos, dsb->device->mixpos);
 	if (slen > mixlen) {
 		/* the primary_done and still_behind checks above should have worked */
 		FIXME("problem with advancement calculation (advlen=%d > mixlen=%d)\n", slen, mixlen);
@@ -1087,22 +1090,19 @@ static void DSOUND_PerformMix(DirectSoundDevice *device)
 		DSOUND_CheckReset(device, writepos);
 
 		/* check how much prebuffering is left */
-		inq = device->mixpos;
-		if (inq < writepos)
-			inq += device->buflen;
-		inq -= writepos;
+		inq = DSOUND_BufPtrDiff(device->buflen, device->mixpos, writepos);
 
 		/* find the maximum we can prebuffer */
-		if (!paused) {
-			maxq = playpos;
-			if (maxq < writepos)
-				maxq += device->buflen;
-			maxq -= writepos;
-		} else maxq = device->buflen;
+		if (!paused)
+			maxq = DSOUND_BufPtrDiff(device->buflen, playpos, writepos);
+		/* If we get the whole buffer, difference is 0, so we need to set whole buffer then */
+		if (paused || !maxq)
+			maxq = device->buflen;
 
 		/* clip maxq to device->prebuf */
 		frag = device->prebuf * device->fraglen;
-		if (maxq > frag) maxq = frag;
+		if (maxq > frag)
+			maxq = frag;
 
 		/* check for consistency */
 		if (inq > maxq) {
@@ -1248,7 +1248,7 @@ void CALLBACK DSOUND_callback(HWAVEOUT hwo, UINT msg, DWORD dwUser, DWORD dw1, D
 		playpos = pwplay * fraglen;
 		mixpos = device->mixpos;
 		/* check remaining mixed data */
-		inq = ((mixpos < playpos) ? buflen : 0) + mixpos - playpos;
+		inq = DSOUND_BufPtrDiff(buflen, mixpos, playpos);
 		mixq = inq / fraglen;
 		if ((inq - (mixq * fraglen)) > 0) mixq++;
 		/* complete the playing buffer */




More information about the wine-cvs mailing list