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_launch_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_launch_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)
@@ -366,6 +366,7 @@ typedef struct weapon_info {
 	// Seeker strength - for countermeasures overhaul.
 	float seeker_strength;
 
+	int pre_launch_snd;
 	int	launch_snd;
 	int	impact_snd;
 	int disarmed_impact_snd;
Index: code/weapon/weapons.cpp
===================================================================
--- code/weapon/weapons.cpp    (revision 7235)
+++ code/weapon/weapons.cpp    (working copy)
@@ -1595,6 +1595,8 @@ int parse_weapon(int subtype, bool replace)
 			wip->free_flight_speed = 0.25f;
 		}
 	}
+	//Optional one-shot sound to play at the beginning of firing
+	parse_sound("$PreLaunchSnd:", &wip->pre_launch_snd, wip->name);
 
 	//Launch sound
 	parse_sound("$LaunchSnd:", &wip->launch_snd, wip->name);
