$NetBSD: patch-aa,v 1.2 2015/01/03 11:21:07 nat Exp $

--- sys/sdl/sdl.c.orig	2001-09-17 16:40:14.000000000 +0000
+++ sys/sdl/sdl.c
@@ -28,6 +28,7 @@ static int use_joy = 1, sdl_joy_num;
 static SDL_Joystick * sdl_joy = NULL;
 static const int joy_commit_range = 3276;
 static char Xstatus, Ystatus;
+static int closing = 0;
 
 static SDL_Surface *screen;
 static SDL_Overlay *overlay;
@@ -441,6 +442,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 +456,19 @@ rcvar_t pcm_exports[] =
 
 static void audio_callback(void *blah, byte *stream, int len)
 {
-	memcpy(stream, pcm.buf, len);
-	audio_done = 1;
+	if (!closing) {
+		SDL_SemWait(pcm_rsem);
+		memcpy(stream, pcm.buf, len);
+		SDL_SemPost(pcm_wsem);
+	}
+}
+
+
+static void audio_atexit(void)
+{
+	closing = 1;
+	if (pcm_wsem)
+		SDL_SemPost(pcm_rsem);
 }
 
 
@@ -466,6 +480,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 +512,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;
+	}
 }
 
 
