about summary refs log tree commit diff
path: root/src/engine/client/sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/client/sound.cpp')
-rw-r--r--src/engine/client/sound.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/engine/client/sound.cpp b/src/engine/client/sound.cpp
index 55ca2939..4678bb8a 100644
--- a/src/engine/client/sound.cpp
+++ b/src/engine/client/sound.cpp
@@ -157,8 +157,12 @@ static void Mix(short *pFinalOut, unsigned Frames)
 			
 			// free voice if not used any more
 			if(v->m_Tick == v->m_pSample->m_NumFrames)
-				v->m_pSample = 0;
-			
+			{
+				if(v->m_Flags&ISound::FLAG_LOOP)
+					v->m_Tick = 0;
+				else
+					v->m_pSample = 0;
+			}
 		}
 	}
 	
@@ -410,7 +414,7 @@ void CSound::SetListenerPos(float x, float y)
 	m_CenterX = (int)x;
 	m_CenterY = (int)y;
 }
-	
+
 
 void CSound::SetChannel(int ChannelID, float Vol, float Pan)
 {
@@ -463,11 +467,16 @@ int CSound::Play(int ChannelID, int SampleID, int Flags)
 	return Play(ChannelID, SampleID, Flags, 0, 0);
 }
 
-void CSound::Stop(int VoiceID)
+void CSound::Stop(int SampleID)
 {
 	// TODO: a nice fade out
 	lock_wait(m_SoundLock);
-	m_aVoices[VoiceID].m_pSample = 0;
+	CSample *pSample = &m_aSamples[SampleID];
+	for(int i = 0; i < NUM_VOICES; i++)
+	{
+		if(m_aVoices[i].m_pSample == pSample)
+			m_aVoices[i].m_pSample = 0;
+	}
 	lock_release(m_SoundLock);
 }