Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp    (revision 7235)
+++ code/ship/ship.cpp    (working copy)
@@ -10287,13 +10287,18 @@ int ship_fire_primary(object * obj, int stream_weapons, int force)
 						weapon_info *wip;
 						ship_weapon *sw_pl;
 
-						// HACK
-						if(winfo_p->launch_snd == SND_AUTOCANNON_SHOT){
-							snd_play( &Snds[winfo_p->launch_snd], 0.0f, 1.0f, SND_PRIORITY_TRIPLE_INSTANCE );
+						if ( (shipp->was_firing_last_frame[bank_to_fire] == 0)
+							&& (winfo_p->pre_fire_snd != NULL)) { //If this weapon type has a pre-fire sound and we are at the beginning of a firing stream, play it.
+							snd_play( &Snds[winfo_p->pre_fire_snd], 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY);
 						} else {
-							snd_play( &Snds[winfo_p->launch_snd], 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY );
+							// HACK
+							if(winfo_p->launch_snd == SND_AUTOCANNON_SHOT){
+								snd_play( &Snds[winfo_p->launch_snd], 0.0f, 1.0f, SND_PRIORITY_TRIPLE_INSTANCE );
+							} else {
+								snd_play( &Snds[winfo_p->launch_snd], 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY );
+							}
+			//				snd_play( &Snds[winfo_p->launch_snd] );
 						}
-		//				snd_play( &Snds[winfo_p->launch_snd] );
 	
 						sw_pl = &Player_ship->weapons;
 						if (sw_pl->current_primary_bank >= 0)
Index: code/weapon/weapon.h
===================================================================
--- code/weapon/weapon.h    (revision 7235)
+++ code/weapon/weapon.h    (working copy)
@@ -369,6 +369,7 @@ typedef struct weapon_info {
 	int	launch_snd;
 	int	impact_snd;
 	int disarmed_impact_snd;
+	int pre_fire_snd;
 	int	flyby_snd;							//	whizz-by sound, transmitted through weapon's portable atmosphere.
 	
 	// Specific to weapons with TRAILS:
Index: code/weapon/weapons.cpp
===================================================================
--- code/weapon/weapons.cpp    (revision 7235)
+++ code/weapon/weapons.cpp    (working copy)
@@ -1605,6 +1605,9 @@ int parse_weapon(int subtype, bool replace)
 	//Disarmed impact sound
 	parse_sound("$Disarmed ImpactSnd:", &wip->impact_snd, wip->name);
 
+	//Optional one-shot sound to play at the beginning of firing
+	parse_sound("$PreFireSnd:", &wip->pre_fire_snd, wip->name);
+
 	if (subtype == WP_MISSILE)
 	{
 		parse_sound("$FlyBySnd:", &wip->flyby_snd, wip->name);
