diff options
Diffstat (limited to '')
-rw-r--r-- | src/audio/AudioManager.cpp | 309 |
1 files changed, 235 insertions, 74 deletions
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 9b1337c9..686b9206 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -10,16 +10,18 @@ #include "sampman.h" #include "Camera.h" #include "World.h" +#include "ZoneCull.h" cAudioManager AudioManager; #define SPEED_OF_SOUND 343.f -#define TIME_SPENT 50 +#define TIME_SPENT 40 cAudioManager::cAudioManager() { m_bIsInitialised = FALSE; m_bReverb = TRUE; + field_6 = 0; m_fSpeedOfSound = SPEED_OF_SOUND / TIME_SPENT; m_nTimeSpent = TIME_SPENT; m_nActiveSamples = NUM_CHANNELS_GENERIC; @@ -114,9 +116,7 @@ cAudioManager::Service() if (m_bIsInitialised) { m_nPreviousUserPause = m_nUserPause; m_nUserPause = CTimer::GetIsUserPaused(); -#if GTA_VERSION >= GTA3_PC_10 UpdateReflections(); -#endif ServiceSoundEffects(); MusicManager.Service(); } @@ -191,11 +191,11 @@ cAudioManager::GetEntityPointer(int32 id) void cAudioManager::PlayOneShot(int32 index, uint16 sound, float vol) { - static const uint8 OneShotPriority[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 4, 4, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 3, 2, 2, 2, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 1, 1, 1, 9, - 2, 2, 0, 0, 0, 0, 3, 3, 5, 1, 1, 1, 1, 3, 4, 7, 6, 6, 6, 6, 1, 3, 4, 3, 4, 2, 1, 3, 5, 4, 6, 6, 1, 3, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + static const uint8 OneShotPriority[] = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 2, 5, 5, 3, 5, 2, 2, 1, 1, 3, 1, 3, 3, 1, 1, 1, 1, 4, 4, 4, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 3, 4, 2, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 1, 1, 1, 9, 0, 0, 0, 1, 2, 2, 0, 0, 2, 3, 3, 3, 5, 1, 1, + 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 7, 1, 4, 3, 4, 2, 2, 2, 3, 1, 2, 1, 3, 5, 3, 4, 6, 4, 6, 3, 0, 0, 0, 0, 0, + 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0 }; if (m_bIsInitialised) { if (index >= 0 && index < NUM_AUDIOENTITIES) { @@ -251,6 +251,12 @@ cAudioManager::SetMusicMasterVolume(uint8 volume) } void +cAudioManager::SetMP3BoostVolume(uint8 volume) +{ + SampleManager.SetMP3BoostVolume(volume); +} + +void cAudioManager::SetEffectsFadeVol(uint8 volume) { SampleManager.SetEffectsFadeVolume(volume); @@ -263,9 +269,9 @@ cAudioManager::SetMusicFadeVol(uint8 volume) } void -cAudioManager::SetMonoMode(bool8 mono) +cAudioManager::SetOutputMode(bool8 surround) { - SampleManager.SetMonoMode(mono); + // on ps2 this calls another method of cAudioManager to set DTS mode on or off } void @@ -285,11 +291,13 @@ cAudioManager::ResetTimers(uint32 time) m_nActiveSampleQueue = 0; } ClearActiveSamples(); - ClearMissionAudio(); + ClearMissionAudio(0); + ClearMissionAudio(1); SampleManager.StopChannel(CHANNEL_POLICE_RADIO); SampleManager.SetEffectsFadeVolume(0); SampleManager.SetMusicFadeVolume(0); MusicManager.ResetMusicAfterReload(); + m_bIsPlayerShutUp = FALSE; #ifdef AUDIO_OAL SampleManager.Service(); #endif @@ -308,7 +316,7 @@ cAudioManager::DestroyAllGameCreatedEntities() case AUDIOTYPE_PHYSICAL: case AUDIOTYPE_EXPLOSION: case AUDIOTYPE_WEATHER: - case AUDIOTYPE_CRANE: + //case AUDIOTYPE_CRANE: case AUDIOTYPE_GARAGE: case AUDIOTYPE_FIREHYDRANT: DestroyEntity(i); @@ -373,6 +381,17 @@ cAudioManager::GetCurrent3DProviderIndex() } int8 +cAudioManager::AutoDetect3DProviders() +{ +#ifdef EXTERNAL_3D_SOUND + if (m_bIsInitialised) + return SampleManager.AutoDetect3DProviders(); +#endif + + return -1; +} + +int8 cAudioManager::SetCurrent3DProvider(uint8 which) { #ifndef EXTERNAL_3D_SOUND @@ -391,11 +410,9 @@ cAudioManager::SetCurrent3DProvider(uint8 which) ClearActiveSamples(); int8 current = SampleManager.SetCurrent3DProvider(which); if (current > 0) { -#ifdef EXTERNAL_3D_SOUND m_nActiveSamples = SampleManager.GetMaximumSupportedChannels(); if (m_nActiveSamples > 1) --m_nActiveSamples; -#endif } return current; #endif @@ -451,7 +468,6 @@ cAudioManager::GetCDAudioDriveLetter() { if (m_bIsInitialised) return SampleManager.GetCDAudioDriveLetter(); - return '\0'; } @@ -487,7 +503,7 @@ cAudioManager::ServiceSoundEffects() ClearActiveSamples(); } m_nActiveSampleQueue = m_nActiveSampleQueue == 1 ? 0 : 1; - ProcessReverb(); + if(m_bReverb) ProcessReverb(); ProcessSpecial(); ClearRequestedQueue(); InterrogateAudioEntities(); @@ -512,22 +528,22 @@ cAudioManager::ServiceSoundEffects() m_sAudioScriptObjectManager.m_nScriptObjectEntityTotal = 0; } -uint32 -cAudioManager::FL(float f) -{ - return SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex) * f; -} - uint8 cAudioManager::ComputeVolume(uint8 emittingVolume, float soundIntensity, float distance) { float newSoundIntensity; + float newEmittingVolume; + if (soundIntensity <= 0.0f) return 0; + newSoundIntensity = soundIntensity / 5.0f; - if (newSoundIntensity <= distance) - emittingVolume = sq((soundIntensity - newSoundIntensity - (distance - newSoundIntensity)) / (soundIntensity - newSoundIntensity)) * emittingVolume; - return emittingVolume; + if (newSoundIntensity > distance) + return emittingVolume; + + newEmittingVolume = emittingVolume * SQR((soundIntensity - newSoundIntensity - (distance - newSoundIntensity)) + / (soundIntensity - newSoundIntensity)); + return Min(127, newEmittingVolume); } void @@ -536,12 +552,23 @@ cAudioManager::TranslateEntity(Const CVector *in, CVector *out) *out = MultiplyInverse(TheCamera.GetMatrix(), *in); } +Const static uint8 PanTable[64] = { 0, 3, 8, 12, 16, 19, 22, 24, 26, 28, 30, 31, 33, 34, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53, + 54, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63}; + int32 -cAudioManager::ComputePan(float dist, CVector *vec) +cAudioManager::ComputeFrontRearMix(float dist, CVector *vec) { - Const static uint8 PanTable[64] = {0, 3, 8, 12, 16, 19, 22, 24, 26, 28, 30, 31, 33, 34, 36, 37, 39, 40, 41, 42, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53, - 54, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63}; + int32 index = vec->y / (dist / 64.f); + index = Min(63, ABS(index)); + + if (vec->y > 0.f) + return Max(0, 63 - (int8)PanTable[index]); + return Min(127, PanTable[index] + 63); +} +int32 +cAudioManager::ComputePan(float dist, CVector *vec) +{ int32 index = vec->x / (dist / 64.f); index = Min(63, ABS(index)); @@ -617,7 +644,7 @@ cAudioManager::AddSampleToRequestedQueue() } m_sQueueSample.m_nCalculatedVolume = calculatedVolume; m_sQueueSample.m_bLoopEnded = FALSE; - if (m_sQueueSample.m_bIs2D) { + if (m_sQueueSample.m_bIs2D || CCullZones::InRoomForAudio()) { m_sQueueSample.m_bRequireReflection = FALSE; m_sQueueSample.m_nLoopsRemaining = 0; } @@ -629,6 +656,9 @@ cAudioManager::AddSampleToRequestedQueue() } m_sQueueSample.m_bRequireReflection = FALSE; + if ( m_bReverb && m_sQueueSample.m_bIs2D ) + m_sQueueSample.field_4C = 30; + if (!m_bDynamicAcousticModelingStatus) m_sQueueSample.m_bReverbFlag = FALSE; @@ -657,30 +687,55 @@ cAudioManager::AddDetailsToRequestedOrderList(uint8 sample) m_abSampleQueueIndexTable[m_nActiveSampleQueue][i] = sample; } -#if GTA_VERSION >= GTA3_PC_10 void cAudioManager::AddReflectionsToRequestedQueue() { +#ifdef FIX_BUGS + uint32 oldFreq = 0; +#else + uint32 oldFreq; +#endif float reflectionDistance; int32 noise; - uint8 emittingVolume = (m_sQueueSample.m_nVolume / 2) + (m_sQueueSample.m_nVolume / 8); + uint8 emittingVolume; + + uint32 oldCounter = m_sQueueSample.m_nCounter; + float oldDist = m_sQueueSample.m_fDistance; + CVector oldPos = m_sQueueSample.m_vecPos; + if ( CTimer::GetIsSlowMotionActive() ) { + emittingVolume = m_sQueueSample.m_nVolume; + oldFreq = m_sQueueSample.m_nFrequency; + } else { + emittingVolume = (9 * m_sQueueSample.m_nVolume) / 16; + } + m_sQueueSample.m_SoundIntensity /= 2.f; + + int halfOldFreq = oldFreq >> 1; for (uint32 i = 0; i < ARRAY_SIZE(m_afReflectionsDistances); i++) { + if ( CTimer::GetIsSlowMotionActive() ) + m_afReflectionsDistances[i] = (m_anRandomTable[i % 4] % 3) * 100.f / 8.f; + reflectionDistance = m_afReflectionsDistances[i]; if (reflectionDistance > 0.0f && reflectionDistance < 100.f && reflectionDistance < m_sQueueSample.m_SoundIntensity) { - m_sQueueSample.m_nLoopsRemaining = (reflectionDistance * 500.f / 1029.f); - if (m_sQueueSample.m_nLoopsRemaining > 5) { + m_sQueueSample.m_nLoopsRemaining = CTimer::GetIsSlowMotionActive() ? (reflectionDistance * 800.f / 1029.f) : (reflectionDistance * 500.f / 1029.f); + if (m_sQueueSample.m_nLoopsRemaining > 3) { m_sQueueSample.m_fDistance = m_afReflectionsDistances[i]; SET_EMITTING_VOLUME(emittingVolume); m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, m_sQueueSample.m_SoundIntensity, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume > emittingVolume / 16) { - m_sQueueSample.m_nCounter += (i + 1) * 256; + m_sQueueSample.m_nCounter = oldCounter + (i + 1) * 256; if (m_sQueueSample.m_nLoopCount) { - noise = RandomDisplacement(m_sQueueSample.m_nFrequency / 32); - if (noise <= 0) - m_sQueueSample.m_nFrequency += noise; - else - m_sQueueSample.m_nFrequency -= noise; + if ( CTimer::GetIsSlowMotionActive() ) { + m_sQueueSample.m_nFrequency = halfOldFreq + ((halfOldFreq * i) / ARRAY_SIZE(m_afReflectionsDistances)); + } else { + noise = RandomDisplacement(m_sQueueSample.m_nFrequency / 32); + if (noise <= 0) + m_sQueueSample.m_nFrequency += noise; + else + m_sQueueSample.m_nFrequency -= noise; + } } m_sQueueSample.m_nReleasingVolumeModificator += 20; m_sQueueSample.m_vecPos = m_avecReflectionsPos[i]; @@ -689,6 +744,8 @@ cAudioManager::AddReflectionsToRequestedQueue() } } } + m_sQueueSample.m_vecPos = oldPos; + m_sQueueSample.m_fDistance = oldDist; } void @@ -698,6 +755,7 @@ cAudioManager::UpdateReflections() CColPoint colpoint; CEntity *ent; +#if GTA_VERSION < GTAVC_PC_10 if (m_FrameCounter % 8 == 0) { camPos = TheCamera.GetPosition(); m_avecReflectionsPos[0] = camPos; @@ -739,8 +797,78 @@ cAudioManager::UpdateReflections() else m_afReflectionsDistances[4] = 50.0f; } +#else + if (m_FrameCounter % 8 == 0) { + camPos = TheCamera.GetPosition(); + m_avecReflectionsPos[0] = camPos; + m_avecReflectionsPos[0].y += 100.f; + if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[0], colpoint, ent, true, false, false, true, false, true, true)) + m_afReflectionsDistances[0] = Distance(camPos, colpoint.point); + else + m_afReflectionsDistances[0] = 100.0f; + } else if ((m_FrameCounter + 1) % 8 == 0) { + camPos = TheCamera.GetPosition(); + m_avecReflectionsPos[1] = camPos; + m_avecReflectionsPos[1].y -= 100.0f; + if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[1], colpoint, ent, true, false, false, true, false, true, true)) + m_afReflectionsDistances[1] = Distance(camPos, colpoint.point); + else + m_afReflectionsDistances[1] = 100.0f; + } else if ((m_FrameCounter + 2) % 8 == 0) { + camPos = TheCamera.GetPosition(); + m_avecReflectionsPos[2] = camPos; + m_avecReflectionsPos[2].x -= 100.0f; + if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[2], colpoint, ent, true, false, false, true, false, true, true)) + m_afReflectionsDistances[2] = Distance(camPos, colpoint.point); + else + m_afReflectionsDistances[2] = 100.0f; + } else if ((m_FrameCounter + 3) % 8 == 0) { + camPos = TheCamera.GetPosition(); + m_avecReflectionsPos[3] = camPos; + m_avecReflectionsPos[3].x += 100.0f; + if (CWorld::ProcessLineOfSight(camPos, m_avecReflectionsPos[3], colpoint, ent, true, false, false, true, false, true, true)) + m_afReflectionsDistances[3] = Distance(camPos, colpoint.point); + else + m_afReflectionsDistances[3] = 100.0f; + } else if ((m_FrameCounter + 4) % 8 == 0) { + camPos = TheCamera.GetPosition(); + camPos.y += 1.0f; + m_avecReflectionsPos[4] = camPos; + m_avecReflectionsPos[4].z += 100.0f; + if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[4].z, colpoint, ent, true, false, false, false, true, false, nil)) + m_afReflectionsDistances[4] = colpoint.point.z - camPos.z; + else + m_afReflectionsDistances[4] = 100.0f; + } else if ((m_FrameCounter + 5) % 8 == 0) { + camPos = TheCamera.GetPosition(); + camPos.y -= 1.0f; + m_avecReflectionsPos[5] = camPos; + m_avecReflectionsPos[5].z += 100.0f; + if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[5].z, colpoint, ent, true, false, false, false, true, false, nil)) + m_afReflectionsDistances[5] = colpoint.point.z - camPos.z; + else + m_afReflectionsDistances[5] = 100.0f; + } else if ((m_FrameCounter + 6) % 8 == 0) { + camPos = TheCamera.GetPosition(); + camPos.x -= 1.0f; + m_avecReflectionsPos[6] = camPos; + m_avecReflectionsPos[6].z += 100.0f; + if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[6].z, colpoint, ent, true, false, false, false, true, false, nil)) + m_afReflectionsDistances[6] = colpoint.point.z - camPos.z; + else + m_afReflectionsDistances[6] = 100.0f; + } else if ((m_FrameCounter + 7) % 8 == 0) { + camPos = TheCamera.GetPosition(); + camPos.x += 1.0f; + m_avecReflectionsPos[7] = camPos; + m_avecReflectionsPos[7].z += 100.0f; + if (CWorld::ProcessVerticalLine(camPos, m_avecReflectionsPos[7].z, colpoint, ent, true, false, false, false, true, false, nil)) + m_afReflectionsDistances[7] = colpoint.point.z - camPos.z; + else + m_afReflectionsDistances[7] = 100.0f; + } +#endif } -#endif // GTA_VERSION >= GTA3_PC_10 void cAudioManager::AddReleasingSounds() @@ -791,7 +919,7 @@ cAudioManager::AddReleasingSounds() if (sample.m_nReleasingVolumeModificator < 20) ++sample.m_nReleasingVolumeModificator; } - sample.m_bReleasingSoundFlag = 0; + sample.m_bReleasingSoundFlag = FALSE; } memcpy(&m_sQueueSample, &sample, sizeof(tSound)); AddSampleToRequestedQueue(); @@ -820,6 +948,8 @@ cAudioManager::ProcessActiveQueues() uint8 emittingVol; CVector position; + bool8 missionState; + for (int32 i = 0; i < m_nActiveSamples; i++) { m_asSamples[m_nActiveSampleQueue][i].m_bIsProcessed = FALSE; m_asActiveSamples[i].m_bIsProcessed = FALSE; @@ -830,7 +960,7 @@ cAudioManager::ProcessActiveQueues() if (sample.m_nSampleIndex != NO_SAMPLE) { for (int32 j = 0; j < m_nActiveSamples; j++) { if (sample.m_nEntityIndex == m_asActiveSamples[j].m_nEntityIndex && sample.m_nCounter == m_asActiveSamples[j].m_nCounter && - sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) { + sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) { if (sample.m_nLoopCount) { if (m_FrameCounter & 1) flag = !!(j & 1); @@ -844,6 +974,8 @@ cAudioManager::ProcessActiveQueues() m_asActiveSamples[j].m_nEntityIndex = AEHANDLE_NONE; continue; } + if (sample.m_nReleasingVolumeDivider == 0) + sample.m_nReleasingVolumeDivider = 1; } sample.m_bIsProcessed = TRUE; m_asActiveSamples[j].m_bIsProcessed = TRUE; @@ -860,7 +992,7 @@ cAudioManager::ProcessActiveQueues() SampleManager.SetChannelEmittingVolume(j, emittingVol); #else SampleManager.SetChannelPan(j, sample.m_nOffset); - SampleManager.SetChannelVolume(j, sample.m_nVolume); + SampleManager.SetChannelVolume(j, emittingVol); #endif } else { position2 = sample.m_fDistance; @@ -872,20 +1004,37 @@ cAudioManager::ProcessActiveQueues() m_asActiveSamples[j].m_nFrequency = freq; SampleManager.SetChannelFrequency(j, freq); } - #ifdef EXTERNAL_3D_SOUND if (sample.m_nEmittingVolume != m_asActiveSamples[j].m_nEmittingVolume) { vol = Clamp2((int8)sample.m_nEmittingVolume, (int8)m_asActiveSamples[j].m_nEmittingVolume, 10); - SampleManager.SetChannelEmittingVolume(j, m_bDoubleVolume ? 2 * Min(63, vol) : vol); - m_asActiveSamples[j].m_nEmittingVolume = vol; - } #else if (sample.m_nVolume != m_asActiveSamples[j].m_nVolume) { vol = Clamp2((int8)sample.m_nVolume, (int8)m_asActiveSamples[j].m_nVolume, 10); +#endif + emittingVol = m_bDoubleVolume ? 2 * Min(63, vol) : vol; + + missionState = FALSE; + for (int32 k = 0; k < MISSION_AUDIO_SLOTS; k++) { + if (m_sMissionAudio.m_bIsMobile[k]) { + missionState = TRUE; + break; + } + } + if (missionState) { + emittingVol = (emittingVol * field_5538) / 127; + } else { + if (field_5538 < 127) + emittingVol = (emittingVol * field_5538) / 127; + } + +#ifdef EXTERNAL_3D_SOUND + SampleManager.SetChannelEmittingVolume(j, emittingVol); + m_asActiveSamples[j].m_nEmittingVolume = vol; +#else + SampleManager.SetChannelVolume(j, emittingVol); m_asActiveSamples[j].m_nVolume = vol; - SampleManager.SetChannelVolume(j, m_bDoubleVolume ? 2 * Min(63, vol) : vol); - } #endif + } TranslateEntity(&sample.m_vecPos, &position); #ifdef EXTERNAL_3D_SOUND SampleManager.SetChannel3DPosition(j, position.x, position.y, position.z); @@ -896,10 +1045,11 @@ cAudioManager::ProcessActiveQueues() #endif } SampleManager.SetChannelReverbFlag(j, sample.m_bReverbFlag); - break; + break; //continue for i } sample.m_bIsProcessed = FALSE; m_asActiveSamples[j].m_bIsProcessed = FALSE; + //continue for j } } } @@ -919,7 +1069,8 @@ cAudioManager::ProcessActiveQueues() sample.m_nReleasingVolumeDivider = 1; } else { for (uint8 j = 0; j < m_nActiveSamples; j++) { - if (!m_asActiveSamples[j].m_bIsProcessed) { + uint8 k = (j + field_6) % m_nActiveSamples; + if (!m_asActiveSamples[k].m_bIsProcessed) { if (sample.m_nLoopCount != 0) { samplesPerFrame = sample.m_nFrequency / m_nTimeSpent; samplesToPlay = sample.m_nLoopCount * SampleManager.GetSampleLength(sample.m_nSampleIndex); @@ -927,9 +1078,9 @@ cAudioManager::ProcessActiveQueues() continue; sample.m_nReleasingVolumeDivider = samplesToPlay / samplesPerFrame + 1; } - memcpy(&m_asActiveSamples[j], &sample, sizeof(tSound)); - if (!m_asActiveSamples[j].m_bIs2D) { - TranslateEntity(&m_asActiveSamples[j].m_vecPos, &position); + memcpy(&m_asActiveSamples[k], &sample, sizeof(tSound)); + if (!m_asActiveSamples[k].m_bIs2D) { + TranslateEntity(&m_asActiveSamples[k].m_vecPos, &position); #ifndef EXTERNAL_3D_SOUND m_asActiveSamples[j].m_nOffset = ComputePan(m_asActiveSamples[j].m_fDistance, &position); #endif @@ -939,41 +1090,55 @@ cAudioManager::ProcessActiveQueues() #else emittingVol = m_bDoubleVolume ? 2 * Min(63, m_asActiveSamples[j].m_nVolume) : m_asActiveSamples[j].m_nVolume; #endif - if (SampleManager.InitialiseChannel(j, m_asActiveSamples[j].m_nSampleIndex, m_asActiveSamples[j].m_nBankIndex)) { - SampleManager.SetChannelFrequency(j, m_asActiveSamples[j].m_nFrequency); + if (SampleManager.InitialiseChannel(k, m_asActiveSamples[k].m_nSampleIndex, m_asActiveSamples[k].m_nBankIndex)) { + SampleManager.SetChannelFrequency(k, m_asActiveSamples[k].m_nFrequency); + bool8 isMobile = FALSE; + for (int32 l = 0; l < MISSION_AUDIO_SLOTS; l++) { + if (m_sMissionAudio.m_bIsMobile[l]) { + isMobile = TRUE; + break; + } + } + if (!isMobile || m_asActiveSamples[k].m_bIs2D) { + if (field_5538 < 127) + emittingVol *= field_5538 / 127; + vol = emittingVol; + } else { + vol = (emittingVol * field_5538 / 127); + } #ifdef EXTERNAL_3D_SOUND - SampleManager.SetChannelEmittingVolume(j, emittingVol); + SampleManager.SetChannelEmittingVolume(k, vol); #else SampleManager.SetChannelVolume(j, emittingVol); SampleManager.SetChannelPan(j, m_asActiveSamples[j].m_nOffset); #endif - SampleManager.SetChannelLoopPoints(j, m_asActiveSamples[j].m_nLoopStart, m_asActiveSamples[j].m_nLoopEnd); - SampleManager.SetChannelLoopCount(j, m_asActiveSamples[j].m_nLoopCount); - SampleManager.SetChannelReverbFlag(j, m_asActiveSamples[j].m_bReverbFlag); + SampleManager.SetChannelLoopPoints(k, m_asActiveSamples[k].m_nLoopStart, m_asActiveSamples[k].m_nLoopEnd); + SampleManager.SetChannelLoopCount(k, m_asActiveSamples[k].m_nLoopCount); + SampleManager.SetChannelReverbFlag(k, m_asActiveSamples[k].m_bReverbFlag); #ifdef EXTERNAL_3D_SOUND - if (m_asActiveSamples[j].m_bIs2D) { - uint8 offset = m_asActiveSamples[j].m_nOffset; + if (m_asActiveSamples[k].m_bIs2D) { + uint8 offset = m_asActiveSamples[k].m_nOffset; if (offset == 63) - x = 0.f; + x = 0.0f; else if (offset >= 63) x = (offset - 63) * 1000.0f / 63; else - x = -(63 - offset) * 1000.0f / 63; + x = -(63 - offset) * 1000.0f / 63; //same like line below usedX = x; usedY = 0.0f; usedZ = 0.0f; - m_asActiveSamples[j].m_SoundIntensity = 100000.0f; + m_asActiveSamples[k].m_SoundIntensity = 100000.0f; } else { usedX = position.x; usedY = position.y; usedZ = position.z; } - SampleManager.SetChannel3DPosition(j, usedX, usedY, usedZ); - SampleManager.SetChannel3DDistances(j, m_asActiveSamples[j].m_SoundIntensity, 0.25f * m_asActiveSamples[j].m_SoundIntensity); + SampleManager.SetChannel3DPosition(k, usedX, usedY, usedZ); + SampleManager.SetChannel3DDistances(k, m_asActiveSamples[k].m_SoundIntensity, 0.25f * m_asActiveSamples[k].m_SoundIntensity); #endif - SampleManager.StartChannel(j); + SampleManager.StartChannel(k); } - m_asActiveSamples[j].m_bIsProcessed = TRUE; + m_asActiveSamples[k].m_bIsProcessed = TRUE; sample.m_bIsProcessed = TRUE; sample.m_nVolumeChange = -1; break; @@ -982,6 +1147,7 @@ cAudioManager::ProcessActiveQueues() } } } + field_6 %= m_nActiveSamples; } void @@ -1020,18 +1186,13 @@ cAudioManager::ClearActiveSamples() m_asActiveSamples[i].m_SoundIntensity = 200.0f; m_asActiveSamples[i].m_nOffset = 63; m_asActiveSamples[i].m_bReleasingSoundFlag = FALSE; -#if GTA_VERSION < GTA3_PC_10 - m_asActiveSamples[i].unk = -3; -#endif m_asActiveSamples[i].m_nCalculatedVolume = 0; m_asActiveSamples[i].m_nReleasingVolumeDivider = 0; m_asActiveSamples[i].m_nVolumeChange = -1; m_asActiveSamples[i].m_vecPos = CVector(0.0f, 0.0f, 0.0f); m_asActiveSamples[i].m_bReverbFlag = FALSE; -#if GTA_VERSION >= GTA3_PC_10 m_asActiveSamples[i].m_nLoopsRemaining = 0; m_asActiveSamples[i].m_bRequireReflection = FALSE; -#endif } } |