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