summaryrefslogtreecommitdiffstats
path: root/src/audio/AudioManager.h
blob: 4c02d07ff9d5101d3af7054d503535893f351a05 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
#pragma once

#include "AudioSamples.h"
#include "DMAudio.h"
#include "common.h"

class tActiveSample
{
public:
	int32 m_nEntityIndex;
	int32 field_4;
	int32 m_nSampleIndex;
	uint8 m_bBankIndex;
	uint8 m_bIsDistant;
	uint8 field_14;
	uint8 field_15;
	int32 field_16;
	int32 m_nFrequency;
	uint8 m_bVolume;
	uint8 field_25;
	uint8 field_26;
	uint8 field_27;
	float m_fDistance;
	int32 m_nLoopCount;
	int32 m_nLoopStart;
	int32 m_nLoopEnd;
	uint8 m_bEmittingVolume;
	uint8 field_45;
	uint8 field_46;
	uint8 field_47;
	float field_48;
	float m_fSoundIntensity;
	uint8 field_56;
	uint8 field_57;
	uint8 field_58;
	uint8 field_59;
	CVector m_vecPos;
	uint8 m_bReverbFlag;
	uint8 m_bLoopsRemaining;
	uint8 m_bRequireReflection;
	uint8 m_bOffset;
	int32 field_76;
	uint8 m_bIsProcessed;
	uint8 m_bLoopEnded;
	uint8 field_82;
	uint8 field_83;
	int32 calculatedVolume;
	uint8 field_88;
	uint8 field_89;
	uint8 field_90;
	uint8 field_91;
};

static_assert(sizeof(tActiveSample) == 0x5c, "tActiveSample: error");

enum eAudioType : int32 {
	AUDIOTYPE_PHYSICAL = 0,
	AUDIOTYPE_EXPLOSION = 1,
	AUDIOTYPE_FIRE = 2,
	AUDIOTYPE_WEATHER = 3,
	AUDIOTYPE_CRANE = 4,
	AUDIOTYPE_ONE_SHOT = 5,
	AUDIOTYPE_BRIDGE = 6,
	AUDIOTYPE_COLLISION = 7,
	AUDIOTYPE_FRONTEND = 8,
	AUDIOTYPE_PROJECTILE = 9,
	AUDIOTYPE_GARAGE = 10,
	AUDIOTYPE_HYDRANT = 11,
	AUDIOTYPE_WATER_CANNON = 12,
	AUDIOTYPE_D = 13,
	TOTAL_AUDIO_TYPES = 14,
};

class CPhysical;

class tAudioEntity
{
public:
	eAudioType m_nType;
	CPhysical *m_pEntity;
	bool m_bIsUsed;
	uint8 m_bStatus;
	int16 m_awAudioEvent[4];
	uint8 gap_18[2];
	float m_afVolume[4];
	uint8 field_24;
	uint8 field_25[3];
};

static_assert(sizeof(tAudioEntity) == 0x28, "tAudioEntity: error");

class tPedComment
{
public:
	int m_nSampleIndex;
	int field_4;
	CVector m_vecPos;
	float m_fDistance;
	uint8 m_bVolume;
	uint8 field_25;
	uint8 gap_26[2];
};

static_assert(sizeof(tPedComment) == 0x1c, "tPedComment: error");

class cPedComments
{
public:
	tPedComment m_asPedComments[40];
	uint8 field_1120[40];
	uint8 field_1160[2];
	uint8 field_1162;
	uint8 gap_1163[1];
};

static_assert(sizeof(cPedComments) == 0x48c, "cPedComments: error");

class CEntity;

class cAudioCollision
{
public:
	CEntity *m_pEntity1;
	CEntity *m_pEntity2;
	uint8 m_bSurface1;
	uint8 m_bSurface2;
	uint8 field_10;
	uint8 field_11;
	float m_fIntensity1;
	float m_fIntensity2;
	CVector m_vecPosition;
	float m_fDistance;
	int32 m_nBaseVolume;
};

static_assert(sizeof(cAudioCollision) == 0x28, "cAudioCollision: error");

class cAudioCollisionManager
{
public:
	cAudioCollision m_asCollisions1[10];
	cAudioCollision m_asCollisions2[10];
	uint8 m_bIndicesTable[10];
	uint8 m_bCollisionsInQueue;
	uint8 gap_811;
	cAudioCollision m_sQueue;
};

static_assert(sizeof(cAudioCollisionManager) == 0x354, "cAudioCollisionManager: error");

class cMissionAudio
{
public:
	CVector m_vecPos;
	uint8 field_12;
	uint8 gap_13[3];
	int m_nSampleIndex;
	uint8 m_bLoadingStatus;
	uint8 m_bPlayStatus;
	uint8 field_22;
	uint8 field_23;
	int field_24;
	bool m_bIsPlayed;
	uint8 field_29;
	uint8 field_30;
	uint8 field_31;
};

class cVehicleParams;

static_assert(sizeof(cMissionAudio) == 0x20, "cMissionAudio: error");

class cAudioManager
{
public:
	bool m_bIsInitialised;
	uint8 field_1;
	uint8 field_2;
	uint8 m_bActiveSamples;
	uint8 field_4;
	bool m_bDynamicAcousticModelingStatus;
	uint8 field_6;
	uint8 field_7;
	float speedOfSound;
	bool m_bTimerJustReset;
	uint8 field_13;
	uint8 field_14;
	uint8 field_15;
	int32 m_nTimer;
	tActiveSample m_sQueueSample;
	uint8 m_bActiveSampleQueue;
	uint8 gap_109[3];
	tActiveSample m_asSamples[2][27];
	uint8 m_abSampleQueueIndexTable[2][27];
	uint8 m_bSampleRequestQueuesStatus[2];
	tActiveSample m_asActiveSamples[27];
	tAudioEntity m_asAudioEntities[200];
	int32 m_anAudioEntityIndices[200];
	int32 m_nAudioEntitiesTotal;
	CVector m_avecReflectionsPos[5];
	float m_afReflectionsDistances[5];
	int32 m_anScriptObjectEntityIndices[40];
	int32 m_nScriptObjectEntityTotal;
	cPedComments m_sPedComments;
	int32 m_nFireAudioEntity;
	int32 m_nWaterCannonEntity;
	int32 m_nPoliceChannelEntity;
	uint8 gap45B8[444];
	int32 m_nFrontEndEntity;
	int32 m_nCollisionEntity;
	cAudioCollisionManager m_sCollisionManager;
	int32 m_nProjectileEntity;
	int32 m_nBridgeEntity;
	cMissionAudio m_sMissionAudio;
	int32 m_anRandomTable[5];
	uint8 field_19192;
	uint8 m_bUserPause;
	uint8 m_bPreviousUserPause;
	uint8 field_19195;
	int32 m_nTimeOfRecentCrime;

	void AddDetailsToRequestedOrderList(uint8 sample);
	void AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sample, uint8 unk1,
	                        uint8 unk2, bool notLooping);
	void AddReflectionsToRequestedQueue();
	void AddReleasingSounds(); // todo
	void AddSampleToRequestedQueue();
	void AgeCrimes(); // todo
	int8 AutoDetect3DProviders();

	void CalculateDistance(bool *ptr, float dist);
	bool CheckForAnAudioFileOnCD();
	void ClearMissionAudio();
	void ClearRequestedQueue();
	int32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2,
	                                      float speedMultiplier);
	int32 ComputePan(float, CVector *); // todo
	uint32 ComputeVolume(int emittingVolume, float soundIntensity, float distance);
	int32 CreateEntity(int32 type, CPhysical *entity);

	void DestroyAllGameCreatedEntities(); // todo, needs cAudioScriptObject
	void DestroyEntity(int32 id);
	void DoPoliceRadioCrackle(); // todo hook

	void GenerateIntegerRandomNumberTable();

	float GetDistanceSquared(CVector *v); // todo hook

	// done

	void TranslateEntity(CVector *v1, CVector *v2); // todo hook

	void Initialise();
	void PostInitialiseGameSpecificSetup();
	void InitialisePoliceRadioZones();       // todo
	void ResetAudioLogicTimers(int32 timer); // todo

	void Terminate();

	char GetMissionScriptPoliceAudioPlayingStatus();
	bool GetMissionAudioLoadingStatus();

	uint8 GetNum3DProvidersAvailable();
	bool IsMP3RadioChannelAvailable();
	uint8 GetCDAudioDriveLetter();

	void SetEffectsMasterVolume(uint8 volume);
	void SetMusicMasterVolume(uint8 volume);
	void SetEffectsFadeVol(uint8 volume);
	void SetMusicFadeVol(uint8 volume);

	void SetSpeakerConfig(int32 conf);

	bool SetupJumboEngineSound(uint8, int32); // todo
	void PreInitialiseGameSpecificSetup();
	void SetMissionScriptPoliceAudio(int32 sfx);

	bool UsesSiren(int32 model);
	bool UsesSirenSwitching(int32 model);

	bool MissionScriptAudioUsesPoliceChannel(int32 soundMission);

	uint8 Get3DProviderName(uint8 id);

	bool SetupJumboFlySound(uint8);          // todo
	bool SetupJumboTaxiSound(uint8);         // todo
	bool SetupJumboWhineSound(uint8, int32); // todo

	void PlayLoadedMissionAudio();

	void SetMissionAudioLocation(float x, float y, float z);

	void ResetPoliceRadio();

	void InterrogateAudioEntities();

	bool UsesReverseWarning(int32 model);
	bool HasAirBrakes(int32 model);

	int32 GetJumboTaxiFreq();

	bool IsMissionAudioSampleFinished();

	void InitialisePoliceRadio(); // todo

	int32 RandomDisplacement(uint32 seed);

	void ReleaseDigitalHandle();
	void RequireDigitalHandle();
	void SetDynamicAcousticModelingStatus(bool status);

	bool IsAudioInitialised() const;

	void SetEntityStatus(int32 id, bool status);

	void PreTerminateGameSpecificShutdown();
	void PostTerminateGameSpecificShutdown();

	void PlayerJustGotInCar();
	void PlayerJustLeftCar();

	void Service();
	void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample, uint32 maxOffset);

	uint32 GetPlayerTalkSfx(int16 sound);
	uint32 GetCopTalkSfx(int16 sound);
	uint32 GetSwatTalkSfx(int16 sound);
	uint32 GetFBITalkSfx(int16 sound);
	uint32 GetArmyTalkSfx(int16 sound);
	uint32 GetMedicTalkSfx(int16 sound);
	uint32 GetFiremanTalkSfx(int16 sound);
	uint32 GetNormalMaleTalkSfx(int16 sound);
	uint32 GetTaxiDriverTalkSfx(int16 sound);
	uint32 GetPimpTalkSfx(int16 sound);
	uint32 GetMafiaTalkSfx(int16 sound);
	uint32 GetTriadTalkSfx(int16 sound);
	uint32 GetDiabloTalkSfx(int16 sound);
	uint32 GetYakuzaTalkSfx(int16 sound);
	uint32 GetYardieTalkSfx(int16 sound);
	uint32 GetColumbianTalkSfx(int16 sound);
	uint32 GetHoodTalkSfx(int16 sound);
	uint32 GetBlackCriminalTalkSfx(int16 sound);
	uint32 GetWhiteCriminalTalkSfx(int16 sound);
	uint32 GetMaleNo2TalkSfx(int16 sound);
	uint32 GetBlackProjectMaleTalkSfx(int16 sound, int32 model);
	uint32 GetWhiteFatMaleTalkSfx(int16 sound);
	uint32 GetBlackFatMaleTalkSfx(int16 sound);
	uint32 GetBlackCasualFemaleTalkSfx(int16 sound);
	uint32 GetWhiteCasualFemaleTalkSfx(int16 sound);
	uint32 GetFemaleNo3TalkSfx(int16 sound);
	uint32 GetBlackFatFemaleTalkSfx(int16 sound);
	uint32 GetWhiteFatFemaleTalkSfx(int16 sound);
	uint32 GetBlackFemaleProstituteTalkSfx(int16 sound);
	uint32 GetWhiteFemaleProstituteTalkSfx(int16 sound);
	uint32 GetBlackProjectFemaleOldTalkSfx(int16 sound);
	uint32 GetBlackProjectFemaleYoungTalkSfx(int16 sound);
	uint32 GetChinatownMaleOldTalkSfx(int16 sound);
	uint32 GetChinatownMaleYoungTalkSfx(int16 sound);
	uint32 GetChinatownFemaleOldTalkSfx(int16 sound);
	uint32 GetChinatownFemaleYoungTalkSfx(int16 sound);
	uint32 GetLittleItalyMaleTalkSfx(int16 sound);
	uint32 GetLittleItalyFemaleOldTalkSfx(int16 sound);
	uint32 GetLittleItalyFemaleYoungTalkSfx(int16 sound);
	uint32 GetWhiteDockerMaleTalkSfx(int16 sound);
	uint32 GetBlackDockerMaleTalkSfx(int16 sound);
	uint32 GetScumMaleTalkSfx(int16 sound);
	uint32 GetScumFemaleTalkSfx(int16 sound);
	uint32 GetWhiteWorkerMaleTalkSfx(int16 sound);
	uint32 GetBlackWorkerMaleTalkSfx(int16 sound);
	uint32 GetBusinessMaleYoungTalkSfx(int16 sound, int32 model);
	uint32 GetBusinessMaleOldTalkSfx(int16 sound);
	uint32 GetWhiteBusinessFemaleTalkSfx(int16 sound, int32 model);
	uint32 GetBlackBusinessFemaleTalkSfx(int16 sound);
	uint32 GetSupermodelMaleTalkSfx(int16 sound);
	uint32 GetSupermodelFemaleTalkSfx(int16 sound);
	uint32 GetStewardMaleTalkSfx(int16 sound);
	uint32 GetStewardFemaleTalkSfx(int16 sound);
	uint32 GetFanMaleTalkSfx(int16 sound, int32 model);
	uint32 GetFanFemaleTalkSfx(int16 sound);
	uint32 GetHospitalMaleTalkSfx(int16 sound);
	uint32 GetHospitalFemaleTalkSfx(int16 sound);
	uint32 GetWhiteConstructionWorkerTalkSfx(int16 sound);
	uint32 GetBlackConstructionWorkerTalkSfx(int16 sound);
	uint32 GetShopperFemaleTalkSfx(int16 sound, int32 model);
	uint32 GetStudentMaleTalkSfx(int16 sound);
	uint32 GetStudentFemaleTalkSfx(int16 sound);
	uint32 GetCasualMaleOldTalkSfx(int16 sound);

	uint32 GetSpecialCharacterTalkSfx(int32 modelIndex, int32 sound);
	uint32 GetEightTalkSfx(int16 sound);
	uint32 GetFrankieTalkSfx(int16 sound);
	uint32 GetMistyTalkSfx(int16 sound);
	uint32 GetOJGTalkSfx(int16 sound);
	uint32 GetCatatalinaTalkSfx(int16 sound);
	uint32 GetBomberTalkSfx(int16 sound);
	uint32 GetSecurityGuardTalkSfx(int16 sound);
	uint32 GetChunkyTalkSfx(int16 sound);

	uint32 GetGenericMaleTalkSfx(int16 sound);
	uint32 GetGenericFemaleTalkSfx(int16 sound);

	void ProcessActiveQueues();                              // todo
	bool ProcessAirBrakes(cVehicleParams *params);           // todo requires CVehicle
	void ProcessAirportScriptObject(uint8 sound);            // done
	bool ProcessBoatEngine(cVehicleParams *params);          // todo requires CVehicle
	bool ProcessBoatMovingOverWater(cVehicleParams *params); // todo requires CVehicle
	void ProcessBridge();                                    // todo
	void ProcessBridgeMotor();                               // done
	void ProcessBridgeOneShots();                            // todo requires CBridge
	void ProcessBridgeWarning();                             // done
	bool ProcessCarBombTick(void *);                         // todo requires CVehicle
	void ProcessCesna(void *);                               // todo requires CPlane
	void ProcessCinemaScriptObject(uint8 sound);             // done
	void ProcessCrane();                                     // todo requires CCrane
	void ProcessDocksScriptObject(uint8 sound);              // done
	//	bool ProcessEngineDamage(void *); //todo requires CVehicle
	void ProcessEntity(int32 sound);         // done
	void ProcessExplosions(int32 explosion); // todo requires CExplosion
	void ProcessFireHydrant();               // done
	void ProcessFires(int32 entity);         // todo requires gFireManager
	void ProcessFrontEnd();                  // done
	void ProcessGarages();                   // todo
	//	bool ProcessHelicopter(void *); // todo requires CVehicle
	void ProcessHomeScriptObject(uint8 sound);
	//	void ProcessJumbo(void *);
	//	void ProcessJumboAccel(void *);
	//	void ProcessJumboDecel(void *);
	void ProcessJumboFlying();
	//	void ProcessJumboLanding(void *);
	//	void ProcessJumboTakeOff(void *);
	void ProcessJumboTaxi(); // done
	//	void ProcessLaunderetteScriptObject(uint8 sound);
	//	void ProcessLoopingScriptObject(uint8 sound);
	//	void ProcessMissionAudio();
	//	void ProcessModelVehicle(void *);
	//	void ProcessOneShotScriptObject(uint8 sound);
	void ProcessPed(CPhysical *p); // todo
	//	void ProcessPedHeadphones(void *);
	//	void ProcessPedOneShots(void *);
	void ProcessPhysical(int32 id); // done
	void ProcessPlane(void *);      // todo
	//	void ProcessPlayersVehicleEngine(void *, void *);
	//	void ProcessPoliceCellBeatingScriptObject(uint8 sound);
	//	void ProcessPornCinema(uint8 sound);
	void ProcessProjectiles(); // todo
	//	void ProcessRainOnVehicle(void *);
	//	void ProcessReverb();
	//	bool ProcessReverseGear(void *);
	//	void ProcessSawMillScriptObject(uint8 sound);
	void ProcessScriptObject(int32 id); // todo
	//	void ProcessShopScriptObject(uint8 sound);
	//	void ProcessSpecial();
	//	bool ProcessTrainNoise(void *);
	void ProcessVehicle(void *); // todo
	//	bool ProcessVehicleDoors(void *);
	//	bool ProcessVehicleEngine(void *);
	//	void ProcessVehicleHorn(void *);
	//	void ProcessVehicleOneShots(void *);
	//	bool ProcessVehicleReverseWarning(void *);
	//	bool ProcessVehicleRoadNoise(void *);
	//	void ProcessVehicleSirenOrAlarm(void *);
	//	void ProcessVehicleSkidding(void *);
	void ProcessWaterCannon(int32); // todo
	void ProcessWeather(int32 id);  // todo
	                                //	bool ProcessWetRoadNoise(void *);
	                                //	void ProcessWorkShopScriptObject(uint8 sound);
};

static_assert(sizeof(cAudioManager) == 0x4B14, "cAudioManager: error");

extern cAudioManager &AudioManager;
extern cAudioManager &Players;