diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c
index 0a39519c215e417747035c12beeb4912f4191fea..29673b778a4cb94e448a703ad89101d6fb4ea133 100644
--- a/src/xpdev/xpbeep.c
+++ b/src/xpdev/xpbeep.c
@@ -63,6 +63,8 @@ static int handle_type=SOUND_DEVICE_CLOSED;
 #ifdef _WIN32
 static	HWAVEOUT		waveOut;
 static	WAVEHDR			wh;
+static	WAVEHDR			silence;
+static	unsigned char	silence_data=128;
 static	unsigned char	wave[S_RATE*15/2+1];
 #endif
 
@@ -232,6 +234,24 @@ BOOL xptone_open(void)
 		waveOutClose(waveOut);
 		return(FALSE);
 	}
+	memset(&silence, 0, sizeof(silence));
+	silence.lpData=&silence_data;
+	silence.dwBufferLength=1;
+	silence.dwFlags=WHDR_BEGINLOOP|WHDR_ENDLOOP;
+	silence.dwLoops=0xffffffffUL;	/* Good for 54 hours of silence @ 22010 */
+	if(waveOutPrepareHeader(waveOut, &silence, sizeof(silence))!=MMSYSERR_NOERROR) {
+		waveOutUnprepareHeader(waveOut, &wh, sizeof(wh));
+		sound_device_open_failed=TRUE;
+		waveOutClose(waveOut);
+		return(FALSE);
+	}
+	if(waveOutWrite(waveOut, &wh, sizeof(wh))!=MMSYSERR_NOERROR) {
+		waveOutUnprepareHeader(waveOut, &wh, sizeof(wh));
+		waveOutUnprepareHeader(waveOut, &silence, sizeof(wh));
+		sound_device_open_failed=TRUE;
+		waveOutClose(waveOut);
+		return(FALSE);
+	}
 	handle_type=SOUND_DEVICE_WIN32;
 	if(!sound_device_open_failed)
 		return(TRUE);
@@ -320,9 +340,12 @@ BOOL xptone_close(void)
 {
 #ifdef _WIN32
 	if(handle_type==SOUND_DEVICE_WIN32) {
-		waveOutClose(waveOut);
+		waveOutBreakLoop(waveOut);
 		while(waveOutUnprepareHeader(waveOut, &wh, sizeof(wh))==WAVERR_STILLPLAYING)
 			SLEEP(1);
+		while(waveOutUnprepareHeader(waveOut, &silence, sizeof(silence))==WAVERR_STILLPLAYING)
+			SLEEP(1);
+		waveOutClose(waveOut);
 	}
 #endif
 
@@ -364,11 +387,14 @@ BOOL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape)
 
 	makewave(freq,wave,wh.dwBufferLength,shape);
 
-	if(waveOutWrite(waveOut, &wh, sizeof(wh))==MMSYSERR_NOERROR)
+	if(waveOutWrite(waveOut, &wh, sizeof(wh))==MMSYSERR_NOERROR) {
 		success=TRUE;
-
-	while(!(wh.dwFlags & WHDR_DONE))
-		SLEEP(1);
+		waveOutBreakLoop(waveOut);
+		/* Put the silence back in */
+		waveOutWrite(waveOut, &silence, sizeof(silence));
+		while(!(wh.dwFlags & WHDR_DONE))
+			SLEEP(1);
+	}
 
 	if(must_close)
 		xptone_close();