diff options
Diffstat (limited to '')
-rw-r--r-- | src/audio/AudioManager.cpp | 1319 |
1 files changed, 1093 insertions, 226 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 |