More structure

This commit is contained in:
robojumper
2025-06-04 10:27:56 +02:00
parent 4e75ae59f5
commit 87cbf6f409
6 changed files with 160 additions and 35 deletions
+2 -2
View File
@@ -16,12 +16,12 @@ void dSndControlPlayer_c::reset() {
apply();
}
void dSndControlPlayer_c::setIndex1(s32 idx) {
void dSndControlPlayer_c::setIndex1(u32 idx) {
mpPlayer = dSndControlPlayerMgr_c::GetInstance()->getPlayer1(idx);
mIndex = idx;
}
void dSndControlPlayer_c::setIndex2(s32 idx) {
void dSndControlPlayer_c::setIndex2(u32 idx) {
mpPlayer = dSndControlPlayerMgr_c::GetInstance()->getPlayer2(idx);
mIndex = idx;
}
+100 -10
View File
@@ -6,7 +6,7 @@
template class SndMgrDisposer<dSndControlPlayerMgr_c>;
dSndControlPlayerMgr_c::dSndControlPlayerMgr_c() : mControlMask(0) {
dSndControlPlayerMgr_c::dSndControlPlayerMgr_c() : mOverrideVolumeMask(0) {
// TODO offsetof
nw4r::ut::List_Init(&mActiveControls, 0x24);
@@ -14,10 +14,10 @@ dSndControlPlayerMgr_c::dSndControlPlayerMgr_c() : mControlMask(0) {
mpCtrls[CTRL_LPF_FREQ] = new dSndControlPlayerLpfFreq_c[sNumPlayers]();
mpCtrls[CTRL_FX_SEND] = new dSndControlPlayerFxSend_c[sNumPlayers]();
field_0x28 = new f32[sNumPlayers];
field_0x1C = new f32[sNumPlayers];
field_0x20 = new f32[sNumPlayers];
field_0x24 = new f32[sNumPlayers];
mpSavedVolumes = new f32[sNumPlayers];
mpTargetVolumes = new f32[sNumPlayers];
mpMaxVolumeDecreases = new f32[sNumPlayers];
mpMaxVolumeIncreases = new f32[sNumPlayers];
}
void dSndControlPlayerMgr_c::calc() {}
@@ -36,10 +36,40 @@ void dSndControlPlayerMgr_c::executeControls() {
}
}
void dSndControlPlayerMgr_c::calcVolumes() {
for (int i = 0; i < sNumPlayers; i++) {
if ((mOverrideVolumeMask & (1 << i)) != 0) {
// overridden volume
mpTargetVolumes[i] = mpSavedVolumes[i];
} else {
// not overridden. The effect of this is that
// something will set the targetValue to a specific value
f32 currentVolume = getAppliedPlayerVolume(i);
f32 targetVolume = mpTargetVolumes[i];
f32 maxVolumeDecrease = mpMaxVolumeDecreases[i];
f32 maxVolumeIncrease = mpMaxVolumeDecreases[i];
if (currentVolume != targetVolume) {
if (currentVolume - targetVolume > maxVolumeDecrease) {
targetVolume = currentVolume - maxVolumeDecrease;
} else if (targetVolume - currentVolume > maxVolumeIncrease) {
targetVolume = currentVolume + maxVolumeIncrease;
}
// @bug not actually clamped
nw4r::ut::Clamp(targetVolume, 0.0f, 2.0f);
setVolume(i, targetVolume, 0);
}
mpTargetVolumes[i] = 1.0f;
mpMaxVolumeDecreases[i] = 0.1f;
mpMaxVolumeDecreases[i] = 0.025f;
}
}
}
void dSndControlPlayerMgr_c::linkCtrl(dSndControlPlayer_c *ctrl) {
if (ctrl == nullptr) {
return;
}
}
if (ctrl->isLinked()) {
return;
}
@@ -50,7 +80,7 @@ void dSndControlPlayerMgr_c::linkCtrl(dSndControlPlayer_c *ctrl) {
void dSndControlPlayerMgr_c::unlinkCtrl(dSndControlPlayer_c *ctrl) {
if (ctrl == nullptr) {
return;
}
}
if (!ctrl->isLinked()) {
return;
}
@@ -58,6 +88,47 @@ void dSndControlPlayerMgr_c::unlinkCtrl(dSndControlPlayer_c *ctrl) {
nw4r::ut::List_Remove(&mActiveControls, ctrl);
}
void dSndControlPlayerMgr_c::setVolume(u32 playerIdx, f32 value, s32 frames) {
if (playerIdx >= sNumPlayers) {
return;
}
u32 mask = (1 << playerIdx);
if ((mOverrideVolumeMask & mask) != 0) {
// Volume is overridden, set saved volume as to not interrupt override
mpSavedVolumes[playerIdx] = value;
} else {
// Volume is not overridden, set volume normally
setControlValue(CTRL_VOLUME, playerIdx, value, frames);
mpSavedVolumes[playerIdx] = getControlVolumeTarget(CTRL_VOLUME, playerIdx);
}
}
void dSndControlPlayerMgr_c::overrideVolume(u32 playerIdx, f32 volume, s32 frames) {
if (playerIdx >= sNumPlayers) {
return;
}
u32 mask = (1 << playerIdx);
if ((mOverrideVolumeMask & mask) == 0) {
mpSavedVolumes[playerIdx] = getControlVolumeTarget(CTRL_VOLUME, playerIdx);
mOverrideVolumeMask |= mask;
}
setControlValue(CTRL_VOLUME, playerIdx, volume, frames);
}
void dSndControlPlayerMgr_c::restoreVolume(u32 playerIdx, s32 frames) {
if (playerIdx >= sNumPlayers) {
return;
}
u32 mask = (1 << playerIdx);
if ((mOverrideVolumeMask & mask) == 0) {
return;
}
mOverrideVolumeMask &= ~mask;
setControlValue(CTRL_VOLUME, playerIdx, mpSavedVolumes[playerIdx], frames);
}
void dSndControlPlayerMgr_c::setLpfFreq(u32 playerIdx, f32 value, s32 frames) {
if (playerIdx < sNumPlayers) {
setControlValue(CTRL_LPF_FREQ, playerIdx, value, frames);
@@ -88,12 +159,19 @@ void dSndControlPlayerMgr_c::resetControls() {
for (s32 ty = 0; ty < CTRL_MAX; ty++) {
mpCtrls[ty][i].reset();
}
field_0x28[i] = 1.0f;
mpSavedVolumes[i] = 1.0f;
}
mControlMask = 0;
mOverrideVolumeMask = 0;
}
f32 dSndControlPlayerMgr_c::getTargetValue(PlayerCtrl_e ctrlType, u32 playerIdx) const {
f32 dSndControlPlayerMgr_c::getAppliedPlayerVolume(u32 playerIdx) const {
if (playerIdx >= sNumPlayers) {
return 0.0f;
}
return getPlayer1(playerIdx)->GetVolume();
}
f32 dSndControlPlayerMgr_c::getControlVolumeTarget(PlayerCtrl_e ctrlType, u32 playerIdx) const {
if (ctrlType >= CTRL_MAX) {
return 1.0f;
}
@@ -102,3 +180,15 @@ f32 dSndControlPlayerMgr_c::getTargetValue(PlayerCtrl_e ctrlType, u32 playerIdx)
}
return mpCtrls[ctrlType][playerIdx].getTargetValue();
}
void dSndControlPlayerMgr_c::setShortParameterTo5(s32 idx1, s32 idx2) {
if (idx1 >= 4) {
return;
}
if (idx2 >= 2) {
return;
}
field_0x3C[idx1][idx2] = 5;
}