From 3d69ae9995987ce408c15c5f7f1d34d09a1aa5bb Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Fri, 16 Aug 2013 15:29:12 -0500 Subject: [PATCH] Fix OpenAL music stop issues using stream stop code S_AL_StopBackgroundTrack would sometimes generate AL errors. S_AL_MusicSourceFree needs to kill source or next track may have short looping buffer. --- code/client/snd_openal.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c index 8376ecfa..83eb541e 100644 --- a/code/client/snd_openal.c +++ b/code/client/snd_openal.c @@ -1876,6 +1876,7 @@ static void S_AL_MusicSourceFree( void ) { // Release the output musicSource S_AL_SrcUnlock(musicSourceHandle); + S_AL_SrcKill(musicSourceHandle); musicSource = 0; musicSourceHandle = -1; } @@ -1908,17 +1909,22 @@ S_AL_StopBackgroundTrack static void S_AL_StopBackgroundTrack( void ) { + int numBuffers; + if(!musicPlaying) return; // Stop playing qalSourceStop(musicSource); - // De-queue the musicBuffers - qalSourceUnqueueBuffers(musicSource, NUM_MUSIC_BUFFERS, musicBuffers); - - // Destroy the musicBuffers - qalDeleteBuffers(NUM_MUSIC_BUFFERS, musicBuffers); + // Un-queue any buffers, and delete them + qalGetSourcei( musicSource, AL_BUFFERS_PROCESSED, &numBuffers ); + while( numBuffers-- ) + { + ALuint buffer; + qalSourceUnqueueBuffers(musicSource, 1, &buffer); + qalDeleteBuffers(1, &buffer); + } // Free the musicSource S_AL_MusicSourceFree();