about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/sound.cpp19
-rw-r--r--src/engine/client/sound.h2
-rw-r--r--src/engine/shared/config_variables.h1
-rw-r--r--src/engine/sound.h6
4 files changed, 19 insertions, 9 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();
 };
 
diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h
index c30edeaf..85749405 100644
--- a/src/engine/shared/config_variables.h
+++ b/src/engine/shared/config_variables.h
@@ -47,6 +47,7 @@ MACRO_CONFIG_INT(BrMaxRequests, br_max_requests, 25, 0, 1000, CFGFLAG_SAVE|CFGFL
 MACRO_CONFIG_INT(SndBufferSize, snd_buffer_size, 512, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound buffer size")
 MACRO_CONFIG_INT(SndRate, snd_rate, 48000, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound mixing rate")
 MACRO_CONFIG_INT(SndEnable, snd_enable, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound enable")
+MACRO_CONFIG_INT(SndMusic, snd_enable_music, 1, 0, 1, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Play background music")
 MACRO_CONFIG_INT(SndVolume, snd_volume, 100, 0, 100, CFGFLAG_SAVE|CFGFLAG_CLIENT, "Sound volume")
 MACRO_CONFIG_INT(SndDevice, snd_device, -1, 0, 0, CFGFLAG_SAVE|CFGFLAG_CLIENT, "(deprecated) Sound device to use")
 
diff --git a/src/engine/sound.h b/src/engine/sound.h
index 8f5dab24..ac4aeaf5 100644
--- a/src/engine/sound.h
+++ b/src/engine/sound.h
@@ -21,9 +21,9 @@ public:
 	virtual void SetChannel(int ChannelID, float Volume, float Panning) = 0;
 	virtual void SetListenerPos(float x, float y) = 0;
 	
-	virtual int PlayAt(int ChannelID, int SoundID, int Flags, float x, float y) = 0;
-	virtual int Play(int ChannelID, int SoundID, int Flags) = 0;
-	virtual void Stop(int VoiceID) = 0;
+	virtual int PlayAt(int ChannelID, int SampleID, int Flags, float x, float y) = 0;
+	virtual int Play(int ChannelID, int SampleID, int Flags) = 0;
+	virtual void Stop(int SampleID) = 0;
 	virtual void StopAll() = 0;
 };