diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs
index 8d56d92c0..10ef8d84e 100644
--- a/wadsrc/static/zscript/actors/actor.zs
+++ b/wadsrc/static/zscript/actors/actor.zs
@@ -1055,7 +1055,7 @@ class Actor : Thinker native
 	deprecated("2.3") native void A_BulletAttack();
 	native void A_WolfAttack(int flags = 0, sound whattoplay = "weapons/pistol", double snipe = 1.0, int maxdamage = 64, int blocksize = 128, int pointblank = 2, int longrange = 4, double runspeed = 160.0, class<Actor> pufftype = "BulletPuff");
 	deprecated("4.3") native clearscope void A_PlaySound(sound whattoplay = "weapons/pistol", int slot = CHAN_BODY, double volume = 1.0, bool looping = false, double attenuation = ATTN_NORM, bool local = false, double pitch = 0.0);
-	native clearscope void A_StartSound(sound whattoplay, int slot, int flags = 0, double volume = 1.0, double attenuation = ATTN_NORM, double pitch = 0.0);
+	native clearscope void A_StartSound(sound whattoplay, int slot = CHAN_BODY, int flags = 0, double volume = 1.0, double attenuation = ATTN_NORM, double pitch = 0.0);
 	native void A_SoundVolume(int slot, double volume);
 	native void A_SoundPitch(int slot, double pitch);
 	deprecated("2.3") void A_PlayWeaponSound(sound whattoplay) { A_StartSound(whattoplay, CHAN_WEAPON); }
@@ -1215,20 +1215,20 @@ class Actor : Thinker native
 	{
 		if (DeathSound)
 		{
-			A_PlaySound(DeathSound, CHAN_VOICE, 1, false, bBoss? ATTN_NONE : ATTN_NORM);
+			A_StartSound(DeathSound, CHAN_VOICE, CHANF_DEFAULT, 1, bBoss? ATTN_NONE : ATTN_NORM);
 		}
 	}
 
 	void A_XScream()
 	{
-		A_PlaySound(player? Sound("*gibbed") : Sound("misc/gibbed"), CHAN_VOICE);
+		A_StartSound(player? Sound("*gibbed") : Sound("misc/gibbed"), CHAN_VOICE);
 	}
 
 	void A_ActiveSound()
 	{
 		if (ActiveSound)
 		{
-			A_PlaySound(ActiveSound, CHAN_VOICE);
+			A_StartSound(ActiveSound, CHAN_VOICE);
 		}
 	}
 	
diff --git a/wadsrc/static/zscript/actors/attacks.zs b/wadsrc/static/zscript/actors/attacks.zs
index be1ec3e16..8cc627b34 100644
--- a/wadsrc/static/zscript/actors/attacks.zs
+++ b/wadsrc/static/zscript/actors/attacks.zs
@@ -67,7 +67,7 @@ extend class Actor
 			if (!(flags & CBAF_NOPITCH)) bslope = AimLineAttack (bangle, MISSILERANGE);
 			if (pufftype == null) pufftype = 'BulletPuff';
 
-			A_PlaySound(AttackSound, CHAN_WEAPON);
+			A_StartSound(AttackSound, CHAN_WEAPON);
 			for (i = 0; i < numbullets; i++)
 			{
 				double pangle = bangle;
@@ -162,7 +162,7 @@ extend class Actor
 				looker.target = target;
 				if (looker.SeeSound)
 				{
-					looker.A_PlaySound(looker.SeeSound, CHAN_VOICE);
+					looker.A_StartSound(looker.SeeSound, CHAN_VOICE);
 				}
 				looker.SetState(looker.SeeState);
 				looker.bInCombat = true;
@@ -662,7 +662,7 @@ extend class Actor
 		if (domelee && MeleeDamage>0 && CheckMeleeRange ())
 		{
 			int damage = random[CustomMelee](1, 8) * MeleeDamage;
-			if (MeleeSound) A_PlaySound (MeleeSound, CHAN_WEAPON);
+			if (MeleeSound) A_StartSound (MeleeSound, CHAN_WEAPON);
 			int newdam = targ.DamageMobj (self, self, damage, 'Melee');
 			targ.TraceBleed (newdam > 0 ? newdam : damage, self);
 		}
diff --git a/wadsrc/static/zscript/actors/doom/arachnotron.zs b/wadsrc/static/zscript/actors/doom/arachnotron.zs
index 35b9daf2a..56ba94831 100644
--- a/wadsrc/static/zscript/actors/doom/arachnotron.zs
+++ b/wadsrc/static/zscript/actors/doom/arachnotron.zs
@@ -109,7 +109,7 @@ extend class Actor
 	
 	void A_BabyMetal()
 	{
-		A_PlaySound("baby/walk", CHAN_BODY, 1, false, ATTN_IDLE);
+		A_StartSound("baby/walk", CHAN_BODY, CHANF_DEFAULT, 1, ATTN_IDLE);
 		A_Chase();
 	}
 }
diff --git a/wadsrc/static/zscript/actors/doom/archvile.zs b/wadsrc/static/zscript/actors/doom/archvile.zs
index 4969c4553..0f441cd9e 100644
--- a/wadsrc/static/zscript/actors/doom/archvile.zs
+++ b/wadsrc/static/zscript/actors/doom/archvile.zs
@@ -103,7 +103,7 @@ extend class Actor
 
 	void A_VileStart()
 	{
-		A_PlaySound ("vile/start", CHAN_VOICE);
+		A_StartSound ("vile/start", CHAN_VOICE);
 	}
 	
 	//
@@ -134,7 +134,7 @@ extend class Actor
 		{
 			A_FaceTarget();
 			if (!CheckSight(targ, 0)) return;
-			A_PlaySound(snd, CHAN_WEAPON);
+			A_StartSound(snd, CHAN_WEAPON);
 			int newdam = targ.DamageMobj (self, self, initialdmg, (flags & VAF_DMGTYPEAPPLYTODIRECT)? damagetype : 'none');
 
 			targ.TraceBleed (newdam > 0 ? newdam : initialdmg, self);
@@ -155,7 +155,7 @@ extend class Actor
 	
 	void A_StartFire()
 	{
-		A_PlaySound ("vile/firestrt", CHAN_BODY);
+		A_StartSound ("vile/firestrt", CHAN_BODY);
 		A_Fire();
 	}
 	
@@ -176,7 +176,7 @@ extend class Actor
 	
 	void A_FireCrackle()
 	{
-		A_PlaySound ("vile/firecrkl", CHAN_BODY);
+		A_StartSound ("vile/firecrkl", CHAN_BODY);
 		A_Fire();
 	}
 }
diff --git a/wadsrc/static/zscript/actors/doom/bossbrain.zs b/wadsrc/static/zscript/actors/doom/bossbrain.zs
index d45f85cf7..a2fb6f267 100644
--- a/wadsrc/static/zscript/actors/doom/bossbrain.zs
+++ b/wadsrc/static/zscript/actors/doom/bossbrain.zs
@@ -143,12 +143,12 @@ extend class Actor
 
 	void A_BrainAwake()
 	{
-		A_PlaySound("brain/sight", CHAN_VOICE, 1, false, ATTN_NONE);
+		A_StartSound("brain/sight", CHAN_VOICE, CHANF_DEFAULT, 1, ATTN_NONE);
 	}
 	
 	void A_BrainPain()
 	{
-		A_PlaySound("brain/pain", CHAN_VOICE, 1, false, ATTN_NONE);
+		A_StartSound("brain/pain", CHAN_VOICE, CHANF_DEFAULT, 1, ATTN_NONE);
 	}
 
 	private static void BrainishExplosion(vector3 pos)
@@ -174,7 +174,7 @@ extend class Actor
 			// (1 / 512.) is actually what the original value of 128 did, even though it probably meant 128 map units.
 			BrainishExplosion(Vec2OffsetZ(x, -320, (1 / 512.) + random[BrainExplode](0, 255) * 2));
 		}
-		A_PlaySound("brain/death", CHAN_VOICE, 1, false, ATTN_NONE);
+		A_StartSound("brain/death", CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 	}
 	
 	void A_BrainExplode()
@@ -267,12 +267,12 @@ extend class Actor
 
 			if (!isdefault)
 			{
-				A_PlaySound(self.AttackSound, CHAN_WEAPON, 1., false, ATTN_NONE);
+				A_StartSound(self.AttackSound, CHAN_WEAPON, CHANF_DEFAULT, 1., ATTN_NONE);
 			}
 			else
 			{
 				// compatibility fallback
-				A_PlaySound("brain/spit", CHAN_WEAPON, 1., false, ATTN_NONE);
+				A_StartSound("brain/spit", CHAN_WEAPON, CHANF_DEFAULT, 1., ATTN_NONE);
 			}
 		}
 	}
@@ -306,7 +306,7 @@ extend class Actor
 		if (spawntype)
 		{
 			fog = Spawn (spawntype, targ.pos, ALLOW_REPLACE);
-			if (fog) A_PlaySound(snd, CHAN_BODY);
+			if (fog) A_StartSound(snd, CHAN_BODY);
 		}
 
 		class<Actor> SpawnName = null;
@@ -428,7 +428,7 @@ extend class Actor
 		void A_SpawnSound()
 	{
 		// travelling cube sound
-		A_PlaySound("brain/cube", CHAN_BODY);
+		A_StartSound("brain/cube", CHAN_BODY);
 		SpawnFly("SpawnFire", "brain/spawn");
 	}
 }
diff --git a/wadsrc/static/zscript/actors/doom/bruiser.zs b/wadsrc/static/zscript/actors/doom/bruiser.zs
index 1a8f97011..a34c91160 100644
--- a/wadsrc/static/zscript/actors/doom/bruiser.zs
+++ b/wadsrc/static/zscript/actors/doom/bruiser.zs
@@ -157,7 +157,7 @@ extend class Actor
 			if (CheckMeleeRange())
 			{
 				int damage = random[pr_bruisattack](1, 8) * 10;
-				A_PlaySound ("baron/melee", CHAN_WEAPON);
+				A_StartSound ("baron/melee", CHAN_WEAPON);
 				int newdam = target.DamageMobj (self, self, damage, "Melee");
 				targ.TraceBleed (newdam > 0 ? newdam : damage, self);
 			}
diff --git a/wadsrc/static/zscript/actors/doom/cacodemon.zs b/wadsrc/static/zscript/actors/doom/cacodemon.zs
index da6b58b16..bce2e2814 100644
--- a/wadsrc/static/zscript/actors/doom/cacodemon.zs
+++ b/wadsrc/static/zscript/actors/doom/cacodemon.zs
@@ -106,7 +106,7 @@ extend class Actor
 			if (CheckMeleeRange())
 			{
 				int damage = random[pr_headattack](1, 6) * 10;
-				A_PlaySound (AttackSound, CHAN_WEAPON);
+				A_StartSound (AttackSound, CHAN_WEAPON);
 				int newdam = target.DamageMobj (self, self, damage, "Melee");
 				targ.TraceBleed (newdam > 0 ? newdam : damage, self);
 			}
diff --git a/wadsrc/static/zscript/actors/doom/cyberdemon.zs b/wadsrc/static/zscript/actors/doom/cyberdemon.zs
index 61fd1d273..4817207fc 100644
--- a/wadsrc/static/zscript/actors/doom/cyberdemon.zs
+++ b/wadsrc/static/zscript/actors/doom/cyberdemon.zs
@@ -83,7 +83,7 @@ extend class Actor
 	
 	void A_Hoof()
 	{
-		A_PlaySound("cyber/hoof", CHAN_BODY, 1, false, ATTN_IDLE);
+		A_StartSound("cyber/hoof", CHAN_BODY, CHANF_DEFAULT, 1, ATTN_IDLE);
 		A_Chase();
 	}
 	
diff --git a/wadsrc/static/zscript/actors/doom/doomimp.zs b/wadsrc/static/zscript/actors/doom/doomimp.zs
index d690fffce..15fafc8d9 100644
--- a/wadsrc/static/zscript/actors/doom/doomimp.zs
+++ b/wadsrc/static/zscript/actors/doom/doomimp.zs
@@ -111,7 +111,7 @@ extend class Actor
 			if (CheckMeleeRange())
 			{
 				int damage = random[pr_troopattack](1, 8) * 3;
-				A_PlaySound ("imp/melee", CHAN_WEAPON);
+				A_StartSound ("imp/melee", CHAN_WEAPON);
 				int newdam = targ.DamageMobj (self, self, damage, "Melee");
 				targ.TraceBleed (newdam > 0 ? newdam : damage, self);
 			}
diff --git a/wadsrc/static/zscript/actors/doom/fatso.zs b/wadsrc/static/zscript/actors/doom/fatso.zs
index e0dfd338d..82ec4623b 100644
--- a/wadsrc/static/zscript/actors/doom/fatso.zs
+++ b/wadsrc/static/zscript/actors/doom/fatso.zs
@@ -108,7 +108,7 @@ extend class Actor
 	void A_FatRaise()
 	{
 		A_FaceTarget();
-		A_PlaySound("fatso/raiseguns", CHAN_WEAPON);
+		A_StartSound("fatso/raiseguns", CHAN_WEAPON);
 	}
 
 	//
diff --git a/wadsrc/static/zscript/actors/doom/lostsoul.zs b/wadsrc/static/zscript/actors/doom/lostsoul.zs
index 055781079..f44a24754 100644
--- a/wadsrc/static/zscript/actors/doom/lostsoul.zs
+++ b/wadsrc/static/zscript/actors/doom/lostsoul.zs
@@ -100,7 +100,7 @@ extend class Actor
 		if (skullspeed <= 0) skullspeed = DEFSKULLSPEED;
 
 		bSkullfly = true;
-		A_PlaySound(AttackSound, CHAN_VOICE);
+		A_StartSound(AttackSound, CHAN_VOICE);
 		A_FaceTarget();
 		VelFromAngle(skullspeed);
 		Vel.Z = (target.pos.Z + target.Height/2 - pos.Z) / DistanceBySpeed(target, skullspeed);
@@ -110,7 +110,7 @@ extend class Actor
 	{
 		if (target == null || target.GetSpecies() == self.GetSpecies()) return;
 
-		A_PlaySound(AttackSound, CHAN_WEAPON);
+		A_StartSound(AttackSound, CHAN_WEAPON);
 		A_FaceTarget();
 		
 		int damage = GetMissileDamage(7,1);
diff --git a/wadsrc/static/zscript/actors/doom/possessed.zs b/wadsrc/static/zscript/actors/doom/possessed.zs
index 0e059792e..eef344ab8 100644
--- a/wadsrc/static/zscript/actors/doom/possessed.zs
+++ b/wadsrc/static/zscript/actors/doom/possessed.zs
@@ -271,7 +271,7 @@ extend class Actor
 			A_FaceTarget();
 			double ang = angle;
 			double slope = AimLineAttack(ang, MISSILERANGE);
-			A_PlaySound("grunt/attack", CHAN_WEAPON);
+			A_StartSound("grunt/attack", CHAN_WEAPON);
 			ang  += Random2[PosAttack]() * (22.5/256);
 			int damage = Random[PosAttack](1, 5) * 3;
 			LineAttack(ang, MISSILERANGE, slope, damage, "Hitscan", "Bulletpuff");
@@ -300,7 +300,7 @@ extend class Actor
 	{
 		if (target)
 		{
-			A_PlaySound(AttackSound, CHAN_WEAPON);
+			A_StartSound(AttackSound, CHAN_WEAPON);
 			A_SPosAttackInternal();
 		}
 	}
@@ -310,7 +310,7 @@ extend class Actor
 	{
 		if (target)
 		{
-			A_PlaySound("shotguy/attack", CHAN_WEAPON);
+			A_StartSound("shotguy/attack", CHAN_WEAPON);
 			A_SPosAttackInternal();
 		}
 	}
@@ -320,7 +320,7 @@ extend class Actor
 		if (target)
 		{
 			if (bStealth) visdir = 1;
-			A_PlaySound(AttackSound, CHAN_WEAPON);
+			A_StartSound(AttackSound, CHAN_WEAPON);
 			A_FaceTarget();
 			double slope = AimLineAttack(angle, MISSILERANGE);
 			double ang = angle + Random2[CPosAttack]() * (22.5/256);
diff --git a/wadsrc/static/zscript/actors/doom/revenant.zs b/wadsrc/static/zscript/actors/doom/revenant.zs
index 6fddcdb16..36599e3a9 100644
--- a/wadsrc/static/zscript/actors/doom/revenant.zs
+++ b/wadsrc/static/zscript/actors/doom/revenant.zs
@@ -150,7 +150,7 @@ extend class Actor
 	{
 		if (target == null) return;
 		A_FaceTarget();
-		A_PlaySound("skeleton/swing", CHAN_WEAPON);
+		A_StartSound("skeleton/swing", CHAN_WEAPON);
 	}
 
 	void A_SkelFist()
@@ -162,7 +162,7 @@ extend class Actor
 		if (CheckMeleeRange ())
 		{
 			int damage = random[SkelFist](1, 10) * 6;
-			A_PlaySound("skeleton/melee", CHAN_WEAPON);
+			A_StartSound("skeleton/melee", CHAN_WEAPON);
 			int newdam = targ.DamageMobj (self, self, damage, 'Melee');
 			targ.TraceBleed (newdam > 0 ? newdam : damage, self);
 		}
diff --git a/wadsrc/static/zscript/actors/doom/scriptedmarine.zs b/wadsrc/static/zscript/actors/doom/scriptedmarine.zs
index 8832bd1b9..3e008618a 100644
--- a/wadsrc/static/zscript/actors/doom/scriptedmarine.zs
+++ b/wadsrc/static/zscript/actors/doom/scriptedmarine.zs
@@ -247,13 +247,13 @@ class ScriptedMarine : Actor
 					switch (ticks)
 					{
 					case 14:
-						A_PlaySound ("weapons/sshoto", CHAN_WEAPON);
+						A_StartSound ("weapons/sshoto", CHAN_WEAPON);
 						break; 
 					case 28:   
-						A_PlaySound ("weapons/sshotl", CHAN_WEAPON);
+						A_StartSound ("weapons/sshotl", CHAN_WEAPON);
 						break;
 					case 41:  
-						A_PlaySound ("weapons/sshotc", CHAN_WEAPON);
+						A_StartSound ("weapons/sshotc", CHAN_WEAPON);
 						break;
 					}
 				}
@@ -329,7 +329,7 @@ class ScriptedMarine : Actor
 	{
 		if (CurrentWeapon == WEAPON_Chainsaw)
 		{
-			A_PlaySound ("weapons/sawidle", CHAN_WEAPON);
+			A_StartSound ("weapons/sawidle", CHAN_WEAPON);
 		}
 	}
 
@@ -380,7 +380,7 @@ class ScriptedMarine : Actor
 		// turn to face target
 		if (t.linetarget)
 		{
-			A_PlaySound ("*fist", CHAN_WEAPON);
+			A_StartSound ("*fist", CHAN_WEAPON);
 			angle = t.angleFromSource;
 		}
 	}
@@ -415,7 +415,7 @@ class ScriptedMarine : Actor
 		if (target == null)
 			return;
 
-		A_PlaySound ("weapons/pistol", CHAN_WEAPON);
+		A_StartSound ("weapons/pistol", CHAN_WEAPON);
 		A_FaceTarget ();
 		GunShot2 (accurate, AimLineAttack (angle, MISSILERANGE), "BulletPuff");
 	}
@@ -431,7 +431,7 @@ class ScriptedMarine : Actor
 		if (target == null)
 			return;
 
-		A_PlaySound ("weapons/shotgf", CHAN_WEAPON);
+		A_StartSound ("weapons/shotgf", CHAN_WEAPON);
 		A_FaceTarget ();
 		double pitch = AimLineAttack (angle, MISSILERANGE);
 		for (int i = 0; i < 7; ++i)
@@ -470,7 +470,7 @@ class ScriptedMarine : Actor
 		if (target == null)
 			return;
 
-		A_PlaySound ("weapons/sshotf", CHAN_WEAPON);
+		A_StartSound ("weapons/sshotf", CHAN_WEAPON);
 		A_FaceTarget ();
 		double pitch = AimLineAttack (angle, MISSILERANGE);
 		for (int i = 0; i < 20; ++i)
@@ -494,7 +494,7 @@ class ScriptedMarine : Actor
 		if (target == null)
 			return;
 
-		A_PlaySound ("weapons/chngun", CHAN_WEAPON);
+		A_StartSound ("weapons/chngun", CHAN_WEAPON);
 		A_FaceTarget ();
 		GunShot2 (accurate, AimLineAttack (angle, MISSILERANGE), "BulletPuff");
 	}
@@ -574,7 +574,7 @@ class ScriptedMarine : Actor
 		else
 		{
 			A_FaceTarget ();
-			A_PlaySound ("weapons/bfgf", CHAN_WEAPON);
+			A_StartSound ("weapons/bfgf", CHAN_WEAPON);
 			// Don't interrupt the firing sequence
 			PainChance = 0;
 		}
@@ -670,10 +670,10 @@ extend class Actor
 
 			if (!t.linetarget)
 			{
-				A_PlaySound (fullsound, 1, CHAN_WEAPON);
+				A_StartSound (fullsound, 1, CHAN_WEAPON);
 				return;
 			}
-			A_PlaySound (hitsound, CHAN_WEAPON);
+			A_StartSound (hitsound, CHAN_WEAPON);
 				
 			// turn to face target
 			ang = t.angleFromSource;
@@ -696,7 +696,7 @@ extend class Actor
 		}
 		else
 		{
-			A_PlaySound (fullsound, 1, CHAN_WEAPON);
+			A_StartSound (fullsound, 1, CHAN_WEAPON);
 		}
 	}
 }
diff --git a/wadsrc/static/zscript/actors/doom/spidermaster.zs b/wadsrc/static/zscript/actors/doom/spidermaster.zs
index c6aaa9cfd..c8b6eb091 100644
--- a/wadsrc/static/zscript/actors/doom/spidermaster.zs
+++ b/wadsrc/static/zscript/actors/doom/spidermaster.zs
@@ -87,7 +87,7 @@ extend class Actor
 
 	void A_Metal()
 	{
-		A_PlaySound("spider/walk", CHAN_BODY, 1, false, ATTN_IDLE);
+		A_StartSound("spider/walk", CHAN_BODY, CHANF_DEFAULT, 1, ATTN_IDLE);
 		A_Chase();
 	}
 }
diff --git a/wadsrc/static/zscript/actors/doom/weaponbfg.zs b/wadsrc/static/zscript/actors/doom/weaponbfg.zs
index e92f2ee9c..583688f8d 100644
--- a/wadsrc/static/zscript/actors/doom/weaponbfg.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponbfg.zs
@@ -60,7 +60,7 @@ extend class StateProvider
 {
 	action void A_BFGsound() 
 	{ 
-		A_PlaySound("weapons/bfgf", CHAN_WEAPON); 
+		A_StartSound("weapons/bfgf", CHAN_WEAPON); 
 	}
 	
 
diff --git a/wadsrc/static/zscript/actors/doom/weaponchaingun.zs b/wadsrc/static/zscript/actors/doom/weaponchaingun.zs
index 3766b9b6e..7d00827fa 100644
--- a/wadsrc/static/zscript/actors/doom/weaponchaingun.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponchaingun.zs
@@ -63,7 +63,7 @@ extend class StateProvider
 			if (!weap.DepleteAmmo (weap.bAltFire, true, 1))
 				return;
 
-			A_PlaySound ("weapons/chngun", CHAN_WEAPON);
+			A_StartSound ("weapons/chngun", CHAN_WEAPON);
 
 			State flash = weap.FindState('Flash');
 			if (flash != null)
diff --git a/wadsrc/static/zscript/actors/doom/weaponchainsaw.zs b/wadsrc/static/zscript/actors/doom/weaponchainsaw.zs
index 88a8c87cd..7ba896355 100644
--- a/wadsrc/static/zscript/actors/doom/weaponchainsaw.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponchainsaw.zs
@@ -88,7 +88,7 @@ extend class StateProvider
 			{
 				player.extralight = !player.extralight;
 			}
-			A_PlaySound (fullsound, CHAN_WEAPON);
+			A_StartSound (fullsound, CHAN_WEAPON);
 			return;
 		}
 
@@ -138,7 +138,7 @@ extend class StateProvider
 			}
 		}
 
-		A_PlaySound (hitsound, CHAN_WEAPON);
+		A_StartSound (hitsound, CHAN_WEAPON);
 			
 		// turn to face target
 		if (!(flags & SF_NOTURN))
diff --git a/wadsrc/static/zscript/actors/doom/weaponfist.zs b/wadsrc/static/zscript/actors/doom/weaponfist.zs
index ae0eedddc..6d857f7a2 100644
--- a/wadsrc/static/zscript/actors/doom/weaponfist.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponfist.zs
@@ -72,7 +72,7 @@ extend class Actor
 		// turn to face target
 		if (t.linetarget)
 		{
-			A_PlaySound ("*fist", CHAN_WEAPON);
+			A_StartSound ("*fist", CHAN_WEAPON);
 			angle = t.angleFromSource;
 		}
 	}
diff --git a/wadsrc/static/zscript/actors/doom/weaponpistol.zs b/wadsrc/static/zscript/actors/doom/weaponpistol.zs
index 45a1ebecd..cddd8647a 100644
--- a/wadsrc/static/zscript/actors/doom/weaponpistol.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponpistol.zs
@@ -94,7 +94,7 @@ extend class StateProvider
 			accurate = true;
 		}
 
-		A_PlaySound ("weapons/pistol", CHAN_WEAPON);
+		A_StartSound ("weapons/pistol", CHAN_WEAPON);
 		GunShot (accurate, "BulletPuff", BulletSlope ());
 	}
 }
\ No newline at end of file
diff --git a/wadsrc/static/zscript/actors/doom/weaponshotgun.zs b/wadsrc/static/zscript/actors/doom/weaponshotgun.zs
index 6a08afc11..3b39f1d3e 100644
--- a/wadsrc/static/zscript/actors/doom/weaponshotgun.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponshotgun.zs
@@ -62,7 +62,7 @@ extend class StateProvider
 			return;
 		}
 
-		A_PlaySound ("weapons/shotgf", CHAN_WEAPON);
+		A_StartSound ("weapons/shotgf", CHAN_WEAPON);
 		Weapon weap = player.ReadyWeapon;
 		if (weap != null && invoker == weap && stateinfo != null && stateinfo.mStateType == STATE_Psprite)
 		{
diff --git a/wadsrc/static/zscript/actors/doom/weaponssg.zs b/wadsrc/static/zscript/actors/doom/weaponssg.zs
index 6c06fe6ec..cf775bde0 100644
--- a/wadsrc/static/zscript/actors/doom/weaponssg.zs
+++ b/wadsrc/static/zscript/actors/doom/weaponssg.zs
@@ -70,7 +70,7 @@ extend class StateProvider
 			return;
 		}
 
-		A_PlaySound ("weapons/sshotf", CHAN_WEAPON);
+		A_StartSound ("weapons/sshotf", CHAN_WEAPON);
 		Weapon weap = player.ReadyWeapon;
 		if (weap != null && invoker == weap && stateinfo != null && stateinfo.mStateType == STATE_Psprite)
 		{
@@ -101,17 +101,17 @@ extend class StateProvider
 
 	action void A_OpenShotgun2() 
 	{ 
-		A_PlaySound("weapons/sshoto", CHAN_WEAPON); 
+		A_StartSound("weapons/sshoto", CHAN_WEAPON); 
 	}
 	
 	action void A_LoadShotgun2() 
 	{ 
-		A_PlaySound("weapons/sshotl", CHAN_WEAPON); 
+		A_StartSound("weapons/sshotl", CHAN_WEAPON); 
 	}
 	
 	action void A_CloseShotgun2() 
 	{ 
-		A_PlaySound("weapons/sshotc", CHAN_WEAPON);
+		A_StartSound("weapons/sshotc", CHAN_WEAPON);
 		A_Refire();
 	}
 }
diff --git a/wadsrc/static/zscript/actors/heretic/chicken.zs b/wadsrc/static/zscript/actors/heretic/chicken.zs
index eb9085513..c643f6c9c 100644
--- a/wadsrc/static/zscript/actors/heretic/chicken.zs
+++ b/wadsrc/static/zscript/actors/heretic/chicken.zs
@@ -83,7 +83,7 @@ class Beak : Weapon
 		{
 			angle = t.angleFromSource;
 		}
-		A_PlaySound ("chicken/peck", CHAN_VOICE);
+		A_StartSound ("chicken/peck", CHAN_VOICE);
 		player.chickenPeck = 12;
 		player.GetPSprite(PSP_WEAPON).Tics -= random[BeakAtk](0,7);
 	}
@@ -131,7 +131,7 @@ class BeakPowered : Beak
 		{
 			angle = t.angleFromSource;
 		}
-		A_PlaySound ("chicken/peck", CHAN_VOICE);
+		A_StartSound ("chicken/peck", CHAN_VOICE);
 		player.chickenPeck = 12;
 		player.GetPSprite(PSP_WEAPON).Tics -= random[BeakAtk](0,3);
 	}
@@ -225,7 +225,7 @@ class ChickenPlayer : PlayerPawn
 		}
 		if (random[ChickenPlayerThink]() < 48)
 		{ // Just noise
-			A_PlaySound ("chicken/active", CHAN_VOICE);
+			A_StartSound ("chicken/active", CHAN_VOICE);
 		}
 	}
 
diff --git a/wadsrc/static/zscript/actors/heretic/dsparil.zs b/wadsrc/static/zscript/actors/heretic/dsparil.zs
index 21e94ed1a..374f47648 100644
--- a/wadsrc/static/zscript/actors/heretic/dsparil.zs
+++ b/wadsrc/static/zscript/actors/heretic/dsparil.zs
@@ -67,10 +67,10 @@ class Sorcerer1 : Actor
 		SRCR F 7 A_Scream;
 		SRCR G 7;
 		SRCR HIJK 6;
-		SRCR L 25 A_PlaySound("dsparil/zap", CHAN_BODY, 1, false, ATTN_NONE);
+		SRCR L 25 A_StartSound("dsparil/zap", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		SRCR MN 5;
 		SRCR O 4;
-		SRCR L 20 A_PlaySound("dsparil/zap", CHAN_BODY, 1, false, ATTN_NONE);
+		SRCR L 20 A_StartSound("dsparil/zap", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		SRCR MN 5;
 		SRCR O 4;
 		SRCR L 12;
@@ -121,7 +121,7 @@ class Sorcerer1 : Actor
 		{
 			return;
 		}
-		A_PlaySound (AttackSound, CHAN_BODY);
+		A_StartSound (AttackSound, CHAN_BODY);
 		if (CheckMeleeRange ())
 		{
 			int damage = random[Srcr1Attack](1,8) * 8;
@@ -252,9 +252,9 @@ class Sorcerer2 : Actor
 		Loop;
 	Rise:
 		SOR2 AB 4;
-		SOR2 C 4 A_PlaySound("dsparil/rise", CHAN_BODY, 1, false, ATTN_NONE);
+		SOR2 C 4 A_StartSound("dsparil/rise", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		SOR2 DEF 4;
-		SOR2 G 12 A_PlaySound("dsparil/sight", CHAN_BODY, 1, false, ATTN_NONE);
+		SOR2 G 12 A_StartSound("dsparil/sight", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		Goto See;
 	Pain:
 		SOR2 Q 3;
@@ -271,15 +271,15 @@ class Sorcerer2 : Actor
 	Death:
 		SDTH A 8 A_Sor2DthInit;
 		SDTH B 8;
-		SDTH C 8 A_PlaySound("dsparil/scream", CHAN_BODY, 1, false, ATTN_NONE);
+		SDTH C 8 A_StartSound("dsparil/scream", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 	DeathLoop:
 		SDTH DE 7;
 		SDTH F 7 A_Sor2DthLoop;
-		SDTH G 6 A_PlaySound("dsparil/explode", CHAN_BODY, 1, false, ATTN_NONE);
+		SDTH G 6 A_StartSound("dsparil/explode", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		SDTH H 6;
 		SDTH I 18;
 		SDTH J 6 A_NoBlocking;
-		SDTH K 6 A_PlaySound("dsparil/bones", CHAN_BODY, 1, false, ATTN_NONE);
+		SDTH K 6 A_StartSound("dsparil/bones", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		SDTH LMN 6;
 		SDTH O -1 A_BossDeath;
 		Stop;
@@ -306,10 +306,10 @@ class Sorcerer2 : Actor
 			if (mo) 
 			{
 				mo.Translation = Translation;
-				mo.A_PlaySound("misc/teleport", CHAN_BODY);
+				mo.A_StartSound("misc/teleport", CHAN_BODY);
 			}
 			SetStateLabel ("Teleport");
-			A_PlaySound ("misc/teleport", CHAN_BODY);
+			A_StartSound ("misc/teleport", CHAN_BODY);
 			SetZ(floorz);
 			angle = spot.angle;
 			vel = (0,0,0); 
@@ -351,7 +351,7 @@ class Sorcerer2 : Actor
 		{
 			return;
 		}
-		A_PlaySound (AttackSound, CHAN_BODY, 1, false, ATTN_NONE);
+		A_StartSound (AttackSound, CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		if (CheckMeleeRange())
 		{
 			int damage = random[Srcr2Atk](1, 8) * 20;
diff --git a/wadsrc/static/zscript/actors/heretic/hereticartifacts.zs b/wadsrc/static/zscript/actors/heretic/hereticartifacts.zs
index 688ca6ebf..d12bf2b19 100644
--- a/wadsrc/static/zscript/actors/heretic/hereticartifacts.zs
+++ b/wadsrc/static/zscript/actors/heretic/hereticartifacts.zs
@@ -80,7 +80,7 @@ Class ArtiTomeOfPower : PowerupGiver
 			}
 			else
 			{ // Succeeded
-				Owner.A_PlaySound ("*evillaugh", CHAN_VOICE);
+				Owner.A_StartSound ("*evillaugh", CHAN_VOICE);
 			}
 			return true;
 		}
diff --git a/wadsrc/static/zscript/actors/heretic/hereticmisc.zs b/wadsrc/static/zscript/actors/heretic/hereticmisc.zs
index d05fa0c29..93dab2557 100644
--- a/wadsrc/static/zscript/actors/heretic/hereticmisc.zs
+++ b/wadsrc/static/zscript/actors/heretic/hereticmisc.zs
@@ -153,7 +153,7 @@ class PodGenerator : Actor
 		}
 		mo.SetStateLabel("Grow");
 		mo.Thrust(4.5, random[MakePod]() * (360. / 256));
-		A_PlaySound (AttackSound, CHAN_BODY);
+		A_StartSound (AttackSound, CHAN_BODY);
 		special1++; // Increment generated pod count
 		mo.master = self; // Link the generator to the pod
 	}
@@ -304,7 +304,7 @@ class Volcano : Actor
 				blast.Angle = random[VolcanoBlast]() * (360 / 256.);
 				blast.VelFromAngle(1.);
 				blast.Vel.Z = 2.5 + random[VolcanoBlast]() / 64.;
-				blast.A_PlaySound ("world/volcano/shoot", CHAN_BODY);
+				blast.A_StartSound ("world/volcano/shoot", CHAN_BODY);
 				blast.CheckMissileSpawn (radius);
 			}
 		}
diff --git a/wadsrc/static/zscript/actors/heretic/hereticplayer.zs b/wadsrc/static/zscript/actors/heretic/hereticplayer.zs
index 945c0e0ee..3d82dc70c 100644
--- a/wadsrc/static/zscript/actors/heretic/hereticplayer.zs
+++ b/wadsrc/static/zscript/actors/heretic/hereticplayer.zs
@@ -68,13 +68,13 @@ class HereticPlayer : PlayerPawn
 		PLAY Y -1;
 		Stop;
 	Burn:
-		FDTH A 5 BRIGHT A_PlaySound("*burndeath");
+		FDTH A 5 BRIGHT A_StartSound("*burndeath");
 		FDTH B 4 BRIGHT;
 		FDTH C 5 BRIGHT;
 		FDTH D 4 BRIGHT A_PlayerScream;
 		FDTH E 5 BRIGHT;
 		FDTH F 4 BRIGHT;
-		FDTH G 5 BRIGHT A_PlaySound("*burndeath");
+		FDTH G 5 BRIGHT A_StartSound("*burndeath");
 		FDTH H 4 BRIGHT;
 		FDTH I 5 BRIGHT;
 		FDTH J 4 BRIGHT;
diff --git a/wadsrc/static/zscript/actors/heretic/ironlich.zs b/wadsrc/static/zscript/actors/heretic/ironlich.zs
index a27facce8..b7831f045 100644
--- a/wadsrc/static/zscript/actors/heretic/ironlich.zs
+++ b/wadsrc/static/zscript/actors/heretic/ironlich.zs
@@ -89,7 +89,7 @@ class Ironlich : Actor
 		if (randAttack < atkResolve1[dist])
 		{ // Ice ball
 			SpawnMissile (targ, "HeadFX1");
-			A_PlaySound ("ironlich/attack2", CHAN_BODY);
+			A_StartSound ("ironlich/attack2", CHAN_BODY);
 		}
 		else if (randAttack < atkResolve2[dist])
 		{ // Fire column
@@ -102,7 +102,7 @@ class Ironlich : Actor
 					Actor fire = Spawn("HeadFX3", baseFire.Pos, ALLOW_REPLACE);
 					if (i == 0)
 					{
-						A_PlaySound ("ironlich/attack1", CHAN_BODY);
+						A_StartSound ("ironlich/attack1", CHAN_BODY);
 					}
 					if (fire != null)
 					{
@@ -124,7 +124,7 @@ class Ironlich : Actor
 				mo.AddZ(-32);
 				mo.tracer = targ;
 				mo.health = 20*TICRATE; // Duration
-				A_PlaySound ("ironlich/attack3", CHAN_BODY);
+				A_StartSound ("ironlich/attack3", CHAN_BODY);
 			}
 		}
 	}
@@ -346,7 +346,7 @@ class Whirlwind : Actor
 		if ((threshold -= 3) < 0)
 		{
 			threshold = random[WhirlwindSeek](58, 89);
-			A_PlaySound("ironlich/attack3", CHAN_BODY);
+			A_StartSound("ironlich/attack3", CHAN_BODY);
 		}
 		if (tracer && tracer.bShadow)
 		{
diff --git a/wadsrc/static/zscript/actors/heretic/knight.zs b/wadsrc/static/zscript/actors/heretic/knight.zs
index 1bc71d6af..ab4fd3871 100644
--- a/wadsrc/static/zscript/actors/heretic/knight.zs
+++ b/wadsrc/static/zscript/actors/heretic/knight.zs
@@ -70,11 +70,11 @@ class Knight : Actor
 			int damage = random[KnightAttack](1, 8) * 3;
 			int newdam = targ.DamageMobj (self, self, damage, 'Melee');
 			targ.TraceBleed (newdam > 0 ? newdam : damage, self);
-			A_PlaySound ("hknight/melee", CHAN_BODY);
+			A_StartSound ("hknight/melee", CHAN_BODY);
 			return;
 		}
 		// Throw axe
-		A_PlaySound (AttackSound, CHAN_BODY);
+		A_StartSound (AttackSound, CHAN_BODY);
 		if (self.bShadow || random[KnightAttack]() < 40)
 		{ // Red axe
 			SpawnMissileZ (pos.Z + 36, targ, "RedAxe");
@@ -123,7 +123,7 @@ class KnightAxe : Actor
 	States
 	{
 	Spawn:
-		SPAX A 3 BRIGHT A_PlaySound("hknight/axewhoosh");
+		SPAX A 3 BRIGHT A_StartSound("hknight/axewhoosh");
 		SPAX BC 3 BRIGHT;
 		Loop;
 	Death:
diff --git a/wadsrc/static/zscript/actors/heretic/mummy.zs b/wadsrc/static/zscript/actors/heretic/mummy.zs
index 928439ecc..17302e39a 100644
--- a/wadsrc/static/zscript/actors/heretic/mummy.zs
+++ b/wadsrc/static/zscript/actors/heretic/mummy.zs
@@ -142,7 +142,7 @@ class MummyFX1 : Actor
 	States
 	{
 	Spawn:
-		FX15 A 5 Bright A_PlaySound("mummy/head");
+		FX15 A 5 Bright A_StartSound("mummy/head");
 		FX15 B 5 Bright A_SeekerMissile(10,20);
 		FX15 C 5 Bright;
 		FX15 B 5 Bright A_SeekerMissile(10,20);
diff --git a/wadsrc/static/zscript/actors/heretic/weaponblaster.zs b/wadsrc/static/zscript/actors/heretic/weaponblaster.zs
index a3d2c3208..23830eb08 100644
--- a/wadsrc/static/zscript/actors/heretic/weaponblaster.zs
+++ b/wadsrc/static/zscript/actors/heretic/weaponblaster.zs
@@ -67,7 +67,7 @@ class Blaster : HereticWeapon
 			ang += Random2[FireBlaster]() * (5.625 / 256);
 		}
 		LineAttack (ang, PLAYERMISSILERANGE, pitch, damage, 'Hitscan', "BlasterPuff");
-		A_PlaySound ("weapons/blastershoot", CHAN_WEAPON);
+		A_StartSound ("weapons/blastershoot", CHAN_WEAPON);
 	}
 }
 
diff --git a/wadsrc/static/zscript/actors/heretic/weapongauntlets.zs b/wadsrc/static/zscript/actors/heretic/weapongauntlets.zs
index cf6487f57..2f4b500e4 100644
--- a/wadsrc/static/zscript/actors/heretic/weapongauntlets.zs
+++ b/wadsrc/static/zscript/actors/heretic/weapongauntlets.zs
@@ -32,7 +32,7 @@ class Gauntlets : Weapon
 		GAUN A 1 A_Raise;
 		Loop;
 	Fire:
-		GAUN B 4 A_PlaySound("weapons/gauntletsuse", CHAN_WEAPON);
+		GAUN B 4 A_StartSound("weapons/gauntletsuse", CHAN_WEAPON);
 		GAUN C 4;
 	Hold:
 		GAUN DEF 4 BRIGHT A_GauntletAttack(0);
@@ -93,7 +93,7 @@ class Gauntlets : Weapon
 			{
 				player.extralight = !player.extralight;
 			}
-			A_PlaySound ("weapons/gauntletson", CHAN_AUTO);
+			A_StartSound ("weapons/gauntletson", CHAN_AUTO);
 			return;
 		}
 		int randVal = random[GauntletAtk]();
@@ -112,11 +112,11 @@ class Gauntlets : Weapon
 		if (power)
 		{
 			if (!t.linetarget.bDontDrain) GiveBody (actualdamage >> 1);
-			A_PlaySound ("weapons/gauntletspowhit", CHAN_AUTO);
+			A_StartSound ("weapons/gauntletspowhit", CHAN_AUTO);
 		}
 		else
 		{
-			A_PlaySound ("weapons/gauntletshit", CHAN_AUTO);
+			A_StartSound ("weapons/gauntletshit", CHAN_AUTO);
 		}
 		// turn to face target
 		ang = t.angleFromSource;
@@ -163,7 +163,7 @@ class GauntletsPowered : Gauntlets
 		GAUN G 1 A_Raise;
 		Loop;
 	Fire:
-		GAUN J 4 A_PlaySound("weapons/gauntletsuse", CHAN_WEAPON);
+		GAUN J 4 A_StartSound("weapons/gauntletsuse", CHAN_WEAPON);
 		GAUN K 4;
 	Hold:
 		GAUN LMN 4 BRIGHT A_GauntletAttack(1);
diff --git a/wadsrc/static/zscript/actors/heretic/weaponmace.zs b/wadsrc/static/zscript/actors/heretic/weaponmace.zs
index d1e474830..9928443ee 100644
--- a/wadsrc/static/zscript/actors/heretic/weaponmace.zs
+++ b/wadsrc/static/zscript/actors/heretic/weaponmace.zs
@@ -68,7 +68,7 @@ class Mace : HereticWeapon
 				ball.AddZ(ball.Vel.Z);
 				ball.VelFromAngle();
 				ball.Vel += Vel.xy / 2;
-				ball.A_PlaySound ("weapons/maceshoot", CHAN_BODY);
+				ball.A_StartSound ("weapons/maceshoot", CHAN_BODY);
 				ball.CheckMissileSpawn (radius);
 			}
 		}
@@ -138,7 +138,7 @@ class MacePowered : Mace
 				mo.tracer = t.linetarget;
 			}
 		}
-		A_PlaySound ("weapons/maceshoot", CHAN_WEAPON);
+		A_StartSound ("weapons/maceshoot", CHAN_WEAPON);
 	}
 }
 
@@ -206,14 +206,14 @@ class MaceFX1 : Actor
 			Vel.Z *= 0.75;
 			bBounceOnFloors = bBounceOnCeilings = false;
 			SetState (SpawnState);
-			A_PlaySound ("weapons/macebounce", CHAN_BODY);
+			A_StartSound ("weapons/macebounce", CHAN_BODY);
 		}
 		else
 		{ // Explode
 			Vel = (0,0,0);
 			bNoGravity = true;
 			Gravity = 1;
-			A_PlaySound ("weapons/macehit", CHAN_BODY);
+			A_StartSound ("weapons/macehit", CHAN_BODY);
 		}
 	}
 }
@@ -445,14 +445,14 @@ class MaceFX4 : Actor
 					VelFromAngle();
 				}
 				SetState (SpawnState);
-				A_PlaySound ("weapons/macestop", CHAN_BODY);
+				A_StartSound ("weapons/macestop", CHAN_BODY);
 				return;
 			}
 		}
 		Vel = (0,0,0);
 		bNoGravity = true;
 		Gravity = 1;
-		A_PlaySound ("weapons/maceexplode", CHAN_BODY);
+		A_StartSound ("weapons/maceexplode", CHAN_BODY);
 	}
 }
 
diff --git a/wadsrc/static/zscript/actors/heretic/weaponphoenix.zs b/wadsrc/static/zscript/actors/heretic/weaponphoenix.zs
index 5feeb46d0..3300c43d3 100644
--- a/wadsrc/static/zscript/actors/heretic/weaponphoenix.zs
+++ b/wadsrc/static/zscript/actors/heretic/weaponphoenix.zs
@@ -161,7 +161,7 @@ class PhoenixRodPowered : PhoenixRod
 		}
 		if (!player.refire)
 		{
-			A_PlaySound("weapons/phoenixpowshoot", CHAN_WEAPON, 1, true);
+			A_StartSound("weapons/phoenixpowshoot", CHAN_WEAPON, CHANF_LOOPING);
 		}	
 	}
 
diff --git a/wadsrc/static/zscript/actors/heretic/weaponskullrod.zs b/wadsrc/static/zscript/actors/heretic/weaponskullrod.zs
index 449d694e4..4a287e52f 100644
--- a/wadsrc/static/zscript/actors/heretic/weaponskullrod.zs
+++ b/wadsrc/static/zscript/actors/heretic/weaponskullrod.zs
@@ -124,7 +124,7 @@ class SkullRodPowered : SkullRod
 			{
 				MissileActor.tracer = t.linetarget;
 			}
-			MissileActor.A_PlaySound ("weapons/hornrodpowshoot", CHAN_WEAPON);
+			MissileActor.A_StartSound ("weapons/hornrodpowshoot", CHAN_WEAPON);
 		}
 	}
 
@@ -346,7 +346,7 @@ class HornRodFX2 : Actor
 		mo.Vel.X = MinVel; // Force collision detection
 		mo.Vel.Z = -mo.Speed;
 		mo.CheckMissileSpawn (radius);
-		if (ActiveSound > 0) A_PlaySound(ActiveSound, CHAN_BODY, 1, true);
+		if (ActiveSound > 0) A_StartSound(ActiveSound, CHAN_BODY, CHANF_LOOPING);
 	}
 
 	
diff --git a/wadsrc/static/zscript/actors/heretic/weaponwand.zs b/wadsrc/static/zscript/actors/heretic/weaponwand.zs
index 8bc4458a6..52d5136e2 100644
--- a/wadsrc/static/zscript/actors/heretic/weaponwand.zs
+++ b/wadsrc/static/zscript/actors/heretic/weaponwand.zs
@@ -66,7 +66,7 @@ class GoldWand : HereticWeapon
 			ang += Random2[FireGoldWand]() * (5.625 / 256);
 		}
 		LineAttack(ang, PLAYERMISSILERANGE, pitch, damage, 'Hitscan', "GoldWandPuff1");
-		A_PlaySound("weapons/wandhit", CHAN_WEAPON);
+		A_StartSound("weapons/wandhit", CHAN_WEAPON);
 	}
 	
 }
@@ -123,7 +123,7 @@ class GoldWandPowered : GoldWand
 			LineAttack (ang, PLAYERMISSILERANGE, pitch, damage, 'Hitscan', "GoldWandPuff2");
 			ang += ((45. / 8) * 2) / 4;
 		}
-		A_PlaySound("weapons/wandhit", CHAN_WEAPON);
+		A_StartSound("weapons/wandhit", CHAN_WEAPON);
 	}
 
 	
diff --git a/wadsrc/static/zscript/actors/heretic/wizard.zs b/wadsrc/static/zscript/actors/heretic/wizard.zs
index ae12e5838..bcd5d2f47 100644
--- a/wadsrc/static/zscript/actors/heretic/wizard.zs
+++ b/wadsrc/static/zscript/actors/heretic/wizard.zs
@@ -115,7 +115,7 @@ class Wizard : Actor
 		A_GhostOff();
 		let targ = target;
 		if (!targ) return;
-		A_PlaySound (AttackSound, CHAN_WEAPON);
+		A_StartSound (AttackSound, CHAN_WEAPON);
 		if (CheckMeleeRange())
 		{
 			int damage = random[WizAtk3](1, 8) * 4;
diff --git a/wadsrc/static/zscript/actors/hexen/bats.zs b/wadsrc/static/zscript/actors/hexen/bats.zs
index e153865c5..b41bfcacc 100644
--- a/wadsrc/static/zscript/actors/hexen/bats.zs
+++ b/wadsrc/static/zscript/actors/hexen/bats.zs
@@ -111,7 +111,7 @@ class Bat : Actor
 
 		if (random[BatMove]() < 15)
 		{
-			A_PlaySound ("BatScream", CHAN_VOICE, 1, false, ATTN_IDLE);
+			A_StartSound ("BatScream", CHAN_VOICE, CHANF_DEFAULT, 1, ATTN_IDLE);
 		}
 
 		// Handle Z movement
diff --git a/wadsrc/static/zscript/actors/hexen/bishop.zs b/wadsrc/static/zscript/actors/hexen/bishop.zs
index 6e85468e2..4ebd519f5 100644
--- a/wadsrc/static/zscript/actors/hexen/bishop.zs
+++ b/wadsrc/static/zscript/actors/hexen/bishop.zs
@@ -88,7 +88,7 @@ class Bishop : Actor
 		{
 			return;
 		}
-		A_PlaySound (AttackSound, CHAN_BODY);
+		A_StartSound (AttackSound, CHAN_BODY);
 		if (CheckMeleeRange())
 		{
 			int damage = random[BishopAttack](1, 8) * 4;
@@ -158,7 +158,7 @@ class Bishop : Actor
 		{ // Thrust forward
 			Thrust(11);
 		}
-		A_PlaySound ("BishopBlur", CHAN_BODY);
+		A_StartSound ("BishopBlur", CHAN_BODY);
 	}
 
 	//============================================================================
diff --git a/wadsrc/static/zscript/actors/hexen/blastradius.zs b/wadsrc/static/zscript/actors/hexen/blastradius.zs
index 0f5094892..9dacb58a4 100644
--- a/wadsrc/static/zscript/actors/hexen/blastradius.zs
+++ b/wadsrc/static/zscript/actors/hexen/blastradius.zs
@@ -113,7 +113,7 @@ extend class Actor
 			}
 		}
 
-		A_PlaySound (blastsound, CHAN_AUTO);
+		A_StartSound (blastsound, CHAN_AUTO);
 
 		if (!(blastflags & BF_DONTWARN))
 		{
diff --git a/wadsrc/static/zscript/actors/hexen/clericboss.zs b/wadsrc/static/zscript/actors/hexen/clericboss.zs
index a472c1ac4..5be5c0bd9 100644
--- a/wadsrc/static/zscript/actors/hexen/clericboss.zs
+++ b/wadsrc/static/zscript/actors/hexen/clericboss.zs
@@ -58,7 +58,7 @@ class ClericBoss : Actor
 		CLER \ 1 A_FreezeDeathChunks;
 		Wait;
 	Burn:
-		CLER C 5 Bright A_PlaySound("PlayerClericBurnDeath");
+		CLER C 5 Bright A_StartSound("PlayerClericBurnDeath");
 		FDTH D 4 Bright ;
 		FDTH G 5 Bright ;
 		FDTH H 4 Bright A_Scream;
@@ -91,6 +91,6 @@ class ClericBoss : Actor
 
 		Actor missile = SpawnMissileZ (pos.z + 40., target, "HolyMissile");
 		if (missile != null) missile.tracer = null;	// No initial target
-		A_PlaySound ("HolySymbolFire", CHAN_WEAPON);
+		A_StartSound ("HolySymbolFire", CHAN_WEAPON);
 	}
 }
diff --git a/wadsrc/static/zscript/actors/hexen/clericflame.zs b/wadsrc/static/zscript/actors/hexen/clericflame.zs
index 6590dc525..9672d55ee 100644
--- a/wadsrc/static/zscript/actors/hexen/clericflame.zs
+++ b/wadsrc/static/zscript/actors/hexen/clericflame.zs
@@ -62,7 +62,7 @@ class CWeapFlame : ClericWeapon
 				return;
 		}
 		SpawnPlayerMissile ("CFlameMissile");
-		A_PlaySound ("ClericFlameFire", CHAN_WEAPON);
+		A_StartSound ("ClericFlameFire", CHAN_WEAPON);
 	}
 }
 
@@ -278,7 +278,7 @@ class CFlameMissile : FastProjectile
 		bInvisible = false;
 		bMissile = false;
 		Vel = (0,0,0);
-		A_PlaySound ("ClericFlameExplode", CHAN_BODY);
+		A_StartSound ("ClericFlameExplode", CHAN_BODY);
 	}
 
 	//============================================================================
@@ -290,7 +290,7 @@ class CFlameMissile : FastProjectile
 	void A_CFlameMissile()
 	{
 		bInvisible = false;
-		A_PlaySound ("ClericFlameExplode", CHAN_BODY);
+		A_StartSound ("ClericFlameExplode", CHAN_BODY);
 		if (BlockingMobj && BlockingMobj.bShootable)
 		{ // Hit something, so spawn the flame circle around the thing
 			double dist = BlockingMobj.radius + 18;
diff --git a/wadsrc/static/zscript/actors/hexen/clericholy.zs b/wadsrc/static/zscript/actors/hexen/clericholy.zs
index b6561795d..8f2af52a4 100644
--- a/wadsrc/static/zscript/actors/hexen/clericholy.zs
+++ b/wadsrc/static/zscript/actors/hexen/clericholy.zs
@@ -169,7 +169,7 @@ class CWeapWraithverge : ClericWeapon
 		}
 
 		invoker.CHolyCount = 3;
-		A_PlaySound ("HolySymbolFire", CHAN_WEAPON);
+		A_StartSound ("HolySymbolFire", CHAN_WEAPON);
 	}
 
 	//============================================================================
@@ -373,7 +373,7 @@ class HolySpirit : Actor
 				if (random[SpiritSlam]() < 128)
 				{
 					Spawn("HolyPuff", Pos, ALLOW_REPLACE);
-					A_PlaySound("SpiritAttack", CHAN_WEAPON);
+					A_StartSound("SpiritAttack", CHAN_WEAPON);
 					if (thing.bIsMonster && random[SpiritSlam]() < 128)
 					{
 						thing.Howl();
@@ -525,7 +525,7 @@ class HolySpirit : Actor
 		A_CHolySeek();
 		if (random[HolyScream]() < 20)
 		{
-			A_PlaySound ("SpiritActive", CHAN_VOICE);
+			A_StartSound ("SpiritActive", CHAN_VOICE);
 		}
 		if (!tracer)
 		{
diff --git a/wadsrc/static/zscript/actors/hexen/clericplayer.zs b/wadsrc/static/zscript/actors/hexen/clericplayer.zs
index a431b118e..a5e54e4dc 100644
--- a/wadsrc/static/zscript/actors/hexen/clericplayer.zs
+++ b/wadsrc/static/zscript/actors/hexen/clericplayer.zs
@@ -79,7 +79,7 @@ class ClericPlayer : PlayerPawn
 		CLER \ 1 A_FreezeDeathChunks;
 		Wait;
 	Burn:
-		FDTH C 5 BRIGHT A_PlaySound("*burndeath");
+		FDTH C 5 BRIGHT A_StartSound("*burndeath");
 		FDTH D 4 BRIGHT;
 		FDTH G 5 BRIGHT;
 		FDTH H 4 BRIGHT A_PlayerScream;
diff --git a/wadsrc/static/zscript/actors/hexen/clericstaff.zs b/wadsrc/static/zscript/actors/hexen/clericstaff.zs
index a2fe1afbc..362dfe96e 100644
--- a/wadsrc/static/zscript/actors/hexen/clericstaff.zs
+++ b/wadsrc/static/zscript/actors/hexen/clericstaff.zs
@@ -136,7 +136,7 @@ class CWeapStaff : ClericWeapon
 		{
 			mo.WeaveIndexXY = 0;
 		}
-		A_PlaySound ("ClericCStaffFire", CHAN_WEAPON);
+		A_StartSound ("ClericCStaffFire", CHAN_WEAPON);
 	}
 
 	//============================================================================
diff --git a/wadsrc/static/zscript/actors/hexen/dragon.zs b/wadsrc/static/zscript/actors/hexen/dragon.zs
index 164d76dee..835ba01c0 100644
--- a/wadsrc/static/zscript/actors/hexen/dragon.zs
+++ b/wadsrc/static/zscript/actors/hexen/dragon.zs
@@ -112,12 +112,12 @@ class Dragon : Actor
 					int damage = random[DragonSeek](1, 8) * 10;
 					int newdam = targ.DamageMobj (self, self, damage, 'Melee');
 					targ.TraceBleed (newdam > 0 ? newdam : damage, self);
-					A_PlaySound (AttackSound, CHAN_WEAPON);
+					A_StartSound (AttackSound, CHAN_WEAPON);
 				}
 				else if (random[DragonSeek]() < 128 && CheckMissileRange())
 				{
 					SpawnMissile(targ, "DragonFireball");		
-					A_PlaySound (AttackSound, CHAN_WEAPON);
+					A_StartSound (AttackSound, CHAN_WEAPON);
 				}
 				target = oldTarget;
 			}
@@ -225,12 +225,12 @@ class Dragon : Actor
 				int damage = random[DragonFlight](1, 8) * 8;
 				int newdam = targ.DamageMobj (self, self, damage, 'Melee');
 				targ.TraceBleed (newdam > 0 ? newdam : damage, self);
-				A_PlaySound (AttackSound, CHAN_WEAPON);
+				A_StartSound (AttackSound, CHAN_WEAPON);
 			}
 			else if (ang <= 20)
 			{
 				SetState (MissileState);
-				A_PlaySound (AttackSound, CHAN_WEAPON);
+				A_StartSound (AttackSound, CHAN_WEAPON);
 			}
 		}
 		else
@@ -250,7 +250,7 @@ class Dragon : Actor
 		A_DragonFlight();
 		if (random[DragonFlight]() < 240)
 		{
-			A_PlaySound ("DragonWingflap", CHAN_BODY);
+			A_StartSound ("DragonWingflap", CHAN_BODY);
 		}
 		else
 		{
diff --git a/wadsrc/static/zscript/actors/hexen/fighterboss.zs b/wadsrc/static/zscript/actors/hexen/fighterboss.zs
index 6ff4c90b1..cf3f98653 100644
--- a/wadsrc/static/zscript/actors/hexen/fighterboss.zs
+++ b/wadsrc/static/zscript/actors/hexen/fighterboss.zs
@@ -59,7 +59,7 @@ class FighterBoss : Actor
 		PLAY X 1 A_FreezeDeathChunks;
 		Wait;
 	Burn:
-		FDTH A 5 Bright A_PlaySound("PlayerFighterBurnDeath");
+		FDTH A 5 Bright A_StartSound("PlayerFighterBurnDeath");
 		FDTH B 4 Bright;
 		FDTH G 5 Bright;
 		FDTH H 4 Bright A_Scream;
@@ -95,6 +95,6 @@ class FighterBoss : Actor
 		SpawnMissileAngle("FSwordMissile", Angle, 0);
 		SpawnMissileAngle("FSwordMissile", Angle - (45. / 8), 0);
 		SpawnMissileAngle("FSwordMissile", Angle - (45. / 4), 0);
-		A_PlaySound ("FighterSwordFire", CHAN_WEAPON);
+		A_StartSound ("FighterSwordFire", CHAN_WEAPON);
 	}
 }
diff --git a/wadsrc/static/zscript/actors/hexen/fighterfist.zs b/wadsrc/static/zscript/actors/hexen/fighterfist.zs
index 48e331e9c..fce2cf113 100644
--- a/wadsrc/static/zscript/actors/hexen/fighterfist.zs
+++ b/wadsrc/static/zscript/actors/hexen/fighterfist.zs
@@ -109,7 +109,7 @@ class FWeapFist : FighterWeapon
 				{
 					weaponspecial = 0;
 					player.SetPsprite(PSP_WEAPON, player.ReadyWeapon.FindState("Fire2"));
-					A_PlaySound ("*fistgrunt", CHAN_VOICE);
+					A_StartSound ("*fistgrunt", CHAN_VOICE);
 				}
 				return;
 			}
diff --git a/wadsrc/static/zscript/actors/hexen/fighterhammer.zs b/wadsrc/static/zscript/actors/hexen/fighterhammer.zs
index 1722c6516..5082de85d 100644
--- a/wadsrc/static/zscript/actors/hexen/fighterhammer.zs
+++ b/wadsrc/static/zscript/actors/hexen/fighterhammer.zs
@@ -152,7 +152,7 @@ class HammerMissile : Actor
 	{
 	Spawn:
 		FHFX A 2 Bright;
-		FHFX B 2 Bright A_PlaySound ("FighterHammerContinuous");
+		FHFX B 2 Bright A_StartSound ("FighterHammerContinuous");
 		FHFX CDEFGH 2 Bright;
 		Loop;
 	Death:
diff --git a/wadsrc/static/zscript/actors/hexen/fighterplayer.zs b/wadsrc/static/zscript/actors/hexen/fighterplayer.zs
index 55264d2cf..4287be0b8 100644
--- a/wadsrc/static/zscript/actors/hexen/fighterplayer.zs
+++ b/wadsrc/static/zscript/actors/hexen/fighterplayer.zs
@@ -78,7 +78,7 @@ class FighterPlayer : PlayerPawn
 		PLAY X 1 A_FreezeDeathChunks;
 		Wait;
 	Burn:
-		FDTH A 5 BRIGHT A_PlaySound("*burndeath");
+		FDTH A 5 BRIGHT A_StartSound("*burndeath");
 		FDTH B 4 BRIGHT;
 		FDTH G 5 BRIGHT;
 		FDTH H 4 BRIGHT A_PlayerScream;
diff --git a/wadsrc/static/zscript/actors/hexen/fighterquietus.zs b/wadsrc/static/zscript/actors/hexen/fighterquietus.zs
index a555470f1..24dd4aa8e 100644
--- a/wadsrc/static/zscript/actors/hexen/fighterquietus.zs
+++ b/wadsrc/static/zscript/actors/hexen/fighterquietus.zs
@@ -150,7 +150,7 @@ class FWeapQuietus : FighterWeapon
 		SpawnPlayerMissile ("FSwordMissile", Angle          ,0, 0,   0);
 		SpawnPlayerMissile ("FSwordMissile", Angle - (45./8),0, 0,   5);
 		SpawnPlayerMissile ("FSwordMissile", Angle - (45./4),0, 0,  10);
-		A_PlaySound ("FighterSwordFire", CHAN_WEAPON);
+		A_StartSound ("FighterSwordFire", CHAN_WEAPON);
 	}
 
 	
diff --git a/wadsrc/static/zscript/actors/hexen/firedemon.zs b/wadsrc/static/zscript/actors/hexen/firedemon.zs
index 5ea5e27bd..d585ea745 100644
--- a/wadsrc/static/zscript/actors/hexen/firedemon.zs
+++ b/wadsrc/static/zscript/actors/hexen/firedemon.zs
@@ -154,7 +154,7 @@ class FireDemon : Actor
 	{
 		if (target == null)	return;
 		Actor mo = SpawnMissile (target, "FireDemonMissile");
-		if (mo) A_PlaySound ("FireDemonAttack", CHAN_BODY);
+		if (mo) A_StartSound ("FireDemonAttack", CHAN_BODY);
 	}
 
 	//============================================================================
diff --git a/wadsrc/static/zscript/actors/hexen/flame.zs b/wadsrc/static/zscript/actors/hexen/flame.zs
index b11e5c2d5..08b4741ab 100644
--- a/wadsrc/static/zscript/actors/hexen/flame.zs
+++ b/wadsrc/static/zscript/actors/hexen/flame.zs
@@ -72,7 +72,7 @@ class FlameSmall : SwitchableDecoration
 	States
 	{
 	Active:
-		FFSM A 0 Bright A_PlaySound("Ignite");
+		FFSM A 0 Bright A_StartSound("Ignite");
 	Spawn:
 		FFSM A 3 Bright;
 		FFSM A 3 Bright A_UnHideThing;
@@ -106,7 +106,7 @@ class FlameLarge : SwitchableDecoration
 	States
 	{
 	Active:
-		FFLG A 0 Bright A_PlaySound("Ignite");
+		FFLG A 0 Bright A_StartSound("Ignite");
 	Spawn:
 		FFLG A 2 Bright;
 		FFLG A 2 Bright A_UnHideThing;
diff --git a/wadsrc/static/zscript/actors/hexen/flechette.zs b/wadsrc/static/zscript/actors/hexen/flechette.zs
index f21a334ce..cce5784ab 100644
--- a/wadsrc/static/zscript/actors/hexen/flechette.zs
+++ b/wadsrc/static/zscript/actors/hexen/flechette.zs
@@ -510,7 +510,7 @@ class PoisonCloud : Actor
 
 					// If successful, play the poison sound.
 					if (victim.player.PoisonPlayer (self, self.target, 50))
-						victim.A_PlaySound ("*poison", CHAN_VOICE);
+						victim.A_StartSound ("*poison", CHAN_VOICE);
 				}
 			}	
 			return -1;
diff --git a/wadsrc/static/zscript/actors/hexen/flies.zs b/wadsrc/static/zscript/actors/hexen/flies.zs
index 35dd90e91..9e5fceff2 100644
--- a/wadsrc/static/zscript/actors/hexen/flies.zs
+++ b/wadsrc/static/zscript/actors/hexen/flies.zs
@@ -124,7 +124,7 @@ class LittleFly : Actor
 		Vel.Z = zrand / 512.;
 		if (random[Fly]() < 40)
 		{
-			A_PlaySound(ActiveSound, CHAN_VOICE, 0.5f, false, ATTN_STATIC);
+			A_StartSound(ActiveSound, CHAN_VOICE, CHANF_DEFAULT, 0.5f, ATTN_STATIC);
 		}
 	}
 }
diff --git a/wadsrc/static/zscript/actors/hexen/healingradius.zs b/wadsrc/static/zscript/actors/hexen/healingradius.zs
index da6cf7959..852bd642a 100644
--- a/wadsrc/static/zscript/actors/hexen/healingradius.zs
+++ b/wadsrc/static/zscript/actors/hexen/healingradius.zs
@@ -84,7 +84,7 @@ class ArtiHealingRadius : Inventory
 				}
 				if (gotsome)
 				{
-					mo.A_PlaySound ("MysticIncant", CHAN_AUTO);
+					mo.A_StartSound ("MysticIncant", CHAN_AUTO);
 					effective=true;
 				}
 			}
diff --git a/wadsrc/static/zscript/actors/hexen/heresiarch.zs b/wadsrc/static/zscript/actors/hexen/heresiarch.zs
index 579661300..b62c6f365 100644
--- a/wadsrc/static/zscript/actors/hexen/heresiarch.zs
+++ b/wadsrc/static/zscript/actors/hexen/heresiarch.zs
@@ -310,7 +310,7 @@ class SorcBall : Actor
 
 	virtual void CastSorcererSpell ()
 	{
-		target.A_PlaySound ("SorcererSpellCast", CHAN_VOICE);
+		target.A_StartSound ("SorcererSpellCast", CHAN_VOICE);
 
 		// Put sorcerer into throw spell animation
 		if (target.health > 0)
@@ -416,7 +416,7 @@ class SorcBall : Actor
 		{
 			parent.args[1]++;			// Bump rotation counter
 			// Completed full rotation - make woosh sound
-			A_PlaySound ("SorcererBallWoosh", CHAN_BODY);
+			A_StartSound ("SorcererBallWoosh", CHAN_BODY);
 		}
 		OldAngle = curangle;		// Set previous angle
 
@@ -525,7 +525,7 @@ class SorcBall : Actor
 
 	void A_SorcBallPop()
 	{
-		A_PlaySound ("SorcererBallPop", CHAN_BODY, 1, false, ATTN_NONE);
+		A_StartSound ("SorcererBallPop", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 		bNoGravity = false;
 		Gravity = 1. / 8;
 
@@ -549,7 +549,7 @@ class SorcBall : Actor
 			if (args[3]-- <= 0)
 			{
 				SetStateLabel("Death");
-				A_PlaySound ("SorcererBigBallExplode", CHAN_BODY, 1, false, ATTN_NONE);
+				A_StartSound ("SorcererBigBallExplode", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 			}
 			else
 			{
@@ -644,7 +644,7 @@ class SorcBall1 : SorcBall
 	{
 		if (random[Heresiarch]() < 200)
 		{
-			target.A_PlaySound ("SorcererSpellCast", CHAN_VOICE, 1, false, ATTN_NONE);
+			target.A_StartSound ("SorcererSpellCast", CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 			special2 = Heresiarch.SORCFX4_RAPIDFIRE_TIME;
 			args[4] = 128;
 			target.args[3] = Heresiarch.SORC_FIRING_SPELL;
@@ -819,7 +819,7 @@ class SorcFX1 : Actor
 			if (args[3]-- <= 0)
 			{
 				SetStateLabel("Death");
-				A_PlaySound ("SorcererHeadScream", CHAN_BODY, 1, false, ATTN_NONE);
+				A_StartSound ("SorcererHeadScream", CHAN_BODY, CHANF_DEFAULT, 1., ATTN_NONE);
 			}
 			else
 			{
@@ -1016,7 +1016,7 @@ class SorcFX3 : Actor
 	void A_SorcererBishopEntry()
 	{
 		Spawn("SorcFX3Explosion", Pos, ALLOW_REPLACE);
-		A_PlaySound (SeeSound, CHAN_VOICE);
+		A_StartSound (SeeSound, CHAN_VOICE);
 	}
 
 	//============================================================================
diff --git a/wadsrc/static/zscript/actors/hexen/hexenspecialdecs.zs b/wadsrc/static/zscript/actors/hexen/hexenspecialdecs.zs
index 3cc5ae783..2cd66bc25 100644
--- a/wadsrc/static/zscript/actors/hexen/hexenspecialdecs.zs
+++ b/wadsrc/static/zscript/actors/hexen/hexenspecialdecs.zs
@@ -128,7 +128,7 @@ class Pottery1 : Actor
 				mo.Vel.Z = random[Pottery](5, 12) * 0.75;
 			}
 		}
-		mo.A_PlaySound ("PotteryExplode", CHAN_BODY);
+		mo.A_StartSound ("PotteryExplode", CHAN_BODY);
 		// Spawn an item?
 		Class<Actor> type = GetSpawnableType(args[0]);
 		if (type != null)
@@ -415,7 +415,7 @@ class ZCorpseSitting : Actor
 			mo.Vel.Y = random2[CorpseExplode]() / 64.;
 			mo.Vel.Z = random[CorpseExplode](5, 12) * 0.75;
 		}
-		A_PlaySound (DeathSound, CHAN_BODY);
+		A_StartSound (DeathSound, CHAN_BODY);
 		Destroy ();
 	}
 }
@@ -581,7 +581,7 @@ class ZTwinedTorch : SwitchableDecoration
 	States
 	{
 	Active:
-		TWTR A 0 Bright A_PlaySound("Ignite");
+		TWTR A 0 Bright A_StartSound("Ignite");
 	Spawn:
 		TWTR ABCDEFGH 4 Bright;
 		Loop;
@@ -615,7 +615,7 @@ class ZWallTorch : SwitchableDecoration
 	States
 	{
 	Active:
-		WLTR A 0 Bright A_PlaySound("Ignite");
+		WLTR A 0 Bright A_StartSound("Ignite");
 	Spawn:
 		WLTR ABCDEFGH 5 Bright;
 		Loop;
@@ -703,7 +703,7 @@ class ZFireBull : SwitchableDecoration
 	States
 	{
 	Active:
-		FBUL I 4 Bright A_PlaySound("Ignite");
+		FBUL I 4 Bright A_StartSound("Ignite");
 		FBUL J 4 Bright;
 	Spawn:
 		FBUL ABCDEFG 4 Bright;
@@ -781,7 +781,7 @@ class ZSuitOfArmor : Actor
 				Spawn (type, Pos, ALLOW_REPLACE);
 			}
 		}
-		A_PlaySound (DeathSound, CHAN_BODY);
+		A_StartSound (DeathSound, CHAN_BODY);
 		Destroy ();
 	}
 }
@@ -962,7 +962,7 @@ class ZCauldron : SwitchableDecoration
 	States
 	{
 	Active:
-		CDRN B 0 Bright A_PlaySound("Ignite");
+		CDRN B 0 Bright A_StartSound("Ignite");
 	Spawn:
 		CDRN BCDEFGH 4 Bright;
 		Loop;
diff --git a/wadsrc/static/zscript/actors/hexen/iceguy.zs b/wadsrc/static/zscript/actors/hexen/iceguy.zs
index 6d32a6b49..c09944f17 100644
--- a/wadsrc/static/zscript/actors/hexen/iceguy.zs
+++ b/wadsrc/static/zscript/actors/hexen/iceguy.zs
@@ -108,7 +108,7 @@ class IceGuy : Actor
 		}
 		SpawnMissileXYZ(Vec3Angle(radius / 2, angle + 90, 40.), target, "IceGuyFX");
 		SpawnMissileXYZ(Vec3Angle(radius / 2, angle - 90, 40.), target, "IceGuyFX");
-		A_PlaySound (AttackSound, CHAN_WEAPON);
+		A_StartSound (AttackSound, CHAN_WEAPON);
 	}
 }
 
diff --git a/wadsrc/static/zscript/actors/hexen/korax.zs b/wadsrc/static/zscript/actors/hexen/korax.zs
index 692b6cb9c..fc4c3efd3 100644
--- a/wadsrc/static/zscript/actors/hexen/korax.zs
+++ b/wadsrc/static/zscript/actors/hexen/korax.zs
@@ -114,7 +114,7 @@ class Korax : Actor
 	
 	void A_KoraxStep()
 	{ 
-		A_PlaySound("KoraxStep"); 
+		A_StartSound("KoraxStep"); 
 		A_Chase(); 
 	}	
 	
@@ -150,7 +150,7 @@ class Korax : Actor
 		}
 		else if (random[KoraxChase]() < 30)
 		{
-			A_PlaySound("KoraxActive", CHAN_VOICE, 1, false, ATTN_NONE);
+			A_StartSound("KoraxActive", CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 		}
 
 		// Teleport away
@@ -260,10 +260,10 @@ class Korax : Actor
 		};
 		int type = random[KoraxMissile](0, 5);
 
-		A_PlaySound("KoraxAttack", CHAN_VOICE);
+		A_StartSound("KoraxAttack", CHAN_VOICE);
 
 		// Fire all 6 missiles at once
-		A_PlaySound(sounds[type], CHAN_WEAPON, 1, false, ATTN_NONE);
+		A_StartSound(sounds[type], CHAN_WEAPON, CHANF_DEFAULT, 1., ATTN_NONE);
 		class<Actor> info = choices[type];
 		for (int i = 0; i < 6; ++i)
 		{
@@ -354,7 +354,7 @@ class Korax : Actor
 	{
 		int numcommands;
 
-		A_PlaySound("KoraxCommand", CHAN_VOICE);
+		A_StartSound("KoraxCommand", CHAN_VOICE);
 
 		// Shoot stream of lightning to ceiling
 		double ang = angle - 90;
@@ -462,7 +462,7 @@ class KoraxSpirit : Actor
 	{
 		if (health-- <= 0)
 		{
-			A_PlaySound("SpiritDie", CHAN_VOICE);
+			A_StartSound("SpiritDie", CHAN_VOICE);
 			SetStateLabel ("Death");
 		}
 		else
@@ -477,7 +477,7 @@ class KoraxSpirit : Actor
 
 			if (random[KoraxRoam]() < 50)
 			{
-				A_PlaySound("SpiritActive", CHAN_VOICE, 1, false, ATTN_NONE);
+				A_StartSound("SpiritActive", CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 			}
 		}
 	}
diff --git a/wadsrc/static/zscript/actors/hexen/mageboss.zs b/wadsrc/static/zscript/actors/hexen/mageboss.zs
index eea86e33e..9fa9afb1a 100644
--- a/wadsrc/static/zscript/actors/hexen/mageboss.zs
+++ b/wadsrc/static/zscript/actors/hexen/mageboss.zs
@@ -62,7 +62,7 @@ class MageBoss : Actor
 		MAGE Y 1 A_FreezeDeathChunks;
 		Wait;
 	Burn:
-		FDTH E 5 Bright A_PlaySound("PlayerMageBurnDeath");
+		FDTH E 5 Bright A_StartSound("PlayerMageBurnDeath");
 		FDTH F 4 Bright;
 		FDTH G 5 Bright;
 		FDTH H 4 Bright A_Scream;
@@ -114,7 +114,7 @@ class MageBoss : Actor
 		MStaffSpawn2(angle);
 		MStaffSpawn2(angle - 5);
 		MStaffSpawn2(angle + 5);
-		A_PlaySound("MageStaffFire", CHAN_WEAPON);
+		A_StartSound("MageStaffFire", CHAN_WEAPON);
 	}
 	
 }
diff --git a/wadsrc/static/zscript/actors/hexen/magecone.zs b/wadsrc/static/zscript/actors/hexen/magecone.zs
index c28108908..a6c95a896 100644
--- a/wadsrc/static/zscript/actors/hexen/magecone.zs
+++ b/wadsrc/static/zscript/actors/hexen/magecone.zs
@@ -66,7 +66,7 @@ class MWeapFrost : MageWeapon
 			if (!weapon.DepleteAmmo (weapon.bAltFire))
 				return;
 		}
-		A_PlaySound ("MageShardsFire", CHAN_WEAPON);
+		A_StartSound ("MageShardsFire", CHAN_WEAPON);
 
 		int damage = random[MageCone](90, 105);
 		for (int i = 0; i < 16; i++)
diff --git a/wadsrc/static/zscript/actors/hexen/magelightning.zs b/wadsrc/static/zscript/actors/hexen/magelightning.zs
index d079a8797..9c67b2b39 100644
--- a/wadsrc/static/zscript/actors/hexen/magelightning.zs
+++ b/wadsrc/static/zscript/actors/hexen/magelightning.zs
@@ -59,7 +59,7 @@ class MWeapLightning : MageWeapon
 		A_WeaponReady();
 		if (random[LightningReady]() < 160)
 		{
-			A_PlaySound ("MageLightningReady", CHAN_WEAPON);
+			A_StartSound ("MageLightningReady", CHAN_WEAPON);
 		}
 	}
 
@@ -85,7 +85,7 @@ class MWeapLightning : MageWeapon
 			cmo.lastenemy = fmo;
 			cmo.A_LightningZap();
 		}
-		A_PlaySound ("MageLightningFire", CHAN_BODY);
+		A_StartSound ("MageLightningFire", CHAN_BODY);
 
 		if (player != NULL)
 		{
@@ -289,7 +289,7 @@ class LightningCeiling : Lightning
 		}
 		if (bFloorHugger && random[LightningZap]() < 160)
 		{
-			A_PlaySound (ActiveSound, CHAN_BODY);
+			A_StartSound (ActiveSound, CHAN_BODY);
 		}
 	}
 
diff --git a/wadsrc/static/zscript/actors/hexen/mageplayer.zs b/wadsrc/static/zscript/actors/hexen/mageplayer.zs
index 9907d2e26..dbab5b9bd 100644
--- a/wadsrc/static/zscript/actors/hexen/mageplayer.zs
+++ b/wadsrc/static/zscript/actors/hexen/mageplayer.zs
@@ -81,7 +81,7 @@ class MagePlayer : PlayerPawn
 		MAGE Y 1 A_FreezeDeathChunks;
 		Wait;
 	Burn:
-		FDTH E 5 BRIGHT A_PlaySound("*burndeath");
+		FDTH E 5 BRIGHT A_StartSound("*burndeath");
 		FDTH F 4 BRIGHT;
 		FDTH G 5 BRIGHT;
 		FDTH H 4 BRIGHT A_PlayerScream;
diff --git a/wadsrc/static/zscript/actors/hexen/magestaff.zs b/wadsrc/static/zscript/actors/hexen/magestaff.zs
index e45095240..782310c41 100644
--- a/wadsrc/static/zscript/actors/hexen/magestaff.zs
+++ b/wadsrc/static/zscript/actors/hexen/magestaff.zs
@@ -200,7 +200,7 @@ class MWeapBloodscourge : MageWeapon
 		MStaffSpawn (angle, t.linetarget);
 		MStaffSpawn (angle-5, t.linetarget);
 		MStaffSpawn (angle+5, t.linetarget);
-		A_PlaySound ("MageStaffFire", CHAN_WEAPON);
+		A_StartSound ("MageStaffFire", CHAN_WEAPON);
 		invoker.MStaffCount = 3;
 	}
 
diff --git a/wadsrc/static/zscript/actors/hexen/pig.zs b/wadsrc/static/zscript/actors/hexen/pig.zs
index 2885956e5..45c601c4e 100644
--- a/wadsrc/static/zscript/actors/hexen/pig.zs
+++ b/wadsrc/static/zscript/actors/hexen/pig.zs
@@ -72,13 +72,13 @@ class Snout : Weapon
 		double ang = angle;
 		double slope = AimLineAttack(ang, DEFMELEERANGE);
 		Actor puff = LineAttack(ang, DEFMELEERANGE, slope, damage, 'Melee', "SnoutPuff", true, t);
-		A_PlaySound("PigActive", CHAN_VOICE);
+		A_StartSound("PigActive", CHAN_VOICE);
 		if(t.linetarget)
 		{
 			AdjustPlayerAngle(t);
 			if(puff != null)
 			{ // Bit something
-				A_PlaySound("PigAttack", CHAN_VOICE);
+				A_StartSound("PigAttack", CHAN_VOICE);
 			}
 		}
 	}
@@ -155,12 +155,12 @@ class PigPlayer : PlayerPawn
 			{
 				player.SetPsprite(PSP_WEAPON, player.ReadyWeapon.FindState('Grunt'));
 			}
-			A_PlaySound ("PigActive1", CHAN_VOICE); // snort
+			A_StartSound ("PigActive1", CHAN_VOICE); // snort
 			return;
 		}
 		if (random[PigPlayerThink]() < 48)
 		{
-			A_PlaySound ("PigActive", CHAN_VOICE); // snort
+			A_StartSound ("PigActive", CHAN_VOICE); // snort
 		}
 	}
 
diff --git a/wadsrc/static/zscript/actors/hexen/serpent.zs b/wadsrc/static/zscript/actors/hexen/serpent.zs
index 7688dbd0e..99083dfce 100644
--- a/wadsrc/static/zscript/actors/hexen/serpent.zs
+++ b/wadsrc/static/zscript/actors/hexen/serpent.zs
@@ -40,7 +40,7 @@ class Serpent : Actor
 	Dive:
 		SSDV ABC 4;
 		SSDV D 4 A_UnSetShootable;
-		SSDV E 3 A_PlaySound("SerpentActive", CHAN_BODY);
+		SSDV E 3 A_StartSound("SerpentActive", CHAN_BODY);
 		SSDV F 3;
 		SSDV GH 4;
 		SSDV I 3;
@@ -48,7 +48,7 @@ class Serpent : Actor
 		Goto See;
 	Melee:
 		SSPT A 1 A_UnHideThing;
-		SSPT A 1 A_PlaySound("SerpentBirth", CHAN_BODY);
+		SSPT A 1 A_StartSound("SerpentBirth", CHAN_BODY);
 		SSPT B 3 A_SetShootable;
 		SSPT C 3;
 		SSPT D 4 A_SerpentCheckForAttack;
@@ -173,7 +173,7 @@ class Serpent : Actor
 			else
 			{	
 				SetStateLabel("Hump");
-				A_PlaySound ("SerpentActive", CHAN_BODY);
+				A_StartSound ("SerpentActive", CHAN_BODY);
 			}
 		}
 	}
@@ -251,7 +251,7 @@ class Serpent : Actor
 			int damage = random[SerpentAttack](1, 8) * 5;
 			int newdam = targ.DamageMobj (self, self, damage, 'Melee');
 			targ.TraceBleed (newdam > 0 ? newdam : damage, self);
-			A_PlaySound ("SerpentMeleeHit", CHAN_BODY);
+			A_StartSound ("SerpentMeleeHit", CHAN_BODY);
 		}
 		if (random[SerpentAttack]() < 96)
 		{
@@ -371,7 +371,7 @@ class SerpentFX : Actor
 	{
 	Spawn:
 		SSFX A 0;
-		SSFX A 3 Bright A_PlaySound("SerpentFXContinuous", CHAN_BODY, 1.0, 1);
+		SSFX A 3 Bright A_StartSound("SerpentFXContinuous", CHAN_BODY, CHANF_LOOPING);
 		SSFX BAB 3 Bright;
 		Goto Spawn+1;
 	Death:
diff --git a/wadsrc/static/zscript/actors/hexen/spike.zs b/wadsrc/static/zscript/actors/hexen/spike.zs
index a411dbf3f..465a331ec 100644
--- a/wadsrc/static/zscript/actors/hexen/spike.zs
+++ b/wadsrc/static/zscript/actors/hexen/spike.zs
@@ -80,7 +80,7 @@ class ThrustFloor : Actor
 	{
 		if (args[0] == 0)
 		{
-			A_PlaySound ("ThrustSpikeLower", CHAN_BODY);
+			A_StartSound ("ThrustSpikeLower", CHAN_BODY);
 			bInvisible = false;
 			if (args[1])
 				SetStateLabel("BloodThrustRaise");
@@ -93,7 +93,7 @@ class ThrustFloor : Actor
 	{
 		if (args[0] == 1)
 		{
-			A_PlaySound ("ThrustSpikeRaise", CHAN_BODY);
+			A_StartSound ("ThrustSpikeRaise", CHAN_BODY);
 			if (args[1])
 				SetStateLabel("BloodThrustLower");
 			else
diff --git a/wadsrc/static/zscript/actors/hexen/summon.zs b/wadsrc/static/zscript/actors/hexen/summon.zs
index c9e9b9295..3e8246a89 100644
--- a/wadsrc/static/zscript/actors/hexen/summon.zs
+++ b/wadsrc/static/zscript/actors/hexen/summon.zs
@@ -105,7 +105,7 @@ class SummoningDoll : Actor
 
 			// Make smoke puff
 			Spawn("MinotaurSmoke", Pos, ALLOW_REPLACE);
-			A_PlaySound(mo.ActiveSound, CHAN_VOICE);
+			A_StartSound(mo.ActiveSound, CHAN_VOICE);
 		}
 	}
 	
diff --git a/wadsrc/static/zscript/actors/inventory/inv_misc.zs b/wadsrc/static/zscript/actors/inventory/inv_misc.zs
index af4bc8e1d..da3625743 100644
--- a/wadsrc/static/zscript/actors/inventory/inv_misc.zs
+++ b/wadsrc/static/zscript/actors/inventory/inv_misc.zs
@@ -124,7 +124,7 @@ class PuzzleItem : Inventory
 			return true;
 		}
 		// [RH] Always play the sound if the use fails.
-		Owner.A_PlaySound ("*puzzfail", CHAN_VOICE);
+		Owner.A_StartSound ("*puzzfail", CHAN_VOICE);
 		if (Owner.CheckLocalView())
 		{
 			Console.MidPrint (null, PuzzFailMessage, true);
diff --git a/wadsrc/static/zscript/actors/inventory/inventory.zs b/wadsrc/static/zscript/actors/inventory/inventory.zs
index 99ca77425..91fc72958 100644
--- a/wadsrc/static/zscript/actors/inventory/inventory.zs
+++ b/wadsrc/static/zscript/actors/inventory/inventory.zs
@@ -213,7 +213,7 @@ class Inventory : Actor
 		bInvisible = false;
 		if (DoRespawn ())
 		{
-			A_PlaySound ("misc/spawn", CHAN_VOICE);
+			A_StartSound ("misc/spawn", CHAN_VOICE);
 		}
 	}
 
@@ -250,7 +250,7 @@ class Inventory : Actor
 		if (DoRespawn ())
 		{
 			SetState (SpawnState);
-			A_PlaySound ("misc/spawn", CHAN_VOICE);
+			A_StartSound ("misc/spawn", CHAN_VOICE);
 			Spawn ("ItemFog", Pos, ALLOW_REPLACE);
 		}
 	}
diff --git a/wadsrc/static/zscript/actors/inventory/powerups.zs b/wadsrc/static/zscript/actors/inventory/powerups.zs
index 01b02efd2..6c3569a36 100644
--- a/wadsrc/static/zscript/actors/inventory/powerups.zs
+++ b/wadsrc/static/zscript/actors/inventory/powerups.zs
@@ -808,7 +808,7 @@ class PowerMask : PowerIronFeet
 		Super.DoEffect ();
 		if (!(Level.maptime & 0x3f))
 		{
-			Owner.A_PlaySound ("misc/mask", CHAN_AUTO);
+			Owner.A_StartSound ("misc/mask", CHAN_AUTO);
 		}
 	}
 	
@@ -1630,7 +1630,7 @@ class PowerDamage : Powerup
 
 		if (Owner != null)
 		{
-			Owner.A_PlaySound(SeeSound, CHAN_5, 1.0, false, ATTN_NONE);
+			Owner.A_StartSound(SeeSound, CHAN_5, CHANF_DEFAULT, 1.0, ATTN_NONE);
 		}
 	}
 
@@ -1645,7 +1645,7 @@ class PowerDamage : Powerup
 		Super.EndEffect();
 		if (Owner != null)
 		{
-			Owner.A_PlaySound(DeathSound, CHAN_5, 1.0, false, ATTN_NONE);
+			Owner.A_StartSound(DeathSound, CHAN_5, CHANF_DEFAULT, 1.0, ATTN_NONE);
 		}
 	}
 
@@ -1660,7 +1660,7 @@ class PowerDamage : Powerup
 		if (!passive && damage > 0)
 		{
 			newdamage = max(1, ApplyDamageFactors(GetClass(), damageType, damage, damage * 4));
-			if (Owner != null && newdamage > damage) Owner.A_PlaySound(ActiveSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
+			if (Owner != null && newdamage > damage) Owner.A_StartSound(ActiveSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
 		}
 	}
 }
@@ -1691,7 +1691,7 @@ class PowerProtection : Powerup
 		let o = Owner;	// copy to a local variable for quicker access.
 		if (o != null)
 		{
-			o.A_PlaySound(SeeSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
+			o.A_StartSound(SeeSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
 
 			// Transfer various protection flags if owner does not already have them.
 			// If the owner already has the flag, clear it from the powerup.
@@ -1731,7 +1731,7 @@ class PowerProtection : Powerup
 		let o = Owner;	// copy to a local variable for quicker access.
 		if (o != null)
 		{
-			o.A_PlaySound(DeathSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
+			o.A_StartSound(DeathSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
 			
 			o.bNoRadiusDmg &= !bNoRadiusDmg;
 			o.bDontMorph &= !bDontMorph;
@@ -1754,7 +1754,7 @@ class PowerProtection : Powerup
 		if (passive && damage > 0)
 		{
 			newdamage = max(0, ApplyDamageFactors(GetClass(), damageType, damage, damage / 4));
-			if (Owner != null && newdamage < damage) Owner.A_PlaySound(ActiveSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
+			if (Owner != null && newdamage < damage) Owner.A_StartSound(ActiveSound, CHAN_AUTO, 1.0, false, ATTN_NONE);
 		}
 	}
 }
@@ -1795,7 +1795,7 @@ class PowerRegeneration : Powerup
 		{
 			if (Owner.GiveBody(int(Strength)))
 			{
-				Owner.A_PlaySound("*regenerate", CHAN_ITEM);
+				Owner.A_StartSound("*regenerate", CHAN_ITEM);
 			}
 		}
 	}
diff --git a/wadsrc/static/zscript/actors/inventory/stateprovider.zs b/wadsrc/static/zscript/actors/inventory/stateprovider.zs
index a72b86782..469b56090 100644
--- a/wadsrc/static/zscript/actors/inventory/stateprovider.zs
+++ b/wadsrc/static/zscript/actors/inventory/stateprovider.zs
@@ -107,7 +107,7 @@ class StateProvider : Inventory
 
 		if (weapon != NULL)
 		{
-			A_PlaySound(weapon.AttackSound, CHAN_WEAPON);
+			A_StartSound(weapon.AttackSound, CHAN_WEAPON);
 		}
 
 		if ((numbullets == 1 && !player.refire) || numbullets == 0)
@@ -283,7 +283,7 @@ class StateProvider : Inventory
 
 		if (!t.linetarget)
 		{
-			if (MissSound) A_PlaySound(MissSound, CHAN_WEAPON);
+			if (MissSound) A_StartSound(MissSound, CHAN_WEAPON);
 		}
 		else
 		{
@@ -319,8 +319,8 @@ class StateProvider : Inventory
 			}
 			if (weapon != NULL)
 			{
-				if (MeleeSound) A_PlaySound(MeleeSound, CHAN_WEAPON);
-				else			A_PlaySound(weapon.AttackSound, CHAN_WEAPON);
+				if (MeleeSound) A_StartSound(MeleeSound, CHAN_WEAPON);
+				else			A_StartSound(weapon.AttackSound, CHAN_WEAPON);
 			}
 
 			if (!(flags & CPF_NOTURN))
diff --git a/wadsrc/static/zscript/actors/inventory/weapons.zs b/wadsrc/static/zscript/actors/inventory/weapons.zs
index de7a024ce..9da5329bc 100644
--- a/wadsrc/static/zscript/actors/inventory/weapons.zs
+++ b/wadsrc/static/zscript/actors/inventory/weapons.zs
@@ -163,7 +163,7 @@ class Weapon : StateProvider
 	{
 		if (UpSound)
 		{
-			origin.A_PlaySound(UpSound, CHAN_WEAPON);
+			origin.A_StartSound(UpSound, CHAN_WEAPON);
 		}
 	}
 	
@@ -345,7 +345,7 @@ class Weapon : StateProvider
 		{
 			if (!weapon.bReadySndHalf || random[WpnReadySnd]() < 128)
 			{
-				pawn.A_PlaySound(weapon.ReadySound, CHAN_WEAPON);
+				pawn.A_StartSound(weapon.ReadySound, CHAN_WEAPON);
 			}
 		}
 
diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs
index 58cba9f0f..4f42b6159 100644
--- a/wadsrc/static/zscript/actors/player/player.zs
+++ b/wadsrc/static/zscript/actors/player/player.zs
@@ -1392,7 +1392,7 @@ class PlayerPawn : Actor
 				Vel.Z += jumpvelz;
 				bOnMobj = false;
 				player.jumpTics = -1;
-				if (!(player.cheats & CF_PREDICTING)) A_PlaySound("*jump", CHAN_BODY);
+				if (!(player.cheats & CF_PREDICTING)) A_StartSound("*jump", CHAN_BODY);
 			}
 		}
 	}
@@ -2421,7 +2421,7 @@ class PlayerPawn : Actor
 
 		if (playgasp && wasdrowning)
 		{
-			A_PlaySound("*gasp", CHAN_VOICE);
+			A_StartSound("*gasp", CHAN_VOICE);
 		}
 		if (Level.airsupply > 0 && AirCapacity > 0) player.air_finished = Level.maptime + int(Level.airsupply * AirCapacity);
 		else player.air_finished = int.max;
diff --git a/wadsrc/static/zscript/actors/player/player_inventory.zs b/wadsrc/static/zscript/actors/player/player_inventory.zs
index ca622707c..76593d2d2 100644
--- a/wadsrc/static/zscript/actors/player/player_inventory.zs
+++ b/wadsrc/static/zscript/actors/player/player_inventory.zs
@@ -81,7 +81,7 @@ extend class PlayerPawn
 		player.inventorytics = 5*TICRATE;
 		if (old != InvSel)
 		{
-			A_PlaySound("misc/invchange", CHAN_AUTO, 1.0, false, ATTN_NONE);
+			A_StartSound("misc/invchange", CHAN_AUTO, CHANF_DEFAULT, 1., ATTN_NONE);
 		}
 	}
 
@@ -117,7 +117,7 @@ extend class PlayerPawn
 		player.inventorytics = 5*TICRATE;
 		if (old != InvSel)
 		{
-			A_PlaySound("misc/invchange", CHAN_AUTO, 1.0, false, ATTN_NONE);
+			A_StartSound("misc/invchange", CHAN_AUTO, CHANF_DEFAULT, 1., ATTN_NONE);
 		}
 	}
 	
@@ -224,7 +224,7 @@ extend class PlayerPawn
 		}
 		if (player == players[consoleplayer])
 		{
-			A_PlaySound(item.UseSound, CHAN_ITEM);
+			A_StartSound(item.UseSound, CHAN_ITEM);
  			StatusBar.FlashItem (itemtype);	// Fixme: This shouldn't be called from here, because it is in the UI.
 		}
 		return true;
diff --git a/wadsrc/static/zscript/actors/raven/artitele.zs b/wadsrc/static/zscript/actors/raven/artitele.zs
index 0400193fe..3f61176a1 100644
--- a/wadsrc/static/zscript/actors/raven/artitele.zs
+++ b/wadsrc/static/zscript/actors/raven/artitele.zs
@@ -49,7 +49,7 @@ class ArtiTeleport : Inventory
 		}
 		if (canlaugh)
 		{ // Full volume laugh
-			Owner.A_PlaySound ("*evillaugh", CHAN_VOICE, 1, false, ATTN_NONE);
+			Owner.A_StartSound ("*evillaugh", CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 		}
 		return true;
 	}
diff --git a/wadsrc/static/zscript/actors/raven/minotaur.zs b/wadsrc/static/zscript/actors/raven/minotaur.zs
index b618f018c..b3e71013c 100644
--- a/wadsrc/static/zscript/actors/raven/minotaur.zs
+++ b/wadsrc/static/zscript/actors/raven/minotaur.zs
@@ -173,7 +173,7 @@ class Minotaur : Actor
 		{
 			return;
 		}
-		A_PlaySound ("minotaur/melee", CHAN_WEAPON);
+		A_StartSound ("minotaur/melee", CHAN_WEAPON);
 		if (CheckMeleeRange())
 		{
 			PlayerInfo player = targ.player;
@@ -205,7 +205,7 @@ class Minotaur : Actor
 		}
 		if (!friendly)
 		{
-			A_PlaySound ("minotaur/sight", CHAN_WEAPON);
+			A_StartSound ("minotaur/sight", CHAN_WEAPON);
 		}
 		double dist = Distance2D(target);
 		if (target.pos.z + target.height > pos.z
@@ -293,7 +293,7 @@ class Minotaur : Actor
 		{
 			return;
 		}
-		A_PlaySound ("minotaur/attack2", CHAN_WEAPON);
+		A_StartSound ("minotaur/attack2", CHAN_WEAPON);
 		if (CheckMeleeRange())
 		{
 			int damage = random[MinotaurAtk2](1, 8) * (friendly ? 3 : 5);
@@ -333,7 +333,7 @@ class Minotaur : Actor
 		{
 			return;
 		}
-		A_PlaySound ("minotaur/attack3", CHAN_VOICE);
+		A_StartSound ("minotaur/attack3", CHAN_VOICE);
 		if (CheckMeleeRange())
 		{
 			PlayerInfo player = targ.player;
@@ -350,14 +350,14 @@ class Minotaur : Actor
 			if (Floorclip > 0 && (Level.compatflags & COMPAT_MINOTAUR))
 			{
 				// only play the sound. 
-				A_PlaySound ("minotaur/fx2hit", CHAN_WEAPON);
+				A_StartSound ("minotaur/fx2hit", CHAN_WEAPON);
 			}
 			else
 			{
 				Actor mo = SpawnMissile (target, "MinotaurFX2");
 				if (mo != null)
 				{
-					mo.A_PlaySound ("minotaur/attack1", CHAN_WEAPON);
+					mo.A_StartSound ("minotaur/attack1", CHAN_WEAPON);
 				}
 			}
 		}
@@ -540,7 +540,7 @@ class Minotaur : Actor
 		{
 			if (AttackSound)
 			{
-				A_PlaySound (AttackSound, CHAN_WEAPON);
+				A_StartSound (AttackSound, CHAN_WEAPON);
 			}
 			SetState (MeleeState);
 			return;
diff --git a/wadsrc/static/zscript/actors/raven/ravenambient.zs b/wadsrc/static/zscript/actors/raven/ravenambient.zs
index e0cff04d3..df79b8334 100644
--- a/wadsrc/static/zscript/actors/raven/ravenambient.zs
+++ b/wadsrc/static/zscript/actors/raven/ravenambient.zs
@@ -13,7 +13,7 @@ class SoundWind : Actor
 	States
 	{
 	Spawn:
-		TNT1 A 2 A_PlaySound("world/wind", CHAN_6, 1, true);
+		TNT1 A 2 A_StartSound("world/wind", CHAN_6, CHANF_LOOPING);
 		Loop;
 	}
 }
@@ -36,7 +36,7 @@ class SoundWaterfall : Actor
 	States
 	{
 	Spawn:
-		TNT1 A 2 A_PlaySound("world/waterfall", CHAN_6, 1, true);
+		TNT1 A 2 A_StartSound("world/waterfall", CHAN_6, CHANF_LOOPING);
 		Loop;
 	}
 }
diff --git a/wadsrc/static/zscript/actors/shared/ice.zs b/wadsrc/static/zscript/actors/shared/ice.zs
index e4f8affe8..ecf519424 100644
--- a/wadsrc/static/zscript/actors/shared/ice.zs
+++ b/wadsrc/static/zscript/actors/shared/ice.zs
@@ -90,7 +90,7 @@ extend class Actor
 		Height = Default.Height;
 		A_SetRenderStyle(1, STYLE_Normal);
 
-		A_PlaySound ("misc/freeze", CHAN_BODY);
+		A_StartSound ("misc/freeze", CHAN_BODY);
 
 		// [RH] Andy Baker's stealth monsters
 		if (bStealth)
@@ -126,7 +126,7 @@ extend class Actor
 			return;
 		}
 		Vel = (0,0,0);
-		A_PlaySound ("misc/icebreak", CHAN_BODY);
+		A_StartSound ("misc/icebreak", CHAN_BODY);
 
 		// [RH] In Hexen, this creates a random number of shards (range [24,56])
 		// with no relation to the size of the self shattering. I think it should
diff --git a/wadsrc/static/zscript/actors/shared/spark.zs b/wadsrc/static/zscript/actors/shared/spark.zs
index c5ae6a455..fb399cd2d 100644
--- a/wadsrc/static/zscript/actors/shared/spark.zs
+++ b/wadsrc/static/zscript/actors/shared/spark.zs
@@ -13,7 +13,7 @@ class Spark : Actor
 	{
 		Super.Activate (activator);
 		DrawSplash (args[0] ? args[0] : 32, Angle, 1);
-		A_PlaySound ("world/spark", CHAN_AUTO, 1, false, ATTN_STATIC);
+		A_StartSound ("world/spark", CHAN_AUTO, CHANF_DEFAULT, 1, ATTN_STATIC);
 	}
 	
 }
\ No newline at end of file
diff --git a/wadsrc/static/zscript/actors/shared/teleport.zs b/wadsrc/static/zscript/actors/shared/teleport.zs
index f558b46a6..d4615875b 100644
--- a/wadsrc/static/zscript/actors/shared/teleport.zs
+++ b/wadsrc/static/zscript/actors/shared/teleport.zs
@@ -27,7 +27,7 @@ class TeleportFog : Actor
 	override void PostBeginPlay ()
 	{
 		Super.PostBeginPlay ();
-		A_PlaySound ("misc/teleport", CHAN_BODY);
+		A_StartSound ("misc/teleport", CHAN_BODY);
 		switch (gameinfo.gametype)
 		{
 		case GAME_Hexen:
diff --git a/wadsrc/static/zscript/actors/strife/acolyte.zs b/wadsrc/static/zscript/actors/strife/acolyte.zs
index 877a44304..5aeb0e63a 100644
--- a/wadsrc/static/zscript/actors/strife/acolyte.zs
+++ b/wadsrc/static/zscript/actors/strife/acolyte.zs
@@ -104,7 +104,7 @@ class Acolyte : StrifeHumanoid
 				players[i].SetLogNumber (14);
 				players[i].SetSubtitleNumber (14, "svox/voc14");
 				A_StopSound (CHAN_VOICE);
-				A_PlaySound ("svox/voc14", CHAN_VOICE, 1, false, ATTN_NONE);
+				A_StartSound ("svox/voc14", CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 			}
 		}
 	}
diff --git a/wadsrc/static/zscript/actors/strife/alienspectres.zs b/wadsrc/static/zscript/actors/strife/alienspectres.zs
index 160ca9529..6b2c83dc1 100644
--- a/wadsrc/static/zscript/actors/strife/alienspectres.zs
+++ b/wadsrc/static/zscript/actors/strife/alienspectres.zs
@@ -179,7 +179,7 @@ class AlienSpectre1 : SpectralMonster
 		if (log > 0)
 		{
 			String voc = "svox/voc" .. log;
-			A_PlaySound(voc, CHAN_VOICE, 1, false, ATTN_NONE);
+			A_StartSound(voc, CHAN_VOICE, CHANF_DEFAULT, 1., ATTN_NONE);
 			player.player.SetLogNumber (log);
 			player.player.SetSubtitleNumber (log, voc);
 		}
diff --git a/wadsrc/static/zscript/actors/strife/inquisitor.zs b/wadsrc/static/zscript/actors/strife/inquisitor.zs
index c1265b474..f999e015f 100644
--- a/wadsrc/static/zscript/actors/strife/inquisitor.zs
+++ b/wadsrc/static/zscript/actors/strife/inquisitor.zs
@@ -80,7 +80,7 @@ class Inquisitor : Actor
 
 	void A_InquisitorWalk ()
 	{
-		A_PlaySound ("inquisitor/walk", CHAN_BODY);
+		A_StartSound ("inquisitor/walk", CHAN_BODY);
 		A_Chase ();
 	}
 
@@ -140,7 +140,7 @@ class Inquisitor : Actor
 		if (target == null)
 			return;
 
-		A_PlaySound ("inquisitor/jump", CHAN_ITEM, 1, true);
+		A_StartSound ("inquisitor/jump", CHAN_ITEM, 1, true);
 		AddZ(64);
 		A_FaceTarget ();
 		let localspeed = Speed * (2./3);
@@ -165,7 +165,7 @@ class Inquisitor : Actor
 			A_StopSound (CHAN_ITEM);
 			return;
 		}
-		A_PlaySound ("inquisitor/jump", CHAN_ITEM, 1, true);
+		A_StartSound ("inquisitor/jump", CHAN_ITEM, CHANF_LOOPING);
 	}
 
 	void A_TossArm ()
diff --git a/wadsrc/static/zscript/actors/strife/klaxon.zs b/wadsrc/static/zscript/actors/strife/klaxon.zs
index 3384ee0b5..6b12593c0 100644
--- a/wadsrc/static/zscript/actors/strife/klaxon.zs
+++ b/wadsrc/static/zscript/actors/strife/klaxon.zs
@@ -87,7 +87,7 @@ extend class Actor
 			}
 			if (SeeSound != 0)
 			{
-				A_PlaySound (SeeSound, CHAN_VOICE);
+				A_StartSound (SeeSound, CHAN_VOICE);
 			}
 			LastHeard = NULL;
 			threshold = 10;
@@ -118,7 +118,7 @@ extend class Actor
 		}
 		else if (reactiontime > 50)
 		{
-			A_PlaySound ("misc/alarm", CHAN_VOICE);
+			A_StartSound ("misc/alarm", CHAN_VOICE);
 		}
 	}
 
diff --git a/wadsrc/static/zscript/actors/strife/loremaster.zs b/wadsrc/static/zscript/actors/strife/loremaster.zs
index cda305d18..f478a0e6b 100644
--- a/wadsrc/static/zscript/actors/strife/loremaster.zs
+++ b/wadsrc/static/zscript/actors/strife/loremaster.zs
@@ -114,7 +114,7 @@ class LoreShot : Actor
 
 	void A_LoremasterChain ()
 	{
-		A_PlaySound ("loremaster/active", CHAN_BODY);
+		A_StartSound ("loremaster/active", CHAN_BODY);
 		Spawn("LoreShot2", Pos, ALLOW_REPLACE);
 		Spawn("LoreShot2", Vec3Offset(-Vel.x/2., -Vel.y/2., -Vel.z/2.), ALLOW_REPLACE);
 		Spawn("LoreShot2", Vec3Offset(-Vel.x, -Vel.y, -Vel.z), ALLOW_REPLACE);
diff --git a/wadsrc/static/zscript/actors/strife/programmer.zs b/wadsrc/static/zscript/actors/strife/programmer.zs
index c835a5ba8..88e2974c0 100644
--- a/wadsrc/static/zscript/actors/strife/programmer.zs
+++ b/wadsrc/static/zscript/actors/strife/programmer.zs
@@ -92,7 +92,7 @@ class Programmer : Actor
 		if (!CheckMeleeRange ())
 			return;
 
-		A_PlaySound("programmer/clank", CHAN_WEAPON);
+		A_StartSound("programmer/clank", CHAN_WEAPON);
 
 		int damage = random[Programmer](1, 10) * 6;
 		int newdam = target.DamageMobj (self, self, damage, 'Melee');
diff --git a/wadsrc/static/zscript/actors/strife/reaver.zs b/wadsrc/static/zscript/actors/strife/reaver.zs
index 9d127d345..408fbf89c 100644
--- a/wadsrc/static/zscript/actors/strife/reaver.zs
+++ b/wadsrc/static/zscript/actors/strife/reaver.zs
@@ -72,7 +72,7 @@ extend class Actor
 		if (target != null)
 		{
 			A_FaceTarget ();
-			A_PlaySound ("reaver/attack", CHAN_WEAPON);
+			A_StartSound ("reaver/attack", CHAN_WEAPON);
 			double bangle = Angle;
 			double pitch = AimLineAttack (bangle, MISSILERANGE);
 
diff --git a/wadsrc/static/zscript/actors/strife/sigil.zs b/wadsrc/static/zscript/actors/strife/sigil.zs
index 77ebbfe1c..fcf7933ee 100644
--- a/wadsrc/static/zscript/actors/strife/sigil.zs
+++ b/wadsrc/static/zscript/actors/strife/sigil.zs
@@ -254,7 +254,7 @@ class Sigil : Weapon
 
 	action void A_SigilCharge ()
 	{
-		A_PlaySound ("weapons/sigilcharge", CHAN_WEAPON);
+		A_StartSound ("weapons/sigilcharge", CHAN_WEAPON);
 		if (player != null)
 		{
 			player.extralight = 2;
@@ -276,7 +276,7 @@ class Sigil : Weapon
 			return;
 
 		DamageMobj (self, null, 1*4, 'Sigil', DMG_NO_ARMOR);
-		A_PlaySound ("weapons/sigilcharge", CHAN_WEAPON);
+		A_StartSound ("weapons/sigilcharge", CHAN_WEAPON);
 
 		BulletSlope (t, ALF_PORTALRESTRICT);
 		if (t.linetarget != null)
@@ -314,7 +314,7 @@ class Sigil : Weapon
 			return;
 
 		DamageMobj (self, null, 2*4, 'Sigil', DMG_NO_ARMOR);
-		A_PlaySound ("weapons/sigilcharge", CHAN_WEAPON);
+		A_StartSound ("weapons/sigilcharge", CHAN_WEAPON);
 		SpawnPlayerMissile ("SpectralLightningH1");
 	}
 
@@ -330,7 +330,7 @@ class Sigil : Weapon
 			return;
 
 		DamageMobj (self, null, 3*4, 'Sigil', DMG_NO_ARMOR);
-		A_PlaySound ("weapons/sigilcharge", CHAN_WEAPON);
+		A_StartSound ("weapons/sigilcharge", CHAN_WEAPON);
 
 		angle -= 90.;
 		for (int i = 0; i < 20; ++i)
@@ -359,7 +359,7 @@ class Sigil : Weapon
 			return;
 
 		DamageMobj (self, null, 4*4, 'Sigil', DMG_NO_ARMOR);
-		A_PlaySound ("weapons/sigilcharge", CHAN_WEAPON);
+		A_StartSound ("weapons/sigilcharge", CHAN_WEAPON);
 
 		BulletSlope (t, ALF_PORTALRESTRICT);
 		if (t.linetarget != null)
@@ -392,7 +392,7 @@ class Sigil : Weapon
 			return;
 
 		DamageMobj (self, null, 5*4, 'Sigil', DMG_NO_ARMOR);
-		A_PlaySound ("weapons/sigilcharge", CHAN_WEAPON);
+		A_StartSound ("weapons/sigilcharge", CHAN_WEAPON);
 
 		SpawnPlayerMissile ("SpectralLightningBigBall1");
 	}
diff --git a/wadsrc/static/zscript/actors/strife/stalker.zs b/wadsrc/static/zscript/actors/strife/stalker.zs
index 12ab87bc5..1677e6a13 100644
--- a/wadsrc/static/zscript/actors/strife/stalker.zs
+++ b/wadsrc/static/zscript/actors/strife/stalker.zs
@@ -128,7 +128,7 @@ class Stalker : Actor
 
 	void A_StalkerWalk ()
 	{
-		A_PlaySound ("stalker/walk", CHAN_BODY);
+		A_StartSound ("stalker/walk", CHAN_BODY);
 		A_Chase ();
 	}
 
diff --git a/wadsrc/static/zscript/actors/strife/strifefunctions.zs b/wadsrc/static/zscript/actors/strife/strifefunctions.zs
index d22b506c2..a364a711f 100644
--- a/wadsrc/static/zscript/actors/strife/strifefunctions.zs
+++ b/wadsrc/static/zscript/actors/strife/strifefunctions.zs
@@ -9,13 +9,13 @@ extend class Actor
 	{
 		if (ActiveSound != 0 && !(Level.maptime & 7))
 		{
-			A_PlaySound (ActiveSound, CHAN_VOICE);
+			A_StartSound (ActiveSound, CHAN_VOICE);
 		}
 	}
 
 	void A_LoopActiveSound()
 	{
-		A_PlaySound(ActiveSound, CHAN_VOICE, 1, true);
+		A_StartSound(ActiveSound, CHAN_VOICE, CHANF_LOOPING);
 	}
 
 	//============================================================================
@@ -80,7 +80,7 @@ extend class Actor
 	void A_ShootGun()
 	{
 		if (!target) return;
-		A_PlaySound ("monsters/rifle", CHAN_WEAPON);
+		A_StartSound ("monsters/rifle", CHAN_WEAPON);
 		A_FaceTarget ();
 		double pitch = AimLineAttack (angle, MISSILERANGE);
 		LineAttack (Angle + Random2[ShootGun]() * (11.25 / 256), MISSILERANGE, pitch, 3*random[ShootGun](1, 5), 'Hitscan', "StrifePuff");
@@ -115,7 +115,7 @@ extend class Actor
 		bInCombat = true;
 		if (random[HurtMe](0, 4) == 0)
 		{
-			A_PlaySound (PainSound, CHAN_VOICE);
+			A_StartSound (PainSound, CHAN_VOICE);
 			health--;
 		}
 		if (health <= 0)
@@ -188,7 +188,7 @@ extend class Actor
 
 	void A_RocketInFlight()
 	{
-		A_PlaySound ("misc/missileinflight", CHAN_VOICE);
+		A_StartSound ("misc/missileinflight", CHAN_VOICE);
 		SpawnPuff ("MiniMissilePuff", Pos, Angle - 180, Angle - 180, 2, PF_HITTHING);
 		Actor trail = Spawn("RocketTrail", Vec3Offset(-Vel.X, -Vel.Y, 0.), ALLOW_REPLACE);
 		if (trail != null)
diff --git a/wadsrc/static/zscript/actors/strife/strifehumanoid.zs b/wadsrc/static/zscript/actors/strife/strifehumanoid.zs
index 5d3d8da80..ae09a14d6 100644
--- a/wadsrc/static/zscript/actors/strife/strifehumanoid.zs
+++ b/wadsrc/static/zscript/actors/strife/strifehumanoid.zs
@@ -13,7 +13,7 @@ class StrifeHumanoid : Actor
 	States
 	{
 	Burn:
-		BURN A 3 Bright Light("PhFire_FX1") A_PlaySound("human/imonfire", CHAN_VOICE);
+		BURN A 3 Bright Light("PhFire_FX1") A_StartSound("human/imonfire", CHAN_VOICE);
 		BURN B 3 Bright Light("PhFire_FX2") A_DropFire;
 		BURN C 3 Bright Light("PhFire_FX3") A_Wander;
 		BURN D 3 Bright Light("PhFire_FX4") A_NoBlocking;
@@ -39,7 +39,7 @@ class StrifeHumanoid : Actor
 		BURN V -1;
 		Stop;
 	Disintegrate:
-		DISR A 5 A_PlaySound("misc/disruptordeath", CHAN_VOICE);
+		DISR A 5 A_StartSound("misc/disruptordeath", CHAN_VOICE);
 		DISR BC 5;
 		DISR D 5 A_NoBlocking;
 		DISR EF 5;
diff --git a/wadsrc/static/zscript/actors/strife/strifeplayer.zs b/wadsrc/static/zscript/actors/strife/strifeplayer.zs
index 8e4286231..9ddba754a 100644
--- a/wadsrc/static/zscript/actors/strife/strifeplayer.zs
+++ b/wadsrc/static/zscript/actors/strife/strifeplayer.zs
@@ -82,7 +82,7 @@ class StrifePlayer : PlayerPawn
 		BURN V -1;
 		Stop;
 	Disintegrate:
-		DISR A 5 A_PlaySound("misc/disruptordeath", CHAN_VOICE);
+		DISR A 5 A_StartSound("misc/disruptordeath", CHAN_VOICE);
 		DISR BC 5;
 		DISR D 5 A_NoBlocking;
 		DISR EF 5;
@@ -99,7 +99,7 @@ class StrifePlayer : PlayerPawn
 	
 	void A_ItBurnsItBurns()
 	{
-		A_PlaySound ("human/imonfire", CHAN_VOICE);
+		A_StartSound ("human/imonfire", CHAN_VOICE);
 
 		if (player != null && player.mo == self)
 		{
diff --git a/wadsrc/static/zscript/actors/strife/templar.zs b/wadsrc/static/zscript/actors/strife/templar.zs
index 3a6822857..87de67546 100644
--- a/wadsrc/static/zscript/actors/strife/templar.zs
+++ b/wadsrc/static/zscript/actors/strife/templar.zs
@@ -68,7 +68,7 @@ class Templar : Actor
 	{
 		if (target != null)
 		{
-			A_PlaySound ("templar/shoot", CHAN_WEAPON);
+			A_StartSound ("templar/shoot", CHAN_WEAPON);
 			A_FaceTarget ();
 			double pitch = AimLineAttack (angle, MISSILERANGE);
 
diff --git a/wadsrc/static/zscript/actors/strife/weaponassault.zs b/wadsrc/static/zscript/actors/strife/weaponassault.zs
index 8d3b8ad2a..3668b3d9a 100644
--- a/wadsrc/static/zscript/actors/strife/weaponassault.zs
+++ b/wadsrc/static/zscript/actors/strife/weaponassault.zs
@@ -52,7 +52,7 @@ extend class StateProvider
 			return;
 		}
 
-		A_PlaySound ("weapons/assaultgun", CHAN_WEAPON);
+		A_StartSound ("weapons/assaultgun", CHAN_WEAPON);
 
 		Weapon weapon = player.ReadyWeapon;
 		if (weapon != null)
diff --git a/wadsrc/static/zscript/actors/strife/weaponcrossbow.zs b/wadsrc/static/zscript/actors/strife/weaponcrossbow.zs
index 1617fbfcd..25129182b 100644
--- a/wadsrc/static/zscript/actors/strife/weaponcrossbow.zs
+++ b/wadsrc/static/zscript/actors/strife/weaponcrossbow.zs
@@ -100,7 +100,7 @@ class StrifeCrossbow : StrifeWeapon
 			player.mo.PlayAttacking2 ();
 			SpawnPlayerMissile (proj);
 			angle = savedangle;
-			A_PlaySound ("weapons/xbowshoot", CHAN_WEAPON);
+			A_StartSound ("weapons/xbowshoot", CHAN_WEAPON);
 		}
 	}
 }
diff --git a/wadsrc/static/zscript/actors/strife/weapondagger.zs b/wadsrc/static/zscript/actors/strife/weapondagger.zs
index 2ba14d11c..84ebb7d35 100644
--- a/wadsrc/static/zscript/actors/strife/weapondagger.zs
+++ b/wadsrc/static/zscript/actors/strife/weapondagger.zs
@@ -64,14 +64,14 @@ class PunchDagger : StrifeWeapon
 		// turn to face target
 		if (t.linetarget)
 		{
-			A_PlaySound (t.linetarget.bNoBlood ? sound("misc/metalhit") : sound("misc/meathit"), CHAN_WEAPON);
+			A_StartSound (t.linetarget.bNoBlood ? sound("misc/metalhit") : sound("misc/meathit"), CHAN_WEAPON);
 			angle = t.angleFromSource;
 			bJustAttacked = true;
 			t.linetarget.DaggerAlert (self);
 		}
 		else
 		{
-			A_PlaySound ("misc/swish", CHAN_WEAPON);
+			A_StartSound ("misc/swish", CHAN_WEAPON);
 		}
 	}
 }	
diff --git a/wadsrc/static/zscript/actors/strife/weapongrenade.zs b/wadsrc/static/zscript/actors/strife/weapongrenade.zs
index 9b0db47da..215f04c22 100644
--- a/wadsrc/static/zscript/actors/strife/weapongrenade.zs
+++ b/wadsrc/static/zscript/actors/strife/weapongrenade.zs
@@ -76,7 +76,7 @@ class StrifeGrenadeLauncher : StrifeWeapon
 
 			if (grenade.SeeSound != 0)
 			{
-				grenade.A_PlaySound (grenade.SeeSound, CHAN_VOICE);
+				grenade.A_StartSound (grenade.SeeSound, CHAN_VOICE);
 			}
 
 			grenade.Vel.Z = (-clamp(tan(Pitch), -5, 5)) * grenade.Speed + 8;
@@ -269,7 +269,7 @@ class PhosphorousFire : Actor
 		Vel.Z -= 8;
 		Vel.X += (random2[PHBurn] (3));
 		Vel.Y += (random2[PHBurn] (3));
-		A_PlaySound ("world/largefire", CHAN_VOICE);
+		A_StartSound ("world/largefire", CHAN_VOICE);
 
 		// Only the main fire spawns more.
 		if (!bDropped)
diff --git a/wadsrc/static/zscript/actors/strife/weaponmauler.zs b/wadsrc/static/zscript/actors/strife/weaponmauler.zs
index cc4e7c30c..3c5000893 100644
--- a/wadsrc/static/zscript/actors/strife/weaponmauler.zs
+++ b/wadsrc/static/zscript/actors/strife/weaponmauler.zs
@@ -58,7 +58,7 @@ class Mauler : StrifeWeapon
 			return;
 		}
 
-		A_PlaySound ("weapons/mauler1", CHAN_WEAPON);
+		A_StartSound ("weapons/mauler1", CHAN_WEAPON);
 		Weapon weap = player.ReadyWeapon;
 		if (weap != null)
 		{
@@ -132,7 +132,7 @@ class Mauler2 : Mauler
 
 	action void A_FireMauler2Pre ()
 	{
-		A_PlaySound ("weapons/mauler2charge", CHAN_WEAPON);
+		A_StartSound ("weapons/mauler2charge", CHAN_WEAPON);
 
 		if (player != null)
 		{
diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs
index d1e073274..23322094c 100644
--- a/wadsrc/static/zscript/constants.zs
+++ b/wadsrc/static/zscript/constants.zs
@@ -423,6 +423,7 @@ enum ESoundFlags
 	CHAN_OVERLAP = 8192,
 
 	// Same as above, with an F appended to allow better distinction of channel and channel flags.
+	CHANF_DEFAULT = 0,	// just to make the code look better and avoid literal 0's.
 	CHANF_LISTENERZ = 8,
 	CHANF_MAYBE_LOCAL = 16,
 	CHANF_UI = 32,
diff --git a/wadsrc_extra/static/filter/harmony/decorate.txt b/wadsrc_extra/static/filter/harmony/decorate.txt
index e1c3a15da..db173e8d8 100644
--- a/wadsrc_extra/static/filter/harmony/decorate.txt
+++ b/wadsrc_extra/static/filter/harmony/decorate.txt
@@ -538,7 +538,7 @@ actor Mine replaces LostSoul
 		Melee:
 			BAL2 D 0 A_Die
 		Death:
-			BAL2 D 0 bright A_PlaySound("weapons/sshotc")
+			BAL2 D 0 bright A_StartSound("weapons/sshotc")
 			MISL B 8 bright A_Explode
 			MISL C 6 bright
 			MISL D 4 bright
@@ -633,7 +633,7 @@ actor WalkingPhage replaces Arachnotron
 			goto Missile+1
 		Death:
 			SSWV N 7
-			SSWV O 7 A_PlaySound("weapons/sshotl")
+			SSWV O 7 A_StartSound("weapons/sshotl")
 			SSWV P 6 A_Fall
 			SSWV QR 5
 			SSWV S -1
@@ -772,7 +772,7 @@ actor WalkingPhage2 replaces WolfensteinSS
 			stop
 		XDeath:
 			SSWV N 7
-			SSWV O 7 A_PlaySound("weapons/sshotl")
+			SSWV O 7 A_StartSound("weapons/sshotl")
 			SSWV P 6 A_Fall
 			SSWV QR 5
 			SSWV S -1
@@ -851,7 +851,7 @@ actor RedBarrel replaces ExplosiveBarrel
 			BAR1 AB 6
 			loop
 		Death:
-			BAL2 D 0 bright A_PlaySound("weapons/sshotc")
+			BAL2 D 0 bright A_StartSound("weapons/sshotc")
 			MISL B 8 bright A_Explode
 			MISL C 6 bright
 			MISL D 4 bright