diff --git a/src/xpdev/sdlfuncs.c b/src/xpdev/sdlfuncs.c index b3c76b920231644e37a92d7b0b80b9ee7574097a..a0640325d66c0c60f7f498b0075ca94f8d402db1 100644 --- a/src/xpdev/sdlfuncs.c +++ b/src/xpdev/sdlfuncs.c @@ -56,6 +56,8 @@ int load_sdl_funcs(struct sdlfuncs *sdlf) sdlf->OpenAudio=SDL_OpenAudio; sdlf->CloseAudio=SDL_CloseAudio; sdlf->PauseAudio=SDL_PauseAudio; + sdlf->LockAudio=SDL_LockAudio; + sdlf->UnlockAudio=SDL_UnlockAudio; sdlf->gotfuncs=1; sdl_funcs_loaded=1; return(0); @@ -211,6 +213,14 @@ int load_sdl_funcs(struct sdlfuncs *sdlf) FreeLibrary(sdl_dll); return(-1); } + if((sdlf->LockAudio=GetProcAddress(sdl_dll, "SDL_LockAudio"))==NULL) { + FreeLibrary(sdl_dll); + return(-1); + } + if((sdlf->UnlockAudio=GetProcAddress(sdl_dll, "SDL_UnlockAudio"))==NULL) { + FreeLibrary(sdl_dll); + return(-1); + } sdlf->gotfuncs=1; sdl_funcs_loaded=1; return(0); @@ -360,6 +370,14 @@ int load_sdl_funcs(struct sdlfuncs *sdlf) dlclose(sdl_dll); return(-1); } + if((sdlf->LockAudio=dlsym(sdl_dll, "SDL_LockAudio"))==NULL) { + dlclose(sdl_dll); + return(-1); + } + if((sdlf->UnlockAudio=dlsym(sdl_dll, "SDL_UnlockAudio"))==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 5525e6069e212c1e463b81cac4693966098ba94e..127ae4edc30de0fa30819d26681f09504f9ca465 100644 --- a/src/xpdev/sdlfuncs.h +++ b/src/xpdev/sdlfuncs.h @@ -42,6 +42,8 @@ struct sdlfuncs { void (*QuitSubSystem)(Uint32 flags); int (*OpenAudio)(SDL_AudioSpec *desired, SDL_AudioSpec *obtained); void (*CloseAudio)(void); + void (*LockAudio)(void); + void (*UnlockAudio)(void); void (*PauseAudio)(int pause_on); int gotfuncs; }; diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c index c6b12c761a428d459e5149a9ac3b159466b7a9a2..c69ba899ffc9d1614cfb48f26fc0f1d9981a1cff 100644 --- a/src/xpdev/xpbeep.c +++ b/src/xpdev/xpbeep.c @@ -427,11 +427,13 @@ BOOL DLLCALL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape) #ifdef WITH_SDL if(handle_type==SOUND_DEVICE_SDL) { + sdl.LockAudio(); sdl_audio_buf_pos=0; sdl_audio_buf_len=S_RATE*duration/1000; if(sdl_audio_buf_len<=S_RATE/freq*2) 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);