diff options
author | Nikolay Korolev <nickvnuk@gmail.com> | 2019-08-03 15:02:09 +0200 |
---|---|---|
committer | Nikolay Korolev <nickvnuk@gmail.com> | 2019-08-03 15:02:09 +0200 |
commit | a3bdaccafbf4e916597fae9df71e3b7052be1647 (patch) | |
tree | 37a42c0b9ecdf75b8d4a524dbf76a10e9b8fe984 /src/audio | |
parent | RunningScript, part 4, plus some fixes (diff) | |
parent | Merge pull request #178 from Fire-Head/master (diff) | |
download | re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.tar re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.tar.gz re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.tar.bz2 re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.tar.lz re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.tar.xz re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.tar.zst re3-a3bdaccafbf4e916597fae9df71e3b7052be1647.zip |
Diffstat (limited to 'src/audio')
-rw-r--r-- | src/audio/AudioManager.cpp | 308 | ||||
-rw-r--r-- | src/audio/AudioManager.h | 34 | ||||
-rw-r--r-- | src/audio/AudioSamples.h | 8 | ||||
-rw-r--r-- | src/audio/MusicManager.cpp | 6 | ||||
-rw-r--r-- | src/audio/MusicManager.h | 13 | ||||
-rw-r--r-- | src/audio/SampleManager.cpp | 176 | ||||
-rw-r--r-- | src/audio/SampleManager.h | 68 | ||||
-rw-r--r-- | src/audio/sampman.cpp | 2331 | ||||
-rw-r--r-- | src/audio/sampman.h | 334 |
9 files changed, 2872 insertions, 406 deletions
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index bffdc27f..bd99628e 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -14,7 +14,7 @@ #include "Plane.h" #include "PlayerPed.h" #include "Pools.h" -#include "SampleManager.h" +#include "sampman.h" #include "Stats.h" #include "Vehicle.h" #include "Plane.h" @@ -149,9 +149,9 @@ cAudioManager::AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sampl } m_sQueueSample.m_bEmittingVolume = emittingVolume; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 6.0f; m_sQueueSample.m_fSoundIntensity = 50.0f; m_sQueueSample.field_56 = 0; @@ -351,9 +351,9 @@ cAudioManager::AgeCrimes() } int8 -cAudioManager::AutoDetect3DProviders() +cAudioManager::GetCurrent3DProviderIndex() { - if(m_bIsInitialised) return cSampleManager.AutoDetect3DProviders(); + if(m_bIsInitialised) return SampleManager.GetCurrent3DProviderIndex(); return -1; } @@ -370,7 +370,7 @@ cAudioManager::CalculateDistance(bool *ptr, float dist) bool cAudioManager::CheckForAnAudioFileOnCD() { - return cSampleManager.CheckForAnAudioFileOnCD(); + return SampleManager.CheckForAnAudioFileOnCD(); } void @@ -522,12 +522,12 @@ cAudioManager::DoPoliceRadioCrackle() m_sQueueSample.m_bIsDistant = 1; m_sQueueSample.field_16 = 10; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_POLICE_SCANNER_CRACKLE); + SampleManager.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.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(188); + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(188); m_sQueueSample.field_56 = 0; m_sQueueSample.m_bReverbFlag = 0; m_sQueueSample.m_bOffset = 63; @@ -569,9 +569,9 @@ cAudioManager::Initialise() { if(!m_bIsInitialised) { PreInitialiseGameSpecificSetup(); - m_bIsInitialised = cSampleManager.Initialise(); + m_bIsInitialised = SampleManager.Initialise(); if(m_bIsInitialised) { - m_bActiveSamples = cSampleManager.GetActiveSamples(); + m_bActiveSamples = SampleManager.GetMaximumSupportedChannels(); if(m_bActiveSamples <= 1u) { Terminate(); } else { @@ -651,10 +651,10 @@ cAudioManager::Terminate() PreTerminateGameSpecificShutdown(); for(uint32 i = 0; i < 2; i++) { - if(cSampleManager.IsSampleBankLoaded(i)) cSampleManager.UnloadSampleBank(i); + if(SampleManager.IsSampleBankLoaded(i)) SampleManager.UnloadSampleBank(i); } - cSampleManager.Terminate(); + SampleManager.Terminate(); m_bIsInitialised = 0; PostTerminateGameSpecificShutdown(); @@ -678,14 +678,14 @@ cAudioManager::GetMissionAudioLoadingStatus() uint8 cAudioManager::GetNum3DProvidersAvailable() { - if(m_bIsInitialised) return num3DProvidersAvailable; + if(m_bIsInitialised) return SampleManager.GetNum3DProvidersAvailable(); return 0; } bool cAudioManager::IsMP3RadioChannelAvailable() { - if(m_bIsInitialised) return cSampleManager.IsMP3RadioChannelAvailable(); + if(m_bIsInitialised) return SampleManager.IsMP3RadioChannelAvailable(); return 0; } @@ -693,7 +693,7 @@ cAudioManager::IsMP3RadioChannelAvailable() uint8 cAudioManager::GetCDAudioDriveLetter() { - if(m_bIsInitialised) return cSampleManager.GetCDAudioDriveLetter(); + if(m_bIsInitialised) return SampleManager.GetCDAudioDriveLetter(); return 0; } @@ -701,31 +701,31 @@ cAudioManager::GetCDAudioDriveLetter() void cAudioManager::SetEffectsMasterVolume(uint8 volume) { - cSampleManager.SetEffectsMasterVolume(volume); + SampleManager.SetEffectsMasterVolume(volume); } void cAudioManager::SetMusicMasterVolume(uint8 volume) { - cSampleManager.SetMusicMasterVolume(volume); + SampleManager.SetMusicMasterVolume(volume); } void -cAudioManager::SetEffectsFadeVol(uint8 volume) +cAudioManager::SetEffectsFadeVolume(uint8 volume) { - cSampleManager.SetEffectsFadeVol(volume); + SampleManager.SetEffectsFadeVolume(volume); } void -cAudioManager::SetMusicFadeVol(uint8 volume) +cAudioManager::SetMusicFadeVolume(uint8 volume) { - cSampleManager.SetMusicFadeVol(volume); + SampleManager.SetMusicFadeVolume(volume); } void cAudioManager::SetSpeakerConfig(int32 conf) { - cSampleManager.SetSpeakerConfig(conf); + SampleManager.SetSpeakerConfig(conf); } WRAPPER @@ -803,8 +803,8 @@ char * cAudioManager::Get3DProviderName(uint8 id) { if(!m_bIsInitialised) return 0; - if(id >= num3DProvidersAvailable) return 0; - return asName3DProviders[id]; + if(id >= SampleManager.GetNum3DProvidersAvailable()) return 0; + return SampleManager.Get3DProviderName(id); } bool @@ -825,16 +825,16 @@ cAudioManager::SetupJumboFlySound(uint8 emittingVol) m_sQueueSample.m_bEmittingVolume = emittingVol; m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_JUMBO_FLY_SOUND); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_JUMBO_FLY_SOUND); m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_fSoundIntensity = 440.0f; m_sQueueSample.field_56 = 0; m_sQueueSample.field_48 = 4.0; m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.field_76 = 5; m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); AddSampleToRequestedQueue(); } return 1; @@ -854,13 +854,13 @@ cAudioManager::SetupJumboRumbleSound(uint8 emittingVol) m_sQueueSample.m_bIsDistant = 1; m_sQueueSample.field_16 = 1; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_JUMBO_RUMBLE_SOUND); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_JUMBO_RUMBLE_SOUND); m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_bEmittingVolume = emittingVol; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 4.0; m_sQueueSample.m_fSoundIntensity = 240.0; m_sQueueSample.field_56 = 0; @@ -903,9 +903,9 @@ cAudioManager::SetupJumboTaxiSound(uint8 vol) m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_bEmittingVolume = emittingVol; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 4.0f; m_sQueueSample.m_fSoundIntensity = 180.0f; m_sQueueSample.field_56 = 0; @@ -934,9 +934,9 @@ cAudioManager::SetupJumboWhineSound(uint8 emittingVol, int32 freq) m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_bEmittingVolume = emittingVol; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 4.0f; m_sQueueSample.m_fSoundIntensity = 170.0f; m_sQueueSample.field_56 = 0; @@ -972,7 +972,7 @@ void cAudioManager::ResetPoliceRadio() { if(m_bIsInitialised) { - if(cSampleManager.GetChannelUsedFlag(28)) cSampleManager.StopChannel(28); + if(SampleManager.GetChannelUsedFlag(28)) SampleManager.StopChannel(28); InitialisePoliceRadio(); } } @@ -1044,13 +1044,13 @@ cAudioManager::RandomDisplacement(uint32 seed) void cAudioManager::ReleaseDigitalHandle() { - if(m_bIsInitialised) { cSampleManager.ReleaseDigitalHandle(); } + if(m_bIsInitialised) { SampleManager.ReleaseDigitalHandle(); } } void -cAudioManager::RequireDigitalHandle() +cAudioManager::ReacquireDigitalHandle() { - if(m_bIsInitialised) { cSampleManager.RequireDigitalHandle(); } + if(m_bIsInitialised) { SampleManager.ReacquireDigitalHandle(); } } void @@ -1142,7 +1142,7 @@ uint8 &jumboVolOffset = *(uint8 *)0x6508ED; void cAudioManager::DoJumboVolOffset() { - if(!(m_nTimeOfRecentCrime % (m_anRandomTable[0] % 6u + 3))) + if(!(m_FrameCounter % (m_anRandomTable[0] % 6u + 3))) jumboVolOffset = m_anRandomTable[1] % 60u; } @@ -3448,7 +3448,7 @@ cAudioManager::ProcessActiveQueues() v6 = (v6 + 92); } if(v5->m_nLoopCount) { - if(m_nTimeOfRecentCrime & 1) { + if(m_FrameCounter & 1) { if(!(j & 1)) { v8 = 0; goto LABEL_17; @@ -3460,7 +3460,7 @@ cAudioManager::ProcessActiveQueues() v8 = 0; } LABEL_17: - if(v8 && !cSampleManager.GetChannelUsedFlag(j)) { + if(v8 && !SampleManager.GetChannelUsedFlag(j)) { v5->m_bLoopEnded = 1; m_asActiveSamples[0].m_bLoopEnded = 1; m_asActiveSamples[0].m_nSampleIndex = NO_SAMPLE; @@ -3483,8 +3483,8 @@ cAudioManager::ProcessActiveQueues() } else { v43 = v5->m_bEmittingVolume; } - cSampleManager.SetChannelFrequency(j, v5->m_nFrequency); - cSampleManager.SetChannelEmittingVolume(j, v43); + SampleManager.SetChannelFrequency(j, v5->m_nFrequency); + SampleManager.SetChannelEmittingVolume(j, v43); } else { v10 = m_asActiveSamples[0].m_fDistance; v11 = v5->m_fDistance; @@ -3506,7 +3506,7 @@ cAudioManager::ProcessActiveQueues() newFreq = activeSampleFreq + 6000; } v7->m_nFrequency = newFreq; - cSampleManager.SetChannelFrequency(j, newFreq); + SampleManager.SetChannelFrequency(j, newFreq); } v40 = v7->m_bEmittingVolume; v17 = v5->m_bEmittingVolume; @@ -3528,16 +3528,16 @@ cAudioManager::ProcessActiveQueues() } else { v19 = v41; } - cSampleManager.SetChannelEmittingVolume(j, v19); + SampleManager.SetChannelEmittingVolume(j, v19); v7->m_bEmittingVolume = v41; } TranslateEntity(&v5->m_vecPos, &a2); - cSampleManager.SetChannel3DPosition(j, a2.x, a2.y, a2.z); + SampleManager.SetChannel3DPosition(j, a2.x, a2.y, a2.z); v20 = 0.25f * v5->m_fSoundIntensity; - cSampleManager.SetChannel3DDistances( + SampleManager.SetChannel3DDistances( j, v5->m_fSoundIntensity, v20); } - cSampleManager.SetChannelReverbFlag(j, v5->m_bReverbFlag); + SampleManager.SetChannelReverbFlag(j, v5->m_bReverbFlag); continue; } v5->m_bIsProcessed = 0; @@ -3551,7 +3551,7 @@ cAudioManager::ProcessActiveQueues() for(uint32 i = 0; v22 < m_bActiveSamples; i++) { if(v23->m_asActiveSamples[0].m_nSampleIndex != NO_SAMPLE && !v23->m_asActiveSamples[0].m_bIsProcessed) { - cSampleManager.StopChannel(i); + SampleManager.StopChannel(i); v23->m_asActiveSamples[0].m_nSampleIndex = NO_SAMPLE; v23->m_asActiveSamples[0].m_nEntityIndex = -5; } @@ -3578,7 +3578,7 @@ cAudioManager::ProcessActiveQueues() if(!v26->m_nLoopCount) goto LABEL_80; v28 = v26->m_nFrequency / field_19192; v29 = v26->m_nLoopCount * - cSampleManager.GetSampleLength( + SampleManager.GetSampleLength( v26->m_nSampleIndex); if(v28) { v26->field_76 = v29 / v28 + 1; @@ -3604,28 +3604,28 @@ cAudioManager::ProcessActiveQueues() v45 = v27->m_asActiveSamples[0] .m_bEmittingVolume; } - if(cSampleManager.InitialiseChannel( + if(SampleManager.InitialiseChannel( l, v27->m_asActiveSamples[0] .m_nSampleIndex, v27->m_asActiveSamples[0] .m_bBankIndex)) { - cSampleManager.SetChannelFrequency( + SampleManager.SetChannelFrequency( l, v27->m_asActiveSamples[0] .m_nFrequency); cSampleManager .SetChannelEmittingVolume(l, v45); - cSampleManager.SetChannelLoopPoints( + SampleManager.SetChannelLoopPoints( l, v27->m_asActiveSamples[0] .m_nLoopStart, v27->m_asActiveSamples[0] .m_nLoopEnd); - cSampleManager.SetChannelLoopCount( + SampleManager.SetChannelLoopCount( l, v27->m_asActiveSamples[0] .m_nLoopCount); - cSampleManager.SetChannelReverbFlag( + SampleManager.SetChannelReverbFlag( l, v27->m_asActiveSamples[0] .m_bReverbFlag); if(v27->m_asActiveSamples[0] @@ -3656,7 +3656,7 @@ cAudioManager::ProcessActiveQueues() v35 = v34; v36 = v33; v37 = v32; - cSampleManager.SetChannel3DPosition( + SampleManager.SetChannel3DPosition( l, v37, v36, v35); v38 = 0.25f * v27->m_asActiveSamples[0] @@ -3667,7 +3667,7 @@ cAudioManager::ProcessActiveQueues() v27->m_asActiveSamples[0] .m_fSoundIntensity, v38); - cSampleManager.StartChannel(l); + SampleManager.StartChannel(l); } v27->m_asActiveSamples[0].m_bIsProcessed = 1; @@ -3706,7 +3706,7 @@ cAudioManager::ProcessAirBrakes(cVehicleParams *params) 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); + SampleManager.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; @@ -3759,7 +3759,7 @@ cAudioManager::ProcessAirportScriptObject(uint8 sound) 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_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_4 = counter++; m_sQueueSample.m_bIsDistant = 0; @@ -3815,9 +3815,9 @@ cAudioManager::ProcessBridgeMotor() m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_bEmittingVolume = 127; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_fSoundIntensity = 400.0f; m_sQueueSample.field_56 = 0; @@ -3847,13 +3847,13 @@ cAudioManager::ProcessBridgeWarning() m_sQueueSample.m_bIsDistant = 0; m_sQueueSample.field_16 = 1; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_BRIDGE_WARNING); + SampleManager.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); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_fSoundIntensity = 450.0f; m_sQueueSample.field_56 = 0; @@ -3910,7 +3910,7 @@ cAudioManager::ProcessCinemaScriptObject(uint8 sound) 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_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency >> 2); @@ -3972,7 +3972,7 @@ cAudioManager::ProcessDocksScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_DOCKS; m_sQueueSample.m_bBankIndex = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_DOCKS); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_DOCKS); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency >> 3); m_sQueueSample.field_4 = counter++; @@ -4100,9 +4100,9 @@ cAudioManager::ProcessFireHydrant() m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_bEmittingVolume = 40; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_fSoundIntensity = 35.0f; m_sQueueSample.field_56 = 0; @@ -4249,7 +4249,7 @@ cAudioManager::ProcessFrontEnd() m_sQueueSample.m_nFrequency = 48000; } else { m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); } m_sQueueSample.m_bVolume = 110; m_sQueueSample.field_4 = counter++; @@ -4317,7 +4317,7 @@ cAudioManager::ProcessHomeScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = m_anRandomTable[0] % 5u + AUDIO_SAMPLE_HOME_1; m_sQueueSample.m_bBankIndex = 0; - m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency >> 4); @@ -4478,7 +4478,7 @@ cAudioManager::ProcessLaunderetteScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_LAUNDERETTE_1; m_sQueueSample.m_bBankIndex = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_LAUNDERETTE_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_LAUNDERETTE_1); m_sQueueSample.field_4 = 0; m_sQueueSample.m_bIsDistant = 0; m_sQueueSample.m_nLoopCount = 0; @@ -4487,9 +4487,9 @@ cAudioManager::ProcessLaunderetteScriptObject(uint8 sound) m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_bEmittingVolume = 45; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bRequireReflection = 0; AddSampleToRequestedQueue(); @@ -4500,7 +4500,7 @@ cAudioManager::ProcessLaunderetteScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_LAUNDERETTE_2; m_sQueueSample.m_bBankIndex = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_LAUNDERETTE_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_LAUNDERETTE_2); m_sQueueSample.field_4 = 1; m_sQueueSample.m_bIsDistant = 0; m_sQueueSample.m_nLoopCount = 0; @@ -4509,9 +4509,9 @@ cAudioManager::ProcessLaunderetteScriptObject(uint8 sound) m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_bEmittingVolume = 110; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bRequireReflection = 0; AddSampleToRequestedQueue(); @@ -4534,7 +4534,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_1); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4546,7 +4546,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_1); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4558,7 +4558,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_2); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4570,7 +4570,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_2); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4582,7 +4582,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_3); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_3); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4594,7 +4594,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_3); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_3); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4606,7 +4606,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_4); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_4); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4618,7 +4618,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_4); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_4); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4630,7 +4630,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_5); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_5); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4642,7 +4642,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_5); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_5); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4654,7 +4654,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_6); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_6); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4666,7 +4666,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_6); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_6); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4678,7 +4678,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_7); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_7); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4690,7 +4690,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_7); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_7); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4702,7 +4702,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_8); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_8); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4714,7 +4714,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_8); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_8); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4726,7 +4726,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_9); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_9); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4738,7 +4738,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_9); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_9); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4750,7 +4750,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_10); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_10); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4762,7 +4762,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_10); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_10); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4774,7 +4774,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_11); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_11); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4786,7 +4786,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_11); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_11); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4798,7 +4798,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_12); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_12); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4810,7 +4810,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_12); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_12); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4822,7 +4822,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_13); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_13); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4834,7 +4834,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_13); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_13); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4846,7 +4846,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_1); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4858,7 +4858,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_1); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4870,7 +4870,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_2); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4882,7 +4882,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_STRIP_CLUB_2); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4900,7 +4900,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_409); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_409); m_sQueueSample.field_16 = 6; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4912,7 +4912,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_409); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_409); m_sQueueSample.field_16 = 6; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4926,7 +4926,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CHINATOWN_RESTAURANT); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CHINATOWN_RESTAURANT); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4938,7 +4938,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CHINATOWN_RESTAURANT); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CHINATOWN_RESTAURANT); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4950,7 +4950,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CIPRIANI_RESTAURANT); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CIPRIANI_RESTAURANT); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4962,7 +4962,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CIPRIANI_RESTAURANT); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_CIPRIANI_RESTAURANT); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4974,7 +4974,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_414); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_414); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4986,7 +4986,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_414); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_414); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -4998,7 +4998,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_MARCO_BISTRO); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_MARCO_BISTRO); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5010,7 +5010,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 110; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_MARCO_BISTRO); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_MARCO_BISTRO); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5032,7 +5032,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_FRANKIE_PIANO); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_FRANKIE_PIANO); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5044,7 +5044,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_PARTY_1); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5064,7 +5064,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 90; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_BANK_ALARM); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_BANK_ALARM); m_sQueueSample.field_16 = 2; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5076,7 +5076,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 90; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_BANK_ALARM); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_BANK_ALARM); m_sQueueSample.field_16 = 2; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5088,7 +5088,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_POLICE_BALL); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_POLICE_BALL); m_sQueueSample.field_16 = 2; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5100,7 +5100,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_POLICE_BALL); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_POLICE_BALL); m_sQueueSample.field_16 = 2; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5112,7 +5112,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_INDUSTRIAL); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_INDUSTRIAL); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5124,7 +5124,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_INDUSTRIAL); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_INDUSTRIAL); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5141,7 +5141,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5154,7 +5154,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5166,7 +5166,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_2); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5178,7 +5178,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 127; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_2); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_RAVE_2); m_sQueueSample.field_16 = 3; m_sQueueSample.field_76 = 3; m_sQueueSample.field_48 = 2.0f; @@ -5190,7 +5190,7 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bBankIndex = 0; emittingVolume = 80; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_FIRE_ENTITY); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_FIRE_ENTITY); m_sQueueSample.field_16 = 8; m_sQueueSample.field_76 = 10; m_sQueueSample.field_48 = 2.0f; @@ -5211,9 +5211,9 @@ cAudioManager::ProcessLoopingScriptObject(uint8 sound) m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bEmittingVolume = emittingVolume; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bRequireReflection = 0; AddSampleToRequestedQueue(); } @@ -5323,7 +5323,7 @@ cAudioManager::ProcessPornCinema(uint8 sound) ComputeVolume(maxVolume, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); if(m_sQueueSample.m_bVolume) { - m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_4 = 0; m_sQueueSample.m_bIsDistant = 0; @@ -5333,9 +5333,9 @@ cAudioManager::ProcessPornCinema(uint8 sound) m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_bEmittingVolume = maxVolume; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset( + SampleManager.GetSampleLoopStartOffset( m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nLoopEnd = cSampleManager.GetSampleLoopEndOffset( + m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset( m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bRequireReflection = 0; @@ -5350,7 +5350,7 @@ cAudioManager::ProcessPornCinema(uint8 sound) if(m_sQueueSample.m_bVolume) { rand = m_anRandomTable[1] & 1; m_sQueueSample.m_nSampleIndex = rand + sample; - m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency >> 4); @@ -5402,7 +5402,7 @@ cAudioManager::ProcessSawMillScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SAWMILL_1; m_sQueueSample.m_bBankIndex = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_SAWMILL_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_SAWMILL_1); m_sQueueSample.field_4 = 0; m_sQueueSample.m_bIsDistant = 0; m_sQueueSample.m_nLoopCount = 0; @@ -5411,9 +5411,9 @@ cAudioManager::ProcessSawMillScriptObject(uint8 sound) m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_bEmittingVolume = 30; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bRequireReflection = 0; AddSampleToRequestedQueue(); @@ -5425,7 +5425,7 @@ cAudioManager::ProcessSawMillScriptObject(uint8 sound) if(m_sQueueSample.m_bVolume) { m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SAWMILL_2; m_sQueueSample.m_bBankIndex = 0; - m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_4 = 1; m_sQueueSample.m_bIsDistant = 0; @@ -5476,7 +5476,7 @@ cAudioManager::ProcessShopScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SHOP_1; m_sQueueSample.m_bBankIndex = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_SHOP_1); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_SHOP_1); m_sQueueSample.field_4 = 0; m_sQueueSample.m_bIsDistant = 0; m_sQueueSample.m_nLoopCount = 0; @@ -5485,9 +5485,9 @@ cAudioManager::ProcessShopScriptObject(uint8 sound) m_sQueueSample.field_48 = 2.0f; m_sQueueSample.m_bEmittingVolume = 30; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bRequireReflection = 0; cAudioManager::AddSampleToRequestedQueue(); @@ -5500,7 +5500,7 @@ cAudioManager::ProcessShopScriptObject(uint8 sound) rand = m_anRandomTable[1] & 1; m_sQueueSample.m_nSampleIndex = rand + AUDIO_SAMPLE_SHOP_2; m_sQueueSample.m_bBankIndex = 0; - m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency( m_sQueueSample.m_nSampleIndex); m_sQueueSample.field_4 = rand + 1; m_sQueueSample.m_bIsDistant = 0; @@ -5526,8 +5526,8 @@ cAudioManager::ProcessSpecial() if(m_bUserPause) { if(!m_bPreviousUserPause) { MusicManager.ChangeMusicMode(0); - cSampleManager.SetEffectsFadeVol(maxVolume); - cSampleManager.SetMusicFadeVol(maxVolume); + SampleManager.SetEffectsFadeVolume(maxVolume); + SampleManager.SetMusicFadeVolume(maxVolume); } } else { if(m_bPreviousUserPause) { @@ -5539,7 +5539,7 @@ cAudioManager::ProcessSpecial() const PedState &state = playerPed->m_nPedState; if(state != PED_ENTER_CAR && state != PED_STEAL_CAR && !playerPed->bInVehicle) - cSampleManager.StopChannel(m_bActiveSamples); + SampleManager.StopChannel(m_bActiveSamples); } } } @@ -5592,7 +5592,7 @@ cAudioManager::ProcessWorkShopScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_WORK_SHOP; m_sQueueSample.m_bBankIndex = 0; m_sQueueSample.m_nFrequency = - cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_WORK_SHOP); + SampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_WORK_SHOP); m_sQueueSample.field_4 = 0; m_sQueueSample.m_bIsDistant = 0; m_sQueueSample.m_nLoopCount = 0; @@ -5601,9 +5601,9 @@ cAudioManager::ProcessWorkShopScriptObject(uint8 sound) m_sQueueSample.field_48 = 2.0; m_sQueueSample.m_bEmittingVolume = 30; m_sQueueSample.m_nLoopStart = - cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = - cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_bReverbFlag = 1; m_sQueueSample.m_bRequireReflection = 0; AddSampleToRequestedQueue(); @@ -5623,7 +5623,7 @@ 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(0x57A8F0, &cAudioManager::GetCurrent3DProviderIndex, PATCH_JUMP); // InjectHook(0x580AF0, &cAudioManager::AgeCrimes, PATCH_JUMP); InjectHook(0x5697A0, &cAudioManager::CalculateDistance, PATCH_JUMP); @@ -5657,8 +5657,8 @@ InjectHook(0x57AA30, &cAudioManager::GetCDAudioDriveLetter, PATCH_JUMP); InjectHook(0x57A730, &cAudioManager::SetEffectsMasterVolume, PATCH_JUMP); InjectHook(0x57A750, &cAudioManager::SetMusicMasterVolume, PATCH_JUMP); -InjectHook(0x57A770, &cAudioManager::SetEffectsFadeVol, PATCH_JUMP); -InjectHook(0x57A790, &cAudioManager::SetMusicFadeVol, PATCH_JUMP); +InjectHook(0x57A770, &cAudioManager::SetEffectsFadeVolume, PATCH_JUMP); +InjectHook(0x57A790, &cAudioManager::SetMusicFadeVolume, PATCH_JUMP); InjectHook(0x57A9A0, &cAudioManager::SetSpeakerConfig, PATCH_JUMP); @@ -5694,7 +5694,7 @@ InjectHook(0x579650, &cAudioManager::IsMissionAudioSampleFinished, PATCH_JUMP); InjectHook(0x57AF90, &cAudioManager::RandomDisplacement, PATCH_JUMP); InjectHook(0x57A9E0, &cAudioManager::ReleaseDigitalHandle, PATCH_JUMP); -InjectHook(0x57A9F0, &cAudioManager::RequireDigitalHandle, PATCH_JUMP); +InjectHook(0x57A9F0, &cAudioManager::ReacquireDigitalHandle, PATCH_JUMP); InjectHook(0x57AA00, &cAudioManager::SetDynamicAcousticModelingStatus, PATCH_JUMP); InjectHook(0x57AA50, &cAudioManager::IsAudioInitialised, PATCH_JUMP); diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 4a59721b..f592d3f3 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -186,6 +186,24 @@ struct cAudioScriptObject { static_assert(sizeof(cAudioScriptObject) == 0x14, "cAudioScriptObject: error"); +enum +{ + /* + REFLECTION_YMAX = 0, top + REFLECTION_YMIN = 1, bottom + REFLECTION_XMIN = 2, left + REFLECTION_XMAX = 3, right + REFLECTION_ZMAX = 4, + */ + + REFLECTION_TOP = 0, + REFLECTION_BOTTOM, + REFLECTION_LEFT, + REFLECTION_RIGHT, + REFLECTION_UP, + MAX_REFLECTIONS, +}; + class cAudioManager { public: @@ -233,7 +251,13 @@ public: uint8 m_bUserPause; uint8 m_bPreviousUserPause; uint8 field_19195; - int32 m_nTimeOfRecentCrime; + uint32 m_FrameCounter; + + inline uint32 GetFrameCounter(void) { return m_FrameCounter; } + float GetReflectionsDistance(int32 idx) { return m_afReflectionsDistances[idx]; } + int32 GetRandomTabe(int32 idx) { return m_anRandomTable[idx]; } + + // void AddDetailsToRequestedOrderList(uint8 sample); /// ok void AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sample, uint8 unk1, @@ -242,7 +266,7 @@ public: void AddReleasingSounds(); // todo (difficult) void AddSampleToRequestedQueue(); /// ok void AgeCrimes(); // todo - int8 AutoDetect3DProviders(); /// ok + int8 GetCurrent3DProviderIndex(); /// ok void CalculateDistance(bool *ptr, float dist); /// ok bool CheckForAnAudioFileOnCD(); /// ok @@ -282,8 +306,8 @@ public: void SetEffectsMasterVolume(uint8 volume); void SetMusicMasterVolume(uint8 volume); - void SetEffectsFadeVol(uint8 volume); - void SetMusicFadeVol(uint8 volume); + void SetEffectsFadeVolume(uint8 volume); + void SetMusicFadeVolume(uint8 volume); void SetSpeakerConfig(int32 conf); @@ -323,7 +347,7 @@ public: int32 RandomDisplacement(uint32 seed); void ReleaseDigitalHandle(); - void RequireDigitalHandle(); + void ReacquireDigitalHandle(); void SetDynamicAcousticModelingStatus(bool status); bool IsAudioInitialised() const; diff --git a/src/audio/AudioSamples.h b/src/audio/AudioSamples.h index ba7bf7a8..7d71be54 100644 --- a/src/audio/AudioSamples.h +++ b/src/audio/AudioSamples.h @@ -3037,6 +3037,14 @@ enum eAudioSamples : uint32 { AUDIO_SAMPLE_AMMUNATION_WELCOME_3 = 3031, TOTAL_AUDIO_SAMPLES = 3032, NO_SAMPLE = 3033, + + // shorthands + SAMPLEBANK_START = AUDIO_SAMPLE_VEHICLE_HORN_0, + SAMPLEBANK_END = AUDIO_SAMPLE_PAGER, + SAMPLEBANK_MAX = AUDIO_SAMPLE_PAGER+1, + SAMPLEBANK_PED_START = AUDIO_SAMPLE_POLICE_COP_1_ARREST_1, + SAMPLEBANK_PED_END = AUDIO_SAMPLE_AMMUNATION_WELCOME_3, + SAMPLEBANK_PED_MAX = AUDIO_SAMPLE_AMMUNATION_WELCOME_3+1, }; enum eScriptSounds : int16 diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 71cc594b..0700ee63 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -8,7 +8,7 @@ #include "Camera.h" #include "World.h" #include "ModelIndices.h" -#include "SampleManager.h" +#include "sampman.h" #include "Replay.h" cMusicManager &MusicManager = *(cMusicManager*)0x8F3964; @@ -57,7 +57,7 @@ void cMusicManager::DisplayRadioStationName() if (MusicManager.m_bPlayerInCar && !MusicManager.m_bPreviousPlayerInCar) pCurrentStation = nil; - if (cSampleManager.IsMP3RadioChannelAvailable()) { + if (SampleManager.IsMP3RadioChannelAvailable()) { gStreamedSound = MusicManager.m_nCurrentStreamedSound; if (gStreamedSound != STREAMED_SOUND_CITY_AMBIENT && gStreamedSound != STREAMED_SOUND_WATER_AMBIENT) { @@ -140,7 +140,7 @@ void cMusicManager::DisplayRadioStationName() return; }; - if (pRetune > CHATTERBOX && !CSampleManager::IsMP3RadioChannelAvailable()) { + if (pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; } diff --git a/src/audio/MusicManager.h b/src/audio/MusicManager.h index 6a08882f..cdea65ec 100644 --- a/src/audio/MusicManager.h +++ b/src/audio/MusicManager.h @@ -16,6 +16,15 @@ enum eRadioStation RADIO_OFF, }; +enum eMusicMode +{ + MUSICMODE_FRONTEND = 0, + MUSICMODE_GAME, + MUSICMODE_CUTSCENE, + MUSICMODE_OFF, + MUSICMODE_4, +}; + enum eStreamedSounds { STREAMED_SOUND_RADIO_HEAD = 0, @@ -264,6 +273,10 @@ public: uint8 field_2395; public: + bool IsInitialised() { return m_bIsInitialised; } + uint32 GetMusicMode() { return m_nMusicMode; } + uint8 GetCurrentTrack() { return m_nCurrentStreamedSound; } + void Initialise(); void Terminate(); diff --git a/src/audio/SampleManager.cpp b/src/audio/SampleManager.cpp deleted file mode 100644 index b2f0cf35..00000000 --- a/src/audio/SampleManager.cpp +++ /dev/null @@ -1,176 +0,0 @@ -#include "SampleManager.h" -#include "common.h" -#include "patcher.h" - -CSampleManager &cSampleManager = *(CSampleManager *)0x7341E0; - -uint32 &nNumOfMp3Files = *(uint32 *)0x95CC00; -uint8 &num3DProvidersAvailable = *(uint8 *)0x734237; -char **asName3DProviders = (char **)0x734238; - -bool -CSampleManager::IsMP3RadioChannelAvailable() -{ - return nNumOfMp3Files != 0; -} - -WRAPPER -void CSampleManager::SetChannelFrequency(int32, int32) { EAXJMP(0x5679D0); } - -WRAPPER -void CSampleManager::SetChannelEmittingVolume(int32, uint32) { EAXJMP(0x567820); } - -WRAPPER -void -CSampleManager::SetChannel3DPosition(int32, float, float, float) -{ - EAXJMP(0x567890); -} - -WRAPPER -void CSampleManager::SetChannelLoopCount(int32, int32) { EAXJMP(0x567AA0); } - -WRAPPER -void CSampleManager::SetChannel3DDistances(int32, int32, int32) { EAXJMP(0x5678D0); } - -WRAPPER -void CSampleManager::SetChannelReverbFlag(int32, uint8) { EAXJMP(0x567630); } - -WRAPPER -int32 CSampleManager::GetSampleLength(int32) { EAXJMP(0x567300); } - -WRAPPER -bool CSampleManager::InitialiseChannel(int32, int32, uint32, uint32) { EAXJMP(0x5676A0); } - -WRAPPER -void CSampleManager::SetChannelLoopPoints(int32, int32, int32) { EAXJMP(0x567A30); } - -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 -void CSampleManager::UnloadSampleBank(uint8) { EAXJMP(0x567110); } - -WRAPPER -void -CSampleManager::Terminate() -{ - EAXJMP(0x566DC0); -} - -WRAPPER -bool -CSampleManager::Initialise() -{ - EAXJMP(0x566530); -} - -WRAPPER -int32 -CSampleManager::GetActiveSamples() -{ - EAXJMP(0x565970); -} - -WRAPPER void -CSampleManager::ReleaseDigitalHandle() -{ - EAXJMP(0x5664B0); -} - -WRAPPER -void -CSampleManager::RequireDigitalHandle() -{ - EAXJMP(0x5664F0); -} - -WRAPPER -char -CSampleManager::AutoDetect3DProviders() -{ - EAXJMP(0x565990); -} - -WRAPPER -uint8 -CSampleManager::GetCDAudioDriveLetter() -{ - EAXJMP(0x566F20); -} - -WRAPPER -void -CSampleManager::SetEffectsMasterVolume(uint8 volume) -{ - EAXJMP(0x567010); -} - -WRAPPER -void -CSampleManager::SetMusicMasterVolume(uint8 volume) -{ - EAXJMP(0x567020); -} - -WRAPPER -void -CSampleManager::SetEffectsFadeVol(uint8 volume) -{ - EAXJMP(0x567030); -} - -WRAPPER -void -CSampleManager::SetMusicFadeVol(uint8 volume) -{ - EAXJMP(0x567040); -} - -WRAPPER -void -CSampleManager::SetSpeakerConfig(uint32 config) -{ - EAXJMP(0x565900); -} - -WRAPPER -bool -CSampleManager::GetChannelUsedFlag(int32 id) -{ - EAXJMP(0x567B00); -} - -WRAPPER -void -CSampleManager::StartChannel(int32 id) -{ - EAXJMP(0x567B80); -} - -WRAPPER -void -CSampleManager::StopChannel(int32 id) -{ - EAXJMP(0x567BE0); -} - -STARTPATCHES -InjectHook(0x566490, CSampleManager::IsMP3RadioChannelAvailable, PATCH_JUMP); -ENDPATCHES
\ No newline at end of file diff --git a/src/audio/SampleManager.h b/src/audio/SampleManager.h deleted file mode 100644 index dc46e7ec..00000000 --- a/src/audio/SampleManager.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include "common.h" - -struct tSample { - int m_nOffset; - unsigned int m_nSize; - int m_nFrequency; - int m_nLoopStart; - int m_nLoopEnd; -}; - -class CSampleManager -{ -public: - void SetChannelFrequency(int32, int32); - void SetChannelEmittingVolume(int32, uint32); - void SetChannel3DPosition(int32, float, float, float); - void SetChannelLoopCount(int32, int32); - - void SetChannel3DDistances(int32, int32, int32); - void SetChannelReverbFlag(int32, uint8); - - int32 GetSampleLength(int32); - - bool InitialiseChannel(int32, int32, uint32, uint32 something = 0); - - void SetChannelLoopPoints(int32, int32, int32); - - bool CheckForAnAudioFileOnCD(); - - int32 GetSampleBaseFrequency(int32); - int32 GetSampleLoopStartOffset(int32); - int32 GetSampleLoopEndOffset(int32); - - bool IsSampleBankLoaded(uint8); - void UnloadSampleBank(uint8); - void Terminate(); - - bool Initialise(); - int32 GetActiveSamples(); - - void ReleaseDigitalHandle(); - void RequireDigitalHandle(); - - char AutoDetect3DProviders(); - uint8 GetCDAudioDriveLetter(); - - void SetEffectsMasterVolume(uint8 volume); - void SetMusicMasterVolume(uint8 volume); - void SetEffectsFadeVol(uint8 volume); - void SetMusicFadeVol(uint8 volume); - - void SetSpeakerConfig(uint32 config); - - bool GetChannelUsedFlag(int32 id); - - void StartChannel(int32 id); - void StopChannel(int32 id); - - static bool IsMP3RadioChannelAvailable(); -}; - -extern uint32 &nNumOfMp3Files; -extern uint8 &num3DProvidersAvailable; -extern char **asName3DProviders; - -extern CSampleManager &cSampleManager;
\ No newline at end of file diff --git a/src/audio/sampman.cpp b/src/audio/sampman.cpp new file mode 100644 index 00000000..c758fc9f --- /dev/null +++ b/src/audio/sampman.cpp @@ -0,0 +1,2331 @@ +#include <windows.h> +#include <shobjidl.h> +#include <shlguid.h> + +#include <time.h> + +#include "eax.h" +#include "eax-util.h" +#include "mss.h" + +#include "sampman.h" +#include "AudioManager.h" +#include "MusicManager.h" +#include "Frontend.h" +#include "Timer.h" +#include "patcher.h" + +#pragma comment( lib, "mss32.lib" ) + +cSampleManager &SampleManager = *(cSampleManager *)0x7341E0; +int32 (&BankStartOffset)[2] = *(int32 (*)[2])*(int *)0x6FAB70; + +/////////////////////////////////////////////////////////////// + +char SampleBankDescFilename[] = "AUDIO\\SFX.SDT"; +char SampleBankDataFilename[] = "AUDIO\\SFX.RAW"; + +FILE *fpSampleDescHandle; +FILE *fpSampleDataHandle; +bool bSampleBankLoaded [MAX_SAMPLEBANKS]; +int32 nSampleBankDiscStartOffset [MAX_SAMPLEBANKS]; +int32 nSampleBankSize [MAX_SAMPLEBANKS]; +int32 nSampleBankMemoryStartAddress[MAX_SAMPLEBANKS]; +int32 _nSampleDataEndOffset; + +int32 nPedSlotSfx [MAX_PEDSFX]; +int32 nPedSlotSfxAddr[MAX_PEDSFX]; +int32 nCurrentPedSlot; + +uint8 nChannelVolume[MAXCHANNELS+MAX2DCHANNELS]; + +uint32 nStreamLength[TOTAL_STREAMED_SOUNDS]; + +/////////////////////////////////////////////////////////////// +struct tMP3Entry +{ + char aFilename[MAX_PATH]; + + uint32 nTrackLength; + uint32 nTrackStreamPos; + + tMP3Entry *pNext; + char *pLinkPath; +}; + +uint32 nNumMP3s; +tMP3Entry *_pMP3List; +char _mp3DirectoryPath[MAX_PATH]; +HSTREAM mp3Stream [MAX_MP3STREAMS]; +int8 nStreamPan [MAX_MP3STREAMS]; +int8 nStreamVolume[MAX_MP3STREAMS]; +uint32 _CurMP3Index; +int32 _CurMP3Pos; +bool _bIsMp3Active; + +#if defined(GTA3_1_1_PATCH) || defined(GTA3_STEAM_PATCH) || defined(NO_CDCHECK) +bool _bUseHDDAudio; +char _aHDDPath[MAX_PATH]; +#endif +/////////////////////////////////////////////////////////////// + + +bool _bSampmanInitialised = false; + +// +// Miscellaneous globals / defines + +// Env Size Diffus Room RoomHF RoomLF DecTm DcHF DcLF Refl RefDel Ref Pan Revb RevDel Rev Pan EchTm EchDp ModTm ModDp AirAbs HFRef LFRef RRlOff FLAGS + +EAXLISTENERPROPERTIES StartEAX3 = + {26, 1.7f, 0.8f, -1000, -1000, -100, 4.42f, 0.14f, 1.00f, 429, 0.014f, 0.00f,0.00f,0.00f, 1023, 0.021f, 0.00f,0.00f,0.00f, 0.250f, 0.000f, 0.250f, 0.000f, -5.0f, 2727.1f, 250.0f, 0.00f, 0x3f }; + +EAXLISTENERPROPERTIES FinishEAX3 = + {26, 100.0f, 1.0f, 0, -1000, -2200, 20.0f, 1.39f, 1.00f, 1000, 0.069f, 0.00f,0.00f,0.00f, 400, 0.100f, 0.00f,0.00f,0.00f, 0.250f, 1.000f, 3.982f, 0.000f, -18.0f, 3530.8f, 417.9f, 6.70f, 0x3f }; + +EAXLISTENERPROPERTIES EAX3Params; + +S32 prevprovider=-1; +S32 curprovider=-1; +S32 usingEAX=0; +S32 usingEAX3=0; +HPROVIDER opened_provider=0; +H3DSAMPLE opened_samples[MAXCHANNELS] = {0}; +HSAMPLE opened_2dsamples[MAX2DCHANNELS] = {0}; +HDIGDRIVER DIG; +S32 speaker_type=0; + +U32 _maxSamples; +float _fPrevEaxRatioDestination; +bool _usingMilesFast2D; +float _fEffectsLevel; + + +struct +{ + HPROVIDER id; + char name[80]; +}providers[MAXPROVIDERS]; + +typedef struct provider_stuff +{ + char* name; + HPROVIDER id; +} provider_stuff; + + +static int __cdecl comp(const provider_stuff*s1,const provider_stuff*s2) +{ + return( _stricmp(s1->name,s2->name) ); +} + +static void +add_providers() +{ + provider_stuff pi[MAXPROVIDERS]; + U32 n,i,j; + + SampleManager.SetNum3DProvidersAvailable(0); + + HPROENUM next = HPROENUM_FIRST; + + n=0; + while (AIL_enumerate_3D_providers(&next, &pi[n].id, &pi[n].name) && (n<MAXPROVIDERS)) + { + ++n; + } + + qsort(pi,n,sizeof(pi[0]), (int(__cdecl*)(void const*, void const*))comp); + + for(i=0;i<n;i++) + { + providers[i].id=pi[i].id; + strcpy(providers[i].name, pi[i].name); + SampleManager.Set3DProviderName(i, providers[i].name); + } + + SampleManager.SetNum3DProvidersAvailable(n); + + for(j=n;j<MAXPROVIDERS;j++) + SampleManager.Set3DProviderName(j, NULL); +} + +static void +release_existing() +{ + for ( U32 i = 0; i < _maxSamples; i++ ) + { + if ( opened_samples[i] ) + { + AIL_release_3D_sample_handle(opened_samples[i]); + opened_samples[i] = NULL; + } + } + + if ( opened_provider ) + { + AIL_close_3D_provider(opened_provider); + opened_provider = NULL; + } + + _fPrevEaxRatioDestination = 0.0f; + _usingMilesFast2D = false; + _fEffectsLevel = 0.0f; +} + +static bool +set_new_provider(S32 index) +{ + DWORD result; + + if ( curprovider == index ) + return true; + + //close the already opened provider + curprovider = index; + + release_existing(); + + if ( curprovider != -1 ) + { + if ( !strcmp(providers[index].name, "Dolby Surround") ) + _maxSamples = MAXCHANNELS_SURROUND; + else + _maxSamples = MAXCHANNELS; + + AIL_set_3D_provider_preference(providers[index].id, "Maximum supported samples", &_maxSamples); + + //load the new provider + result = AIL_open_3D_provider(providers[index].id); + + if (result != M3D_NOERR) + { + curprovider=-1; + + OutputDebugStringA(AIL_last_error()); + + release_existing(); + + return false; + } + else + { + opened_provider=providers[index].id; + + //see if we're running under an EAX compatible provider + + if ( !strcmp(providers[index].name, "Creative Labs EAX 3 (TM)") ) + { + usingEAX = 1; + usingEAX3 = 1; + } + else + { + usingEAX3 = 0; + + result=AIL_3D_room_type(opened_provider); + usingEAX=(((S32)result)!=-1)?1:0; // will be something other than -1 on EAX + } + + if ( usingEAX3 ) + { + OutputDebugString("DOING SPECIAL EAX 3 STUFF!"); + AIL_set_3D_provider_preference(opened_provider, "EAX all parameters", &FinishEAX3); + } + else if ( usingEAX ) + { + AIL_set_3D_room_type(opened_provider, ENVIRONMENT_CAVE); + + if ( !strcmp(providers[index].name, "Miles Fast 2D Positional Audio") ) + _usingMilesFast2D = true; + } + + AIL_3D_provider_attribute(opened_provider, "Maximum supported samples", &_maxSamples); + + if ( _maxSamples > MAXCHANNELS ) + _maxSamples = MAXCHANNELS; + + SampleManager.SetSpeakerConfig(speaker_type); + + //obtain a 3D sample handles + for ( U32 i = 0; i < _maxSamples; ++i ) + { + opened_samples[i] = AIL_allocate_3D_sample_handle(opened_provider); + if ( opened_samples[i] != NULL ) + AIL_set_3D_sample_effects_level(opened_samples[i], 0.0f); + } + + return true; + } + } + + return false; +} + +void +cSampleManager::SetSpeakerConfig(int32 which) +{ + switch ( which ) + { + case 1: + speaker_type=AIL_3D_2_SPEAKER; + break; + + case 2: + speaker_type=AIL_3D_HEADPHONE; + break; + + case 3: + speaker_type=AIL_3D_4_SPEAKER; + break; + + default: + return; + break; + } + + if (opened_provider) + AIL_set_3D_speaker_type(opened_provider, speaker_type); +} + +uint32 +cSampleManager::GetMaximumSupportedChannels(void) //[Y] +{ + if ( _maxSamples > MAXCHANNELS ) + return MAXCHANNELS; + + return _maxSamples; +} + +int8 +cSampleManager::GetCurrent3DProviderIndex(void) +{ + return curprovider; +} + +int8 +cSampleManager::SetCurrent3DProvider(uint8 nProvider) +{ + S32 savedprovider = curprovider; + + if ( nProvider < m_nNumberOfProviders ) + { + if ( set_new_provider(nProvider) ) + return curprovider; + else if ( savedprovider != -1 && savedprovider < m_nNumberOfProviders && set_new_provider(savedprovider) ) + return curprovider; + else + return -1; + } + else + return curprovider; +} + +static bool +_ResolveLink(char const *path, char *out) +{ + IShellLink* psl; + WIN32_FIND_DATA fd; + char filepath[MAX_PATH]; + + CoInitialize(NULL); + + if (SUCCEEDED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl ) )) + { + IPersistFile *ppf; + + if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf))) + { + WCHAR wpath[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, MAX_PATH); + + if (SUCCEEDED(ppf->Load(wpath, STGM_READ))) + { + /* Resolve the link */ + if (SUCCEEDED(psl->Resolve(NULL, SLR_ANY_MATCH|SLR_NO_UI|SLR_NOSEARCH))) + { + strcpy(filepath, path); + + if (SUCCEEDED(psl->GetPath(filepath, MAX_PATH, &fd, SLGP_UNCPRIORITY))) + { + OutputDebugString(fd.cFileName); + + strcpy(out, filepath); + + return true; + } + } + } + + ppf->Release(); + } + psl->Release(); + } + + return false; +} + +static void +_FindMP3s(void) +{ + tMP3Entry *pList; + bool bShortcut; + bool bInitFirstEntry; + HANDLE hFind; + char path[MAX_PATH]; + char filepath[MAX_PATH*2]; + S32 total_ms; + WIN32_FIND_DATA fd; + + + if ( GetCurrentDirectory(MAX_PATH, _mp3DirectoryPath) == 0 ) + { + GetLastError(); + return; + } + + OutputDebugString("Finding MP3s..."); + strcpy(path, _mp3DirectoryPath); + strcat(path, "\\MP3\\"); + + strcpy(_mp3DirectoryPath, path); + OutputDebugString(_mp3DirectoryPath); + + strcat(path, "*"); + + hFind = FindFirstFile(path, &fd); + + if ( hFind == INVALID_HANDLE_VALUE ) + { + GetLastError(); + return; + } + + strcpy(filepath, _mp3DirectoryPath); + strcat(filepath, fd.cFileName); + + int32 filepathlen = strlen(filepath); + + if ( filepathlen <= 0) + { + FindClose(hFind); + return; + } + + FILE *f = fopen("MP3\\MP3Report.txt", "w"); + + if ( f ) + { + fprintf(f, "MP3 Report File\n\n"); + fprintf(f, "\"%s\"", fd.cFileName); + } + + + if ( filepathlen > 4 ) + { + if ( !strcmp(&filepath[filepathlen - 4], ".lnk") ) + { + if ( _ResolveLink(filepath, filepath) ) + { + OutputDebugString("Resolving Link"); + OutputDebugString(filepath); + + if ( f ) + fprintf(f, " - shortcut to \"%s\"", filepath); + } + else + { + if ( f ) + fprintf(f, " - couldn't resolve shortcut"); + } + + bShortcut = true; + } + else + { + bShortcut = false; + } + } + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + if ( mp3Stream[0] ) + { + AIL_stream_ms_position(mp3Stream[0], &total_ms, NULL); + + AIL_close_stream(mp3Stream[0]); + mp3Stream[0] = NULL; + + OutputDebugString(fd.cFileName); + + _pMP3List = new tMP3Entry; + + if ( _pMP3List == NULL ) + { + FindClose(hFind); + + if ( f ) + fclose(f); + + return; + } + + nNumMP3s = 1; + + strcpy(_pMP3List->aFilename, fd.cFileName); + + _pMP3List->nTrackLength = total_ms; + + _pMP3List->pNext = NULL; + + pList = _pMP3List; + + if ( bShortcut ) + { + _pMP3List->pLinkPath = new char[MAX_PATH*2]; + strcpy(_pMP3List->pLinkPath, filepath); + } + else + { + _pMP3List->pLinkPath = NULL; + } + + if ( f ) + fprintf(f, " - OK\n"); + + bInitFirstEntry = false; + } + else + { + strcat(filepath, " - NOT A VALID MP3"); + + OutputDebugString(filepath); + + if ( f ) + fprintf(f, " - not an MP3 or supported MP3 type\n"); + + bInitFirstEntry = true; + } + + while ( true ) + { + if ( !FindNextFile(hFind, &fd) ) + { + if ( f ) + { + fprintf(f, "\nTOTAL SUPPORTED MP3s: %d\n", nNumMP3s); + fclose(f); + } + + FindClose(hFind); + + return; + } + + if ( bInitFirstEntry ) + { + strcpy(filepath, _mp3DirectoryPath); + strcat(filepath, fd.cFileName); + + int32 filepathlen = strlen(filepath); + + if ( f ) + fprintf(f, "\"%s\"", fd.cFileName); + + if ( filepathlen > 0 ) + { + if ( filepathlen > 4 ) + { + if ( !strcmp(&filepath[filepathlen - 4], ".lnk") ) + { + if ( _ResolveLink(filepath, filepath) ) + { + OutputDebugString("Resolving Link"); + OutputDebugString(filepath); + + if ( f ) + fprintf(f, " - shortcut to \"%s\"", filepath); + } + else + { + if ( f ) + fprintf(f, " - couldn't resolve shortcut"); + } + + bShortcut = true; + } + else + { + bShortcut = false; + + if ( filepathlen > MAX_PATH ) + { + if ( f ) + fprintf(f, " - Filename and path too long - %s - IGNORED)\n", filepath); + + continue; + } + } + } + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + if ( mp3Stream[0] ) + { + AIL_stream_ms_position(mp3Stream[0], &total_ms, NULL); + + AIL_close_stream(mp3Stream[0]); + mp3Stream[0] = NULL; + + OutputDebugString(fd.cFileName); + + _pMP3List = new tMP3Entry; + + if ( _pMP3List == NULL) + { + if ( f ) + { + fprintf(f, "\nTOTAL SUPPORTED MP3s: %d\n", nNumMP3s); + fclose(f); + } + FindClose(hFind); + return; + } + + nNumMP3s = 1; + + strcpy(_pMP3List->aFilename, fd.cFileName); + + _pMP3List->nTrackLength = total_ms; + _pMP3List->pNext = NULL; + + if ( bShortcut ) + { + _pMP3List->pLinkPath = new char [MAX_PATH*2]; + strcpy(_pMP3List->pLinkPath, filepath); + } + else + { + _pMP3List->pLinkPath = NULL; + } + + pList = _pMP3List; + + if ( f ) + fprintf(f, " - OK\n"); + + bInitFirstEntry = false; + } + else + { + strcat(filepath, " - NOT A VALID MP3"); + OutputDebugString(filepath); + + if ( f ) + fprintf(f, " - not an MP3 or supported MP3 type\n"); + } + } + } + else + { + strcpy(filepath, _mp3DirectoryPath); + strcat(filepath, fd.cFileName); + + int32 filepathlen = strlen(filepath); + + if ( filepathlen > 0 ) + { + if ( f ) + fprintf(f, "\"%s\"", fd.cFileName); + + if ( filepathlen > 4 ) + { + if ( !strcmp(&filepath[filepathlen - 4], ".lnk") ) + { + if ( _ResolveLink(filepath, filepath) ) + { + OutputDebugString("Resolving Link"); + OutputDebugString(filepath); + + if ( f ) + fprintf(f, " - shortcut to \"%s\"", filepath); + } + else + { + if ( f ) + fprintf(f, " - couldn't resolve shortcut"); + } + + bShortcut = true; + } + else + { + bShortcut = false; + } + } + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + if ( mp3Stream[0] ) + { + AIL_stream_ms_position(mp3Stream[0], &total_ms, NULL); + + AIL_close_stream(mp3Stream[0]); + mp3Stream[0] = NULL; + + pList->pNext = new tMP3Entry; + + tMP3Entry *e = pList->pNext; + + if ( e == NULL) + { + if ( f ) + { + fprintf(f, "\nTOTAL SUPPORTED MP3s: %d\n", nNumMP3s); + fclose(f); + } + FindClose(hFind); + return; + } + + pList = pList->pNext; + + strcpy(e->aFilename, fd.cFileName); + e->nTrackLength = total_ms; + e->pNext = NULL; + + if ( bShortcut ) + { + e->pLinkPath = new char [MAX_PATH*2]; + strcpy(e->pLinkPath, filepath); + } + else + { + e->pLinkPath = NULL; + } + + nNumMP3s++; + + OutputDebugString(fd.cFileName); + + if ( f ) + fprintf(f, " - OK\n"); + } + else + { + strcat(filepath, " - NOT A VALID MP3"); + OutputDebugString(filepath); + + if ( f ) + fprintf(f, " - not an MP3 or supported MP3 type\n"); + } + } + } + } +} + +static void +_DeleteMP3Entries(void) +{ + tMP3Entry *e = _pMP3List; + + while ( e != NULL ) + { + tMP3Entry *next = e->pNext; + + if ( next == NULL ) + next = NULL; + + if ( e->pLinkPath != NULL ) + { +#ifndef FIX_BUGS + delete e->pLinkPath; // BUG: should be delete [] +#else + delete[] e->pLinkPath; +#endif + e->pLinkPath = NULL; + } + + delete e; + + if ( next ) + e = next; + else + e = NULL; + + nNumMP3s--; + } + + + if ( nNumMP3s != 0 ) + { + OutputDebugString("Not all MP3 entries were deleted"); + nNumMP3s = 0; + } + + _pMP3List = NULL; +} + +static tMP3Entry * +_GetMP3EntryByIndex(uint32 idx) +{ + uint32 n = ( idx < nNumMP3s ) ? idx : 0; + + if ( _pMP3List != NULL ) + { + tMP3Entry *e = _pMP3List; + + for ( uint32 i = 0; i < n; i++ ) + e = e->pNext; + + return e; + + } + + return NULL; +} + +static inline bool +_GetMP3PosFromStreamPos(uint32 *pPosition, tMP3Entry **pEntry) +{ + _CurMP3Index = 0; + + for ( *pEntry = _pMP3List; *pEntry != NULL; *pEntry = (*pEntry)->pNext ) + { + if ( *pPosition >= (*pEntry)->nTrackStreamPos + && *pPosition < (*pEntry)->nTrackLength + (*pEntry)->nTrackStreamPos ) + { + *pPosition -= (*pEntry)->nTrackStreamPos; + _CurMP3Pos = *pPosition; + + return true; + } + + _CurMP3Index++; + } + + *pPosition = 0; + *pEntry = _pMP3List; + _CurMP3Pos = 0; + _CurMP3Index = 0; + + return false; +} + +bool +cSampleManager::IsMP3RadioChannelAvailable(void) +{ + return nNumMP3s != 0; +} + +void +cSampleManager::ReleaseDigitalHandle(void) +{ + if ( DIG ) + { + prevprovider = curprovider; + release_existing(); + curprovider = -1; + AIL_digital_handle_release(DIG); + } +} + +void +cSampleManager::ReacquireDigitalHandle(void) +{ + if ( DIG ) + { + AIL_digital_handle_reacquire(DIG); + if ( prevprovider != -1 ) + set_new_provider(prevprovider); + } +} + +bool +cSampleManager::Initialise(void) +{ + TRACE("start"); + + if ( _bSampmanInitialised ) + return true; + + { + for ( int32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ ) + { + m_aSamples[i].nOffset = 0; + m_aSamples[i].nSize = 0; + m_aSamples[i].nFrequency = 22050; + m_aSamples[i].nLoopStart = 0; + m_aSamples[i].nLoopEnd = -1; + } + + m_nEffectsVolume = 127; + m_nMusicVolume = 127; + m_nEffectsFadeVolume = 127; + m_nMusicFadeVolume = 127; + + m_nMonoMode = 0; + } + + // miles + TRACE("MILES"); + { + curprovider = -1; + prevprovider = -1; + + _usingMilesFast2D = false; + usingEAX=0; + usingEAX3=0; + + _fEffectsLevel = 0.0f; + + _maxSamples = 0; + + opened_provider = NULL; + DIG = NULL; + + for ( int32 i = 0; i < MAXCHANNELS; i++ ) + opened_samples[i] = NULL; + } + + // banks + TRACE("banks"); + { + fpSampleDescHandle = NULL; + fpSampleDataHandle = NULL; + + _nSampleDataEndOffset = 0; + + for ( int32 i = 0; i < MAX_SAMPLEBANKS; i++ ) + { + bSampleBankLoaded[i] = false; + nSampleBankDiscStartOffset[i] = 0; + nSampleBankSize[i] = 0; + nSampleBankMemoryStartAddress[i] = 0; + } + } + + // pedsfx + TRACE("pedsfx"); + { + for ( int32 i = 0; i < MAX_PEDSFX; i++ ) + { + nPedSlotSfx[i] = NO_SAMPLE; + nPedSlotSfxAddr[i] = 0; + } + + nCurrentPedSlot = 0; + } + + // channel volume + TRACE("vol"); + { + for ( int32 i = 0; i < MAXCHANNELS+MAX2DCHANNELS; i++ ) + nChannelVolume[i] = 0; + } + + TRACE("mss"); + { + AIL_set_redist_directory( "mss" ); + + AIL_startup(); + + AIL_set_preference(DIG_MIXER_CHANNELS, MAX_DIGITAL_MIXER_CHANNELS); + + DIG = AIL_open_digital_driver(DIGITALRATE, DIGITALBITS, DIGITALCHANNELS, 0); + if ( DIG == NULL ) + { + OutputDebugString(AIL_last_error()); + Terminate(); + return false; + } + + add_providers(); + + if ( !InitialiseSampleBanks() ) + { + Terminate(); + return false; + } + + nSampleBankMemoryStartAddress[0] = (int32)AIL_mem_alloc_lock(nSampleBankSize[0]); + if ( !nSampleBankMemoryStartAddress[0] ) + { + Terminate(); + return false; + } + + nSampleBankMemoryStartAddress[1] = (int32)AIL_mem_alloc_lock(PED_BLOCKSIZE*MAX_PEDSFX); + + } + + TRACE("cdrom"); + + S32 tatalms; + char filepath[MAX_PATH]; + + { + m_bInitialised = false; + + while (true) + { + int32 drive = 'C'; + + do + { + char latter[2]; + + latter[0] = drive; + latter[1] = '\0'; + + strcpy(m_szCDRomRootPath, latter); + strcat(m_szCDRomRootPath, ":\\"); + + if ( GetDriveType(m_szCDRomRootPath) == DRIVE_CDROM ) + { + strcpy(filepath, m_szCDRomRootPath); + strcat(filepath, StreamedNameTable[0]); + + FILE *f = fopen(filepath, "rb"); + + if ( f ) + { + fclose(f); + + bool bFileNotFound = false; + + for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ ) + { + strcpy(filepath, m_szCDRomRootPath); + strcat(filepath, StreamedNameTable[i]); + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + + if ( mp3Stream[0] ) + { + AIL_stream_ms_position(mp3Stream[0], &tatalms, NULL); + + AIL_close_stream(mp3Stream[0]); + mp3Stream[0] = NULL; + + nStreamLength[i] = tatalms; + } + else + { + bFileNotFound = true; + break; + } + } + + if ( !bFileNotFound ) + { + m_bInitialised = true; + break; + } + else + { + m_bInitialised = false; + continue; + } + } + } + + } while ( ++drive <= 'Z' ); + + if ( !m_bInitialised ) + { +#if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK) + FrontEndMenuManager.WaitForUserCD(); + if ( FrontEndMenuManager.m_bQuitGameNoCD ) + { + Terminate(); + return false; + } + continue; +#else + m_bInitialised = true; +#endif + } + + break; + } + } + +#if defined(GTA3_1_1_PATCH) || defined(GTA3_STEAM_PATCH) || defined(NO_CDCHECK) + // hddaudio + /** + Option for user to play audio files directly from hard disk. + Copy the contents of the PLAY discs Audio directory into your installed Grand Theft Auto III Audio directory. + Grand Theft Auto III still requires the presence of the PLAY disc when started. + This may give better performance on some machines (though worse on others). + **/ + TRACE("hddaudio 1.1 patch"); + { + int32 streamLength[TOTAL_STREAMED_SOUNDS]; + + bool bFileNotFound = false; + char rootpath[MAX_PATH]; + + strcpy(_aHDDPath, m_szCDRomRootPath); + rootpath[0] = '\0'; + + FILE *f = fopen(StreamedNameTable[0], "rb"); + + if ( f ) + { + fclose(f); + + for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ ) + { + strcpy(filepath, rootpath); + strcat(filepath, StreamedNameTable[i]); + + mp3Stream[0] = AIL_open_stream(DIG, filepath, 0); + + if ( mp3Stream[0] ) + { + AIL_stream_ms_position(mp3Stream[0], &tatalms, NULL); + + AIL_close_stream(mp3Stream[0]); + mp3Stream[0] = NULL; + + streamLength[i] = tatalms; + } + else + { + bFileNotFound = true; + break; + } + } + + } + else + bFileNotFound = true; + + if ( !bFileNotFound ) + { + strcpy(m_szCDRomRootPath, rootpath); + + for ( int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++ ) + nStreamLength[i] = streamLength[i]; + + _bUseHDDAudio = true; + } + else + _bUseHDDAudio = false; + } +#endif + + TRACE("stream"); + { + for ( int32 i = 0; i < MAX_MP3STREAMS; i++ ) + { + mp3Stream [i] = NULL; + nStreamPan [i] = 63; + nStreamVolume[i] = 100; + } + } + + for ( int32 i = 0; i < MAX2DCHANNELS; i++ ) + { + opened_2dsamples[i] = AIL_allocate_sample_handle(DIG); + if ( opened_2dsamples[i] ) + { + AIL_init_sample(opened_2dsamples[i]); + AIL_set_sample_type(opened_2dsamples[i], DIG_F_MONO_16, DIG_PCM_SIGN); + } + } + + TRACE("providerset"); + { + _bSampmanInitialised = true; + + U32 n = 0; + + while ( n < m_nNumberOfProviders ) + { + if ( !strcmp(providers[n].name, "Miles Fast 2D Positional Audio") ) + { + set_new_provider(n); + break; + } + n++; + } + + if ( n == m_nNumberOfProviders ) + { + Terminate(); + return false; + } + } + + TRACE("bank"); + + LoadSampleBank(0); + + // mp3 + TRACE("mp3"); + { + nNumMP3s = 0; + + _pMP3List = NULL; + + _FindMP3s(); + + if ( nNumMP3s != 0 ) + { + nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] = 0; + + for ( tMP3Entry *e = _pMP3List; e != NULL; e = e->pNext ) + { + e->nTrackStreamPos = nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER]; + nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] += e->nTrackLength; + } + + time_t t = time(NULL); + tm *localtm; + bool bUseRandomTable; + + if ( t == -1 ) + bUseRandomTable = true; + else + { + bUseRandomTable = 0; + localtm = localtime(&t); + } + + int32 randval; + if ( bUseRandomTable ) + randval = AudioManager.GetRandomTabe(1); + else + randval = localtm->tm_sec * localtm->tm_min; + + _CurMP3Index = randval % nNumMP3s; + + tMP3Entry *randmp3 = _pMP3List; + for ( int32 i = randval % nNumMP3s; i > 0; --i) + randmp3 = randmp3->pNext; + + if ( bUseRandomTable ) + _CurMP3Pos = AudioManager.GetRandomTabe(0) % randmp3->nTrackLength; + else + { + if ( localtm->tm_sec > 0 ) + { + int32 s = localtm->tm_sec; + _CurMP3Pos = s*s*s*s*s*s*s*s % randmp3->nTrackLength; + } + else + _CurMP3Pos = AudioManager.GetRandomTabe(0) % randmp3->nTrackLength; + } + } + else + _CurMP3Pos = 0; + + _bIsMp3Active = false; + } + + TRACE("end"); + + return true; +} + +void +cSampleManager::Terminate(void) +{ + for ( int32 i = 0; i < MAX_MP3STREAMS; i++ ) + { + if ( mp3Stream[i] ) + { + AIL_pause_stream(mp3Stream[i], 1); + AIL_close_stream(mp3Stream[i]); + mp3Stream[i] = NULL; + } + } + + for ( int32 i = 0; i < MAX2DCHANNELS; i++ ) + { + if ( opened_2dsamples[i] ) + { + AIL_release_sample_handle(opened_2dsamples[i]); + opened_2dsamples[i] = NULL; + } + } + + release_existing(); + + _DeleteMP3Entries(); + + if ( nSampleBankMemoryStartAddress[0] != 0 ) + { + AIL_mem_free_lock((void *)nSampleBankMemoryStartAddress[0]); + nSampleBankMemoryStartAddress[0] = 0; + } + + if ( nSampleBankMemoryStartAddress[1] != 0 ) + { + AIL_mem_free_lock((void *)nSampleBankMemoryStartAddress[1]); + nSampleBankMemoryStartAddress[1] = 0; + } + + if ( DIG ) + { + AIL_close_digital_driver(DIG); + DIG = NULL; + } + + AIL_shutdown(); + + _bSampmanInitialised = false; +} + +bool +cSampleManager::CheckForAnAudioFileOnCD(void) +{ + char filepath[MAX_PATH]; + +#if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK) + +#if defined(GTA3_1_1_PATCH) + if (_bUseHDDAudio) + strcpy(filepath, _aHDDPath); + else + strcpy(filepath, m_szCDRomRootPath); +#else + strcpy(filepath, m_szCDRomRootPath); +#endif // #if defined(GTA3_1_1_PATCH) + + strcat(filepath, StreamedNameTable[AudioManager.GetRandomTabe(1) % TOTAL_STREAMED_SOUNDS]); + + FILE *f = fopen(filepath, "rb"); + + if ( f ) + { + fclose(f); + + return true; + } + + return false; + +#else + return true; +#endif // #if !defined(GTA3_STEAM_PATCH) && !defined(NO_CDCHECK) +} + +char +cSampleManager::GetCDAudioDriveLetter(void) +{ +#if defined(GTA3_1_1_PATCH) || defined(GTA3_STEAM_PATCH) || defined(NO_CDCHECK) + if (_bUseHDDAudio) + { + if ( strlen(_aHDDPath) != 0 ) + return _aHDDPath[0]; + else + return '\0'; + } + else + { + if ( strlen(m_szCDRomRootPath) != 0 ) + return m_szCDRomRootPath[0]; + else + return '\0'; + } +#else + if ( strlen(m_szCDRomRootPath) != 0 ) + return m_szCDRomRootPath[0]; + else + return '\0'; +#endif +} + +void +cSampleManager::UpdateEffectsVolume(void) //[Y], cSampleManager::UpdateSoundBuffers ? +{ + if ( _bSampmanInitialised ) + { + for ( int32 i = 0; i < MAXCHANNELS+MAX2DCHANNELS; i++ ) + { + if ( i < MAXCHANNELS ) + { + if ( opened_samples[i] && GetChannelUsedFlag(i) ) + { + if ( nChannelVolume[i] ) + { + AIL_set_3D_sample_volume(opened_samples[i], + m_nEffectsFadeVolume * nChannelVolume[i] * m_nEffectsVolume >> 14); + } + } + } + else + { + if ( opened_2dsamples[i - MAXCHANNELS] ) + { + if ( GetChannelUsedFlag(i - MAXCHANNELS) ) + { + if ( nChannelVolume[i - MAXCHANNELS] ) + { + AIL_set_sample_volume(opened_2dsamples[i - MAXCHANNELS], + m_nEffectsFadeVolume * nChannelVolume[i - MAXCHANNELS] * m_nEffectsVolume >> 14); + } + } + } + } + } + } +} + +void +cSampleManager::SetEffectsMasterVolume(uint8 nVolume) +{ + m_nEffectsVolume = nVolume; + UpdateEffectsVolume(); +} + +void +cSampleManager::SetMusicMasterVolume(uint8 nVolume) +{ + m_nMusicVolume = nVolume; +} + +void +cSampleManager::SetEffectsFadeVolume(uint8 nVolume) +{ + m_nEffectsFadeVolume = nVolume; + UpdateEffectsVolume(); +} + +void +cSampleManager::SetMusicFadeVolume(uint8 nVolume) +{ + m_nMusicFadeVolume = nVolume; +} + +bool +cSampleManager::LoadSampleBank(uint8 nBank) +{ + if ( CTimer::GetIsCodePaused() ) + return false; + + if ( MusicManager.IsInitialised() + && MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE + && nBank != 0 ) + { + return false; + } + + if ( fseek(fpSampleDataHandle, nSampleBankDiscStartOffset[nBank], SEEK_SET) != 0 ) + return false; + + if ( fread((void *)nSampleBankMemoryStartAddress[nBank], 1, nSampleBankSize[nBank],fpSampleDataHandle) != nSampleBankSize[nBank] ) + return false; + + bSampleBankLoaded[nBank] = true; + + return true; +} + +void +cSampleManager::UnloadSampleBank(uint8 nBank) +{ + bSampleBankLoaded[nBank] = false; +} + +bool +cSampleManager::IsSampleBankLoaded(uint8 nBank) +{ + return bSampleBankLoaded[nBank]; +} + +bool +cSampleManager::IsPedCommentLoaded(uint32 nComment) +{ + int32 slot; + + for ( int32 i = 0; i < _TODOCONST(3); i++ ) + { + slot = nCurrentPedSlot - i - 1; + if ( nComment == nPedSlotSfx[slot] ) + return true; + } + + return false; +} + +int32 +cSampleManager::_GetPedCommentSlot(uint32 nComment) +{ + int32 slot; + + for ( int32 i = 0; i < _TODOCONST(3); i++ ) + { + slot = nCurrentPedSlot - i - 1; + if ( nComment == nPedSlotSfx[slot] ) + return slot; + } + + return -1; +} + +bool +cSampleManager::LoadPedComment(uint32 nComment) +{ + if ( CTimer::GetIsCodePaused() ) + return false; + + // no talking peds during cutsenes or the game end + if ( MusicManager.IsInitialised() ) + { + switch ( MusicManager.GetMusicMode() ) + { + case MUSICMODE_CUTSCENE: + { + return false; + + break; + } + + case MUSICMODE_FRONTEND: + { + if ( MusicManager.GetCurrentTrack() == STREAMED_SOUND_GAME_COMPLETED ) + return false; + + break; + } + } + } + + if ( fseek(fpSampleDataHandle, m_aSamples[nComment].nOffset, SEEK_SET) != 0 ) + return false; + + if ( fread((void *)(nSampleBankMemoryStartAddress[1] + PED_BLOCKSIZE*nCurrentPedSlot), 1, m_aSamples[nComment].nSize, fpSampleDataHandle) != m_aSamples[nComment].nSize ) + return false; + + nPedSlotSfxAddr[nCurrentPedSlot] = nSampleBankMemoryStartAddress[1] + PED_BLOCKSIZE*nCurrentPedSlot; + nPedSlotSfx [nCurrentPedSlot] = nComment; + + if ( ++nCurrentPedSlot >= MAX_PEDSFX ) + nCurrentPedSlot = 0; + + return true; +} + +int32 +cSampleManager::GetSampleBaseFrequency(uint32 nSample) +{ + return m_aSamples[nSample].nFrequency; +} + +int32 +cSampleManager::GetSampleLoopStartOffset(uint32 nSample) +{ + return m_aSamples[nSample].nLoopStart; +} + +int32 +cSampleManager::GetSampleLoopEndOffset(uint32 nSample) +{ + return m_aSamples[nSample].nLoopEnd; +} + +uint32 +cSampleManager::GetSampleLength(uint32 nSample) +{ + return m_aSamples[nSample].nSize >> 1; +} + +bool +cSampleManager::UpdateReverb(void) +{ + if ( !usingEAX ) + return false; + + if ( AudioManager.GetFrameCounter() & 15 ) + return false; + + float y = AudioManager.GetReflectionsDistance(REFLECTION_TOP) + AudioManager.GetReflectionsDistance(REFLECTION_BOTTOM); + float x = AudioManager.GetReflectionsDistance(REFLECTION_LEFT) + AudioManager.GetReflectionsDistance(REFLECTION_RIGHT); + float z = AudioManager.GetReflectionsDistance(REFLECTION_UP); + + float normy = norm(y, 5.0f, 40.0f); + float normx = norm(x, 5.0f, 40.0f); + float normz = norm(z, 5.0f, 40.0f); + + float fRatio; + + if ( normy == 0.0f ) + { + if ( normx == 0.0f ) + { + if ( normz == 0.0f ) + fRatio = 0.3f; + else + fRatio = 0.5f; + } + else + { + fRatio = 0.3f; + } + } + else + { + if ( normx == 0.0f ) + { + if ( normz == 0.0f ) + fRatio = 0.3f; + else + fRatio = 0.5f; + } + else + { + if ( normz == 0.0f ) + fRatio = 0.3f; + else + fRatio = (normy+normx+normz) / 3.0f; + } + } + + fRatio = clamp(fRatio, usingEAX3==1 ? 0.0f : 0.30f, 1.0f); + + if ( fRatio == _fPrevEaxRatioDestination ) + return false; + + if ( usingEAX3 ) + { + if ( EAX3ListenerInterpolate(&StartEAX3, &FinishEAX3, fRatio, &EAX3Params, false) ) + { + AIL_set_3D_provider_preference(opened_provider, "EAX all parameters", &EAX3Params); + _fEffectsLevel = 1.0f - fRatio * 0.5f; + } + } + else + { + if ( _usingMilesFast2D ) + _fEffectsLevel = (1.0f - fRatio) * 0.4f; + else + _fEffectsLevel = (1.0f - fRatio) * 0.7f; + } + + _fPrevEaxRatioDestination = fRatio; + + return true; +} + +void +cSampleManager::SetChannelReverbFlag(uint32 nChannel, uint8 nReverbFlag) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( usingEAX ) + { + if ( nReverbFlag != 0 ) + { + if ( !b2d ) + AIL_set_3D_sample_effects_level(opened_samples[nChannel], _fEffectsLevel); + } + else + { + if ( !b2d ) + AIL_set_3D_sample_effects_level(opened_samples[nChannel], 0.0f); + } + } +} + +bool +cSampleManager::InitialiseChannel(uint32 nChannel, uint32 nSfx, uint8 nBank) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + int32 addr; + + if ( nSfx < SAMPLEBANK_MAX ) + { + if ( !IsSampleBankLoaded(nBank) ) + return false; + + addr = nSampleBankMemoryStartAddress[nBank] + m_aSamples[nSfx].nOffset - m_aSamples[BankStartOffset[nBank]].nOffset; + } + else + { + if ( !IsPedCommentLoaded(nSfx) ) + return false; + + int32 slot = _GetPedCommentSlot(nSfx); + + addr = nPedSlotSfxAddr[slot]; + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + { + AIL_set_sample_address(opened_2dsamples[nChannel - MAXCHANNELS], (void *)addr, m_aSamples[nSfx].nSize); + return true; + } + else + return false; + } + else + { + AILSOUNDINFO info; + + info.format = WAVE_FORMAT_PCM; + info.data_ptr = (void *)addr; + info.channels = 1; + info.data_len = m_aSamples[nSfx].nSize; + info.rate = m_aSamples[nSfx].nFrequency; + info.bits = 16; + + if ( AIL_set_3D_sample_info(opened_samples[nChannel], &info) == 0 ) + { + OutputDebugString(AIL_last_error()); + return false; + } + + return true; + } +} + +void +cSampleManager::SetChannelEmittingVolume(uint32 nChannel, uint32 nVolume) +{ + uint32 vol = nVolume; + if ( vol > 127 ) vol = 127; + + nChannelVolume[nChannel] = vol; + + // increase the volume for JB.MP3 and S4_BDBD.MP3 + if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE + && MusicManager.GetCurrentTrack() != STREAMED_SOUND_NEWS_INTRO + && MusicManager.GetCurrentTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD ) + { + nChannelVolume[nChannel] >>= 2; + } + + if ( opened_samples[nChannel] ) + AIL_set_3D_sample_volume(opened_samples[nChannel], m_nEffectsFadeVolume*nChannelVolume[nChannel]*m_nEffectsVolume >> 14); + +} + +void +cSampleManager::SetChannel3DPosition(uint32 nChannel, float fX, float fY, float fZ) +{ + if ( opened_samples[nChannel] ) + AIL_set_3D_position(opened_samples[nChannel], -fX, fY, fZ); +} + +void +cSampleManager::SetChannel3DDistances(uint32 nChannel, float fMax, float fMin) +{ + if ( opened_samples[nChannel] ) + AIL_set_3D_sample_distances(opened_samples[nChannel], fMax, fMin); +} + +void +cSampleManager::SetChannelVolume(uint32 nChannel, uint32 nVolume) +{ + uint32 vol = nVolume; + if ( vol > 127 ) vol = 127; + + switch ( nChannel ) + { + case CHANNEL2D: + { + nChannelVolume[nChannel] = vol; + + // increase the volume for JB.MP3 and S4_BDBD.MP3 + if ( MusicManager.GetMusicMode() == MUSICMODE_CUTSCENE + && MusicManager.GetCurrentTrack() != STREAMED_SOUND_NEWS_INTRO + && MusicManager.GetCurrentTrack() != STREAMED_SOUND_CUTSCENE_SAL4_BDBD ) + { + nChannelVolume[nChannel] >>= 2; + } + + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + { + AIL_set_sample_volume(opened_2dsamples[nChannel - MAXCHANNELS], + m_nEffectsFadeVolume*vol*m_nEffectsVolume >> 14); + } + + break; + } + } +} + +void +cSampleManager::SetChannelPan(uint32 nChannel, uint32 nPan) +{ + switch ( nChannel ) + { + case CHANNEL2D: + { +#ifndef FIX_BUGS + if ( opened_samples[nChannel - MAXCHANNELS] ) // BUG +#else + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) +#endif + AIL_set_sample_pan(opened_2dsamples[nChannel - MAXCHANNELS], nPan); + + break; + } + } +} + +void +cSampleManager::SetChannelFrequency(uint32 nChannel, uint32 nFreq) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + AIL_set_sample_playback_rate(opened_2dsamples[nChannel - MAXCHANNELS], nFreq); + } + else + { + if ( opened_samples[nChannel] ) + AIL_set_3D_sample_playback_rate(opened_samples[nChannel], nFreq); + } +} + +void +cSampleManager::SetChannelLoopPoints(uint32 nChannel, uint32 nLoopStart, int32 nLoopEnd) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + AIL_set_sample_loop_block(opened_2dsamples[nChannel - MAXCHANNELS], nLoopStart, nLoopEnd); + } + else + { + if ( opened_samples[nChannel] ) + AIL_set_3D_sample_loop_block(opened_samples[nChannel], nLoopStart, nLoopEnd); + } +} + +void +cSampleManager::SetChannelLoopCount(uint32 nChannel, uint32 nLoopCount) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + AIL_set_sample_loop_count(opened_2dsamples[nChannel - MAXCHANNELS], nLoopCount); + } + else + { + if ( opened_samples[nChannel] ) + AIL_set_3D_sample_loop_count(opened_samples[nChannel], nLoopCount); + } +} + +bool +cSampleManager::GetChannelUsedFlag(uint32 nChannel) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + return AIL_sample_status(opened_2dsamples[nChannel - MAXCHANNELS]) == SMP_PLAYING; + else + return false; + } + else + { + if ( opened_samples[nChannel] ) + return AIL_3D_sample_status(opened_samples[nChannel]) == SMP_PLAYING; + else + return false; + } + +} + +void +cSampleManager::StartChannel(uint32 nChannel) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + AIL_start_sample(opened_2dsamples[nChannel - MAXCHANNELS]); + } + else + { + if ( opened_samples[nChannel] ) + AIL_start_3D_sample(opened_samples[nChannel]); + } +} + +void +cSampleManager::StopChannel(uint32 nChannel) +{ + bool b2d = false; + + switch ( nChannel ) + { + case CHANNEL2D: + { + b2d = true; + break; + } + } + + if ( b2d ) + { + if ( opened_2dsamples[nChannel - MAXCHANNELS] ) + AIL_end_sample(opened_2dsamples[nChannel - MAXCHANNELS]); + } + else + { + if ( opened_samples[nChannel] ) + { + if ( AIL_3D_sample_status(opened_samples[nChannel]) == SMP_PLAYING ) + AIL_end_3D_sample(opened_samples[nChannel]); + } + } +} + +void +cSampleManager::PreloadStreamedFile(uint8 nFile, uint8 nStream) +{ + if ( m_bInitialised ) + { + if ( nFile < TOTAL_STREAMED_SOUNDS ) + { + if ( mp3Stream[nStream] ) + { + AIL_pause_stream(mp3Stream[nStream], 1); + AIL_close_stream(mp3Stream[nStream]); + } + + char filepath[MAX_PATH]; + + strcpy(filepath, m_szCDRomRootPath); + strcat(filepath, StreamedNameTable[nFile]); + + mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0); + + if ( mp3Stream[nStream] ) + { + AIL_set_stream_loop_count(mp3Stream[nStream], 1); + AIL_service_stream(mp3Stream[nStream], 1); + } + else + OutputDebugString(AIL_last_error()); + } + } +} + +void +cSampleManager::PauseStream(uint8 nPauseFlag, uint8 nStream) +{ + if ( m_bInitialised ) + { + if ( mp3Stream[nStream] ) + AIL_pause_stream(mp3Stream[nStream], nPauseFlag != 0); + } +} + +void +cSampleManager::StartPreloadedStreamedFile(uint8 nStream) +{ + if ( m_bInitialised ) + { + if ( mp3Stream[nStream] ) + AIL_start_stream(mp3Stream[nStream]); + } +} + +bool +cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream) +{ + uint32 position = nPos; + char filename[MAX_PATH]; + + if ( m_bInitialised && nFile < TOTAL_STREAMED_SOUNDS ) + { + if ( mp3Stream[nStream] ) + { + AIL_pause_stream(mp3Stream[nStream], 1); + AIL_close_stream(mp3Stream[nStream]); + } + + if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) + { + uint32 i = 0; + + if ( !_bIsMp3Active ) goto FIND_MP3TRACK; + + do + { + if ( ++_CurMP3Index >= nNumMP3s ) + _CurMP3Index = 0; + + _CurMP3Pos = 0; + + tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); + + if ( mp3 ) + { + mp3 = _pMP3List; + if ( mp3 == NULL ) + { + _bIsMp3Active = false; + nFile = 0; + goto PLAY_STREAMEDTRACK; + } + } + + if ( mp3->pLinkPath != NULL ) + mp3Stream[nStream] = AIL_open_stream(DIG, mp3->pLinkPath, 0); + else + { + strcpy(filename, _mp3DirectoryPath); + strcat(filename, mp3->aFilename); + + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + } + + if ( mp3Stream[nStream] ) + { + AIL_set_stream_loop_count(mp3Stream[nStream], 1); + AIL_set_stream_ms_position(mp3Stream[nStream], 0); + AIL_pause_stream(mp3Stream[nStream], 0); + return true; + } + + goto NEXT_MP3TRACK; + +FIND_MP3TRACK: + if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] ) + position = 0; + + tMP3Entry *e; + if ( !_GetMP3PosFromStreamPos(&position, &e) ) + { + if ( e == NULL ) + { + nFile = 0; + goto PLAY_STREAMEDTRACK; + } + } + + if ( e->pLinkPath != NULL ) + mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0); + else + { + strcpy(filename, _mp3DirectoryPath); + strcat(filename, e->aFilename); + + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + } + + if ( mp3Stream[nStream] ) + { + AIL_set_stream_loop_count(mp3Stream[nStream], 1); + AIL_set_stream_ms_position(mp3Stream[nStream], position); + AIL_pause_stream(mp3Stream[nStream], 0); + + _bIsMp3Active = true; + + return true; + } + +NEXT_MP3TRACK: + _bIsMp3Active = false; + + } while ( ++i < nNumMP3s ); + + position = 0; + nFile = 0; + goto PLAY_STREAMEDTRACK; + } + +PLAY_STREAMEDTRACK: + strcpy(filename, m_szCDRomRootPath); + strcat(filename, StreamedNameTable[nFile]); + + mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0); + if ( mp3Stream[nStream] ) + { + AIL_set_stream_loop_count(mp3Stream[nStream], 1); + AIL_set_stream_ms_position(mp3Stream[nStream], position); + AIL_pause_stream(mp3Stream[nStream], 0); + return true; + } + } + + return false; +} + +void +cSampleManager::StopStreamedFile(uint8 nStream) +{ + if ( m_bInitialised ) + { + if ( mp3Stream[nStream] ) + { + AIL_pause_stream(mp3Stream[nStream], 1); + + AIL_close_stream(mp3Stream[nStream]); + mp3Stream[nStream] = NULL; + + if ( nStream == 0 ) + _bIsMp3Active = false; + } + } +} + +int32 +cSampleManager::GetStreamedFilePosition(uint8 nStream) +{ + S32 currentms; + + if ( m_bInitialised ) + { + if ( mp3Stream[nStream] ) + { + if ( _bIsMp3Active ) + { + tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); + + if ( mp3 != NULL ) + { + AIL_stream_ms_position(mp3Stream[nStream], NULL, ¤tms); + return currentms + mp3->nTrackStreamPos; + } + else + return 0; + } + else + { + AIL_stream_ms_position(mp3Stream[nStream], NULL, ¤tms); + return currentms; + } + } + } + + return 0; +} + +void +cSampleManager::SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffectFlag, uint8 nStream) +{ + uint8 vol = nVolume; + + if ( m_bInitialised ) + { + if ( vol > 127 ) vol = 127; + if ( vol > 127 ) vol = 127; + + nStreamVolume[nStream] = vol; + nStreamPan[nStream] = nPan; + + if ( mp3Stream[nStream] ) + { + if ( nEffectFlag ) + AIL_set_stream_volume(mp3Stream[nStream], m_nEffectsFadeVolume*vol*m_nEffectsVolume >> 14); + else + AIL_set_stream_volume(mp3Stream[nStream], m_nMusicFadeVolume*vol*m_nMusicVolume >> 14); + + AIL_set_stream_pan(mp3Stream[nStream], nPan); + } + } +} + +int32 +cSampleManager::GetStreamedFileLength(uint8 nStream) +{ + if ( m_bInitialised ) + return nStreamLength[nStream]; + + return 0; +} + +bool +cSampleManager::IsStreamPlaying(uint8 nStream) +{ + if ( m_bInitialised ) + { + if ( mp3Stream[nStream] ) + { + if ( AIL_stream_status(mp3Stream[nStream]) == SMP_PLAYING ) + return true; + else + return false; + } + } + + return false; +} + +bool +cSampleManager::InitialiseSampleBanks(void) +{ + int32 nBank = 0; + + fpSampleDescHandle = fopen(SampleBankDescFilename, "rb"); + if ( fpSampleDescHandle == NULL ) + return false; + + fpSampleDataHandle = fopen(SampleBankDataFilename, "rb"); + if ( fpSampleDataHandle == NULL ) + { + fclose(fpSampleDescHandle); + fpSampleDescHandle = NULL; + + return false; + } + + fseek(fpSampleDataHandle, 0, SEEK_END); + _nSampleDataEndOffset = ftell(fpSampleDataHandle); + rewind(fpSampleDataHandle); + + fread(m_aSamples, sizeof(tSample), TOTAL_AUDIO_SAMPLES, fpSampleDescHandle); + + fclose(fpSampleDescHandle); + fpSampleDescHandle = NULL; + + for ( int32 i = 0; i < TOTAL_AUDIO_SAMPLES; i++ ) + { + if ( BankStartOffset[nBank] == BankStartOffset[0] + i ) + { + nSampleBankDiscStartOffset[nBank] = m_aSamples[i].nOffset; + nBank++; + } + } + + nSampleBankSize[0] = nSampleBankDiscStartOffset[1] - nSampleBankDiscStartOffset[0]; + nSampleBankSize[1] = _nSampleDataEndOffset - nSampleBankDiscStartOffset[1]; + + return true; +} + +STARTPATCHES + //InjectHook(0x565500, cSampleManager::cSampleManager, PATCH_JUMP); + //InjectHook(0x565510, cSampleManager::~cSampleManager, PATCH_JUMP); + InjectHook(0x565520, comp, PATCH_JUMP); + InjectHook(0x565540, add_providers, PATCH_JUMP); + InjectHook(0x565680, release_existing, PATCH_JUMP); + InjectHook(0x5656F0, set_new_provider, PATCH_JUMP); + InjectHook(0x565900, &cSampleManager::SetSpeakerConfig, PATCH_JUMP); + InjectHook(0x565970, &cSampleManager::GetMaximumSupportedChannels, PATCH_JUMP); + InjectHook(0x565990, &cSampleManager::GetCurrent3DProviderIndex, PATCH_JUMP); + InjectHook(0x5659A0, &cSampleManager::SetCurrent3DProvider, PATCH_JUMP); + InjectHook(0x565A10, _ResolveLink, PATCH_JUMP); + InjectHook(0x565B40, _FindMP3s, PATCH_JUMP); + InjectHook(0x566380, _DeleteMP3Entries, PATCH_JUMP); + InjectHook(0x566400, _GetMP3EntryByIndex, PATCH_JUMP); + InjectHook(0x566490, &cSampleManager::IsMP3RadioChannelAvailable, PATCH_JUMP); + InjectHook(0x5664B0, &cSampleManager::ReleaseDigitalHandle, PATCH_JUMP); + InjectHook(0x5664F0, &cSampleManager::ReacquireDigitalHandle, PATCH_JUMP); + InjectHook(0x566530, &cSampleManager::Initialise, PATCH_JUMP); + InjectHook(0x566DC0, &cSampleManager::Terminate, PATCH_JUMP); + InjectHook(0x566EA0, &cSampleManager::CheckForAnAudioFileOnCD, PATCH_JUMP); + InjectHook(0x566F20, &cSampleManager::GetCDAudioDriveLetter, PATCH_JUMP); + InjectHook(0x566F50, &cSampleManager::UpdateEffectsVolume, PATCH_JUMP); + InjectHook(0x567010, &cSampleManager::SetEffectsMasterVolume, PATCH_JUMP); + InjectHook(0x567020, &cSampleManager::SetMusicMasterVolume, PATCH_JUMP); + InjectHook(0x567030, &cSampleManager::SetEffectsFadeVolume, PATCH_JUMP); + InjectHook(0x567040, &cSampleManager::SetMusicFadeVolume, PATCH_JUMP); + InjectHook(0x567050, &cSampleManager::LoadSampleBank, PATCH_JUMP); + InjectHook(0x567110, &cSampleManager::UnloadSampleBank, PATCH_JUMP); + InjectHook(0x567130, &cSampleManager::IsSampleBankLoaded, PATCH_JUMP); + InjectHook(0x567150, &cSampleManager::IsPedCommentLoaded, PATCH_JUMP); + InjectHook(0x5671A0, &cSampleManager::LoadPedComment, PATCH_JUMP); + InjectHook(0x5672A0, &cSampleManager::GetSampleBaseFrequency, PATCH_JUMP); + InjectHook(0x5672C0, &cSampleManager::GetSampleLoopStartOffset, PATCH_JUMP); + InjectHook(0x5672E0, &cSampleManager::GetSampleLoopEndOffset, PATCH_JUMP); + InjectHook(0x567300, &cSampleManager::GetSampleLength, PATCH_JUMP); + InjectHook(0x567320, &cSampleManager::UpdateReverb, PATCH_JUMP); + InjectHook(0x567630, &cSampleManager::SetChannelReverbFlag, PATCH_JUMP); + InjectHook(0x5676A0, &cSampleManager::InitialiseChannel, PATCH_JUMP); + InjectHook(0x567820, &cSampleManager::SetChannelEmittingVolume, PATCH_JUMP); + InjectHook(0x567890, &cSampleManager::SetChannel3DPosition, PATCH_JUMP); + InjectHook(0x5678D0, &cSampleManager::SetChannel3DDistances, PATCH_JUMP); + InjectHook(0x567900, &cSampleManager::SetChannelVolume, PATCH_JUMP); + InjectHook(0x567980, &cSampleManager::SetChannelPan, PATCH_JUMP); + InjectHook(0x5679D0, &cSampleManager::SetChannelFrequency, PATCH_JUMP); + InjectHook(0x567A30, &cSampleManager::SetChannelLoopPoints, PATCH_JUMP); + InjectHook(0x567AA0, &cSampleManager::SetChannelLoopCount, PATCH_JUMP); + InjectHook(0x567B00, &cSampleManager::GetChannelUsedFlag, PATCH_JUMP); + InjectHook(0x567B80, &cSampleManager::StartChannel, PATCH_JUMP); + InjectHook(0x567BE0, &cSampleManager::StopChannel, PATCH_JUMP); + InjectHook(0x567C50, &cSampleManager::PreloadStreamedFile, PATCH_JUMP); + InjectHook(0x567D30, &cSampleManager::PauseStream, PATCH_JUMP); + InjectHook(0x567D60, &cSampleManager::StartPreloadedStreamedFile, PATCH_JUMP); + InjectHook(0x567D80, &cSampleManager::StartStreamedFile, PATCH_JUMP); + InjectHook(0x5680E0, &cSampleManager::StopStreamedFile, PATCH_JUMP); + InjectHook(0x568130, &cSampleManager::GetStreamedFilePosition, PATCH_JUMP); + InjectHook(0x5681D0, &cSampleManager::SetStreamedVolumeAndPan, PATCH_JUMP); + InjectHook(0x568270, &cSampleManager::GetStreamedFileLength, PATCH_JUMP); + InjectHook(0x568290, &cSampleManager::IsStreamPlaying, PATCH_JUMP); + InjectHook(0x5682D0, &cSampleManager::InitialiseSampleBanks, PATCH_JUMP); + //InjectHook(0x5683F0, `global constructor keyed to'sampman.cpp, PATCH_JUMP); +ENDPATCHES
\ No newline at end of file diff --git a/src/audio/sampman.h b/src/audio/sampman.h new file mode 100644 index 00000000..ba2381b5 --- /dev/null +++ b/src/audio/sampman.h @@ -0,0 +1,334 @@ +#pragma once +#include "common.h" +#include "AudioSamples.h" + +struct tSample { + int32 nOffset; + uint32 nSize; + int32 nFrequency; + int32 nLoopStart; + int32 nLoopEnd; +}; + +#define MAXPROVIDERS 64 + +#define MAXCHANNELS 28 +#define MAXCHANNELS_SURROUND 24 +#define MAX2DCHANNELS 1 +#define CHANNEL2D MAXCHANNELS + + +#define MAX_MP3STREAMS 2 + + +#define MAX_SAMPLEBANKS 2 +#define MAX_PEDSFX 7 +#define PED_BLOCKSIZE 79000 + + +#define MAX_DIGITAL_MIXER_CHANNELS 32 + +#define DIGITALRATE 32000 +#define DIGITALBITS 16 +#define DIGITALCHANNELS 2 + + + +class cSampleManager +{ + uint8 m_nEffectsVolume; + uint8 m_nMusicVolume; + uint8 m_nEffectsFadeVolume; + uint8 m_nMusicFadeVolume; + uint8 m_nMonoMode; + char _pad0[1]; + char m_szCDRomRootPath[80]; + bool m_bInitialised; + uint8 m_nNumberOfProviders; + char *m_aAudioProviders[MAXPROVIDERS]; + tSample m_aSamples[TOTAL_AUDIO_SAMPLES]; + +public: + + + + cSampleManager(void) : + m_nNumberOfProviders(0) + { } + + ~cSampleManager(void) + { } + + void SetSpeakerConfig(int32 nConfig); + uint32 GetMaximumSupportedChannels(void); + + uint32 GetNum3DProvidersAvailable() { return m_nNumberOfProviders; } + void SetNum3DProvidersAvailable(uint32 num) { m_nNumberOfProviders = num; } + + char *Get3DProviderName(uint8 id) { return m_aAudioProviders[id]; } + void Set3DProviderName(uint8 id, char *name) { m_aAudioProviders[id] = name; } + + int8 GetCurrent3DProviderIndex(void); + int8 SetCurrent3DProvider(uint8 which); + + bool IsMP3RadioChannelAvailable(void); + + void ReleaseDigitalHandle (void); + void ReacquireDigitalHandle(void); + + bool Initialise(void); + void Terminate (void); + + bool CheckForAnAudioFileOnCD(void); + char GetCDAudioDriveLetter (void); + + void UpdateEffectsVolume(void); + + void SetEffectsMasterVolume(uint8 nVolume); + void SetMusicMasterVolume (uint8 nVolume); + void SetEffectsFadeVolume (uint8 nVolume); + void SetMusicFadeVolume (uint8 nVolume); + + bool LoadSampleBank (uint8 nBank); + void UnloadSampleBank (uint8 nBank); + bool IsSampleBankLoaded(uint8 nBank); + + bool IsPedCommentLoaded(uint32 nComment); + bool LoadPedComment (uint32 nComment); + + int32 _GetPedCommentSlot(uint32 nComment); + + int32 GetSampleBaseFrequency (uint32 nSample); + int32 GetSampleLoopStartOffset(uint32 nSample); + int32 GetSampleLoopEndOffset (uint32 nSample); + uint32 GetSampleLength (uint32 nSample); + + bool UpdateReverb(void); + + void SetChannelReverbFlag (uint32 nChannel, uint8 nReverbFlag); + bool InitialiseChannel (uint32 nChannel, uint32 nSfx, uint8 nBank); + void SetChannelEmittingVolume(uint32 nChannel, uint32 nVolume); + void SetChannel3DPosition (uint32 nChannel, float fX, float fY, float fZ); + void SetChannel3DDistances (uint32 nChannel, float fMax, float fMin); + void SetChannelVolume (uint32 nChannel, uint32 nVolume); + void SetChannelPan (uint32 nChannel, uint32 nPan); + void SetChannelFrequency (uint32 nChannel, uint32 nFreq); + void SetChannelLoopPoints (uint32 nChannel, uint32 nLoopStart, int32 nLoopEnd); + void SetChannelLoopCount (uint32 nChannel, uint32 nLoopCount); + bool GetChannelUsedFlag (uint32 nChannel); + void StartChannel (uint32 nChannel); + void StopChannel (uint32 nChannel); + + void PreloadStreamedFile (uint8 nFile, uint8 nStream); + void PauseStream (uint8 nPauseFlag, uint8 nStream); + void StartPreloadedStreamedFile (uint8 nStream); + bool StartStreamedFile (uint8 nFile, uint32 nPos, uint8 nStream); + void StopStreamedFile (uint8 nStream); + int32 GetStreamedFilePosition (uint8 nStream); + void SetStreamedVolumeAndPan(uint8 nVolume, uint8 nPan, uint8 nEffectFlag, uint8 nStream); + int32 GetStreamedFileLength (uint8 nStream); + bool IsStreamPlaying (uint8 nStream); + bool InitialiseSampleBanks(void); +}; + +extern cSampleManager &SampleManager; + +static char StreamedNameTable[][25]= +{ + "AUDIO\\HEAD.WAV", + "AUDIO\\CLASS.WAV", + "AUDIO\\KJAH.WAV", + "AUDIO\\RISE.WAV", + "AUDIO\\LIPS.WAV", + "AUDIO\\GAME.WAV", + "AUDIO\\MSX.WAV", + "AUDIO\\FLASH.WAV", + "AUDIO\\CHAT.WAV", + "AUDIO\\HEAD.WAV", + "AUDIO\\POLICE.WAV", + "AUDIO\\CITY.WAV", + "AUDIO\\WATER.WAV", + "AUDIO\\COMOPEN.WAV", + "AUDIO\\SUBOPEN.WAV", + "AUDIO\\JB.MP3", + "AUDIO\\BET.MP3", + "AUDIO\\L1_LG.MP3", + "AUDIO\\L2_DSB.MP3", + "AUDIO\\L3_DM.MP3", + "AUDIO\\L4_PAP.MP3", + "AUDIO\\L5_TFB.MP3", + "AUDIO\\J0_DM2.MP3", + "AUDIO\\J1_LFL.MP3", + "AUDIO\\J2_KCL.MP3", + "AUDIO\\J3_VH.MP3", + "AUDIO\\J4_ETH.MP3", + "AUDIO\\J5_DST.MP3", + "AUDIO\\J6_TBJ.MP3", + "AUDIO\\T1_TOL.MP3", + "AUDIO\\T2_TPU.MP3", + "AUDIO\\T3_MAS.MP3", + "AUDIO\\T4_TAT.MP3", + "AUDIO\\T5_BF.MP3", + "AUDIO\\S0_MAS.MP3", + "AUDIO\\S1_PF.MP3", + "AUDIO\\S2_CTG.MP3", + "AUDIO\\S3_RTC.MP3", + "AUDIO\\S5_LRQ.MP3", + "AUDIO\\S4_BDBA.MP3", + "AUDIO\\S4_BDBB.MP3", + "AUDIO\\S2_CTG2.MP3", + "AUDIO\\S4_BDBD.MP3", + "AUDIO\\S5_LRQB.MP3", + "AUDIO\\S5_LRQC.MP3", + "AUDIO\\A1_SSO.WAV", + "AUDIO\\A2_PP.WAV", + "AUDIO\\A3_SS.WAV", + "AUDIO\\A4_PDR.WAV", + "AUDIO\\A5_K2FT.WAV", + "AUDIO\\K1_KBO.MP3", + "AUDIO\\K2_GIS.MP3", + "AUDIO\\K3_DS.MP3", + "AUDIO\\K4_SHI.MP3", + "AUDIO\\K5_SD.MP3", + "AUDIO\\R0_PDR2.MP3", + "AUDIO\\R1_SW.MP3", + "AUDIO\\R2_AP.MP3", + "AUDIO\\R3_ED.MP3", + "AUDIO\\R4_GF.MP3", + "AUDIO\\R5_PB.MP3", + "AUDIO\\R6_MM.MP3", + "AUDIO\\D1_STOG.MP3", + "AUDIO\\D2_KK.MP3", + "AUDIO\\D3_ADO.MP3", + "AUDIO\\D5_ES.MP3", + "AUDIO\\D7_MLD.MP3", + "AUDIO\\D4_GTA.MP3", + "AUDIO\\D4_GTA2.MP3", + "AUDIO\\D6_STS.MP3", + "AUDIO\\A6_BAIT.WAV", + "AUDIO\\A7_ETG.WAV", + "AUDIO\\A8_PS.WAV", + "AUDIO\\A9_ASD.WAV", + "AUDIO\\K4_SHI2.MP3", + "AUDIO\\C1_TEX.MP3", + "AUDIO\\EL_PH1.MP3", + "AUDIO\\EL_PH2.MP3", + "AUDIO\\EL_PH3.MP3", + "AUDIO\\EL_PH4.MP3", + "AUDIO\\YD_PH1.MP3", + "AUDIO\\YD_PH2.MP3", + "AUDIO\\YD_PH3.MP3", + "AUDIO\\YD_PH4.MP3", + "AUDIO\\HD_PH1.MP3", + "AUDIO\\HD_PH2.MP3", + "AUDIO\\HD_PH3.MP3", + "AUDIO\\HD_PH4.MP3", + "AUDIO\\HD_PH5.MP3", + "AUDIO\\MT_PH1.MP3", + "AUDIO\\MT_PH2.MP3", + "AUDIO\\MT_PH3.MP3", + "AUDIO\\MT_PH4.MP3", + "AUDIO\\MISCOM.WAV", + "AUDIO\\END.MP3", + "AUDIO\\lib_a1.WAV", + "AUDIO\\lib_a2.WAV", + "AUDIO\\lib_a.WAV", + "AUDIO\\lib_b.WAV", + "AUDIO\\lib_c.WAV", + "AUDIO\\lib_d.WAV", + "AUDIO\\l2_a.WAV", + "AUDIO\\j4t_1.WAV", + "AUDIO\\j4t_2.WAV", + "AUDIO\\j4t_3.WAV", + "AUDIO\\j4t_4.WAV", + "AUDIO\\j4_a.WAV", + "AUDIO\\j4_b.WAV", + "AUDIO\\j4_c.WAV", + "AUDIO\\j4_d.WAV", + "AUDIO\\j4_e.WAV", + "AUDIO\\j4_f.WAV", + "AUDIO\\j6_1.WAV", + "AUDIO\\j6_a.WAV", + "AUDIO\\j6_b.WAV", + "AUDIO\\j6_c.WAV", + "AUDIO\\j6_d.WAV", + "AUDIO\\t4_a.WAV", + "AUDIO\\s1_a.WAV", + "AUDIO\\s1_a1.WAV", + "AUDIO\\s1_b.WAV", + "AUDIO\\s1_c.WAV", + "AUDIO\\s1_c1.WAV", + "AUDIO\\s1_d.WAV", + "AUDIO\\s1_e.WAV", + "AUDIO\\s1_f.WAV", + "AUDIO\\s1_g.WAV", + "AUDIO\\s1_h.WAV", + "AUDIO\\s1_i.WAV", + "AUDIO\\s1_j.WAV", + "AUDIO\\s1_k.WAV", + "AUDIO\\s1_l.WAV", + "AUDIO\\s3_a.WAV", + "AUDIO\\s3_b.WAV", + "AUDIO\\el3_a.WAV", + "AUDIO\\mf1_a.WAV", + "AUDIO\\mf2_a.WAV", + "AUDIO\\mf3_a.WAV", + "AUDIO\\mf3_b.WAV", + "AUDIO\\mf3_b1.WAV", + "AUDIO\\mf3_c.WAV", + "AUDIO\\mf4_a.WAV", + "AUDIO\\mf4_b.WAV", + "AUDIO\\mf4_c.WAV", + "AUDIO\\a1_a.WAV", + "AUDIO\\a3_a.WAV", + "AUDIO\\a5_a.WAV", + "AUDIO\\a4_a.WAV", + "AUDIO\\a4_b.WAV", + "AUDIO\\a4_c.WAV", + "AUDIO\\a4_d.WAV", + "AUDIO\\k1_a.WAV", + "AUDIO\\k3_a.WAV", + "AUDIO\\r1_a.WAV", + "AUDIO\\r2_a.WAV", + "AUDIO\\r2_b.WAV", + "AUDIO\\r2_c.WAV", + "AUDIO\\r2_d.WAV", + "AUDIO\\r2_e.WAV", + "AUDIO\\r2_f.WAV", + "AUDIO\\r2_g.WAV", + "AUDIO\\r2_h.WAV", + "AUDIO\\r5_a.WAV", + "AUDIO\\r6_a.WAV", + "AUDIO\\r6_a1.WAV", + "AUDIO\\r6_b.WAV", + "AUDIO\\lo2_a.WAV", + "AUDIO\\lo6_a.WAV", + "AUDIO\\yd2_a.WAV", + "AUDIO\\yd2_b.WAV", + "AUDIO\\yd2_c.WAV", + "AUDIO\\yd2_c1.WAV", + "AUDIO\\yd2_d.WAV", + "AUDIO\\yd2_e.WAV", + "AUDIO\\yd2_f.WAV", + "AUDIO\\yd2_g.WAV", + "AUDIO\\yd2_h.WAV", + "AUDIO\\yd2_ass.WAV", + "AUDIO\\yd2_ok.WAV", + "AUDIO\\h5_a.WAV", + "AUDIO\\h5_b.WAV", + "AUDIO\\h5_c.WAV", + "AUDIO\\ammu_a.WAV", + "AUDIO\\ammu_b.WAV", + "AUDIO\\ammu_c.WAV", + "AUDIO\\door_1.WAV", + "AUDIO\\door_2.WAV", + "AUDIO\\door_3.WAV", + "AUDIO\\door_4.WAV", + "AUDIO\\door_5.WAV", + "AUDIO\\door_6.WAV", + "AUDIO\\t3_a.WAV", + "AUDIO\\t3_b.WAV", + "AUDIO\\t3_c.WAV", + "AUDIO\\k1_b.WAV", + "AUDIO\\cat1.WAV" +};
\ No newline at end of file |