1 #ifndef SOUND_CONTROL_H 2 #define SOUND_CONTROL_H 3 4 #include "JA2Types.h" 5 #include "Random.h" 6 7 #include <string_theory/string> 8 9 10 #define FARLEFT 0 11 #define LEFTSIDE 48 12 #define MIDDLE 64 13 #define MIDDLEPAN 64 14 #define RIGHTSIDE 80 15 #define FARRIGHT 127 16 17 18 #define LOWVOLUME 25 19 #define BTNVOLUME 40 20 #define MIDVOLUME 65 21 #define HIGHVOLUME 127 22 23 24 #define LOOPING 0 25 26 27 // SOUNDS ENUMERATION 28 enum SoundID 29 { 30 NO_SOUND = -1, 31 MISS_1 = 0, // 0 32 MISS_2, // 1 33 MISS_3, // 2 34 MISS_4, // 3 35 MISS_5, // 4 36 MISS_6, // 5 37 MISS_7, // 6 38 MISS_8, // 7 39 MISS_G1, // 8 40 MISS_G2, // 9 41 MISS_KNIFE, // 10 42 FALL_1, // 11 43 FALL_2, // 12 44 FALL_TO_GROUND_1, // 13 45 FALL_TO_GROUND_2, // 14 46 FALL_TO_GROUND_3, // 15 47 HEAVY_FALL_1, // 16 48 BODY_SPLAT_1, // 17 49 GLASS_SHATTER1, // 18 50 GLASS_SHATTER2, // 19 51 DROPEN_1, // 20 52 DROPEN_2, // 21 53 DROPEN_3, // 22 54 DRCLOSE_1, // 23 55 DRCLOSE_2, // 24 56 UNLOCK_DOOR_1, // 25 57 KICKIN_DOOR, // 26 58 BREAK_LOCK, // 27 59 PICKING_LOCK, // 28 60 GARAGE_DOOR_OPEN, // 29 61 GARAGE_DOOR_CLOSE, // 30 62 S_UNUSED_31, // 31 63 S_UNUSED_32, // 32 64 S_UNUSED_33, // 33 65 S_UNUSED_34, // 34 66 CURTAINS_OPEN, // 35 67 CURTAINS_CLOSE, // 36 68 METAL_DOOR_OPEN, // 37 69 METAL_DOOR_CLOSE, // 38 70 WALK_LEFT_OUT, // 39 71 WALK_RIGHT_OUT, // 40 72 WALK_LEFT_OUT2, // 41 73 WALK_RIGHT_OUT2, // 42 74 WALK_LEFT_IN, // 43 75 WALK_RIGHT_IN, // 44 76 WALK_LEFT_IN2, // 45 77 WALK_RIGHT_IN2, // 46 78 WALK_LEFT_ROAD, // 47 79 WALK_RIGHT_ROAD, // 48 80 WALK_LEFT_ROAD2, // 49 81 WALK_RIGHT_ROAD2, // 50 82 CRAWL_1, // 51 83 CRAWL_2, // 52 84 CRAWL_3, // 53 85 CRAWL_4, // 54 86 TARG_REFINE_BEEP, // 55 87 ENDTURN_1, // 56 88 HEADCR_1, // 57 89 DOORCR_1, // 58 90 HEADSPLAT_1, // 59 91 BODY_EXPLODE_1, // 60 92 EXPLOSION_1, // 61 93 CROW_EXPLODE_1, // 62 94 SMALL_EXPLODE_1, // 63 95 HELI_1, // 64 96 BULLET_IMPACT_1, // 65 97 BULLET_IMPACT_2, // 66 98 BULLET_IMPACT_3, // 67 99 CREATURE_BATTLECRY_1, // 68 100 ENTER_WATER_1, // 69 101 ENTER_DEEP_WATER_1, // 70 102 COW_HIT_SND, // 71 103 COW_DIE_SND, // 72 104 RG_ID_IMPRINTED, // 73 105 RG_ID_INVALID, // 74 106 RG_TARGET_SELECTED, // 75 107 CAVE_COLLAPSE, // 76 108 S_RAID_WHISTLE, // 77 109 S_RAID_AMBIENT, // 78 110 S_RAID_DIVE, // 79 111 S_RAID_TB_DIVE, // 80 112 S_RAID_TB_BOMB, // 81 113 S_VECH1_MOVE, // 82 114 S_VECH1_ON, // 83 115 S_VECH1_OFF, // 84 116 S_VECH1_INTO, // 85 117 S_DRYFIRE1, // 86 118 S_WOOD_IMPACT1, // 87 119 S_WOOD_IMPACT2, // 88 120 S_WOOD_IMPACT3, // 89 121 S_PORCELAIN_IMPACT1, // 90 122 S_RUBBER_IMPACT1, // 91 123 S_STONE_IMPACT1, // 92 124 S_WATER_IMPACT1, // 93 125 S_VEG_IMPACT1, // 94 126 S_METAL_IMPACT1, // 95 127 S_METAL_IMPACT2, // 96 128 S_METAL_IMPACT3, // 97 129 S_SLAP_IMPACT, // 98 130 S_RELOAD_REVOLVER, // 99 131 S_RELOAD_PISTOL, // 100 132 S_RELOAD_SMG, // 101 133 S_RELOAD_RIFLE, // 102 134 S_RELOAD_SHOTGUN, // 103 135 S_RELOAD_LMG, // 104 136 S_LNL_REVOLVER, // 105 137 S_LNL_PISTOL, // 106 138 S_LNL_SMG, // 107 139 S_LNL_RIFLE, // 108 140 S_LNL_SHOTGUN, // 109 141 S_LNL_LMG, // 110 142 S_UNUSED_111, // 111 143 S_UNUSED_112, // 112 144 S_UNUSED_113, // 113 145 S_UNUSED_114, // 114 146 S_UNUSED_115, // 115 147 S_UNUSED_116, // 116 148 S_UNUSED_117, // 117 149 S_UNUSED_118, // 118 150 S_UNUSED_119, // 119 151 S_UNUSED_120, // 120 152 S_UNUSED_121, // 121 153 S_UNUSED_122, // 122 154 S_UNUSED_123, // 123 155 S_UNUSED_124, // 124 156 S_UNUSED_125, // 125 157 S_UNUSED_126, // 126 158 S_UNUSED_127, // 127 159 S_UNUSED_128, // 128 160 S_UNUSED_129, // 129 161 S_UNUSED_130, // 130 162 S_UNUSED_131, // 131 163 S_UNUSED_132, // 132 164 S_UNUSED_133, // 133 165 S_UNUSED_134, // 134 166 S_UNUSED_135, // 135 167 S_UNUSED_136, // 136 168 S_UNUSED_137, // 137 169 S_UNUSED_138, // 138 170 S_UNUSED_139, // 139 171 S_UNUSED_140, // 140 172 S_UNUSED_141, // 141 173 S_UNUSED_142, // 142 174 S_UNUSED_143, // 143 175 S_UNUSED_144, // 144 176 S_UNUSED_145, // 145 177 S_UNUSED_146, // 146 178 S_UNUSED_147, // 147 179 S_UNUSED_148, // 148 180 S_UNUSED_149, // 149 181 S_UNUSED_150, // 150 182 S_UNUSED_151, // 151 183 S_UNUSED_152, // 152 184 S_UNUSED_153, // 153 185 S_UNUSED_154, // 154 186 S_UNUSED_155, // 155 187 S_SILENCER_1, // 156 188 S_SILENCER_2, // 157 189 SWOOSH_1, // 158 190 SWOOSH_2, // 159 191 SWOOSH_3, // 160 192 SWOOSH_4, // 161 193 SWOOSH_5, // 162 194 SWOOSH_6, // 163 195 ACR_FALL_1, // 164 196 ACR_STEP_1, // 165 197 ACR_STEP_2, // 166 198 ACR_SWIPE, // 167 199 ACR_EATFLESH, // 168 200 ACR_CRIPPLED, // 169 201 ACR_DIE_PART1, // 170 202 ACR_DIE_PART2, // 171 203 ACR_LUNGE, // 172 204 ACR_SMELL_THREAT, // 173 205 ACR_SMELL_PREY, // 174 206 ACR_SPIT, // 175 207 BCR_DYING, // 176 208 BCR_DRAGGING, // 177 209 BCR_SHRIEK, // 178 210 S_UNUSED_179, // 179 211 LCR_MOVEMENT, // 180 212 LCR_RUPTURE, // 181 213 LQ_SHRIEK, // 182 214 LQ_DYING, // 183 215 LQ_ENRAGED_ATTACK, // 184 216 LQ_RUPTURING, // 185 217 LQ_CRIPPLED, // 186 218 LQ_SMELLS_THREAT, // 187 219 LQ_WHIP_ATTACK, // 188 220 THROW_IMPACT_1, // 189 221 THROW_IMPACT_2, // 190 222 IDLE_SCRATCH, // 191 223 IDLE_ARMPIT, // 192 224 IDLE_BACKCRACK, // 193 225 AUTORESOLVE_FINISHFX, // 194 226 EMAIL_ALERT, // 195 227 ENTERING_TEXT, // 196 228 REMOVING_TEXT, // 197 229 COMPUTER_BEEP2_IN, // 198 230 COMPUTER_BEEP2_OUT, // 199 231 COMPUTER_SWITCH1_IN, // 200 232 COMPUTER_SWITCH1_OUT, // 201 233 VSM_SWITCH1_IN, // 202 234 VSM_SWITCH1_OUT, // 203 235 VSM_SWITCH2_IN, // 204 236 VSM_SWITCH2_OUT, // 205 237 SM_SWITCH1_IN, // 206 238 SM_SWITCH1_OUT, // 207 239 SM_SWITCH2_IN, // 208 240 SM_SWITCH2_OUT, // 209 241 SM_SWITCH3_IN, // 210 242 SM_SWITCH3_OUT, // 211 243 BIG_SWITCH3_IN, // 212 244 BIG_SWITCH3_OUT, // 213 245 KLAXON_ALARM, // 214 246 BOXING_BELL, // 215 247 S_UNUSED_216, // 216 248 ATTACH_TO_GUN, // 217 249 ATTACH_CERAMIC_PLATES, // 218 250 ATTACH_DETONATOR, // 219 251 GRAB_ROOF, // 220 252 LAND_ON_ROOF, // 221 253 S_UNUSED_222, // 222 254 S_UNUSED_223, // 223 255 S_UNUSED_224, // 224 256 OPEN_DEFAULT_OPENABLE, // 225 257 CLOSE_DEFAULT_OPENABLE, // 226 258 FIRE_ON_MERC, // 227 259 GLASS_CRACK, // 228 260 SPIT_RICOCHET, // 229 261 BLOODCAT_HIT_1, // 230 262 BLOODCAT_DIE_1, // 231 263 SLAP_1, // 232 264 ROBOT_BEEP, // 233 265 DOOR_ELECTRICITY, // 234 266 SWIM_1, // 235 267 SWIM_2, // 236 268 KEY_FAILURE, // 237 269 TARGET_OUT_OF_RANGE, // 238 270 OPEN_STATUE, // 239 271 USE_STATUE_REMOTE, // 240 272 USE_WIRE_CUTTERS, // 241 273 DRINK_CANTEEN_FEMALE, // 242 274 BLOODCAT_ATTACK, // 243 275 BLOODCAT_ROAR, // 244 276 ROBOT_GREETING, // 245 277 ROBOT_DEATH, // 246 278 GAS_EXPLODE_1, // 247 279 AIR_ESCAPING_1, // 248 280 OPEN_DRAWER, // 249 281 CLOSE_DRAWER, // 250 282 OPEN_LOCKER, // 251 283 CLOSE_LOCKER, // 252 284 OPEN_WOODEN_BOX, // 253 285 CLOSE_WOODEN_BOX, // 254 286 ROBOT_STOP, // 255 287 WATER_WALK1_IN, // 256 288 WATER_WALK1_OUT, // 257 289 WATER_WALK2_IN, // 258 290 WATER_WALK2_OUT, // 259 291 PRONE_UP_SOUND, // 260 292 PRONE_DOWN_SOUND, // 261 293 KNEEL_UP_SOUND, // 262 294 KNEEL_DOWN_SOUND, // 263 295 PICKING_SOMETHING_UP, // 264 296 COW_FALL, // 265 297 BLOODCAT_GROWL_1, // 266 298 BLOODCAT_GROWL_2, // 267 299 BLOODCAT_GROWL_3, // 268 300 BLOODCAT_GROWL_4, // 269 301 CREATURE_GAS_NOISE, // 270 302 CREATURE_FALL_PART_2, // 271 303 CREATURE_DISSOLVE_1, // 272 304 QUEEN_AMBIENT_NOISE, // 273 305 CREATURE_FALL, // 274 306 CROW_PECKING_AT_FLESH, // 275 307 CROW_FLYING_AWAY, // 276 308 SLAP_2, // 277 309 MORTAR_START, // 278 310 MORTAR_WHISTLE, // 279 311 MORTAR_LOAD, // 280 312 TURRET_MOVE, // 281 313 TURRET_STOP, // 282 314 COW_FALL_2, // 283 315 KNIFE_IMPACT, // 284 316 EXPLOSION_ALT_BLAST_1, // 285 317 EXPLOSION_BLAST_2, // 286 318 DRINK_CANTEEN_MALE, // 287 319 USE_X_RAY_MACHINE, // 288 320 CATCH_OBJECT, // 289 321 FENCE_OPEN, // 290 322 323 NUM_SAMPLES 324 }; 325 326 327 const char * getSoundSample(SoundID soundId); 328 329 template<SoundID, SoundID, bool> struct SoundRangeHelper; 330 template<SoundID first, SoundID last> struct SoundRangeHelper<first, last, true> 331 { 332 operator SoundID() { return static_cast<SoundID>(first + Random(last - first + 1)); } 333 }; 334 335 336 template<SoundID first, SoundID last> static inline SoundID SoundRange() 337 { 338 return SoundRangeHelper<first, last, first < last>(); 339 } 340 341 342 enum AmbientSoundID 343 { 344 LIGHTNING_1 = 0, 345 LIGHTNING_2, 346 RAIN_1, 347 BIRD_1, 348 BIRD_2, 349 CRICKETS_1, 350 CRICKETS_2, 351 CRICKET_1, 352 CRICKET_2, 353 OWL_1, 354 OWL_2, 355 OWL_3, 356 NIGHT_BIRD_1, 357 NIGHT_BIRD_2, 358 359 NUM_AMBIENTS 360 }; 361 362 typedef void (*SOUND_STOP_CALLBACK)( void *pData ); 363 364 365 void ShutdownJA2Sound(void); 366 UINT32 PlayJA2Sample(const char *sample, UINT32 const ubVolume, UINT32 const ubLoops, UINT32 const uiPan); 367 UINT32 PlayJA2Sample(SoundID, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan); 368 UINT32 PlayJA2StreamingSample(SoundID, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan); 369 370 UINT32 PlayJA2SampleFromFile(const char* szFileName, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan); 371 UINT32 PlayJA2StreamingSampleFromFile(const char* szFileName, UINT32 ubVolume, UINT32 ubLoops, UINT32 uiPan, SOUND_STOP_CALLBACK EndsCallback); 372 373 UINT32 PlayJA2Ambient(AmbientSoundID, UINT32 ubVolume, UINT32 ubLoops); 374 375 UINT32 PlayLocationJA2SampleFromFile(UINT16 grid_no, const char* filename, UINT32 base_vol, UINT32 loops); 376 377 UINT32 PlayLocationJA2Sample(UINT16 grid_no, SoundID, UINT32 base_vol, UINT32 loops); 378 UINT32 PlayLocationJA2Sample(UINT16 grid_no, const ST::string &sample, UINT32 base_vol, UINT32 loops); 379 UINT32 PlayLocationJA2StreamingSample(UINT16 grid_no, SoundID, UINT32 base_vol, UINT32 loops); 380 UINT32 PlaySoldierJA2Sample(SOLDIERTYPE const* s, SoundID, UINT32 base_vol, UINT32 ubLoops, BOOLEAN fCheck); 381 382 383 UINT32 GetSoundEffectsVolume(void); 384 void SetSoundEffectsVolume( UINT32 uiNewVolume ); 385 386 UINT32 GetSpeechVolume(void); 387 void SetSpeechVolume( UINT32 uiNewVolume ); 388 389 390 //Calculates a volume based on the current Speech Volume level 391 UINT32 CalculateSpeechVolume( UINT32 uiVolume ); 392 393 394 //Calculates a volume based on the current Sound Effects Volume level 395 UINT32 CalculateSoundEffectsVolume( UINT32 uiVolume ); 396 397 INT8 SoundDir( INT16 sGridNo ); 398 INT8 SoundVolume( INT8 bInitialVolume, INT16 sGridNo ); 399 400 401 INT32 NewPositionSnd(INT16 sGridNo, SOLDIERTYPE const* SoundSource, SoundID); 402 void DeletePositionSnd( INT32 iPositionSndIndex ); 403 void SetPositionSndsActive(void); 404 void SetPositionSndsInActive(void); 405 void SetPositionSndsVolumeAndPanning(void); 406 void SetPositionSndGridNo( INT32 iPositionSndIndex, INT16 sGridNo ); 407 408 #endif 409