From 0141a4b4b0d2c26350625430e23bff3100643532 Mon Sep 17 00:00:00 2001
From: "Tony J. White =" <tjw@tjw.org>
Date: Thu, 3 Aug 2006 02:29:47 +0000
Subject: [PATCH] bug 2747 * open music stream in S_AL_StartBackgroundTrack()
 instead of relying   on  S_AL_MusicProcess() to open it.  This allows
 S_AL_MusicProcess() to   return early when called whenever there is no open
 music stream to prevent   a segfault.

---
 code/client/snd_openal.c | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c
index 1cbd7143..ad1baa5c 100644
--- a/code/client/snd_openal.c
+++ b/code/client/snd_openal.c
@@ -1369,6 +1369,9 @@ void S_AL_MusicProcess(ALuint b)
 	int l;
 	ALuint format;
 
+	if(!mus_stream)
+		return;
+
 	l = S_CodecReadStream(mus_stream, MUSIC_BUFFER_SIZE, decode_buffer);
 
 	// Run out data to read, start at the beginning again
@@ -1443,6 +1446,13 @@ void S_AL_StartBackgroundTrack( const char *intro, const char *loop )
 	if(musicSourceHandle == -1)
 		return;
 
+	mus_stream = S_CodecOpenStream(s_backgroundLoop);
+	if(!mus_stream)
+	{
+		S_AL_MusicSourceFree();
+		return;
+	}
+
 	// Generate the musicBuffers
 	qalGenBuffers(NUM_MUSIC_BUFFERS, musicBuffers);
 	
@@ -1450,19 +1460,6 @@ void S_AL_StartBackgroundTrack( const char *intro, const char *loop )
 	for(i = 0; i < NUM_MUSIC_BUFFERS; i++)
 	{
 		S_AL_MusicProcess(musicBuffers[i]);
-
-		// check whether our stream still exists.
-		if(!mus_stream)
-		{
-			// there was an error in reading which resulted in a
-			// closed stream. We must bail out or we'll crash.
-
-			// deallocate everything we allocated so far:
-			qalDeleteBuffers(NUM_MUSIC_BUFFERS, musicBuffers);
-			S_AL_MusicSourceFree();
-
-			return;
-		}
 	}
 
 	qalSourceQueueBuffers(musicSource, NUM_MUSIC_BUFFERS, musicBuffers);