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