diff -u wine.cvs/dlls/dsound/mixer.c wine.save/dlls/dsound/mixer.c
--- wine.cvs/dlls/dsound/mixer.c	2003-09-26 15:01:55.000000000 -0400
+++ wine/dlls/dsound/mixer.c	2003-09-21 16:57:52.000000000 -0400
@@ -892,6 +896,9 @@
 		TRACE("primary playpos=%ld, writepos=%ld, clrpos=%ld, mixpos=%ld, buflen=%ld\n",
 		      playpos,writepos,dsound->playpos,dsound->mixpos,dsound->buflen);
 		assert(dsound->playpos < dsound->buflen);
+
+		EnterCriticalSection(&(dsound->mixlock));
+
 		/* wipe out just-played sound data */
 		if (playpos < dsound->playpos) {
 			memset(dsound->buffer + dsound->playpos, nfiller, dsound->buflen - dsound->playpos);
@@ -901,7 +908,7 @@
 		}
 		dsound->playpos = playpos;
 
-		EnterCriticalSection(&(dsound->mixlock));
 
 		/* reset mixing if necessary */
 		DSOUND_CheckReset(dsound, writepos);
 
diff -u wine.cvs/dlls/dsound/primary.c wine.save/dlls/dsound/primary.c
--- wine.cvs/dlls/dsound/primary.c	2003-09-26 15:01:55.000000000 -0400
+++ wine/dlls/dsound/primary.c	2003-09-21 15:56:48.000000000 -0400
@@ -177,6 +177,7 @@
 			WARN("IDsDriver_CreateSoundBuffer failed\n");
 			return err;
 		}
+		memset(This->buffer, (This->wfx.wBitsPerSample == 16) ? 0 : 128, This->buflen);
 	}
 	if (!This->hwbuf) {
 		/* Allocate memory for HEL buffer headers */
@@ -405,6 +406,10 @@
 		err = IDsDriverBuffer_SetFormat(dsound->hwbuf, &(dsound->wfx));
 		if (err == DSERR_BUFFERLOST) {
 			/* Wine-only: the driver wants us to recreate the HW buffer */
+
+			/* **** */
+			EnterCriticalSection(&(dsound->mixlock));
+
 			IDsDriverBuffer_Release(dsound->hwbuf);
 			err = IDsDriver_CreateSoundBuffer(dsound->driver,&(dsound->wfx),
 							  DSBCAPS_PRIMARYBUFFER,0,
@@ -412,11 +417,22 @@
 							  (LPVOID)&(dsound->hwbuf));
 			if (err != DS_OK) {
 				WARN("IDsDriver_CreateSoundBuffer failed\n");
+				LeaveCriticalSection(&(dsound->mixlock));
 				RtlReleaseResource(&(dsound->lock));
 				return err;
 			}
-			if (dsound->state == STATE_PLAYING) dsound->state = STATE_STARTING;
-			else if (dsound->state == STATE_STOPPING) dsound->state = STATE_STOPPED;
+
+			/* fill the new buffer with silence */
+			memset(dsound->buffer, (dsound->wfx.wBitsPerSample == 16) ? 0 : 128, dsound->buflen);
+
+			if (dsound->state == STATE_PLAYING)
+				dsound->state = STATE_STARTING;
+			else if (dsound->state == STATE_STOPPING)
+				dsound->state = STATE_STOPPED;
+
+			LeaveCriticalSection(&(dsound->mixlock));
+			/* **** */
+
 		} else {
 			WARN("IDsDriverBuffer_SetFormat failed\n");
 			RtlReleaseResource(&(dsound->lock));
