* 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.
This commit is contained in:
Tony J. White = 2006-08-03 02:29:47 +00:00
parent fe35a8eef8
commit 0141a4b4b0

View file

@ -1369,6 +1369,9 @@ void S_AL_MusicProcess(ALuint b)
int l; int l;
ALuint format; ALuint format;
if(!mus_stream)
return;
l = S_CodecReadStream(mus_stream, MUSIC_BUFFER_SIZE, decode_buffer); l = S_CodecReadStream(mus_stream, MUSIC_BUFFER_SIZE, decode_buffer);
// Run out data to read, start at the beginning again // 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) if(musicSourceHandle == -1)
return; return;
mus_stream = S_CodecOpenStream(s_backgroundLoop);
if(!mus_stream)
{
S_AL_MusicSourceFree();
return;
}
// Generate the musicBuffers // Generate the musicBuffers
qalGenBuffers(NUM_MUSIC_BUFFERS, 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++) for(i = 0; i < NUM_MUSIC_BUFFERS; i++)
{ {
S_AL_MusicProcess(musicBuffers[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); qalSourceQueueBuffers(musicSource, NUM_MUSIC_BUFFERS, musicBuffers);