Index: code/sound/audiostr.cpp
===================================================================
--- code/sound/audiostr.cpp	(revision 9116)
+++ code/sound/audiostr.cpp	(working copy)
@@ -260,6 +260,7 @@
 	uint GetMaxWriteSize (void);
 	bool ServiceBuffer (void);
 	static bool TimerCallback (ptr_u dwUser);
+	bool PlaybackDone(void);
 
 	ALuint m_source_id;	// name of openAL source
 	ALuint m_buffer_ids[MAX_STREAM_BUFFERS];	// names of buffers
@@ -1375,13 +1382,11 @@
 				m_bPastLimit = true;
 			}
 
-
-			// see if we're done
-			ALint state = 0;
-			OpenAL_ErrorPrint( alGetSourcei(m_source_id, AL_SOURCE_STATE, &state) );
-
-			if ( m_bReadingDone && (state != AL_PLAYING) ) {
+			if ( PlaybackDone() ) {
 				if ( m_bDestroy_when_faded == true ) {
 					LEAVE_CRITICAL_SECTION( write_lock );
 
 					Destroy();
@@ -1508,11 +1514,20 @@
 }
 
 
-// Fade_and_Destroy
+/** Have stream fade out and be destroyed when inaudabile.
+If stream is already done or never started just destroy it now.
+*/
 void AudioStream::Fade_and_Destroy (void)
 {
-	m_bFade = true;
-	m_bDestroy_when_faded = true;
+	if (!m_fPlaying || PlaybackDone())
+	{
+		Destroy();
+	}
+	else
+	{
+		m_bFade = true;
+		m_bDestroy_when_faded = true;
+	}
 }
 
 // Fade_and_Destroy
@@ -1586,8 +1601,18 @@
 	return m_lVolume;
 }
 
+bool AudioStream::PlaybackDone()
+{
+	ALint state = 0;
+	OpenAL_ErrorPrint( alGetSourcei(m_source_id, AL_SOURCE_STATE, &state) );
 
+	if (m_bReadingDone && (state != AL_PLAYING))
+		return true;
+	else
+		return false;
+}
 
+
 AudioStream Audio_streams[MAX_AUDIO_STREAMS];
 
 
