/*
 * ChangeLog:
 *	11.12.2005 Lesh changed balance settings
 */
#ifndef SOUND_CONTROL_H
#define SOUND_CONTROL_H

#include "Overhead Types.h"

// == Lesh modifications ======
#define FARLEFT		 0
#define LEFTSIDE		96
#define MIDDLE			128
#define MIDDLEPAN		128
#define RIGHTSIDE		160
#define FARRIGHT		255
// == Lesh modifications ends =

#define LOWVOLUME		25
#define BTNVOLUME		40
#define MIDVOLUME		65
#define HIGHVOLUME		127


#define	RATE_11025		0xffffffff


#define LOOPING			0

// sound group priorities (higher = more important)
#define GROUP_PLAYER	1000
#define GROUP_AMBIENT	0


#define MAX_SAMPLES			5000


// SOUNDS ENUMERATION
enum SoundDefines
{
	MISS_1 = 0,
	MISS_2,
	MISS_3,
	MISS_4,
	MISS_5,
	MISS_6,
	MISS_7,
	MISS_8,
	MISS_G1,
	MISS_G2,
	MISS_KNIFE,
	FALL_1,
	FALL_2,
	FALL_TO_GROUND_1,
	FALL_TO_GROUND_2,
	FALL_TO_GROUND_3,
	HEAVY_FALL_1,
	BODY_SPLAT_1,
	GLASS_SHATTER1,
	GLASS_SHATTER2,
	DROPEN_1,
	DROPEN_2,
	DROPEN_3,
	DRCLOSE_1,
	DRCLOSE_2,
	UNLOCK_DOOR_1,
	KICKIN_DOOR,
	BREAK_LOCK,
	PICKING_LOCK,

	GARAGE_DOOR_OPEN,
	GARAGE_DOOR_CLOSE,
	ELEVATOR_DOOR_OPEN,
	ELEVATOR_DOOR_CLOSE,
	HITECH_DOOR_OPEN,
	HITECH_DOOR_CLOSE,
	CURTAINS_OPEN,
	CURTAINS_CLOSE,
	METAL_DOOR_OPEN,
	METAL_DOOR_CLOSE,

	WALK_LEFT_OUT,
	WALK_RIGHT_OUT,
	WALK_LEFT_OUT2,
	WALK_RIGHT_OUT2,
	WALK_LEFT_IN,
	WALK_RIGHT_IN,
	WALK_LEFT_IN2,
	WALK_RIGHT_IN2,
	WALK_LEFT_ROAD,
	WALK_RIGHT_ROAD,
	WALK_LEFT_ROAD2,
	WALK_RIGHT_ROAD2,
	CRAWL_1,
	CRAWL_2,
	CRAWL_3,
	CRAWL_4,
	TARG_REFINE_BEEP,
	ENDTURN_1,
	HEADCR_1,
	DOORCR_1,
	HEADSPLAT_1,
	BODY_EXPLODE_1,
	EXPLOSION_1,
	CROW_EXPLODE_1,
	SMALL_EXPLODE_1,
	HELI_1,
	BULLET_IMPACT_1,
	BULLET_IMPACT_2,
	BULLET_IMPACT_3,
	CREATURE_BATTLECRY_1,
	ENTER_WATER_1,
	ENTER_DEEP_WATER_1,

	COW_HIT_SND,
	COW_DIE_SND,

	// ROCKET GUN COMPUTER VOICE...
	RG_ID_IMPRINTED,
	RG_ID_INVALID,
	RG_TARGET_SELECTED,

	// CAVE COLLAPSE
	CAVE_COLLAPSE,

	// AIR RAID SOUNDS...
	S_RAID_WHISTLE,
	S_RAID_AMBIENT,
	S_RAID_DIVE,
	S_RAID_TB_DIVE,
	S_RAID_TB_BOMB,

	// VEHICLE SOUNDS
	S_VECH1_MOVE,
	S_VECH1_ON,
	S_VECH1_OFF,
	S_VECH1_INTO,

	S_DRYFIRE1,

	// IMPACT SOUNDS
	S_WOOD_IMPACT1,
	S_WOOD_IMPACT2,
	S_WOOD_IMPACT3,
	S_PORCELAIN_IMPACT1,
	S_RUBBER_IMPACT1,
	S_STONE_IMPACT1,
	S_WATER_IMPACT1,
	S_VEG_IMPACT1,
	S_METAL_IMPACT1,
	S_METAL_IMPACT2,
	S_METAL_IMPACT3,

	S_SLAP_IMPACT,

	// WEAPON RELOAD
	S_RELOAD_REVOLVER,
	S_RELOAD_PISTOL,
	S_RELOAD_SMG,
	S_RELOAD_RIFLE,
	S_RELOAD_SHOTGUN,
	S_RELOAD_LMG,

	// WEAPON LOCKNLOAD
	S_LNL_REVOLVER,
	S_LNL_PISTOL,
	S_LNL_SMG,
	S_LNL_RIFLE,
	S_LNL_SHOTGUN,
	S_LNL_LMG,

	//WEAPON SHOT SOUNDS
	S_SMALL_ROCKET_LAUNCHER,
	S_GLAUNCHER,
	S_UNDER_GLAUNCHER,
	S_ROCKET_LAUNCHER,
	S_MORTAR_SHOT,
	S_GLOCK17,
	S_GLOCK18,
	S_BERETTA92,	
	S_BERETTA93,	
	S_SWSPECIAL,
	S_BARRACUDA,
	S_DESERTEAGLE,
	S_M1911,
	S_MP5K,
	S_MAC10,
	S_THOMPSON,
	S_COMMANDO,
	S_MP53,
	S_AKSU74,
	S_P90,
	S_TYPE85,
	S_SKS,
	S_DRAGUNOV,
	S_M24,
	S_AUG,
	S_G41,
	S_RUGERMINI,
	S_C7,
	S_FAMAS,
	S_AK74,
	S_AKM,
	S_M14,
	S_FNFAL,
	S_G3A3,
	S_G11,
	S_M870,
	S_SPAS,
	S_CAWS,
	S_FNMINI,
	S_RPK74,
	S_21E,
	S_THROWKNIFE,
	S_TANK_CANNON,
	S_BURSTTYPE1,
	S_AUTOMAG,

	S_SILENCER_1,
	S_SILENCER_2,

	// SWOOSHES.
	SWOOSH_1,
	SWOOSH_2,
	SWOOSH_3,
	SWOOSH_4,
	SWOOSH_5,
	SWOOSH_6,

	// CREATURE SOUNDS....
	ACR_FALL_1,
	ACR_STEP_1,
	ACR_STEP_2,
	ACR_SWIPE,
	ACR_EATFLESH,
	ACR_CRIPPLED,
	ACR_DIE_PART1,
	ACR_DIE_PART2,
	ACR_LUNGE,
	ACR_SMELL_THREAT,
	ACR_SMEEL_PREY,
	ACR_SPIT,
	//BABY
	BCR_DYING,
	BCR_DRAGGING,
	BCR_SHRIEK,
	BCR_SPITTING,
	// LARVAE
	LCR_MOVEMENT,
	LCR_RUPTURE,
	// QUEEN
	LQ_SHRIEK,
	LQ_DYING,
	LQ_ENRAGED_ATTACK,
	LQ_RUPTURING,
	LQ_CRIPPLED,
	LQ_SMELLS_THREAT,
	LQ_WHIP_ATTACK,

	THROW_IMPACT_1,
	THROW_IMPACT_2,

	IDLE_SCRATCH,
	IDLE_ARMPIT,
	IDLE_BACKCRACK,

	AUTORESOLVE_FINISHFX,

	//Interface buttons, misc.
	EMAIL_ALERT,
	ENTERING_TEXT,
	REMOVING_TEXT,
	COMPUTER_BEEP2_IN,
	COMPUTER_BEEP2_OUT,
	COMPUTER_SWITCH1_IN,
	COMPUTER_SWITCH1_OUT,
	VSM_SWITCH1_IN,
	VSM_SWITCH1_OUT,
	VSM_SWITCH2_IN,
	VSM_SWITCH2_OUT,
	SM_SWITCH1_IN,
	SM_SWITCH1_OUT,
	SM_SWITCH2_IN,
	SM_SWITCH2_OUT,
	SM_SWITCH3_IN,
	SM_SWITCH3_OUT,
	BIG_SWITCH3_IN,
	BIG_SWITCH3_OUT,
	KLAXON_ALARM,
	BOXING_BELL,
	HELI_CRASH,
	ATTACH_TO_GUN,
	ATTACH_CERAMIC_PLATES,
	ATTACH_DETONATOR,

	GRAB_ROOF,
	LAND_ON_ROOF,

	UNSTEALTHY_OUTSIDE_1,
	UNSTEALTHY_OUTSIDE_2,
	UNSTEALTHY_INSIDE_1,

	OPEN_DEFAULT_OPENABLE,
	CLOSE_DEFAULT_OPENABLE,

	FIRE_ON_MERC,
	GLASS_CRACK,
	SPIT_RICOCHET,

	BLOODCAT_HIT_1,
	BLOODCAT_DIE_1,
	SLAP_1,

	ROBOT_BEEP,
	DOOR_ELECTRICITY,
	SWIM_1,
	SWIM_2,
	KEY_FAILURE,
	TARGET_OUT_OF_RANGE,
	OPEN_STATUE,
	USE_STATUE_REMOTE,
	USE_WIRE_CUTTERS,
	DRINK_CANTEEN_FEMALE,
	BLOODCAT_ATTACK,
	BLOODCAT_ROAR,
	ROBOT_GREETING,
	ROBOT_DEATH,
	GAS_EXPLODE_1,
	AIR_ESCAPING_1,

	OPEN_DRAWER,
	CLOSE_DRAWER,
	OPEN_LOCKER,
	CLOSE_LOCKER,
	OPEN_WOODEN_BOX,
	CLOSE_WOODEN_BOX,
	ROBOT_STOP,

	WATER_WALK1_IN,
	WATER_WALK1_OUT,
	WATER_WALK2_IN,
	WATER_WALK2_OUT,

	PRONE_UP_SOUND,
	PRONE_DOWN_SOUND,
	KNEEL_UP_SOUND,
	KNEEL_DOWN_SOUND,
	PICKING_SOMETHING_UP,

	COW_FALL,

	BLOODCAT_GROWL_1,
	BLOODCAT_GROWL_2,
	BLOODCAT_GROWL_3,
	BLOODCAT_GROWL_4,
	CREATURE_GAS_NOISE,
	CREATURE_FALL_PART_2,
	CREATURE_DISSOLVE_1,
	QUEEN_AMBIENT_NOISE,
	CREATURE_FALL,
	CROW_PECKING_AT_FLESH,
	CROW_FLYING_AWAY,
	SLAP_2,
	MORTAR_START,
	MORTAR_WHISTLE,
	MORTAR_LOAD,

	TURRET_MOVE,
	TURRET_STOP,
	COW_FALL_2,
	KNIFE_IMPACT,
	EXPLOSION_ALT_BLAST_1,
	EXPLOSION_BLAST_2,
	DRINK_CANTEEN_MALE,
	USE_X_RAY_MACHINE,
	CATCH_OBJECT,
	FENCE_OPEN,

	//MADD MARKER
	S_BARRETT,
	S_VAL,
	//BREAK_LIGHT_IGNITING,

	NUM_SAMPLES,
	POWER_GEN_FAN_SOUND = 5001 // This is a workaround to get the generator fan positional sound working in UB campaign.
	// Had to special case it because sound effects have been externalized.
};

enum AmbientDefines
{
	LIGHTNING_1 = 0,
	LIGHTNING_2,
	RAIN_1,
	BIRD_1,
	BIRD_2,
	CRICKETS_1,
	CRICKETS_2,
	CRICKET_1,
	CRICKET_2,
	OWL_1,
	OWL_2,
	OWL_3,
	NIGHT_BIRD_1,
	NIGHT_BIRD_2,
	WIND,

	NUM_AMBIENTS
};

typedef void (*SOUND_STOP_CALLBACK)( void *pData );	


extern UINT8 AmbientVols[NUM_AMBIENTS];

//extern char szSoundEffects[MAX_SAMPLES][255];


BOOLEAN InitJA2Sound( );
BOOLEAN ShutdownJA2Sound( );
UINT32 PlayJA2Sample( UINT32 usNum, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan );
UINT32 PlayJA2StreamingSample( UINT32 usNum, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan );

UINT32 PlayJA2SampleFromFile( STR8 szFileName, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan );
UINT32 PlayWeaponSound(STR8 szFileName, UINT32 ubVolume, UINT32 uiPan);
UINT32 PlayJA2StreamingSampleFromFile( STR8 szFileName, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan, SOUND_STOP_CALLBACK EndsCallback );

UINT32	PlayJA2Ambient( UINT32 usNum, UINT32 ubVolume, UINT32 ubLoops);
UINT32	PlayJA2AmbientRandom(UINT32 usNum, UINT32 uiTimeMin, UINT32 uiTimeMax);

UINT32 PlaySoldierJA2Sample( SoldierID usID, UINT32 usNum, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan, BOOLEAN fCheck );



UINT32	GetSoundEffectsVolume( );
void	SetSoundEffectsVolume( UINT32 uiNewVolume );

UINT32	GetSpeechVolume( );
void	SetSpeechVolume( UINT32 uiNewVolume );


//Calculates a volume based on the current Speech Volume level 
UINT32 CalculateSpeechVolume( UINT32 uiVolume );


//Calculates a volume based on the current Sound Effects Volume level
UINT32 CalculateSoundEffectsVolume( UINT32 uiVolume );

INT32 SoundDir( INT32 sGridNo );
INT32 SoundVolume( INT8 bInitialVolume, INT32 sGridNo );

// ATE: Warning! Use this sparingly! NOT very robust - can
// have only 1 delayed sound at a time, and uses the global custom
// timer, again, of which can only be one
void PlayDelayedJA2Sample( UINT32 uiDelay, UINT32 usNum, UINT32 usRate, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan );


#define POSITION_SOUND_FROM_SOLDIER	0x00000001
#define POSITION_SOUND_STATIONATY_OBJECT	0x00000002

INT32 NewPositionSnd( INT32 sGridNo, UINT32 uiFlags, UINT32 uiData, UINT32 iSoundToPlay, UINT8 volume );
void DeletePositionSnd( INT32 iPositionSndIndex );
void SetPositionSndsActive( );
void SetPositionSndsInActive( );
void SetPositionSndsVolumeAndPanning( );
void SetPositionSndGridNo( INT32 iPositionSndIndex, INT32 sGridNo );






#endif
