dsound patch

Ove Kaaven ovehk at ping.uio.no
Sun Mar 18 02:49:02 CST 2001


Log:
Ove Kaaven <ovek at transgaming.com>
Fixed sound disappearing after on-the-fly sample rate changes and
after certain underrun conditions.
Compilation fixes for when USE_DSOUND3D is defined.

Index: dlls/dsound/dsound_main.c
===================================================================
RCS file: /cvsroot/winex/wine/dlls/dsound/dsound_main.c,v
retrieving revision 1.1.1.10
retrieving revision 1.25
diff -u -r1.1.1.10 -r1.25
--- dlls/dsound/dsound_main.c	2001/03/05 22:51:44	1.1.1.10
+++ dlls/dsound/dsound_main.c	2001/03/14 19:55:56	1.25
@@ -2,7 +2,7 @@
  * 
  * Copyright 1998 Marcus Meissner
  * Copyright 1998 Rob Riggs
- * Copyright 2000 Ove Kåven, TransGaming Technologies, Inc.
+ * Copyright 2000-2001 TransGaming Technologies, Inc.
  */
 /*
  * Most thread locking is complete. There may be a few race
@@ -971,6 +971,8 @@
 		HRESULT merr = DS_OK;
 		/* Start in pause mode, to allow buffers to get filled */
 		waveOutPause(dsb->dsound->hwo);
+		if (dsb->state == STATE_PLAYING) dsb->state = STATE_STARTING;
+		else if (dsb->state == STATE_STOPPING) dsb->state = STATE_STOPPED;
 		/* use fragments of 10ms (1/100s) each (which should get us within
 		 * the documented write cursor lead of 10-15ms) */
 		buflen = ((dsb->wfx.nAvgBytesPerSec / 100) & ~3) * DS_HEL_FRAGS;
@@ -1126,6 +1128,8 @@
 			err = IDsDriver_CreateSoundBuffer(primarybuf->dsound->driver,&(primarybuf->wfx),primarybuf->dsbd.dwFlags,0,
 							  &(primarybuf->buflen),&(primarybuf->buffer),
 							  (LPVOID)&(primarybuf->hwbuf));
+			if (primarybuf->state == STATE_PLAYING) primarybuf->state = STATE_STARTING;
+			else if (primarybuf->state == STATE_STOPPING) primarybuf->state = STATE_STOPPED;
 		}
 	}
 	DSOUND_RecalcFormat(primarybuf);
@@ -1768,30 +1772,29 @@
                 ds3db = (IDirectSound3DBufferImpl*)HeapAlloc(GetProcessHeap(),
                         0,sizeof(*ds3db));
                 ds3db->ref = 1;
-                ds3db->dsb = (*ippdsb);
+                ds3db->dsb = This;
                 ICOM_VTBL(ds3db) = &ds3dbvt;
 		InitializeCriticalSection(&ds3db->lock);
 
-		ds3db->ds3db = This;
 		IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)This);
 
                 ds3db->ds3db.dwSize = sizeof(DS3DBUFFER);
-                ds3db->ds3db.vPosition.x.x = 0.0;
-                ds3db->ds3db.vPosition.y.y = 0.0;
-                ds3db->ds3db.vPosition.z.z = 0.0;
-                ds3db->ds3db.vVelocity.x.x = 0.0;
-                ds3db->ds3db.vVelocity.y.y = 0.0;
-                ds3db->ds3db.vVelocity.z.z = 0.0;
+                ds3db->ds3db.vPosition.u1.x = 0.0;
+                ds3db->ds3db.vPosition.u2.y = 0.0;
+                ds3db->ds3db.vPosition.u3.z = 0.0;
+                ds3db->ds3db.vVelocity.u1.x = 0.0;
+                ds3db->ds3db.vVelocity.u2.y = 0.0;
+                ds3db->ds3db.vVelocity.u3.z = 0.0;
                 ds3db->ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
                 ds3db->ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
-                ds3db->ds3db.vConeOrientation.x.x = 0.0;
-                ds3db->ds3db.vConeOrientation.y.y = 0.0;
-                ds3db->ds3db.vConeOrientation.z.z = 0.0;
+                ds3db->ds3db.vConeOrientation.u1.x = 0.0;
+                ds3db->ds3db.vConeOrientation.u2.y = 0.0;
+                ds3db->ds3db.vConeOrientation.u3.z = 0.0;
                 ds3db->ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME;                ds3db->ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
                 ds3db->ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
                 ds3db->ds3db.dwMode = DS3DMODE_NORMAL;
-                ds3db->buflen = ((*ippdsb)->buflen * primarybuf->wfx.nBlockAlign) /
-                        (*ippdsb)->wfx.nBlockAlign;
+                ds3db->buflen = (This->buflen * primarybuf->wfx.nBlockAlign) /
+                        This->wfx.nBlockAlign;
                 ds3db->buffer = HeapAlloc(GetProcessHeap(), 0, ds3db->buflen);
                 if (ds3db->buffer == NULL) {
                         ds3db->buflen = 0;
@@ -2068,17 +2071,17 @@
 		InitializeCriticalSection(&ds3db->lock);
 
 		ds3db->ds3db.dwSize = sizeof(DS3DBUFFER);
-		ds3db->ds3db.vPosition.x.x = 0.0;
-		ds3db->ds3db.vPosition.y.y = 0.0;
-		ds3db->ds3db.vPosition.z.z = 0.0;
-		ds3db->ds3db.vVelocity.x.x = 0.0;
-		ds3db->ds3db.vVelocity.y.y = 0.0;
-		ds3db->ds3db.vVelocity.z.z = 0.0;
+		ds3db->ds3db.vPosition.u1.x = 0.0;
+		ds3db->ds3db.vPosition.u2.y = 0.0;
+		ds3db->ds3db.vPosition.u3.z = 0.0;
+		ds3db->ds3db.vVelocity.u1.x = 0.0;
+		ds3db->ds3db.vVelocity.u2.y = 0.0;
+		ds3db->ds3db.vVelocity.u3.z = 0.0;
 		ds3db->ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
 		ds3db->ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
-		ds3db->ds3db.vConeOrientation.x.x = 0.0;
-		ds3db->ds3db.vConeOrientation.y.y = 0.0;
-		ds3db->ds3db.vConeOrientation.z.z = 0.0;
+		ds3db->ds3db.vConeOrientation.u1.x = 0.0;
+		ds3db->ds3db.vConeOrientation.u2.y = 0.0;
+		ds3db->ds3db.vConeOrientation.u3.z = 0.0;
 		ds3db->ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME;
 		ds3db->ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
 		ds3db->ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
@@ -2870,7 +2873,7 @@
 	return slen;
 }
 
-static DWORD DSOUND_MixToPrimary(DWORD playpos, DWORD writepos, DWORD mixlen)
+static DWORD DSOUND_MixToPrimary(DWORD playpos, DWORD writepos, DWORD mixlen, BOOL recover)
 {
 	INT			i, len, maxlen = 0;
 	IDirectSoundBufferImpl	*dsb;
@@ -2888,7 +2891,7 @@
 				DSOUND_MixCancel(dsb, writepos);
 				dsb->state = STATE_STOPPED;
 			} else {
-				if (dsb->state == STATE_STARTING)
+				if ((dsb->state == STATE_STARTING) || recover)
 					dsb->primary_mixpos = writepos;
 				len = DSOUND_MixOne(dsb, playpos, writepos, mixlen);
 				if (dsb->state == STATE_STARTING)
@@ -3015,7 +3018,7 @@
 			}
 
 			/* do the mixing */
-			frag = DSOUND_MixToPrimary(playpos, writepos, maxq);
+			frag = DSOUND_MixToPrimary(playpos, writepos, maxq, paused);
 			if (forced) frag = maxq - inq;
 			primarybuf->buf_mixpos += frag;
 			while (primarybuf->buf_mixpos >= primarybuf->buflen)
@@ -3092,7 +3095,7 @@
 		/* do the mixing */
 		if (dsound->priolevel != DSSCL_WRITEPRIMARY) {
 			DWORD frag, maxq = DS_SND_QUEUE * dsound->fraglen;
-			frag = DSOUND_MixToPrimary(primarybuf->playpos, writepos, maxq);
+			frag = DSOUND_MixToPrimary(primarybuf->playpos, writepos, maxq, FALSE);
 			mixq = frag / dsound->fraglen;
 			if (frag - (mixq * dsound->fraglen))
 				mixq++;





More information about the wine-patches mailing list