summaryrefslogblamecommitdiffstats
path: root/src/audio/AudioManager.h
blob: 4c02d07ff9d5101d3af7054d503535893f351a05 (plain) (tree)
1
2
3
4
5
6
7
8
9

            
                         
                    



                   
       








                             
                        


                       
                          


                           
                                


                       

                                



                       
                         


                                   
                        









                               





















                                                                     

                

                  
       
                           
                             
                       
                        
                                
                        
                            

                          










                                                                   


                        



                                                                 

                  

                                        



                             





                                                                    

                     


                            



                          



                              
                            



                                                                         

                            


                                            


                                   


                                 
                                                                                        
 


                   
                         

                        
                           



                               
                     
                         


                       

  

                     





                                                                     



                               
                                              

                      
                           
                               



                       
                                     
                                   



                                               

                                            

                                          

                                          

                                                
                                    





                                     
                                                   

                                  
                                      





                                   
 
                                                          

                                                                                            
                                              



                                          
 






                                                                                               
                                                                                       










                                                                               
 

                                                                    

                                               

                                                        


                         



                                                        









                                                  



                                                         






                                                                     











                                                                




                                             

                                            
                                             
 

                                              
                                    
                                    



                                                           


                                                    
                                                 
 

                                  
 
                       
                                                                                            















                                                 



                                                    












































                                                                       









                                                                         
                                                  
                                                    






















                                                                                          
                                                  







































                                                                       

                                                                                              

  


                                                                       
                              
#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;