$NetBSD: patch-aa,v 1.1.1.1 2004/07/26 17:05:05 dillo Exp $ --- sys/sdl/sdl.c.orig 2001-09-17 18:40:14.000000000 +0200 +++ sys/sdl/sdl.c @@ -441,6 +441,8 @@ static int sound = 1; static int samplerate = 44100; static int stereo = 1; static volatile int audio_done; +static SDL_sem *pcm_rsem, *pcm_wsem; +static int atexit_done = 0; rcvar_t pcm_exports[] = { @@ -453,8 +455,16 @@ rcvar_t pcm_exports[] = static void audio_callback(void *blah, byte *stream, int len) { + SDL_SemWait(pcm_rsem); memcpy(stream, pcm.buf, len); - audio_done = 1; + SDL_SemPost(pcm_wsem); +} + + +static void audio_atexit(void) +{ + if (pcm_wsem) + SDL_SemPost(pcm_rsem); } @@ -466,6 +476,13 @@ void pcm_init() if (!sound) return; SDL_InitSubSystem(SDL_INIT_AUDIO); + /* XXX: check for NULL */ + pcm_rsem = SDL_CreateSemaphore(0); + pcm_wsem = SDL_CreateSemaphore(0); + if (!atexit_done) { + atexit(audio_atexit); + atexit_done = 1; + } as.freq = samplerate; as.format = AUDIO_U8; as.channels = 1 + stereo; @@ -491,16 +508,20 @@ int pcm_submit() { if (!pcm.buf) return 0; if (pcm.pos < pcm.len) return 1; - while (!audio_done) - SDL_Delay(4); - audio_done = 0; + SDL_SemPost(pcm_rsem); + SDL_SemWait(pcm_wsem); pcm.pos = 0; return 1; } void pcm_close() { - if (sound) SDL_CloseAudio(); + if (sound) { + SDL_CloseAudio(); + SDL_DestroySemaphore(pcm_rsem); + SDL_DestroySemaphore(pcm_wsem); + pcm_rsem = pcm_wsem = 0; + } }