diff --git a/src/s_sound.c b/src/s_sound.c
index 5b6b053d556ef103f69897f33bc28d01060e9bff..6b96f6cd7616a999e141623bde4e31c764156056 100644
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -451,6 +451,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
 	sfxinfo_t *sfx;
 	INT32 sep, pitch, priority, cnum;
 	boolean anyListeners = false;
+	boolean itsUs = false;
 	INT32 i;
 
 	listener_t listener[MAXSPLITSCREENPLAYERS];
@@ -473,10 +474,8 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
 		if (i == 0 && democam.soundmobj)
 		{
 			listenmobj[i] = democam.soundmobj;
-			continue;
 		}
-
-		if (player->awayviewtics)
+		else if (player->awayviewtics)
 		{
 			listenmobj[i] = player->awayviewmobj;
 		}
@@ -484,6 +483,11 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
 		{
 			listenmobj[i] = player->mo;
 		}
+
+		if (origin && origin == listenmobj[i])
+		{
+			itsUs = true;
+		}
 	}
 
 #ifdef HW3SOUND
@@ -538,41 +542,56 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
 	// Initialize sound parameters
 	pitch = NORM_PITCH;
 	priority = NORM_PRIORITY;
+	sep = NORM_SEP;
 
-	for (i = splitscreen; i >= 0; i--)
-	{
-		// Copy the sound for the splitscreen players!
-		if (listenmobj[i] == NULL && i != 0)
-		{
-			continue;
-		}
+	i = 0; // sensible default
 
+	{
 		// Check to see if it is audible, and if not, modify the params
-		if (origin && origin != listenmobj[i])
+		if (origin && !itsUs)
 		{
-			boolean rc = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, &pitch, sfx);
+			boolean audible = false;
+			if (splitscreen > 0)
+			{
+				fixed_t recdist = INT32_MAX;
+				UINT8 j = 0;
+
+				for (; j <= splitscreen; j++)
+				{
+					fixed_t thisdist = INT32_MAX;
+
+					if (!listenmobj[j])
+					{
+						continue;
+					}
+
+					thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
+
+					if (thisdist >= recdist)
+					{
+						continue;
+					}
+				
+					recdist = thisdist;
+					i = j;
+				}
+			}
 
-			if (!rc)
+			if (listenmobj[i])
 			{
-				continue; // Maybe the other player can hear it...
+				audible = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, &pitch, sfx);
+
+				if (origin->x == listener[i].x && origin->y == listener[i].y)
+				{
+					sep = NORM_SEP;
+				}
 			}
 
-			if (origin->x == listener[i].x && origin->y == listener[i].y)
+			if (!audible)
 			{
-				sep = NORM_SEP;
+				return;
 			}
 		}
-		else if (i > 0 && !origin)
-		{
-			// Do not play origin-less sounds for the splitscreen players.
-			// The first player will be able to hear it just fine,
-			// we really don't want it playing twice.
-			continue;
-		}
-		else
-		{
-			sep = NORM_SEP;
-		}
 
 		// This is supposed to handle the loading/caching.
 		// For some odd reason, the caching is done nearly
@@ -829,46 +848,58 @@ void S_UpdateSounds(void)
 				{
 					boolean itsUs = false;
 
-					for (i = 0; i <= splitscreen; i++)
+					for (i = splitscreen; i >= 0; i--)
 					{
-						if (c->origin == players[displayplayers[i]].mo)
-						{
-							itsUs = true;
-							break;
-						}
+						if (c->origin != listenmobj[i])
+							continue;
+
+						itsUs = true;
 					}
 
 					if (itsUs == false)
 					{
-						const mobj_t *soundmobj = c->origin;
-						fixed_t recdist = INT32_MAX;
-						UINT8 p = 0;
+						const mobj_t *origin = c->origin;
 
-						for (i = 0; i <= splitscreen; i++)
+						i = 0;
+
+						if (splitscreen > 0)
 						{
-							fixed_t thisdist = INT32_MAX;
+							fixed_t recdist = INT32_MAX;
+							UINT8 j = 0;
 
-							if (!listenmobj[i])
+							for (; j <= splitscreen; j++)
 							{
-								continue;
-							}
+								fixed_t thisdist = INT32_MAX;
 
-							thisdist = P_AproxDistance(listener[i].x - soundmobj->x, listener[i].y - soundmobj->y);
+								if (!listenmobj[j])
+								{
+									continue;
+								}
+
+								thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y);
+
+								if (thisdist >= recdist)
+								{
+									continue;
+								}
 
-							if (thisdist < recdist)
-							{
 								recdist = thisdist;
-								p = i;
+								i = j;
 							}
 						}
 
-						if (listenmobj[p])
+						if (listenmobj[i])
 						{
 							audible = S_AdjustSoundParams(
-								listenmobj[p], c->origin,
+								listenmobj[i], c->origin,
 								&volume, &sep, &pitch,
 								c->sfxinfo
 							);
+
+							if (origin->x == listener[i].x && origin->y == listener[i].y)
+							{
+								sep = NORM_SEP;
+							}
 						}
 
 						if (audible)