Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp    (revision 7235)
+++ code/ship/ship.cpp    (working copy)
@@ -4779,6 +4779,7 @@ void ship_set(int ship_index, int objnum, int ship_type)
 		swp->next_primary_fire_stamp[i] = timestamp(0);	
 		swp->last_primary_fire_stamp[i] = -1;	
 		swp->primary_bank_rearm_time[i] = timestamp(0);		// added by Goober5000
+		swp->last_primary_fire_sound_stamp[i] = timestamp(0); // added by Halleck
 
 		swp->primary_animation_position[i] = MA_POS_NOT_SET;
 		swp->secondary_animation_position[i] = MA_POS_NOT_SET;
@@ -8449,6 +8450,7 @@ void ship_set_default_weapons(ship *shipp, ship_info *sip)
 		swp->next_primary_fire_stamp[i] = timestamp(0);
 		swp->last_primary_fire_stamp[i] = -1;
 		swp->burst_counter[i] = 0;
+		swp->last_primary_fire_sound_stamp[i] = timestamp(0);
 	}
 
 	for ( i = 0; i < MAX_SHIP_SECONDARY_BANKS; i++ ){
@@ -10287,13 +10289,26 @@ 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 );
-						} else {
-							snd_play( &Snds[winfo_p->launch_snd], 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY );
+						//Update the last timestamp until continous fire is over, so we have the timestamp of the cease-fire.
+						if (shipp->was_firing_last_frame[bank_to_fire] == 1) {
+							swp->last_primary_fire_sound_stamp[bank_to_fire] = timestamp();
+						}
+
+						//Check for pre-launch sound and play if relevant
+						if( (winfo_p->pre_launch_snd != NULL)									//If this weapon type has a pre-fire sound
+							&& ((timestamp() - swp->last_primary_fire_sound_stamp[bank_to_fire]) >= winfo_p->pre_launch_snd_min_interval)	//and if we're past our minimum delay from the last cease-fire
+							&& (shipp->was_firing_last_frame[bank_to_fire] == 0)				//and if we are at the beginning of a firing stream
+						){ 
+							snd_play( &Snds[winfo_p->pre_launch_snd], 0.0f, 1.0f, SND_PRIORITY_MUST_PLAY); //play it 
+						} else { //Otherwise, play normal firing sounds
+							// 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/ship/ship.h
===================================================================
--- code/ship/ship.h    (revision 7235)
+++ code/ship/ship.h    (working copy)
@@ -114,6 +114,7 @@ typedef struct ship_weapon {
 	int next_secondary_fire_stamp[MAX_SHIP_SECONDARY_BANKS];		// next time this secondary bank can fire
 	int last_secondary_fire_stamp[MAX_SHIP_SECONDARY_BANKS];		// last time this secondary bank fired (mostly used by SEXPs)
 	int next_tertiary_fire_stamp;
+	int last_primary_fire_sound_stamp[MAX_SHIP_PRIMARY_BANKS];		// trailing end of the last time this primary bank was fired, for purposes of timing the pre-launch sound
 
 	// ballistic primary support - by Goober5000
 	int primary_bank_ammo[MAX_SHIP_PRIMARY_BANKS];			// Number of missiles left in primary bank
Index: code/weapon/weapon.h
===================================================================
--- code/weapon/weapon.h    (revision 7235)
+++ code/weapon/weapon.h    (working copy)
@@ -366,6 +366,8 @@ typedef struct weapon_info {
 	// Seeker strength - for countermeasures overhaul.
 	float seeker_strength;
 
+	int pre_launch_snd;
+	int	pre_launch_snd_min_interval;	//Minimum interval in ms between the last time the pre-launch sound was played and the next time it can play, as a limiter in case the player is pumping the trigger
 	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,14 @@ 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);
+
+	//Optional delay for Pre-Launch sound
+	if(optional_string("+PreLaunchSnd Min Interval:"))
+	{
+		stuff_int(&wip->pre_launch_snd_min_interval);
+	}
 
 	//Launch sound
 	parse_sound("$LaunchSnd:", &wip->launch_snd, wip->name);
