1
0
Fork 0
mirror of https://github.com/halpz/re3.git synced 2024-12-22 17:35:29 +00:00

Refactor cAudioManager::ProcessActiveQueues, fix doppler effect

This commit is contained in:
Sergeanur 2021-08-12 13:01:07 +03:00
parent f1545daeae
commit 033d89a9ab
2 changed files with 29 additions and 79 deletions

View file

@ -539,10 +539,11 @@ cAudioManager::TranslateEntity(Const CVector *in, CVector *out)
int32 int32
cAudioManager::ComputePan(float dist, CVector *vec) cAudioManager::ComputePan(float dist, CVector *vec)
{ {
const 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, 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}; 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 = Min(63, Abs(vec->x / (dist / 64.f))); int32 index = vec->x / (dist / 64.f);
index = Min(63, ABS(index));
if (vec->x > 0.f) if (vec->x > 0.f)
return Max(20, 63 - PanTable[index]); return Max(20, 63 - PanTable[index]);
@ -558,11 +559,7 @@ cAudioManager::ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1,
if (dist != 0.0f) { if (dist != 0.0f) {
float speedOfSource = (dist / m_nTimeSpent) * speedMultiplier; float speedOfSource = (dist / m_nTimeSpent) * speedMultiplier;
if (m_fSpeedOfSound > Abs(speedOfSource)) { if (m_fSpeedOfSound > Abs(speedOfSource)) {
if (speedOfSource < 0.0f) { speedOfSource = Clamp2(speedOfSource, 0.0f, 1.5f);
speedOfSource = Max(speedOfSource, -1.5f);
} else {
speedOfSource = Min(speedOfSource, 1.5f);
}
newFreq = (oldFreq * m_fSpeedOfSound) / (speedOfSource + m_fSpeedOfSound); newFreq = (oldFreq * m_fSpeedOfSound) / (speedOfSource + m_fSpeedOfSound);
} }
} }
@ -804,8 +801,8 @@ cAudioManager::ProcessActiveQueues()
float position2; float position2;
float position1; float position1;
uint32 v28; uint32 samplesPerFrame;
uint32 v29; uint32 samplesToPlay;
#ifdef EXTERNAL_3D_SOUND #ifdef EXTERNAL_3D_SOUND
float x; float x;
@ -830,11 +827,11 @@ cAudioManager::ProcessActiveQueues()
if (sample.m_nEntityIndex == m_asActiveSamples[j].m_nEntityIndex && sample.m_nCounter == m_asActiveSamples[j].m_nCounter && 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 (sample.m_nLoopCount) {
if (m_FrameCounter & 1) { if (m_FrameCounter & 1)
flag = !!(j & 1); flag = !!(j & 1);
} else { else
flag = !(j & 1); flag = !(j & 1);
}
if (flag && !SampleManager.GetChannelUsedFlag(j)) { if (flag && !SampleManager.GetChannelUsedFlag(j)) {
sample.m_bLoopEnded = TRUE; sample.m_bLoopEnded = TRUE;
m_asActiveSamples[j].m_bLoopEnded = TRUE; m_asActiveSamples[j].m_bLoopEnded = TRUE;
@ -849,17 +846,9 @@ cAudioManager::ProcessActiveQueues()
if (!sample.m_bReleasingSoundFlag) { if (!sample.m_bReleasingSoundFlag) {
if (sample.m_bIs2D) { if (sample.m_bIs2D) {
#ifdef EXTERNAL_3D_SOUND #ifdef EXTERNAL_3D_SOUND
if (m_bDoubleVolume) { emittingVol = m_bDoubleVolume ? 2 * Min(63, sample.m_nEmittingVolume) : sample.m_nEmittingVolume;
emittingVol = 2 * Min(63, sample.m_nEmittingVolume);
} else {
emittingVol = sample.m_nEmittingVolume;
}
#else #else
if (m_bDoubleVolume) { emittingVol = m_bDoubleVolume ? 2 * Min(63, sample.m_nVolume) : sample.m_nVolume;
emittingVol = 2 * Min(63, sample.m_nVolume);
} else {
emittingVol = sample.m_nVolume;
}
#endif #endif
SampleManager.SetChannelFrequency(j, sample.m_nFrequency); SampleManager.SetChannelFrequency(j, sample.m_nFrequency);
#ifdef EXTERNAL_3D_SOUND #ifdef EXTERNAL_3D_SOUND
@ -869,58 +858,27 @@ cAudioManager::ProcessActiveQueues()
SampleManager.SetChannelVolume(j, sample.m_nVolume); SampleManager.SetChannelVolume(j, sample.m_nVolume);
#endif #endif
} else { } else {
m_asActiveSamples[j].m_fDistance = sample.m_fDistance;
position2 = sample.m_fDistance; position2 = sample.m_fDistance;
position1 = m_asActiveSamples[j].m_fDistance; position1 = m_asActiveSamples[j].m_fDistance;
m_asActiveSamples[j].m_fDistance = sample.m_fDistance;
sample.m_nFrequency = ComputeDopplerEffectedFrequency(sample.m_nFrequency, position1, position2, sample.m_fSpeedMultiplier); sample.m_nFrequency = ComputeDopplerEffectedFrequency(sample.m_nFrequency, position1, position2, sample.m_fSpeedMultiplier);
if (sample.m_nFrequency != m_asActiveSamples[j].m_nFrequency) { if (sample.m_nFrequency != m_asActiveSamples[j].m_nFrequency) {
int32 freq; uint32 freq = Clamp2((int32)sample.m_nFrequency, (int32)m_asActiveSamples[j].m_nFrequency, 6000);
if (sample.m_nFrequency <= m_asActiveSamples[j].m_nFrequency) {
#ifdef FIX_BUGS
freq = Max((int32)sample.m_nFrequency, (int32)m_asActiveSamples[j].m_nFrequency - 6000);
#else
freq = Max((int32)sample.m_nFrequency, int32(m_asActiveSamples[j].m_nFrequency - 6000));
#endif
} else {
freq = Min(sample.m_nFrequency, m_asActiveSamples[j].m_nFrequency + 6000);
}
m_asActiveSamples[j].m_nFrequency = freq; m_asActiveSamples[j].m_nFrequency = freq;
SampleManager.SetChannelFrequency(j, freq); SampleManager.SetChannelFrequency(j, freq);
} }
#ifdef EXTERNAL_3D_SOUND #ifdef EXTERNAL_3D_SOUND
if (sample.m_nEmittingVolume != m_asActiveSamples[j].m_nEmittingVolume) { if (sample.m_nEmittingVolume != m_asActiveSamples[j].m_nEmittingVolume) {
if (sample.m_nEmittingVolume <= m_asActiveSamples[j].m_nEmittingVolume) { vol = Clamp2((int8)sample.m_nEmittingVolume, (int8)m_asActiveSamples[j].m_nEmittingVolume, 10);
vol = Max(m_asActiveSamples[j].m_nEmittingVolume - 10, sample.m_nEmittingVolume); SampleManager.SetChannelEmittingVolume(j, m_bDoubleVolume ? 2 * Min(63, vol) : vol);
} else {
vol = Min(m_asActiveSamples[j].m_nEmittingVolume + 10, sample.m_nEmittingVolume);
}
uint8 emittingVol;
if (m_bDoubleVolume) {
emittingVol = 2 * Min(63, vol);
} else {
emittingVol = vol;
}
SampleManager.SetChannelEmittingVolume(j, emittingVol);
m_asActiveSamples[j].m_nEmittingVolume = vol; m_asActiveSamples[j].m_nEmittingVolume = vol;
} }
#else #else
if (sample.m_nVolume != m_asActiveSamples[j].m_nVolume) { if (sample.m_nVolume != m_asActiveSamples[j].m_nVolume) {
if (sample.m_nVolume <= m_asActiveSamples[j].m_nVolume) { vol = Clamp2((int8)sample.m_nVolume, (int8)m_asActiveSamples[j].m_nVolume, 10);
vol = Max(m_asActiveSamples[j].m_nVolume - 10, sample.m_nVolume);
} else {
vol = Min(m_asActiveSamples[j].m_nVolume + 10, sample.m_nVolume);
}
m_asActiveSamples[j].m_nVolume = vol; m_asActiveSamples[j].m_nVolume = vol;
SampleManager.SetChannelVolume(j, m_bDoubleVolume ? 2 * Min(63, vol) : vol);
uint8 emittingVol;
if (m_bDoubleVolume) {
emittingVol = 2 * Min(63, vol);
} else {
emittingVol = vol;
}
SampleManager.SetChannelVolume(j, emittingVol);
} }
#endif #endif
TranslateEntity(&sample.m_vecPos, &position); TranslateEntity(&sample.m_vecPos, &position);
@ -958,11 +916,11 @@ cAudioManager::ProcessActiveQueues()
for (uint8 j = 0; j < m_nActiveSamples; ++j) { for (uint8 j = 0; j < m_nActiveSamples; ++j) {
if (!m_asActiveSamples[j].m_bIsProcessed) { if (!m_asActiveSamples[j].m_bIsProcessed) {
if (sample.m_nLoopCount) { if (sample.m_nLoopCount) {
v28 = sample.m_nFrequency / m_nTimeSpent; samplesPerFrame = sample.m_nFrequency / m_nTimeSpent;
v29 = sample.m_nLoopCount * SampleManager.GetSampleLength(sample.m_nSampleIndex); samplesToPlay = sample.m_nLoopCount * SampleManager.GetSampleLength(sample.m_nSampleIndex);
if (v28 == 0) if (samplesPerFrame == 0)
continue; continue;
sample.m_nReleasingVolumeDivider = v29 / v28 + 1; sample.m_nReleasingVolumeDivider = samplesToPlay / samplesPerFrame + 1;
} }
memcpy(&m_asActiveSamples[j], &sample, sizeof(tSound)); memcpy(&m_asActiveSamples[j], &sample, sizeof(tSound));
if (!m_asActiveSamples[j].m_bIs2D) { if (!m_asActiveSamples[j].m_bIs2D) {
@ -970,20 +928,11 @@ cAudioManager::ProcessActiveQueues()
#ifndef EXTERNAL_3D_SOUND #ifndef EXTERNAL_3D_SOUND
m_asActiveSamples[j].m_nOffset = ComputePan(m_asActiveSamples[j].m_fDistance, &position); m_asActiveSamples[j].m_nOffset = ComputePan(m_asActiveSamples[j].m_fDistance, &position);
#endif #endif
} }
#ifdef EXTERNAL_3D_SOUND #ifdef EXTERNAL_3D_SOUND
if (m_bDoubleVolume) { emittingVol = m_bDoubleVolume ? 2 * Min(63, m_asActiveSamples[j].m_nEmittingVolume) : m_asActiveSamples[j].m_nEmittingVolume;
emittingVol = 2 * Min(63, m_asActiveSamples[j].m_nEmittingVolume);
} else {
emittingVol = m_asActiveSamples[j].m_nEmittingVolume;
}
#else #else
if (m_bDoubleVolume) { emittingVol = m_bDoubleVolume ? 2 * Min(63, m_asActiveSamples[j].m_nVolume) : m_asActiveSamples[j].m_nVolume;
emittingVol = 2 * Min(63, m_asActiveSamples[j].m_nVolume);
} else {
emittingVol = m_asActiveSamples[j].m_nVolume;
}
#endif #endif
if (SampleManager.InitialiseChannel(j, m_asActiveSamples[j].m_nSampleIndex, m_asActiveSamples[j].m_nBankIndex)) { if (SampleManager.InitialiseChannel(j, m_asActiveSamples[j].m_nSampleIndex, m_asActiveSamples[j].m_nBankIndex)) {
SampleManager.SetChannelFrequency(j, m_asActiveSamples[j].m_nFrequency); SampleManager.SetChannelFrequency(j, m_asActiveSamples[j].m_nFrequency);
@ -999,13 +948,12 @@ cAudioManager::ProcessActiveQueues()
#ifdef EXTERNAL_3D_SOUND #ifdef EXTERNAL_3D_SOUND
if (m_asActiveSamples[j].m_bIs2D) { if (m_asActiveSamples[j].m_bIs2D) {
uint8 offset = m_asActiveSamples[j].m_nOffset; uint8 offset = m_asActiveSamples[j].m_nOffset;
if (offset == 63) { if (offset == 63)
x = 0.f; x = 0.f;
} else if (offset >= 63) { else if (offset >= 63)
x = (offset - 63) * 1000.f / 63; x = (offset - 63) * 1000.f / 63;
} else { else
x = -(63 - offset) * 1000.f / 63; x = -(63 - offset) * 1000.f / 63;
}
usedX = x; usedX = x;
usedY = 0.f; usedY = 0.f;
usedZ = 0.f; usedZ = 0.f;

View file

@ -292,6 +292,8 @@ extern wchar *AllocUnicode(const char*src);
#define Clamp(v, low, high) ((v)<(low) ? (low) : (v)>(high) ? (high) : (v)) #define Clamp(v, low, high) ((v)<(low) ? (low) : (v)>(high) ? (high) : (v))
#define Clamp2(v, center, radius) ((v) > (center) ? Min(v, center + radius) : Max(v, center - radius))
inline float sq(float x) { return x*x; } inline float sq(float x) { return x*x; }
#define SQR(x) ((x) * (x)) #define SQR(x) ((x) * (x))