From 67dba3460d8376f02ce992472dc4350f30f9ff4f Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Mon, 29 May 2006 05:08:54 +0000
Subject: [PATCH] Include GetAudioStatus in sdl struct. Don't pause/unpause
 output... just keep playing silence the whole time. Fixes problem with
 click/pops on cut-off audio buffers. Lower buffer size for lower latency.

---
 src/xpdev/sdlfuncs.c | 9 +++++++++
 src/xpdev/sdlfuncs.h | 1 +
 src/xpdev/xpbeep.c   | 9 +++++----
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/xpdev/sdlfuncs.c b/src/xpdev/sdlfuncs.c
index a0640325d6..7c01f59060 100644
--- a/src/xpdev/sdlfuncs.c
+++ b/src/xpdev/sdlfuncs.c
@@ -58,6 +58,7 @@ int load_sdl_funcs(struct sdlfuncs *sdlf)
 	sdlf->PauseAudio=SDL_PauseAudio;
 	sdlf->LockAudio=SDL_LockAudio;
 	sdlf->UnlockAudio=SDL_UnlockAudio;
+	sdlf->GetAudioStatus=SDL_GetAudioStatus;
 	sdlf->gotfuncs=1;
 	sdl_funcs_loaded=1;
 	return(0);
@@ -221,6 +222,10 @@ int load_sdl_funcs(struct sdlfuncs *sdlf)
 		FreeLibrary(sdl_dll);
 		return(-1);
 	}
+	if((sdlf->GetAudioStatus=GetProcAddress(sdl_dll, "SDL_GetAudioStatus"))==NULL) {
+		FreeLibrary(sdl_dll);
+		return(-1);
+	}
 	sdlf->gotfuncs=1;
 	sdl_funcs_loaded=1;
 	return(0);
@@ -378,6 +383,10 @@ int load_sdl_funcs(struct sdlfuncs *sdlf)
 		dlclose(sdl_dll);
 		return(-1);
 	}
+	if((sdlf->GetAudioStatus=dlsym(sdl_dll, "SDL_GetAudioStatus"))==NULL) {
+		dlclose(sdl_dll);
+		return(-1);
+	}
 	sdlf->gotfuncs=1;
 	sdl_funcs_loaded=1;
 	return(0);
diff --git a/src/xpdev/sdlfuncs.h b/src/xpdev/sdlfuncs.h
index 127ae4edc3..616929eede 100644
--- a/src/xpdev/sdlfuncs.h
+++ b/src/xpdev/sdlfuncs.h
@@ -45,6 +45,7 @@ struct sdlfuncs {
 	void (*LockAudio)(void);
 	void (*UnlockAudio)(void);
 	void (*PauseAudio)(int pause_on);
+	void (*GetAudioStatus)(int pause_on);
 	int	gotfuncs;
 };
 
diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c
index c69ba899ff..2f02a7bb3e 100644
--- a/src/xpdev/xpbeep.c
+++ b/src/xpdev/xpbeep.c
@@ -240,8 +240,8 @@ BOOL xptone_open(void)
 			spec.freq=22050;
 			spec.format=AUDIO_U8;
 			spec.channels=1;
-			spec.samples=512;		/* Size of audio buffer */
-			spec.size=512;
+			spec.samples=256;		/* Size of audio buffer */
+			spec.size=256;
 			spec.callback=sdl_fillbuf;
 			spec.userdata=NULL;
 			if(sdl.OpenAudio(&spec, NULL)==-1) {
@@ -249,6 +249,9 @@ BOOL xptone_open(void)
 			}
 			else {
 				sdlToneDone=sdl.SDL_CreateSemaphore(0);
+				sdl_audio_buf_len=0;
+				sdl_audio_buf_pos=0;
+				sdl.PauseAudio(FALSE);
 				handle_type=SOUND_DEVICE_SDL;
 				return(TRUE);
 			}
@@ -434,9 +437,7 @@ BOOL DLLCALL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape)
 			sdl_audio_buf_len=S_RATE/freq*2;
 		makewave(freq,swave,sdl_audio_buf_len,shape);
 		sdl.UnlockAudio();
-		sdl.PauseAudio(FALSE);
 		sdl.SemWait(sdlToneDone);
-		sdl.PauseAudio(TRUE);
 	}
 #endif
 
-- 
GitLab