Index: code/hud/hud.cpp
===================================================================
--- code/hud/hud.cpp	(revision 7840)
+++ code/hud/hud.cpp	 (working copy)
@@ -1811,7 +1811,6 @@ void update_throttle_sound()
 
 			if ( percent_throttle < ZERO_PERCENT ) {
 				if ( Player_engine_snd_loop > -1 )	{
-					snd_chg_loop_status(Player_engine_snd_loop, 0);
 					snd_stop(Player_engine_snd_loop); // Backslash - otherwise, long engine loops keep playing
 					Player_engine_snd_loop = -1;
 				}
Index: code/hud/hudlock.cpp
===================================================================
--- code/hud/hudlock.cpp	(revision 7840)
+++ code/hud/hudlock.cpp	 (working copy)
@@ -625,7 +625,7 @@ void hud_do_lock_indicator(float frametime)
 
 	if (Player_ai->current_target_is_locked) {
 		if ( Missile_track_loop > -1 )	{
-			snd_chg_loop_status(Missile_track_loop, 0);
+			snd_stop(Missile_track_loop);
 			Missile_track_loop = -1;
 			Missile_lock_loop = snd_play(&Snds[SND_MISSILE_LOCK]);
 		}
@@ -863,7 +863,7 @@ void hud_calculate_lock_position(float frametime)
 	} else {
 
 		if ( Missile_track_loop > -1 )	{
-			snd_chg_loop_status(Missile_track_loop, 0);
+			snd_stop(Missile_track_loop);
 			Missile_track_loop = -1;
 		}
 
Index: code/sound/sound.cpp
===================================================================
--- code/sound/sound.cpp	(revision 7840)
+++ code/sound/sound.cpp	 (working copy)
@@ -56,6 +56,8 @@ float Master_voice_volume = 0.7f;	// range is 0 -> 1, used for all voice playbac
 
 unsigned int SND_ENV_DEFAULT = 0;
 
+SCP_list<int> currentlyLoopingSoundHandles;
+
 //For the adjust-audio-volume sexp
 float aav_voice_volume = 1.0f;
 float aav_music_volume = 1.0f;
@@ -757,6 +759,8 @@ int snd_get_3d_vol_and_pan(game_snd *gs, vec3d *pos, float* vol, float *pan, flo
 	return 0;
 }
 
+
+
 // ---------------------------------------------------------------------------------------
 // volume 0 to 1.0.  Returns the handle of the sound. -1 if failed.
 // If startloop or stoploop are not -1, then then are used.
@@ -817,18 +821,18 @@ int snd_play_looping( game_snd *gs, float pan, int start_loop, int stop_loop, fl
 
 	if ( (volume > MIN_SOUND_VOLUME) || force) {
 		handle = ds_play( snd->sid, gs->id_sig, ds_priority(priority), volume, pan, 1);
+
+		currentlyLoopingSoundHandles.push_back(handle);
 	}
 
 	return handle;
 }
 
-// ---------------------------------------------------------------------------------------
-// snd_stop()
-//
-// Stop a sound from playing.
-//
-// parameters:		sig => handle to sound, what is returned from snd_play()
-//
+/**
+ * Stop a sound from playing.
+ *
+ * @param sig handle to sound, what is returned from snd_play()
+ */
 void snd_stop( int sig )
 {
 	int channel;
@@ -840,9 +844,35 @@ void snd_stop( int sig )
 	if ( channel == -1 )
 		return;
 	
+	SCP_list<int>::iterator iter = currentlyLoopingSoundHandles.begin();
+	while (iter != currentlyLoopingSoundHandles.end())
+	{
+		int handle = *iter;
+		if(handle == sig) {
+			iter = currentlyLoopingSoundHandles.erase(iter);
+		} else {
+			++iter;
+		}
+	}
+
 	ds_stop_channel(channel);
 }
 
+/**
+ * Stop all playing sound channels (including looping sounds)
+ *
+ * NOTE: This stops all sounds that are playing from Channels[] sound buffers.
+ * It doesn't stop every secondary sound buffer in existance.
+ */
+void snd_stop_all()
+{
+	if (!ds_initialized)
+		return;
+
+	currentlyLoopingSoundHandles.clear();
+	ds_stop_channel_all();
+}
+
 // ---------------------------------------------------------------------------------------
 // snd_set_volume()
 //
@@ -985,50 +1015,6 @@ int snd_is_playing( int sig )
 	return 0;
 }
 
-
-// ---------------------------------------------------------------------------------------
-// snd_chg_loop_status()
-//
-// Change whether a currently playing song is looping or not
-//
-// parameters:		sig			=> handle to sound, what is returned from snd_play()
-//						loop			=> whether to start (1) or stop (0) looping
-//
-void snd_chg_loop_status(int sig, int loop)
-{
-	int channel;
-
-	if (!ds_initialized)
-		return;
-
-	if ( sig < 0 )
-		return;
-
-	channel = ds_get_channel(sig);
-	if ( channel == -1 ) {
-		nprintf(( "Sound", "WARNING: Trying to change loop status of a non-playing sound!\n" ));
-		return;
-	}
-
-	ds_chg_loop_status(channel, loop);
-}
-
-// ---------------------------------------------------------------------------------------
-// snd_stop_all()
-//
-// Stop all playing sound channels (including looping sounds)
-//
-// NOTE: This stops all sounds that are playing from Channels[] sound buffers.  It doesn't
-//			stop every secondary sound buffer in existance
-//
-void snd_stop_all()
-{
-	if (!ds_initialized)
-		return;
-
-	ds_stop_channel_all();
-}
-
 // ---------------------------------------------------------------------------------------
 // snd_is_inited()
 //
@@ -1368,6 +1354,13 @@ void snd_do_frame()
 	adjust_volume_on_frame(&aav_music_volume, &aav_data[AAV_MUSIC]);
 	adjust_volume_on_frame(&aav_voice_volume, &aav_data[AAV_VOICE]);
 	adjust_volume_on_frame(&aav_effect_volume, &aav_data[AAV_EFFECTS]);
+
+	SCP_list<int>::iterator iter;
+	for (iter = currentlyLoopingSoundHandles.begin(); iter != currentlyLoopingSoundHandles.end(); ++iter) {
+		int handle = *iter;
+		snd_set_volume(handle, 1.0f);
+	}
+
 	ds_do_frame();
 }
 
