diff options
Diffstat (limited to '')
-rw-r--r-- | src/audio/AudioManager.cpp | 1319 | ||||
-rw-r--r-- | src/audio/AudioManager.h | 130 | ||||
-rw-r--r-- | src/audio/AudioSamples.h | 130 | ||||
-rw-r--r-- | src/audio/DMAudio.h | 14 | ||||
-rw-r--r-- | src/audio/SampleManager.cpp | 22 | ||||
-rw-r--r-- | src/audio/SampleManager.h | 8 |
6 files changed, 1355 insertions, 268 deletions
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 51f45e16..a76c475d 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -3,19 +3,24 @@ #include "AudioManager.h" +#include "Automobile.h" +#include "Camera.h" #include "DMAudio.h" +#include "Garages.h" #include "ModelIndices.h" #include "MusicManager.h" #include "Ped.h" #include "Physical.h" #include "PlayerPed.h" #include "SampleManager.h" +#include "Stats.h" #include "Vehicle.h" #include "World.h" +uint32 *audioLogicTimers = (uint32 *)0x6508A0; + // TODO: where is this used? Is this the right file? -enum eVehicleModel -{ +enum eVehicleModel { LANDSTAL, IDAHO, STINGER, @@ -96,6 +101,172 @@ constexpr int maxVolume = 127; char &g_nMissionAudioPlayingStatus = *(char *)0x60ED88; void +cAudioManager::AddDetailsToRequestedOrderList(uint8 sample) +{ + int32 offset; + uint32 i = 0; + if(sample != 0) { + for(; i < sample; i++) { + offset = 27 * m_bActiveSampleQueue; + if(m_asSamples[offset + m_abSampleQueueIndexTable[i + offset]] + .calculatedVolume > m_asSamples[offset + sample].calculatedVolume) + break; + } + if(i < sample) { + memmove(&m_abSampleQueueIndexTable[offset + 1 + i], + &m_abSampleQueueIndexTable[offset + i], m_bActiveSamples - i - 1); + } + } + m_abSampleQueueIndexTable[27 * m_bActiveSampleQueue + i] = sample; +} + +void +cAudioManager::AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sample, uint8 unk1, + uint8 unk2, bool notLooping) +{ + m_sQueueSample.m_bVolume = ComputeVolume(emittingVolume, 50.f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = unk2; + m_sQueueSample.m_nSampleIndex = sample; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 0; + m_sQueueSample.m_nFrequency = freq; + if(notLooping) { + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.field_76 = 8; + } else { + m_sQueueSample.m_nLoopCount = 1; + } + m_sQueueSample.m_bEmittingVolume = emittingVolume; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 6.0f; + m_sQueueSample.m_fSoundIntensity = 50.0f; + m_sQueueSample.field_56 = 0; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } +} + +void +cAudioManager::AddReflectionsToRequestedQueue() +{ + float reflectionDistance; + int32 noise; + uint8 emittingVolume = emittingVolume = + (m_sQueueSample.m_bVolume >> 1) + (m_sQueueSample.m_bVolume >> 3); + + for(uint32 i = 0; i < 5u; i++) { + reflectionDistance = m_afReflectionsDistances[i]; + if(reflectionDistance > 0.0f && reflectionDistance < 100.f && + reflectionDistance < m_sQueueSample.m_fSoundIntensity) { + m_sQueueSample.m_bLoopsRemaining = + (reflectionDistance * + 0.38873f); // @todo assert value, here used from VC + if(m_sQueueSample.m_bLoopsRemaining > 5u) { + m_sQueueSample.m_fDistance = m_afReflectionsDistances[i]; + m_sQueueSample.m_bEmittingVolume = emittingVolume; + m_sQueueSample.m_bVolume = + ComputeVolume(emittingVolume, m_sQueueSample.m_fSoundIntensity, + m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume > emittingVolume >> 4) { + m_sQueueSample.field_4 += ((i + 1) << 8); + if(m_sQueueSample.m_nLoopCount) { + noise = RandomDisplacement( + m_sQueueSample.m_nFrequency >> 5); + if(noise <= 0) + m_sQueueSample.m_nFrequency += noise; + else + m_sQueueSample.m_nFrequency -= noise; + } + m_sQueueSample.field_16 += 20; + m_sQueueSample.m_vecPos.x = m_avecReflectionsPos[i].x; + m_sQueueSample.m_vecPos.y = m_avecReflectionsPos[i].y; + m_sQueueSample.m_vecPos.z = m_avecReflectionsPos[i].z; + AddSampleToRequestedQueue(); + } + } + } + } +} +#if 0 +WRAPPER void +cAudioManager::AddReleasingSounds() +{ + EAXJMP(0x57B8D0); +} +#else +void +cAudioManager::AddReleasingSounds() +{ + bool isFirstSampleQueue; + int32 calculatedIndex; + tActiveSample *sample; + uint8 field_76; + uint8 field_88; + int sampleQueue; + bool toProcess[44]; + isFirstSampleQueue = m_bActiveSampleQueue == 0; + + cAudioManager *s = (this + 2484 * isFirstSampleQueue); // wtf + + for(uint32 i = 0; i < m_bSampleRequestQueuesStatus[isFirstSampleQueue]; i++) { + calculatedIndex = i + 27 * isFirstSampleQueue; + sample = &s->m_asSamples[m_abSampleQueueIndexTable[calculatedIndex]]; + if(!s->m_asSamples[m_abSampleQueueIndexTable[calculatedIndex]].m_bLoopEnded) { + toProcess[i] = 0; + sampleQueue = m_bActiveSampleQueue; + for(uint8 j = 0; j < m_bSampleRequestQueuesStatus[m_bActiveSampleQueue]; + j++) { + if(sample->m_nEntityIndex == + m_asSamples[27 * sampleQueue + + m_abSampleQueueIndexTable[27 * sampleQueue + j]] + .m_nEntityIndex && + sample->field_4 == + m_asSamples[27 * sampleQueue + + m_abSampleQueueIndexTable[27 * sampleQueue + j]] + .field_4) { + toProcess[i] = 1; + break; + } + } + if(!toProcess[i]) { + if(sample->field_4 <= 255u || !sample->m_bLoopsRemaining) { + field_76 = sample->field_76; + if(!field_76) continue; + if(!sample->m_nLoopCount) { + uint8 &vol = sample->m_bVolume; + if(sample->field_88 == -1) { + sample->field_88 = vol / field_76; + if(sample->field_88 <= 0) + sample->field_88 = 1; + } + field_88 = sample->field_88; + if(vol <= field_88) { + sample->field_76 = 0; + continue; + } + vol -= field_88; + } + --sample->field_76; + if(field_2) { + if(sample->field_16 < 20u) ++sample->field_16; + } + sample->field_56 = 0; + } + memcpy(&m_sQueueSample, sample, 92); + AddSampleToRequestedQueue(); + } + } + } +} +#endif + +void cAudioManager::AddSampleToRequestedQueue() { int32 calculatedVolume; @@ -164,64 +335,86 @@ cAudioManager::AddSampleToRequestedQueue() } } +WRAPPER void -cAudioManager::AddDetailsToRequestedOrderList(uint8 sample) +cAudioManager::AgeCrimes() { - int32 offset; - uint32 i = 0; - if(sample != 0) { - for(; i < sample; i++) { - offset = 27 * m_bActiveSampleQueue; - if(m_asSamples[offset + m_abSampleQueueIndexTable[i + offset]] - .calculatedVolume > m_asSamples[offset + sample].calculatedVolume) - break; - } - if(i < sample) { - memmove(&m_abSampleQueueIndexTable[offset + 1 + i], - &m_abSampleQueueIndexTable[offset + i], m_bActiveSamples - i - 1); - } + EAXJMP(0x580AF0); +} + +int8 +cAudioManager::AutoDetect3DProviders() +{ + if(m_bIsInitialised) return cSampleManager.AutoDetect3DProviders(); + + return -1; +} + +void +cAudioManager::CalculateDistance(bool *ptr, float dist) +{ + if(*ptr == false) { + m_sQueueSample.m_fDistance = sqrt(dist); + *ptr = true; } - m_abSampleQueueIndexTable[27 * m_bActiveSampleQueue + i] = sample; +} + +bool +cAudioManager::CheckForAnAudioFileOnCD() +{ + return cSampleManager.CheckForAnAudioFileOnCD(); } void -cAudioManager::AddReflectionsToRequestedQueue() +cAudioManager::ClearMissionAudio() { - float reflectionDistance; - int32 noise; - uint8 emittingVolume = emittingVolume = - (m_sQueueSample.m_bVolume >> 1) + (m_sQueueSample.m_bVolume >> 3); + if(m_bIsInitialised) { + m_sMissionAudio.m_nSampleIndex = NO_SAMPLE; + m_sMissionAudio.m_bLoadingStatus = 0; + m_sMissionAudio.m_bPlayStatus = 0; + m_sMissionAudio.field_22 = 0; + m_sMissionAudio.m_bIsPlayed = false; + m_sMissionAudio.field_12 = 1; + m_sMissionAudio.field_24 = 0; + } +} - for(uint32 i = 0; i < 5u; i++) { - reflectionDistance = m_afReflectionsDistances[i]; - if(reflectionDistance > 0.0f && reflectionDistance < 100.f && - reflectionDistance < m_sQueueSample.m_fSoundIntensity) { - m_sQueueSample.m_bLoopsRemaining = (reflectionDistance * 0.38873f); // @todo assert value - if(m_sQueueSample.m_bLoopsRemaining > 5u) { - m_sQueueSample.m_fDistance = m_afReflectionsDistances[i]; - m_sQueueSample.m_bEmittingVolume = emittingVolume; - m_sQueueSample.m_bVolume = - ComputeVolume(emittingVolume, m_sQueueSample.m_fSoundIntensity, - m_sQueueSample.m_fDistance); - if(m_sQueueSample.m_bVolume > emittingVolume >> 4) { - m_sQueueSample.field_4 += ((i + 1) << 8); - if(m_sQueueSample.m_nLoopCount) { - noise = RandomDisplacement( - m_sQueueSample.m_nFrequency >> 5); - if(noise <= 0) - m_sQueueSample.m_nFrequency += noise; - else - m_sQueueSample.m_nFrequency -= noise; - } - m_sQueueSample.field_16 += 20; - m_sQueueSample.m_vecPos.x = m_avecReflectionsPos[i].x; - m_sQueueSample.m_vecPos.y = m_avecReflectionsPos[i].y; - m_sQueueSample.m_vecPos.z = m_avecReflectionsPos[i].z; - AddSampleToRequestedQueue(); +void +cAudioManager::ClearRequestedQueue() +{ + for(int32 i = 0; i < m_bActiveSamples; i++) { + m_abSampleQueueIndexTable[i + 27 * m_bActiveSampleQueue] = m_bActiveSamples; + } + m_bSampleRequestQueuesStatus[m_bActiveSampleQueue] = 0; +} + +int32 +cAudioManager::ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, + float speedMultiplier) +{ + uint32 newFreq = oldFreq; + if(!TheCamera.Get_Just_Switched_Status() && speedMultiplier != 0.0f) { + float dist = position2 - position1; + if(dist != 0.0f) { + float speedOfSource = (dist / field_19195) * speedMultiplier; + if(speedOfSound > fabsf(speedOfSource)) { + if(speedOfSource < 0.0f) { + speedOfSource = max(speedOfSource, -1.5f); + } else { + speedOfSource = min(speedOfSource, 1.5f); } + newFreq = (oldFreq * speedOfSound) / (speedOfSource + speedOfSound); } } } + return newFreq; +} + +WRAPPER +int32 +cAudioManager::ComputePan(float, CVector *) +{ + EAXJMP(0x57AD20); } uint32 @@ -238,6 +431,129 @@ cAudioManager::ComputeVolume(int emittingVolume, float soundIntensity, float dis return emittingVolume; } +int32 +cAudioManager::CreateEntity(int32 type, CPhysical *entity) +{ + if(!m_bIsInitialised) return -4; + if(!entity) return -2; + if(type >= TOTAL_AUDIO_TYPES) return -1; + for(uint32 i = 0; i < 200; i++) { + if(!m_asAudioEntities[i].m_bIsUsed) { + m_asAudioEntities[i].m_bIsUsed = true; + m_asAudioEntities[i].m_bStatus = 0; + m_asAudioEntities[i].m_nType = (eAudioType)type; + m_asAudioEntities[i].m_pEntity = entity; + m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_TOTAL_PED_SOUNDS; + m_asAudioEntities[i].m_awAudioEvent[1] = SOUND_TOTAL_PED_SOUNDS; + m_asAudioEntities[i].m_awAudioEvent[2] = SOUND_TOTAL_PED_SOUNDS; + m_asAudioEntities[i].m_awAudioEvent[3] = SOUND_TOTAL_PED_SOUNDS; + m_asAudioEntities[i].field_24 = 0; + m_anAudioEntityIndices[m_nAudioEntitiesTotal++] = i; + return i; + } + } + return -3; +} + +#if 1 +WRAPPER +void +cAudioManager::DestroyAllGameCreatedEntities() +{ + EAXJMP(0x57A830); +} +#else +void +cAudioManager::DestroyAllGameCreatedEntities() +{ + cAudioManager *v1; + cAudioScriptObject *entity; + + if(m_bIsInitialised) { + for(uint32 i = 0; i < 200; i++) { + if(m_asAudioEntities[i].m_bIsUsed) { + switch(m_asAudioEntities[i].m_nType) { + case AUDIOTYPE_PHYSICAL: + case AUDIOTYPE_EXPLOSION: + case AUDIOTYPE_WEATHER: + case AUDIOTYPE_CRANE: + case AUDIOTYPE_GARAGE: + case AUDIOTYPE_HYDRANT: cAudioManager::DestroyEntity(i); break; + case AUDIOTYPE_ONE_SHOT: + entity = m_asAudioEntities[i].m_pEntity; + if(entity) { + cAudioScriptObject::~cAudioScriptObject( + m_asAudioEntities[i].m_pEntity); + cAudioScriptObject::operator delete(entity); + } + cAudioManager::DestroyEntity(i); + break; + default: break; + } + } + } + m_nScriptObjectEntityTotal = 0; + } +} +#endif + +void +cAudioManager::DestroyEntity(int32 id) +{ + if(m_bIsInitialised && id >= 0 && id < totalAudioEntitiesSlots && + m_asAudioEntities[id].m_bIsUsed) { + m_asAudioEntities[id].m_bIsUsed = 0; + for(int32 i = 0; i < m_nAudioEntitiesTotal; ++i) { + if(id == m_anAudioEntityIndices[i]) { + if(i < totalAudioEntitiesSlots - 1) + memmove(&m_anAudioEntityIndices[i], + &m_anAudioEntityIndices[i + 1], + 4 * (m_nAudioEntitiesTotal - (i + 1))); + m_anAudioEntityIndices[--m_nAudioEntitiesTotal] = + totalAudioEntitiesSlots; + return; + } + } + } +} + +void +cAudioManager::DoPoliceRadioCrackle() +{ + m_sQueueSample.m_nEntityIndex = m_nPoliceChannelEntity; + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_POLICE_SCANNER_CRACKLE; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 1; + m_sQueueSample.field_16 = 10; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_POLICE_SCANNER_CRACKLE); + m_sQueueSample.m_bVolume = m_anRandomTable[2] % 20u + 15; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = m_sQueueSample.m_bVolume; + m_sQueueSample.m_nLoopStart = cSampleManager.GetSampleLoopStartOffset(188); + m_sQueueSample.m_nLoopEnd = cSampleManager.GetSampleLoopEndOffset(188); + m_sQueueSample.field_56 = 0; + m_sQueueSample.m_bReverbFlag = 0; + m_sQueueSample.m_bOffset = 63; + m_sQueueSample.field_76 = 3; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); +} + +void +cAudioManager::GenerateIntegerRandomNumberTable() +{ + for(int32 i = 0; i < 5; i++) { m_anRandomTable[i] = rand(); } +} + +float +cAudioManager::GetDistanceSquared(CVector *v) +{ + const CVector &c = TheCamera.GetPosition(); + return sq(v->x - c.x) + sq(v->y - c.y) + sq((v->z - c.z) * 0.2f); +} + void cAudioManager::Initialise() { @@ -262,27 +578,28 @@ cAudioManager::Initialise() void cAudioManager::PostInitialiseGameSpecificSetup() { - m_nFireAudioEntity = CreateEntity( - AUDIOTYPE_FIRE, (CPhysical *)0x8F31D0); // last is addr of firemanager @todo change - if(m_nFireAudioEntity >= 0) cAudioManager::SetEntityStatus(m_nFireAudioEntity, 1); + m_nFireAudioEntity = + CreateEntity(AUDIOTYPE_FIRE, + (CPhysical *)0x8F31D0); // last is addr of firemanager @todo change + if(m_nFireAudioEntity >= 0) SetEntityStatus(m_nFireAudioEntity, 1); m_nCollisionEntity = CreateEntity(AUDIOTYPE_COLLISION, (CPhysical *)1); - if(m_nCollisionEntity >= 0) cAudioManager::SetEntityStatus(m_nCollisionEntity, 1); + if(m_nCollisionEntity >= 0) SetEntityStatus(m_nCollisionEntity, 1); m_nFrontEndEntity = CreateEntity(AUDIOTYPE_FRONTEND, (CPhysical *)1); - if(m_nFrontEndEntity >= 0) cAudioManager::SetEntityStatus(m_nFrontEndEntity, 1); + if(m_nFrontEndEntity >= 0) SetEntityStatus(m_nFrontEndEntity, 1); m_nProjectileEntity = CreateEntity(AUDIOTYPE_PROJECTILE, (CPhysical *)1); - if(m_nProjectileEntity >= 0) cAudioManager::SetEntityStatus(m_nProjectileEntity, 1); + if(m_nProjectileEntity >= 0) SetEntityStatus(m_nProjectileEntity, 1); m_nWaterCannonEntity = CreateEntity(AUDIOTYPE_WATER_CANNON, (CPhysical *)1); - if(m_nWaterCannonEntity >= 0) cAudioManager::SetEntityStatus(m_nWaterCannonEntity, 1); + if(m_nWaterCannonEntity >= 0) SetEntityStatus(m_nWaterCannonEntity, 1); m_nPoliceChannelEntity = CreateEntity(AUDIOTYPE_D, (CPhysical *)1); - if(m_nPoliceChannelEntity >= 0) cAudioManager::SetEntityStatus(m_nPoliceChannelEntity, 1); + if(m_nPoliceChannelEntity >= 0) SetEntityStatus(m_nPoliceChannelEntity, 1); m_nBridgeEntity = CreateEntity(AUDIOTYPE_BRIDGE, (CPhysical *)1); - if(m_nBridgeEntity >= 0) cAudioManager::SetEntityStatus(m_nBridgeEntity, 1); + if(m_nBridgeEntity >= 0) SetEntityStatus(m_nBridgeEntity, 1); m_sMissionAudio.m_nSampleIndex = NO_SAMPLE; m_sMissionAudio.m_bLoadingStatus = 0; @@ -348,7 +665,6 @@ cAudioManager::GetMissionAudioLoadingStatus() return true; } - uint8 cAudioManager::GetNum3DProvidersAvailable() { @@ -356,14 +672,6 @@ cAudioManager::GetNum3DProvidersAvailable() return 0; } -int8 -cAudioManager::AutoDetect3DProviders() -{ - if(m_bIsInitialised) return cSampleManager.AutoDetect3DProviders(); - - return -1; -} - bool cAudioManager::IsMP3RadioChannelAvailable() { @@ -410,12 +718,6 @@ cAudioManager::SetSpeakerConfig(int32 conf) cSampleManager.SetSpeakerConfig(conf); } -void -cAudioManager::ProcessJumboFlying() -{ - if(SetupJumboFlySound(127u)) SetupJumboEngineSound(63u, 22050); -} - WRAPPER bool cAudioManager::SetupJumboEngineSound(uint8, int32) { EAXJMP(0x56F140); } @@ -441,15 +743,6 @@ cAudioManager::SetMissionScriptPoliceAudio(int32 sfx) } } -void -cAudioManager::CalculateDistance(bool *ptr, float dist) -{ - if(*ptr == false) { - m_sQueueSample.m_fDistance = Sqrt(dist); - *ptr = true; - } -} - bool cAudioManager::UsesSiren(int32 model) { @@ -504,14 +797,6 @@ cAudioManager::Get3DProviderName(uint8 id) return asName3DProviders[id]; } -void -cAudioManager::ProcessJumboTaxi() -{ - if(SetupJumboFlySound(20u)) { - if(SetupJumboTaxiSound(75u)) SetupJumboWhineSound(18u, 29500); - } -} - WRAPPER bool cAudioManager::SetupJumboFlySound(uint8) { EAXJMP(0x56F230); } @@ -559,20 +844,6 @@ cAudioManager::InterrogateAudioEntities() } } -void -cAudioManager::ClearRequestedQueue() -{ - for(int32 i = 0; i < m_bActiveSamples; i++) { - m_abSampleQueueIndexTable[i + 27 * m_bActiveSampleQueue] = m_bActiveSamples; - } - m_bSampleRequestQueuesStatus[m_bActiveSampleQueue] = 0; -} - -// void cAudioManager::AgeCrimes() -//{ - -//} - bool cAudioManager::UsesReverseWarning(int32 model) { @@ -593,59 +864,6 @@ cAudioManager::GetJumboTaxiFreq() return (60.833f * m_sQueueSample.m_fDistance) + 22050; } -void -cAudioManager::ProcessPhysical(int32 id) -{ - CPhysical *entity = m_asAudioEntities[id].m_pEntity; - if(entity) { - switch(entity->m_type & 7) { - case ENTITY_TYPE_VEHICLE: ProcessVehicle(m_asAudioEntities[id].m_pEntity); break; - case ENTITY_TYPE_PED: ProcessPed(m_asAudioEntities[id].m_pEntity); break; - default: return; - } - } -} - -WRAPPER -void -cAudioManager::ProcessVehicle(CPhysical *) -{ - EAXJMP(0x569A00); -} - -WRAPPER -void -cAudioManager::ProcessPed(CPhysical *) -{ - EAXJMP(0x56F450); -} - -WRAPPER -void -cAudioManager::ProcessPlane(void *ptr) -{ - EAXJMP(0x56E860); -} - -void -cAudioManager::ClearMissionAudio() -{ - if(m_bIsInitialised) { - m_sMissionAudio.m_nSampleIndex = NO_SAMPLE; - m_sMissionAudio.m_bLoadingStatus = 0; - m_sMissionAudio.m_bPlayStatus = 0; - m_sMissionAudio.field_22 = 0; - m_sMissionAudio.m_bIsPlayed = false; - m_sMissionAudio.field_12 = 1; - m_sMissionAudio.field_24 = 0; - } -} - -// void -// cAudioManager::ProcessReverb() -//{ -//} - bool cAudioManager::IsMissionAudioSampleFinished() { @@ -657,9 +875,6 @@ cAudioManager::IsMissionAudioSampleFinished() } WRAPPER -void cAudioManager::ProcessEntity(int32) { EAXJMP(0x569870); } - -WRAPPER void cAudioManager::InitialisePoliceRadio() { @@ -708,50 +923,6 @@ cAudioManager::IsAudioInitialised() const return m_bIsInitialised; } -int32 -cAudioManager::CreateEntity(int32 type, CPhysical *entity) -{ - if(!m_bIsInitialised) return -4; - if(!entity) return -2; - if(type >= TOTAL_AUDIO_TYPES) return -1; - for(uint32 i = 0; i < 200; i++) { - if(!m_asAudioEntities[i].m_bIsUsed) { - m_asAudioEntities[i].m_bIsUsed = true; - m_asAudioEntities[i].m_bStatus = 0; - m_asAudioEntities[i].m_nType = (eAudioType)type; - m_asAudioEntities[i].m_pEntity = entity; - m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_TOTAL_PED_SOUNDS; - m_asAudioEntities[i].m_awAudioEvent[1] = SOUND_TOTAL_PED_SOUNDS; - m_asAudioEntities[i].m_awAudioEvent[2] = SOUND_TOTAL_PED_SOUNDS; - m_asAudioEntities[i].m_awAudioEvent[3] = SOUND_TOTAL_PED_SOUNDS; - m_asAudioEntities[i].field_24 = 0; - m_anAudioEntityIndices[m_nAudioEntitiesTotal++] = i; - return i; - } - } - return -3; -} - -void -cAudioManager::DestroyEntity(int32 id) -{ - if(m_bIsInitialised && id >= 0 && id < totalAudioEntitiesSlots && - m_asAudioEntities[id].m_bIsUsed) { - m_asAudioEntities[id].m_bIsUsed = 0; - for(int32 i = 0; i < m_nAudioEntitiesTotal; ++i) { - if(id == m_anAudioEntityIndices[i]) { - if(i < totalAudioEntitiesSlots - 1) - memmove(&m_anAudioEntityIndices[i], - &m_anAudioEntityIndices[i + 1], - 4 * (m_nAudioEntitiesTotal - (i + 1))); - m_anAudioEntityIndices[--m_nAudioEntitiesTotal] = - totalAudioEntitiesSlots; - return; - } - } - } -} - void cAudioManager::SetEntityStatus(int32 id, bool status) { @@ -799,12 +970,6 @@ cAudioManager::PostTerminateGameSpecificShutdown() ; } -void -cAudioManager::GenerateIntegerRandomNumberTable() -{ - for(int32 i = 0; i < 5; i++) { m_anRandomTable[i] = rand(); } -} - bool &bPlayerJustEnteredCar = *(bool *)0x6508C4; void @@ -2953,6 +3118,698 @@ cAudioManager::GetGenericFemaleTalkSfx(int16 sound) return sfx; } +WRAPPER +void +cAudioManager::ProcessActiveQueues() +{ + EAXJMP(0x57BA60); +} + +#if 1 +bool +cAudioManager::ProcessAirBrakes(cVehicleParams *params) +{ + EAXJMP(0x56C940); +} +#else +bool +cAudioManager::ProcessAirBrakes(cVehicleParams *params) +{ + CAutomobile *automobile; + uint8 rand; + + if(params->m_fDistance > 900.0f) return 0; + automobile = (CAutomobile *)params->m_pVehicle; + if(!automobile->bEngineOn) return 1; + + if((automobile->m_fVelocityChangeForAudio < 0.025f || + params->m_fVelocityChange >= 0.025f) && + (automobile->m_fVelocityChangeForAudio > -0.025f || params->m_fVelocityChange <= 0.025f)) + return 1; + + CalculateDistance((bool *)params, params->m_fDistance); + rand = m_anRandomTable[0] % 10u + 70; + m_sQueueSample.m_bVolume = ComputeVolume(rand, 30.0f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 13; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_VEHICLE_AIR_BRAKES; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_VEHICLE_AIR_BRAKES); + m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency >> 4); + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 10; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.m_bEmittingVolume = rand; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.field_48 = 0.0f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + m_sQueueSample.field_56 = 1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + + return 1; +} +#endif + +void +cAudioManager::ProcessAirportScriptObject(uint8 sound) +{ + + float dist; + float distSquared; + float maxDist; + + static uint8 counter = 0; + + uint32 time = CTimer::GetTimeInMilliseconds(); + if(time > audioLogicTimers[3]) { + switch(sound) { + case SCRIPT_SOUND_AIRPORT_LOOP_S: + maxDist = 900.f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + break; + case SCRIPT_SOUND_AIRPORT_LOOP_L: + maxDist = 6400.f; + m_sQueueSample.m_fSoundIntensity = 80.0f; + break; + default: break; + } + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < maxDist) { + dist = sqrt(distSquared); + m_sQueueSample.m_fDistance = dist; + m_sQueueSample.m_bVolume = ComputeVolume( + 110u, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = + (m_anRandomTable[1] & 3) + AUDIO_SAMPLE_AIRPORT_1; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_4 = counter++; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.field_16 = 3; + m_sQueueSample.field_48 = 2.0; + m_sQueueSample.m_bEmittingVolume = 110; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + audioLogicTimers[3] = time + 10000 + m_anRandomTable[3] % 20000u; + } + } + } +} + +WRAPPER +bool +cAudioManager::ProcessBoatEngine(cVehicleParams *params) +{ + EAXJMP(0x56DE80); +} + +WRAPPER +bool +cAudioManager::ProcessBoatMovingOverWater(cVehicleParams *params) +{ + EAXJMP(0x56E500); +} + +WRAPPER +void +cAudioManager::ProcessBridge() +{ + EAXJMP(0x5790D0); +} + +void +cAudioManager::ProcessBridgeMotor() +{ + if(m_sQueueSample.m_fDistance < 400.f) { + m_sQueueSample.m_bVolume = ComputeVolume(127, 400.f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_MOTOR; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 1; + m_sQueueSample.m_nFrequency = 5500; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = 127; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 2.0; + m_sQueueSample.m_fSoundIntensity = 400.0f; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_76 = 3; + m_sQueueSample.m_bReverbFlag = 0; + AddSampleToRequestedQueue(); + } + } +} + +WRAPPER +void +cAudioManager::ProcessBridgeOneShots() +{ + EAXJMP(0x579310); +} + +void +cAudioManager::ProcessBridgeWarning() +{ + if(CStats::CommercialPassed && m_sQueueSample.m_fDistance < 450.f) { + m_sQueueSample.m_bVolume = ComputeVolume(100u, 450.f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_nSampleIndex = 457; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 1; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_BRIDGE_WARNING); + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = 100; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 2.0f; + m_sQueueSample.m_fSoundIntensity = 450.0f; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_76 = 8; + m_sQueueSample.m_bReverbFlag = 0; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + } +} + +WRAPPER +bool +cAudioManager::ProcessCarBombTick(void *) +{ + EAXJMP(0x56CC20); +} + +WRAPPER +void +cAudioManager::ProcessCesna(void *) +{ + EAXJMP(0x56ADF0); +} + +void +cAudioManager::ProcessCinemaScriptObject(uint8 sound) +{ + uint8 rand; + float distSquared; + float maxDist; + + static uint8 counter = 0; + + uint32 time = CTimer::GetTimeInMilliseconds(); + if(time > audioLogicTimers[4]) { + switch(sound) { + case SCRIPT_SOUND_CINEMA_LOOP_S: + maxDist = 900.f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + break; + case SCRIPT_SOUND_CINEMA_LOOP_L: + maxDist = 6400.f; + m_sQueueSample.m_fSoundIntensity = 80.0f; + break; + default: break; + } + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < maxDist) { + m_sQueueSample.m_fDistance = sqrt(distSquared); + rand = m_anRandomTable[0] % 90u + 30; + m_sQueueSample.m_bVolume = ComputeVolume( + rand, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = counter % 3 + AUDIO_SAMPLE_CINEMA_1; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nFrequency += + RandomDisplacement(m_sQueueSample.m_nFrequency >> 2); + m_sQueueSample.field_4 = counter++; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.field_16 = 3; + m_sQueueSample.field_48 = 2.0; + m_sQueueSample.m_bEmittingVolume = rand; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + audioLogicTimers[4] = time + 1000 + m_anRandomTable[3] % 4000u; + } + } + } +} + +WRAPPER +void +cAudioManager::ProcessCrane() +{ + EAXJMP(0x578910); +} + +void +cAudioManager::ProcessDocksScriptObject(uint8 sound) +{ + uint32 time; + uint8 rand; + float distSquared; + float maxDist; + + static uint32 counter = 0; + + time = CTimer::GetTimeInMilliseconds(); + if(time > audioLogicTimers[5]) { + switch(sound) { + case SCRIPT_SOUND_DOCKS_LOOP_S: + maxDist = 900.f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + break; + case SCRIPT_SOUND_DOCKS_LOOP_L: + maxDist = 6400.f; + m_sQueueSample.m_fSoundIntensity = 80.0f; + break; + default: break; + } + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < maxDist) { + m_sQueueSample.m_fDistance = sqrt(distSquared); + rand = m_anRandomTable[0] % 60u + 40; + m_sQueueSample.m_bVolume = ComputeVolume( + rand, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_DOCKS; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_DOCKS); + m_sQueueSample.m_nFrequency += + RandomDisplacement(m_sQueueSample.m_nFrequency >> 3); + m_sQueueSample.field_4 = counter++; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.field_16 = 3; + m_sQueueSample.field_48 = 2.0; + m_sQueueSample.m_bEmittingVolume = rand; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + audioLogicTimers[5] = time + 10000 + m_anRandomTable[3] % 40000u; + } + } + } +} + +void +cAudioManager::ProcessEntity(int32 id) +{ + if(m_asAudioEntities[id].m_bStatus) { + m_sQueueSample.m_nEntityIndex = id; + switch(m_asAudioEntities[id].m_nType) { + case AUDIOTYPE_PHYSICAL: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessPhysical(id); + } + break; + case AUDIOTYPE_EXPLOSION: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessExplosions(id); + } + break; + case AUDIOTYPE_FIRE: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessFires(id); + } + break; + case AUDIOTYPE_WEATHER: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessWeather(id); + } + break; + case AUDIOTYPE_CRANE: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessCrane(); + } + break; + case AUDIOTYPE_ONE_SHOT: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessScriptObject(id); + } + break; + case AUDIOTYPE_BRIDGE: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessBridgeOneShots(); + } + break; + case AUDIOTYPE_FRONTEND: + m_sQueueSample.m_bReverbFlag = 0; + cAudioManager::ProcessFrontEnd(); + break; + case AUDIOTYPE_PROJECTILE: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessProjectiles(); + } + break; + case AUDIOTYPE_GARAGE: + if(!m_bUserPause) cAudioManager::ProcessGarages(); + break; + case AUDIOTYPE_HYDRANT: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessFireHydrant(); + } + break; + case AUDIOTYPE_WATER_CANNON: + if(!m_bUserPause) { + m_sQueueSample.m_bReverbFlag = 1; + cAudioManager::ProcessWaterCannon(id); + } + break; + default: return; + } + } +} + +WRAPPER +void +cAudioManager::ProcessExplosions(int32 explosion) +{ + EAXJMP(0x575AC0); +} + +void +cAudioManager::ProcessFireHydrant() +{ + float distSquared; + bool something = false; + + m_sQueueSample.m_vecPos = + *(CVector *)(m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_pEntity + 52); + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < 1225.f) { + CalculateDistance(&something, distSquared); + m_sQueueSample.m_bVolume = ComputeVolume(40u, 35.f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_TAXI_SOUND; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 4; + m_sQueueSample.m_nFrequency = 15591; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = 40; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 2.0; + m_sQueueSample.m_fSoundIntensity = 35.0; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_76 = 3; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + } +} + +WRAPPER +void +cAudioManager::ProcessFires(int32 entity) +{ + EAXJMP(0x575CD0); +} + +void +cAudioManager::ProcessFrontEnd() +{ + bool processed; + int16 sample; + + static uint32 counter = 0; + + for(uint32 i = 0; i < m_asAudioEntities[m_sQueueSample.m_nEntityIndex].field_24; i++) { + processed = 0; + switch( + m_asAudioEntities[0].m_awAudioEvent[i + 20 * m_sQueueSample.m_nEntityIndex]) { + case SOUND_WEAPON_SNIPER_SHOT_NO_ZOOM: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SNIPER_NO_ZOOM; + break; + case SOUND_WEAPON_ROCKET_SHOT_NO_ZOOM: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_ROCKET_NO_ZOOM; + break; + case SOUND_GARAGE_NO_MONEY: + case SOUND_GARAGE_BAD_VEHICLE: + case SOUND_3C: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PICKUP_FAIL_1; + processed = 1; + break; + case SOUND_GARAGE_OPENING: + case SOUND_GARAGE_BOMB1_SET: + case SOUND_GARAGE_BOMB2_SET: + case SOUND_GARAGE_BOMB3_SET: + case SOUND_41: + case SOUND_GARAGE_VEHICLE_DECLINED: + case SOUND_GARAGE_VEHICLE_ACCEPTED: + case SOUND_PICKUP_HEALTH: + case SOUND_4B: + case SOUND_PICKUP_ADRENALINE: + case SOUND_PICKUP_ARMOUR: + case SOUND_EVIDENCE_PICKUP: + case SOUND_UNLOAD_GOLD: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PICKUP_SUCCESS_1; + processed = 1; + break; + case SOUND_PICKUP_WEAPON_BOUGHT: + case SOUND_PICKUP_WEAPON: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PICKUP_NEUTRAL_1; + processed = 1; + break; + case SOUND_4A: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PICKUP_FAIL_1; + processed = 1; + break; + case SOUND_PICKUP_BONUS: + case SOUND_PICKUP_MONEY: + case SOUND_PICKUP_HIDDEN_PACKAGE: + case SOUND_PICKUP_PACMAN_PILL: + case SOUND_PICKUP_PACMAN_PACKAGE: + case SOUND_PICKUP_FLOAT_PACKAGE: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PICKUP_SUCCESS_3; + processed = 1; + break; + case SOUND_PAGER: m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PAGER; break; + case SOUND_RACE_START_3: + case SOUND_RACE_START_2: + case SOUND_RACE_START_1: + case SOUND_CLOCK_TICK: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_CLOCK_TICK; + break; + case SOUND_RACE_START_GO: + m_sQueueSample.m_nSampleIndex = + AUDIO_SAMPLE_FRONTEND_PART_MISSION_COMPLETED; + break; + case SOUND_PART_MISSION_COMPLETE: + m_sQueueSample.m_nSampleIndex = + AUDIO_SAMPLE_FRONTEND_PART_MISSION_COMPLETED; + break; + case SOUND_FRONTEND_MENU_STARTING: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_MENU_STARTING_1; + break; + case SOUND_FRONTEND_MENU_COMPLETED: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_MENU_COMPLETED_1; + break; + case SOUND_FRONTEND_MENU_DENIED: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_MENU_DENIED_1; + break; + case SOUND_FRONTEND_MENU_SUCCESS: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_MENU_SUCCESS_1; + break; + case SOUND_FRONTEND_EXIT: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_MENU_EXIT_1; + break; + case SOUND_9A: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_380; + break; + case SOUND_9B: m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_382; break; + case SOUND_FRONTEND_AUDIO_TEST: + m_sQueueSample.m_nSampleIndex = + m_anRandomTable[0] % 3u + AUDIO_SAMPLE_FRONTEND_MENU_AUDIO_TEST_1; + break; + case SOUND_FRONTEND_FAIL: + processed = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_MENU_FAIL_1; + break; + case SOUND_FRONTEND_NO_RADIO: + case SOUND_FRONTEND_RADIO_CHANGE: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_GAMEPLAY_FAIL; + break; + case SOUND_A0: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_FRONTEND_GAMEPLAY_SUCCESS; + break; + default: continue; + } + + sample = + m_asAudioEntities[0].m_awAudioEvent[i + 20 * m_sQueueSample.m_nEntityIndex]; + if(sample == AUDIO_SAMPLE_COLLISION_LOOPING_GRASS) { + m_sQueueSample.m_nFrequency = 28509; + } else if(sample == AUDIO_SAMPLE_PICKUP_NEUTRAL_1) { + if(1.f == + m_asAudioEntities[0].m_afVolume[i + 10 * m_sQueueSample.m_nEntityIndex]) + m_sQueueSample.m_nFrequency = 32000; + else + m_sQueueSample.m_nFrequency = 48000; + } else { + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + } + m_sQueueSample.m_bVolume = 110; + m_sQueueSample.field_4 = counter++; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.field_16 = 0; + m_sQueueSample.m_bIsDistant = 1; + m_sQueueSample.m_bEmittingVolume = m_sQueueSample.m_bVolume; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + if(processed) + m_sQueueSample.m_bOffset = m_anRandomTable[0] & 0x1F; + else + m_sQueueSample.m_bOffset = 63; + m_sQueueSample.m_bReverbFlag = 0; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + if(processed) { + ++m_sQueueSample.m_nSampleIndex; + m_sQueueSample.field_4 = counter++; + m_sQueueSample.m_bOffset = 127 - m_sQueueSample.m_bOffset; + AddSampleToRequestedQueue(); + } + } +} + +WRAPPER +void +cAudioManager::ProcessGarages() +{ + EAXJMP(0x578C20); +} + +void cAudioManager::ProcessHomeScriptObject(uint8 sound) +{ + +} + +void +cAudioManager::ProcessJumboFlying() +{ + if(SetupJumboFlySound(127u)) SetupJumboEngineSound(63u, 22050); +} + +void +cAudioManager::ProcessJumboTaxi() +{ + if(SetupJumboFlySound(20u)) { + if(SetupJumboTaxiSound(75u)) SetupJumboWhineSound(18u, 29500); + } +} + +WRAPPER +void +cAudioManager::ProcessPed(CPhysical *) +{ + EAXJMP(0x56F450); +} + +void +cAudioManager::ProcessPhysical(int32 id) +{ + CPhysical *entity = m_asAudioEntities[id].m_pEntity; + if(entity) { + switch(entity->m_type & 7) { + case ENTITY_TYPE_VEHICLE: ProcessVehicle(m_asAudioEntities[id].m_pEntity); break; + case ENTITY_TYPE_PED: ProcessPed(m_asAudioEntities[id].m_pEntity); break; + default: return; + } + } +} + +WRAPPER +void +cAudioManager::ProcessPlane(void *ptr) +{ + EAXJMP(0x56E860); +} + +WRAPPER +void +cAudioManager::ProcessProjectiles() +{ + EAXJMP(0x578A80); +} + +WRAPPER +void +cAudioManager::ProcessScriptObject(int32 id) +{ + EAXJMP(0x576070); +} + +WRAPPER +void +cAudioManager::ProcessVehicle(void *) +{ + EAXJMP(0x569A00); +} + +WRAPPER +void cAudioManager::ProcessWaterCannon(int32) { EAXJMP(0x575F30); } + +WRAPPER +void +cAudioManager::ProcessWeather(int32 id) +{ + EAXJMP(0x578370); +} + WRAPPER void cAudioManager::Service() { @@ -2960,22 +3817,31 @@ cAudioManager::Service() } STARTPATCHES -InjectHook(0x57B070, &cAudioManager::AddSampleToRequestedQueue, PATCH_JUMP); InjectHook(0x57B210, &cAudioManager::AddDetailsToRequestedOrderList, PATCH_JUMP); +InjectHook(0x56AD30, &cAudioManager::AddPlayerCarSample, PATCH_JUMP); InjectHook(0x57B300, &cAudioManager::AddReflectionsToRequestedQueue, PATCH_JUMP); +InjectHook(0x57B8D0, &cAudioManager::AddReleasingSounds, PATCH_JUMP); +InjectHook(0x57B070, &cAudioManager::AddSampleToRequestedQueue, PATCH_JUMP); +InjectHook(0x57A8F0, &cAudioManager::AutoDetect3DProviders, PATCH_JUMP); +// InjectHook(0x580AF0, &cAudioManager::AgeCrimes, PATCH_JUMP); + +InjectHook(0x5697A0, &cAudioManager::CalculateDistance, PATCH_JUMP); +InjectHook(0x57AA10, &cAudioManager::CheckForAnAudioFileOnCD, PATCH_JUMP); +InjectHook(0x5796A0, &cAudioManager::ClearMissionAudio, PATCH_JUMP); +InjectHook(0x57C120, &cAudioManager::ClearRequestedQueue, PATCH_JUMP); +InjectHook(0x57AE00, &cAudioManager::ComputeDopplerEffectedFrequency, PATCH_JUMP); InjectHook(0x57ABB0, &cAudioManager::ComputeVolume, PATCH_JUMP); InjectHook(0x57A0E0, &cAudioManager::Initialise, PATCH_JUMP); InjectHook(0x569420, &cAudioManager::PostInitialiseGameSpecificSetup, PATCH_JUMP); -//InjectHook(0x57EAC0, &cAudioManager::InitialisePoliceRadioZones, PATCH_JUMP); -//InjectHook(0x569650, &cAudioManager::ResetAudioLogicTimers, PATCH_JUMP); +// InjectHook(0x57EAC0, &cAudioManager::InitialisePoliceRadioZones, PATCH_JUMP); +// InjectHook(0x569650, &cAudioManager::ResetAudioLogicTimers, PATCH_JUMP); InjectHook(0x57A150, &cAudioManager::Terminate, PATCH_JUMP); InjectHook(0x57F050, &cAudioManager::GetMissionScriptPoliceAudioPlayingStatus, PATCH_JUMP); InjectHook(0x5795D0, &cAudioManager::GetMissionAudioLoadingStatus, PATCH_JUMP); InjectHook(0x57A8A0, &cAudioManager::GetNum3DProvidersAvailable, PATCH_JUMP); -InjectHook(0x57A8F0, &cAudioManager::AutoDetect3DProviders, PATCH_JUMP); InjectHook(0x57A9C0, &cAudioManager::IsMP3RadioChannelAvailable, PATCH_JUMP); InjectHook(0x57AA30, &cAudioManager::GetCDAudioDriveLetter, PATCH_JUMP); @@ -2986,20 +3852,16 @@ InjectHook(0x57A790, &cAudioManager::SetMusicFadeVol, PATCH_JUMP); InjectHook(0x57A9A0, &cAudioManager::SetSpeakerConfig, PATCH_JUMP); -InjectHook(0x56ECF0, &cAudioManager::ProcessJumboFlying, PATCH_JUMP); InjectHook(0x569400, &cAudioManager::PreInitialiseGameSpecificSetup, PATCH_JUMP); InjectHook(0x57F020, &cAudioManager::SetMissionScriptPoliceAudio, PATCH_JUMP); -InjectHook(0x5697A0, &cAudioManager::CalculateDistance, PATCH_JUMP); - InjectHook(0x56C3C0, &cAudioManager::UsesSiren, PATCH_JUMP); InjectHook(0x56C3F0, &cAudioManager::UsesSirenSwitching, PATCH_JUMP); InjectHook(0x579520, &cAudioManager::MissionScriptAudioUsesPoliceChannel, PATCH_JUMP); InjectHook(0x57A8C0, &cAudioManager::Get3DProviderName, PATCH_JUMP); -InjectHook(0x56EA10, &cAudioManager::ProcessJumboTaxi, PATCH_JUMP); InjectHook(0x579620, &cAudioManager::PlayLoadedMissionAudio, PATCH_JUMP); @@ -3009,20 +3871,11 @@ InjectHook(0x57EFF0, &cAudioManager::ResetPoliceRadio, PATCH_JUMP); InjectHook(0x57B030, &cAudioManager::InterrogateAudioEntities, PATCH_JUMP); -InjectHook(0x57C120, &cAudioManager::ClearRequestedQueue, PATCH_JUMP); -// InjectHook(0x580AF0, &cAudioManager::AgeCrimes, PATCH_JUMP); - InjectHook(0x56C600, &cAudioManager::UsesReverseWarning, PATCH_JUMP); InjectHook(0x56CAB0, &cAudioManager::HasAirBrakes, PATCH_JUMP); InjectHook(0x56F410, &cAudioManager::GetJumboTaxiFreq, PATCH_JUMP); -InjectHook(0x5699C0, &cAudioManager::ProcessPhysical, PATCH_JUMP); -// InjectHook(0x56E860, &cAudioManager::ProcessPlane, PATCH_JUMP); - -InjectHook(0x5796A0, &cAudioManager::ClearMissionAudio, PATCH_JUMP); -// InjectHook(0x569700, &cAudioManager::ProcessReverb, PATCH_JUMP); - InjectHook(0x579650, &cAudioManager::IsMissionAudioSampleFinished, PATCH_JUMP); // done InjectHook(0x57AF90, &cAudioManager::RandomDisplacement, PATCH_JUMP); @@ -3122,4 +3975,18 @@ InjectHook(0x575120, &cAudioManager::GetChunkyTalkSfx, PATCH_JUMP); InjectHook(0x575460, &cAudioManager::GetGenericMaleTalkSfx, PATCH_JUMP); InjectHook(0x575510, &cAudioManager::GetGenericFemaleTalkSfx, PATCH_JUMP); + +// Process stuff +InjectHook(0x577B30, &cAudioManager::ProcessAirportScriptObject, PATCH_JUMP); +InjectHook(0x579250, &cAudioManager::ProcessBridgeMotor, PATCH_JUMP); +InjectHook(0x579170, &cAudioManager::ProcessBridgeWarning, PATCH_JUMP); +InjectHook(0x577CA0, &cAudioManager::ProcessCinemaScriptObject, PATCH_JUMP); +InjectHook(0x577E50, &cAudioManager::ProcessDocksScriptObject, PATCH_JUMP); +InjectHook(0x569870, &cAudioManager::ProcessEntity, PATCH_JUMP); +InjectHook(0x578FD0, &cAudioManager::ProcessFireHydrant, PATCH_JUMP); +InjectHook(0x5785E0, &cAudioManager::ProcessFrontEnd, PATCH_JUMP); +InjectHook(0x56ECF0, &cAudioManager::ProcessJumboFlying, PATCH_JUMP); +InjectHook(0x56EA10, &cAudioManager::ProcessJumboTaxi, PATCH_JUMP); +InjectHook(0x5699C0, &cAudioManager::ProcessPhysical, PATCH_JUMP); + ENDPATCHES diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 7a2dc9c5..fb13d18a 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -146,8 +146,7 @@ public: cAudioCollision m_sQueue; }; -static_assert(sizeof(cAudioCollisionManager) == 0x354, - "cAudioCollisionManager: error"); +static_assert(sizeof(cAudioCollisionManager) == 0x354, "cAudioCollisionManager: error"); class cMissionAudio { @@ -167,6 +166,8 @@ public: char field_31; }; +class cVehicleParams; + static_assert(sizeof(cMissionAudio) == 0x20, "cMissionAudio: error"); class cAudioManager @@ -180,7 +181,7 @@ public: bool m_bDynamicAcousticModelingStatus; char field_6; char field_7; - float field_8; + float speedOfSound; bool m_bTimerJustReset; char field_13; char field_14; @@ -218,17 +219,39 @@ public: char field_19195; int m_nTimeOfRecentCrime; - void AddSampleToRequestedQueue(); - 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 Initialise(); void PostInitialiseGameSpecificSetup(); - void InitialisePoliceRadioZones(); // @todo - void ResetAudioLogicTimers(int32 timer); // @todo + void InitialisePoliceRadioZones(); // todo + void ResetAudioLogicTimers(int32 timer); // todo void Terminate(); @@ -236,7 +259,6 @@ public: bool GetMissionAudioLoadingStatus(); uint8 GetNum3DProvidersAvailable(); - int8 AutoDetect3DProviders(); bool IsMP3RadioChannelAvailable(); uint8 GetCDAudioDriveLetter(); @@ -247,13 +269,10 @@ public: void SetSpeakerConfig(int32 conf); - void ProcessJumboFlying(); bool SetupJumboEngineSound(uint8, int32); // todo void PreInitialiseGameSpecificSetup(); void SetMissionScriptPoliceAudio(int32 sfx); - void CalculateDistance(bool *ptr, float dist); - bool UsesSiren(int32 model); bool UsesSirenSwitching(int32 model); @@ -261,7 +280,6 @@ public: uint8 Get3DProviderName(uint8 id); - void ProcessJumboTaxi(); bool SetupJumboFlySound(uint8); // todo bool SetupJumboTaxiSound(uint8); // todo bool SetupJumboWhineSound(uint8, int32); // todo @@ -274,27 +292,14 @@ public: void InterrogateAudioEntities(); - void ClearRequestedQueue(); - // void AgeCrimes(); //todo - bool UsesReverseWarning(int32 model); bool HasAirBrakes(int32 model); int32 GetJumboTaxiFreq(); - void ProcessPhysical(int32 id); - void ProcessVehicle(CPhysical *); // todo - void ProcessPed(CPhysical *); // todo - void ProcessPlane(void *); // todo - - void ClearMissionAudio(); - // void ProcessReverb(); // todo - bool IsMissionAudioSampleFinished(); - void ProcessEntity(int32); - - void InitialisePoliceRadio(); + void InitialisePoliceRadio(); // todo int32 RandomDisplacement(uint32 seed); @@ -304,21 +309,16 @@ public: bool IsAudioInitialised() const; - int32 CreateEntity(int32 type, CPhysical *entity); - void DestroyEntity(int32 id); void SetEntityStatus(int32 id, bool status); void PreTerminateGameSpecificShutdown(); void PostTerminateGameSpecificShutdown(); - void GenerateIntegerRandomNumberTable(); - void PlayerJustGotInCar(); void PlayerJustLeftCar(); void Service(); - void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample, - uint32 maxOffset); + void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample, uint32 maxOffset); uint32 GetPlayerTalkSfx(int16 sound); uint32 GetCopTalkSfx(int16 sound); @@ -396,6 +396,72 @@ public: 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"); diff --git a/src/audio/AudioSamples.h b/src/audio/AudioSamples.h index 26fffe63..ba7bf7a8 100644 --- a/src/audio/AudioSamples.h +++ b/src/audio/AudioSamples.h @@ -3037,4 +3037,132 @@ enum eAudioSamples : uint32 { AUDIO_SAMPLE_AMMUNATION_WELCOME_3 = 3031, TOTAL_AUDIO_SAMPLES = 3032, NO_SAMPLE = 3033, -};
\ No newline at end of file +}; + +enum eScriptSounds : int16 +{ + SCRIPT_SOUND_0 = 0, + SCRIPT_SOUND_1 = 1, + SCRIPT_SOUND_2 = 2, + SCRIPT_SOUND_3 = 3, + SCRIPT_SOUND_PARTY_1_LOOP_S = 4, + SCRIPT_SOUND_PARTY_1_LOOP_L = 5, + SCRIPT_SOUND_PARTY_2_LOOP_S = 6, + SCRIPT_SOUND_PARTY_2_LOOP_L = 7, + SCRIPT_SOUND_PARTY_3_LOOP_S = 8, + SCRIPT_SOUND_PARTY_3_LOOP_L = 9, + SCRIPT_SOUND_PARTY_4_LOOP_S = 10, + SCRIPT_SOUND_PARTY_4_LOOP_L = 11, + SCRIPT_SOUND_PARTY_5_LOOP_S = 12, + SCRIPT_SOUND_PARTY_5_LOOP_L = 13, + SCRIPT_SOUND_PARTY_6_LOOP_S = 14, + SCRIPT_SOUND_PARTY_6_LOOP_L = 15, + SCRIPT_SOUND_PARTY_7_LOOP_S = 16, + SCRIPT_SOUND_PARTY_7_LOOP_L = 17, + SCRIPT_SOUND_PARTY_8_LOOP_S = 18, + SCRIPT_SOUND_PARTY_8_LOOP_L = 19, + SCRIPT_SOUND_PARTY_9_LOOP_S = 20, + SCRIPT_SOUND_PARTY_9_LOOP_L = 21, + SCRIPT_SOUND_PARTY_10_LOOP_S = 22, + SCRIPT_SOUND_PARTY_10_LOOP_L = 23, + SCRIPT_SOUND_PARTY_11_LOOP_S = 24, + SCRIPT_SOUND_PARTY_11_LOOP_L = 25, + SCRIPT_SOUND_PARTY_12_LOOP_S = 26, + SCRIPT_SOUND_PARTY_12_LOOP_L = 27, + SCRIPT_SOUND_PARTY_13_LOOP_S = 28, + SCRIPT_SOUND_PARTY_13_LOOP_L = 29, + SCRIPT_SOUND_STRIP_CLUB_LOOP_1_S = 30, + SCRIPT_SOUND_STRIP_CLUB_LOOP_1_L = 31, + SCRIPT_SOUND_STRIP_CLUB_LOOP_2_S = 32, + SCRIPT_SOUND_STRIP_CLUB_LOOP_2_L = 33, + SCRIPT_SOUND_WORK_SHOP_LOOP_S = 34, + SCRIPT_SOUND_WORK_SHOP_LOOP_L = 35, + SCRIPT_SOUND_SAWMILL_LOOP_S = 36, + SCRIPT_SOUND_SAWMILL_LOOP_L = 37, + SCRIPT_SOUND_38 = 38, + SCRIPT_SOUND_39 = 39, + SCRIPT_SOUND_LAUNDERETTE_LOOP_S = 40, + SCRIPT_SOUND_LAUNDERETTE_LOOP_L = 41, + SCRIPT_SOUND_CHINATOWN_RESTAURANT_S = 42, + SCRIPT_SOUND_CHINATOWN_RESTAURANT_L = 43, + SCRIPT_SOUND_CIPRIANI_RESAURANT_S = 44, + SCRIPT_SOUND_CIPRIANI_RESAURANT_L = 45, + SCRIPT_SOUND_46 = 46, + SCRIPT_SOUND_47 = 47, + SCRIPT_SOUND_MARCO_BISTRO_S = 48, + SCRIPT_SOUND_MARCO_BISTRO_L = 49, + SCRIPT_SOUND_AIRPORT_LOOP_S = 50, + SCRIPT_SOUND_AIRPORT_LOOP_L = 51, + SCRIPT_SOUND_SHOP_LOOP_S = 52, + SCRIPT_SOUND_SHOP_LOOP_L = 53, + SCRIPT_SOUND_CINEMA_LOOP_S = 54, + SCRIPT_SOUND_CINEMA_LOOP_L = 55, + SCRIPT_SOUND_DOCKS_LOOP_S = 56, + SCRIPT_SOUND_DOCKS_LOOP_L = 57, + SCRIPT_SOUND_HOME_LOOP_S = 58, + SCRIPT_SOUND_HOME_LOOP_L = 59, + SCRIPT_SOUND_FRANKIE_PIANO = 60, + SCRIPT_SOUND_PARTY_1_LOOP = 61, + SCRIPT_SOUND_PORN_CINEMA_1_S = 62, + SCRIPT_SOUND_PORN_CINEMA_1_L = 63, + SCRIPT_SOUND_PORN_CINEMA_2_S = 64, + SCRIPT_SOUND_PORN_CINEMA_2_L = 65, + SCRIPT_SOUND_PORN_CINEMA_3_S = 66, + SCRIPT_SOUND_PORN_CINEMA_3_L = 67, + SCRIPT_SOUND_BANK_ALARM_LOOP_S = 68, + SCRIPT_SOUND_BANK_ALARM_LOOP_L = 69, + SCRIPT_SOUND_POLICE_BALL_LOOP_S = 70, + SCRIPT_SOUND_POLICE_BALL_LOOP_L = 71, + SCRIPT_SOUND_RAVE_LOOP_INDUSTRIAL_S = 72, + SCRIPT_SOUND_RAVE_LOOP_INDUSTRIAL_L = 73, + SCRIPT_SOUND_74 = 74, + SCRIPT_SOUND_75 = 75, + SCRIPT_SOUND_POLICE_CELL_BEATING_LOOP_S = 76, + SCRIPT_SOUND_POLICE_CELL_BEATING_LOOP_L = 77, + SCRIPT_SOUND_INJURED_PED_MALE_OUCH_S = 78, + SCRIPT_SOUND_INJURED_PED_MALE_OUCH_L = 79, + SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_S = 80, + SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_L = 81, + SCRIPT_SOUND_EVIDENCE_PICKUP = 82, + SCRIPT_SOUND_UNLOAD_GOLD = 83, + SCRIPT_SOUND_RAVE_1_LOOP_S = 84, + SCRIPT_SOUND_RAVE_1_LOOP_L = 85, + SCRIPT_SOUND_RAVE_2_LOOP_S = 86, + SCRIPT_SOUND_RAVE_2_LOOP_L = 87, + SCRIPT_SOUND_RAVE_3_LOOP_S = 88, + SCRIPT_SOUND_RAVE_3_LOOP_L = 89, + SCRIPT_SOUND_MISTY_SEX_S = 90, + SCRIPT_SOUND_MISTY_SEX_L = 91, + SCRIPT_SOUND_GATE_START_CLUNK = 92, + SCRIPT_SOUND_GATE_STOP_CLUNK = 93, + SCRIPT_SOUND_PART_MISSION_COMPLETE = 94, + SCRIPT_SOUND_CHUNKY_RUN_SHOUT = 95, + SCRIPT_SOUND_SECURITY_GUARD_AWAY_SHOUT = 96, + SCRIPT_SOUND_RACE_START_3 = 97, + SCRIPT_SOUND_RACE_START_2 = 98, + SCRIPT_SOUND_RACE_START_1 = 99, + SCRIPT_SOUND_RACE_START_GO = 100, + SCRIPT_SOUND_SWAT_PED_SHOUT = 101, + SCRIPT_SOUND_PRETEND_FIRE_LOOP = 102, + SCRIPT_SOUND_AMMUNATION_CHAT_1 = 103, + SCRIPT_SOUND_AMMUNATION_CHAT_2 = 104, + SCRIPT_SOUND_AMMUNATION_CHAT_3 = 105, + SCRIPT_SOUND_BULLET_HIT_GROUND_1 = 106, + SCRIPT_SOUND_BULLET_HIT_GROUND_2 = 107, + SCRIPT_SOUND_BULLET_HIT_GROUND_3 = 108, + SCRIPT_SOUND_109 = 109, + SCRIPT_SOUND_110 = 110, + SCRIPT_SOUND_111 = 111, + SCRIPT_SOUND_PAYPHONE_RINGING = 112, + SCRIPT_SOUND_113 = 113, + SCRIPT_SOUND_GLASS_BREAK_L = 114, + SCRIPT_SOUND_GLASS_BREAK_S = 115, + SCRIPT_SOUND_GLASS_CRACK = 116, + SCRIPT_SOUND_GLASS_LIGHT_BREAK = 117, + SCRIPT_SOUND_BOX_DESTROYED_1 = 118, + SCRIPT_SOUND_BOX_DESTROYED_2 = 119, + SCRIPT_SOUND_METAL_COLLISION = 120, + SCRIPT_SOUND_TIRE_COLLISION = 121, + SCRIPT_SOUND_GUNSHELL_DROP = 122, + SCRIPT_SOUND_GUNSHELL_DROP_SOFT = 123, +}; diff --git a/src/audio/DMAudio.h b/src/audio/DMAudio.h index b671e260..da20dc31 100644 --- a/src/audio/DMAudio.h +++ b/src/audio/DMAudio.h @@ -96,8 +96,8 @@ enum eSound : int16 SOUND_RAMPAGE_FAILED = 91, SOUND_RAMPAGE_KILL = 92, SOUND_RAMPAGE_CAR_BLOWN = 93, - _SOUND_EVIDENCE_PICKUP = 94, - _SOUND_UNLOAD_GOLD = 95, + SOUND_EVIDENCE_PICKUP = 94, + SOUND_UNLOAD_GOLD = 95, SOUND_PAGER = 96, SOUND_PED_DEATH = 97, SOUND_PED_DAMAGE = 98, @@ -141,16 +141,16 @@ enum eSound : int16 SOUND_INJURED_PED_MALE_OUCH = 136, SOUND_INJURED_PED_FEMALE = 137, SOUND_8A = 138, - _SOUND_RACE_START_3 = 139, - _SOUND_RACE_START_2 = 140, - _SOUND_RACE_START_1 = 141, - _SOUND_RACE_START_GO = 142, + SOUND_RACE_START_3 = 139, + SOUND_RACE_START_2 = 140, + SOUND_RACE_START_1 = 141, + SOUND_RACE_START_GO = 142, SOUND_SPLASH = 143, SOUND_WATER_FALL = 144, SOUND_SPLATTER = 145, SOUND_CAR_PED_COLLISION = 146, SOUND_CLOCK_TICK = 147, - _SOUND_PART_MISSION_COMPLETE = 148, + SOUND_PART_MISSION_COMPLETE = 148, SOUND_FRONTEND_MENU_STARTING = 149, SOUND_FRONTEND_MENU_COMPLETED = 150, SOUND_FRONTEND_MENU_DENIED = 151, diff --git a/src/audio/SampleManager.cpp b/src/audio/SampleManager.cpp index fbeb49ed..2e11532e 100644 --- a/src/audio/SampleManager.cpp +++ b/src/audio/SampleManager.cpp @@ -1,6 +1,6 @@ +#include "SampleManager.h" #include "common.h" #include "patcher.h" -#include "SampleManager.h" CSampleManager &cSampleManager = *(CSampleManager *)0x7341E0; @@ -8,11 +8,29 @@ uint32 &nNumOfMp3Files = *(uint32 *)0x95CC00; uint8 &num3DProvidersAvailable = *(uint8 *)0x734237; uint32 *asName3DProviders = (uint32 *)0x734238; -bool CSampleManager::IsMP3RadioChannelAvailable() { +bool +CSampleManager::IsMP3RadioChannelAvailable() +{ return nNumOfMp3Files != 0; } WRAPPER +bool +CSampleManager::CheckForAnAudioFileOnCD() +{ + EAXJMP(0x566EA0); +} + +WRAPPER +int32 CSampleManager::GetSampleBaseFrequency(int32) { EAXJMP(0x5672A0); } + +WRAPPER +int32 CSampleManager::GetSampleLoopStartOffset(int32) { EAXJMP(0x5672C0); } + +WRAPPER +int32 CSampleManager::GetSampleLoopEndOffset(int32) { EAXJMP(0x5672E0); } + +WRAPPER bool CSampleManager::IsSampleBankLoaded(uint8) { EAXJMP(0x567130); } WRAPPER diff --git a/src/audio/SampleManager.h b/src/audio/SampleManager.h index f0245d4e..8db6c7d2 100644 --- a/src/audio/SampleManager.h +++ b/src/audio/SampleManager.h @@ -1,5 +1,7 @@ #pragma once +#include "common.h" + struct tSample { int m_nOffset; unsigned int m_nSize; @@ -11,6 +13,12 @@ struct tSample { class CSampleManager { public: + bool CheckForAnAudioFileOnCD(); + + int32 GetSampleBaseFrequency(int32); + int32 GetSampleLoopStartOffset(int32); + int32 GetSampleLoopEndOffset(int32); + bool IsSampleBankLoaded(uint8); void UnloadSampleBank(uint8); void Terminate(); |