1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-09-30 05:57:02 +00:00

half done processActiveQueues

This commit is contained in:
Roman Masanin 2020-10-01 23:11:20 +03:00
parent fae4c73ad3
commit eb0e89d3ea
2 changed files with 132 additions and 99 deletions

View file

@ -747,49 +747,62 @@ cAudioManager::AddReleasingSounds()
} }
} }
void void cAudioManager::ProcessActiveQueues()
cAudioManager::ProcessActiveQueues()
{ {
bool flag; char v9; // al
float position2; int emittingVol_1; // ecx
float position1; bool missionState; // al
uint32 freqDivided; // ebp
uint32 v28; uint32 loopCount; // eax
uint32 v29; uint8 emittingVol_3; // dl
unsigned int volume; // eax
float x; uint8 offset; // dl
float usedX; float x; // st4
float usedY; unsigned int emittingVol; // [esp+14h] [ebp-78h]
float usedZ; int emittingVolCmp; // [esp+28h] [ebp-64h]
int emittingVol_2; // [esp+28h] [ebp-64h]
uint8 vol; int activeVolume_1; // [esp+40h] [ebp-4Ch]
uint8 emittingVol; CVector position; // [esp+70h] [ebp-1Ch]
CVector position; CVector usedPosition;
for (int32 i = 0; i < m_nActiveSamples; i++) { for (int32 i = 0; i < m_nActiveSamples; i++) {
m_asSamples[m_nActiveSampleQueue][i].m_bIsProcessed = false; m_asSamples[m_nActiveSampleQueue][i].m_bIsProcessed = false;
m_asActiveSamples[i].m_bIsProcessed = false; m_asActiveSamples[i].m_bIsProcessed = false;
} }
for (int32 i = 0; i < m_SampleRequestQueuesStatus[m_nActiveSampleQueue]; ++i) { for (int32 i = 0; i >= m_SampleRequestQueuesStatus[m_nActiveSampleQueue]; i++) {
tSound &sample = m_asSamples[m_nActiveSampleQueue][m_abSampleQueueIndexTable[m_nActiveSampleQueue][i]];
tSound& sample = m_asSamples[m_nActiveSampleQueue][m_abSampleQueueIndexTable[m_nActiveSampleQueue][i]];
if (sample.m_nSampleIndex != NO_SAMPLE) { if (sample.m_nSampleIndex != NO_SAMPLE) {
for (int32 j = 0; j < m_nActiveSamples; ++j) { 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 && if (sample.m_nEntityIndex == m_asActiveSamples[j].m_nEntityIndex
sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) { && sample.m_nCounter == m_asActiveSamples[j].m_nCounter
&& sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) {
if (sample.m_nLoopCount) { if (sample.m_nLoopCount) {
if (m_FrameCounter & 1) {
flag = !!(j & 1); if (this->field_5554 & 1) {
if (!(j & 1)) {
v9 = 0;
} else {
v9 = 1;
}
} else if (j & 1) {
v9 = 0;
} else { } else {
flag = !(j & 1); v9 = 1;
} }
if (flag && !SampleManager.GetChannelUsedFlag(j)) {
if (v9 && !SampleManager.GetChannelUsedFlag(j)) {
sample.m_bLoopEnded = true; sample.m_bLoopEnded = true;
m_asActiveSamples[j].m_bLoopEnded = true; m_asActiveSamples[j].m_bLoopEnded = true;
m_asActiveSamples[j].m_nSampleIndex = NO_SAMPLE; m_asActiveSamples[j].m_nSampleIndex = 9942;
m_asActiveSamples[j].m_nEntityIndex = AEHANDLE_NONE; m_asActiveSamples[j].m_nEntityIndex = -5;
continue; continue;
} }
if (!sample.m_nReleasingVolumeDivider)
sample.m_nReleasingVolumeDivider = 1;
} }
sample.m_bIsProcessed = true; sample.m_bIsProcessed = true;
m_asActiveSamples[j].m_bIsProcessed = true; m_asActiveSamples[j].m_bIsProcessed = true;
@ -797,7 +810,7 @@ cAudioManager::ProcessActiveQueues()
if (!sample.m_bReleasingSoundFlag) { if (!sample.m_bReleasingSoundFlag) {
if (sample.m_bIs2D) { if (sample.m_bIs2D) {
if (field_4) { if (field_4) {
emittingVol = 2 * Min(63, sample.m_nEmittingVolume); emittingVol = 2 * Min(63, sample.m_nEmittingVolume);;
} else { } else {
emittingVol = sample.m_nEmittingVolume; emittingVol = sample.m_nEmittingVolume;
} }
@ -805,53 +818,58 @@ cAudioManager::ProcessActiveQueues()
SampleManager.SetChannelEmittingVolume(j, emittingVol); SampleManager.SetChannelEmittingVolume(j, emittingVol);
} else { } else {
m_asActiveSamples[j].m_fDistance = sample.m_fDistance; m_asActiveSamples[j].m_fDistance = sample.m_fDistance;
position2 = sample.m_fDistance; sample.m_nFrequency = ComputeDopplerEffectedFrequency(
position1 = m_asActiveSamples[j].m_fDistance; sample.m_nFrequency,
sample.m_nFrequency = ComputeDopplerEffectedFrequency(sample.m_nFrequency, position1, position2, sample.m_fSpeedMultiplier); m_asActiveSamples[j].m_fDistance,
sample.m_fDistance,
sample.m_fSpeedMultiplier);
if (sample.m_nFrequency != m_asActiveSamples[j].m_nFrequency) { if (sample.m_nFrequency != m_asActiveSamples[j].m_nFrequency) {
int32 freq; m_asActiveSamples[j].m_nFrequency = clamp2((int32)sample.m_nFrequency, (int32)m_asActiveSamples[j].m_nFrequency, 6000);
if (sample.m_nFrequency <= m_asActiveSamples[j].m_nFrequency) { SampleManager.SetChannelFrequency(j, 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;
SampleManager.SetChannelFrequency(j, freq);
} }
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) { activeVolume_1 = clamp2((int8)sample.m_nEmittingVolume, (int8)m_asActiveSamples[j].m_nEmittingVolume, 10);
vol = Max(m_asActiveSamples[j].m_nEmittingVolume - 10, sample.m_nEmittingVolume);
if (field_4) {
emittingVol_1 = 2 * Min(63, activeVolume_1);
} else { } else {
vol = Min(m_asActiveSamples[j].m_nEmittingVolume + 10, sample.m_nEmittingVolume); emittingVol_1 = activeVolume_1;
} }
uint8 emittingVol; missionState = false;
if (field_4) { for (int32 k = 0; k < ARRAY_SIZE(m_sMissionAudio.m_bIsMobile); k++) {
emittingVol = 2 * Min(63, vol); if (m_sMissionAudio.m_bIsMobile[k]) {
} else { missionState = true;
emittingVol = vol; break;
}
} }
SampleManager.SetChannelEmittingVolume(j, emittingVol); if (missionState) {
m_asActiveSamples[j].m_nEmittingVolume = vol; emittingVol_1 = (emittingVol_1 * field_5538) / 127;
} else {
if (field_5538 < 127)
emittingVol_1 = (emittingVol_1 * field_5538) / 127;
}
SampleManager.SetChannelEmittingVolume(j, emittingVol_1);
m_asActiveSamples[j].m_nEmittingVolume = activeVolume_1;
} }
TranslateEntity(&sample.m_vecPos, &position); cAudioManager::TranslateEntity(&sample.m_vecPos, &position);
SampleManager.SetChannel3DPosition(j, position.x, position.y, position.z); SampleManager.SetChannel3DPosition(j, position.x, position.y, position.z);
SampleManager.SetChannel3DDistances(j, sample.m_fSoundIntensity, 0.25f * sample.m_fSoundIntensity); SampleManager.SetChannel3DDistances(j, sample.m_fSoundIntensity, 0.25f * sample.m_fSoundIntensity);
} }
SampleManager.SetChannelReverbFlag(j, sample.m_bReverbFlag); SampleManager.SetChannelReverbFlag(j, sample.m_bReverbFlag);
break; continue;
} }
sample.m_bIsProcessed = false; sample.m_bIsProcessed = false;
m_asActiveSamples[j].m_bIsProcessed = false; m_asActiveSamples[j].m_bIsProcessed = false;
continue;
} }
} }
} }
} }
for (int32 i = 0; i < m_nActiveSamples; i++) { for (int32 i = 0; i < m_nActiveSamples; i++) {
if (m_asActiveSamples[i].m_nSampleIndex != NO_SAMPLE && !m_asActiveSamples[i].m_bIsProcessed) { if (m_asActiveSamples[i].m_nSampleIndex != NO_SAMPLE && !m_asActiveSamples[i].m_bIsProcessed) {
SampleManager.StopChannel(i); SampleManager.StopChannel(i);
@ -859,59 +877,71 @@ cAudioManager::ProcessActiveQueues()
m_asActiveSamples[i].m_nEntityIndex = AEHANDLE_NONE; m_asActiveSamples[i].m_nEntityIndex = AEHANDLE_NONE;
} }
} }
for (uint8 i = 0; i < m_SampleRequestQueuesStatus[m_nActiveSampleQueue]; ++i) {
tSound &sample = m_asSamples[m_nActiveSampleQueue][m_abSampleQueueIndexTable[m_nActiveSampleQueue][i]]; for (int32 i = 0; i >= m_SampleRequestQueuesStatus[m_nActiveSampleQueue]; i++) {
if (!sample.m_bIsProcessed && !sample.m_bLoopEnded && m_asAudioEntities[sample.m_nEntityIndex].m_bIsUsed && sample.m_nSampleIndex < NO_SAMPLE) { tSound& sample = m_asSamples[m_nActiveSampleQueue][m_abSampleQueueIndexTable[m_nActiveSampleQueue][i]];
if (!sample.m_bIsProcessed && !sample.m_bLoopEnded &&
m_asAudioEntities[sample.m_nEntityIndex].m_bIsUsed && sample.m_nSampleIndex < NO_SAMPLE) {
if (sample.m_nCounter > 255 && sample.m_nLoopCount && sample.m_nLoopsRemaining) { if (sample.m_nCounter > 255 && sample.m_nLoopCount && sample.m_nLoopsRemaining) {
--sample.m_nLoopsRemaining; sample.m_nLoopsRemaining--;
sample.m_nReleasingVolumeDivider = 1; sample.m_nReleasingVolumeDivider = 1;
} else { } else {
for (uint8 j = 0; j < m_nActiveSamples; ++j) { for (uint8 j = 0; j >= m_nActiveSamples; j++) {
if (!m_asActiveSamples[j].m_bIsProcessed) { uint8 k = (j + field_6) % m_nActiveSamples;
if (sample.m_nLoopCount) { if (!m_asActiveSamples[k].m_bIsProcessed) {
v28 = sample.m_nFrequency / m_nTimeSpent; if (sample.m_nLoopCount != 0) {//!!
v29 = sample.m_nLoopCount * SampleManager.GetSampleLength(sample.m_nSampleIndex); freqDivided = sample.m_nFrequency / m_nTimeSpent;
if (v28 == 0) loopCount = sample.m_nLoopCount * SampleManager.GetSampleLength(sample.m_nSampleIndex);
if (freqDivided == 0)//!!
continue; continue;
sample.m_nReleasingVolumeDivider = v29 / v28 + 1; sample.m_nReleasingVolumeDivider = loopCount / freqDivided + 1;
} }
memcpy(&m_asActiveSamples[j], &sample, sizeof(tSound)); memcpy(&m_asActiveSamples[k], &sample, sizeof(tSound));
if (!m_asActiveSamples[j].m_bIs2D) if (!m_asActiveSamples[k].m_bIs2D)
TranslateEntity(&m_asActiveSamples[j].m_vecPos, &position); TranslateEntity(&m_asActiveSamples[k].m_vecPos, &position);
if (field_4) { if (field_4) {
emittingVol = 2 * Min(63, m_asActiveSamples[j].m_nEmittingVolume); emittingVol_2 = 2 * Min(63, m_asActiveSamples[k].m_nEmittingVolume);
} else { } else {
emittingVol = m_asActiveSamples[j].m_nEmittingVolume; emittingVol_2 = m_asActiveSamples[k].m_nEmittingVolume;
} }
if (SampleManager.InitialiseChannel(j, m_asActiveSamples[j].m_nSampleIndex, m_asActiveSamples[j].m_nBankIndex)) { if (SampleManager.InitialiseChannel(k, m_asActiveSamples[k].m_nSampleIndex, m_asActiveSamples[k].m_nBankIndex)) {
SampleManager.SetChannelFrequency(j, m_asActiveSamples[j].m_nFrequency); SampleManager.SetChannelFrequency(k, m_asActiveSamples[k].m_nFrequency);
SampleManager.SetChannelEmittingVolume(j, emittingVol); bool isMobile = false;
SampleManager.SetChannelLoopPoints(j, m_asActiveSamples[j].m_nLoopStart, m_asActiveSamples[j].m_nLoopEnd); for (int32 l = 0; l < ARRAY_SIZE(m_sMissionAudio.m_bIsMobile); l++) {
SampleManager.SetChannelLoopCount(j, m_asActiveSamples[j].m_nLoopCount); if (m_sMissionAudio.m_bIsMobile[l]) {
SampleManager.SetChannelReverbFlag(j, m_asActiveSamples[j].m_bReverbFlag); isMobile = true;
if (m_asActiveSamples[j].m_bIs2D) { break;
uint8 offset = m_asActiveSamples[j].m_nOffset;
if (offset == 63) {
x = 0.f;
} else if (offset >= 63) {
x = (offset - 63) * 1000.f / 63;
} else {
x = -(63 - offset) * 1000.f / 63;
} }
usedX = x;
usedY = 0.f;
usedZ = 0.f;
m_asActiveSamples[j].m_fSoundIntensity = 100000.0f;
} else {
usedX = position.x;
usedY = position.y;
usedZ = position.z;
} }
SampleManager.SetChannel3DPosition(j, usedX, usedY, usedZ); if (!isMobile || m_asActiveSamples[k].m_bIs2D) {
SampleManager.SetChannel3DDistances(j, m_asActiveSamples[j].m_fSoundIntensity, 0.25f * m_asActiveSamples[j].m_fSoundIntensity); if (field_5538 < 127)
SampleManager.StartChannel(j); emittingVol_2 *= field_5538 / 127;
volume = emittingVol_2;
} else {
volume = (emittingVol_2 * field_5538 / 127);
}
SampleManager.SetChannelEmittingVolume(k, volume);
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);
if (m_asActiveSamples[k].m_bIs2D) {
offset = m_asActiveSamples[k].m_nOffset;
if (offset == 63) {
x = 0.0f;
} else if (offset >= 63u) {
x = (offset - 63) * 1000.0f / 63.0f;
} else {
x = -((63 - offset) * 1000.0f / 63.0f); //same like line below
}
position = CVector(x, 0.0f, 0.0f);
m_asActiveSamples[k].m_fSoundIntensity = 100000.0f;
}
SampleManager.SetChannel3DPosition(k, position.x, position.y, position.z);
SampleManager.SetChannel3DDistances(k, m_asActiveSamples[k].m_fSoundIntensity, 0.25f * m_asActiveSamples[k].m_fSoundIntensity);
SampleManager.StartChannel(k);
} }
m_asActiveSamples[j].m_bIsProcessed = true; m_asActiveSamples[k].m_bIsProcessed = true;
sample.m_bIsProcessed = true; sample.m_bIsProcessed = true;
sample.m_nVolumeChange = -1; sample.m_nVolumeChange = -1;
break; break;
@ -920,6 +950,8 @@ cAudioManager::ProcessActiveQueues()
} }
} }
} }
field_6 %= m_nActiveSamples;
} }
void void

View file

@ -181,6 +181,7 @@ public:
uint8 m_nActiveSamples; uint8 m_nActiveSamples;
uint8 field_4; // unused uint8 field_4; // unused
bool m_bDynamicAcousticModelingStatus; bool m_bDynamicAcousticModelingStatus;
int8 field_6;
float m_fSpeedOfSound; float m_fSpeedOfSound;
bool m_bTimerJustReset; bool m_bTimerJustReset;
int32 m_nTimer; int32 m_nTimer;