diff options
Diffstat (limited to 'src/engine/client')
| -rw-r--r-- | src/engine/client/sound.cpp | 19 | ||||
| -rw-r--r-- | src/engine/client/sound.h | 2 |
2 files changed, 15 insertions, 6 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); } diff --git a/src/engine/client/sound.h b/src/engine/client/sound.h index 0c45f1ab..3cc84d4d 100644 --- a/src/engine/client/sound.h +++ b/src/engine/client/sound.h @@ -31,7 +31,7 @@ public: int Play(int ChannelID, int SampleID, int Flags, float x, float y); virtual int PlayAt(int ChannelID, int SampleID, int Flags, float x, float y); virtual int Play(int ChannelID, int SampleID, int Flags); - virtual void Stop(int VoiceID); + virtual void Stop(int SampleID); virtual void StopAll(); }; |