[audio_core] Better biquad filter logic (#3235)
This removes all redundant code and improves the logic of the biquad filter. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3235 Reviewed-by: Maufeat <sahyno1996@gmail.com> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
This commit is contained in:
parent
2b4d13c205
commit
55646657e1
|
|
@ -275,7 +275,6 @@ void CommandBuffer::GenerateBiquadFilterCommand(const s32 node_id, EffectInfoBas
|
|||
const auto& parameter{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())};
|
||||
|
||||
if (parameter.state <= EffectInfoBase::ParameterState::Updated && IsChannelCountValid(parameter.channel_count) && channel >= 0 && channel < parameter.channel_count) {
|
||||
cmd.input = buffer_offset + parameter.inputs[channel];
|
||||
cmd.output = buffer_offset + parameter.outputs[channel];
|
||||
|
||||
|
|
@ -285,19 +284,16 @@ void CommandBuffer::GenerateBiquadFilterCommand(const s32 node_id, EffectInfoBas
|
|||
cmd.biquad.b[2] = ToQ14Clamped(parameter.b[2]);
|
||||
cmd.biquad.a[0] = ToQ14Clamped(parameter.a[0]);
|
||||
cmd.biquad.a[1] = ToQ14Clamped(parameter.a[1]);
|
||||
}
|
||||
} else {
|
||||
const auto& parameter{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
|
||||
|
||||
if (IsChannelCountValid(parameter.channel_count) && channel >= 0 && channel < parameter.channel_count) {
|
||||
cmd.input = buffer_offset + parameter.inputs[channel];
|
||||
cmd.output = buffer_offset + parameter.outputs[channel];
|
||||
|
||||
cmd.biquad.b = parameter.b;
|
||||
cmd.biquad.a = parameter.a;
|
||||
}
|
||||
}
|
||||
|
||||
// Effects always use the fixed-point coefficient path on the DSP.
|
||||
cmd.use_float_coefficients = false;
|
||||
|
|
|
|||
|
|
@ -370,29 +370,16 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset
|
|||
if (render_context.behavior->IsEffectInfoVersion2Supported()) {
|
||||
const auto* parameter =
|
||||
reinterpret_cast<const BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter());
|
||||
if (!parameter) {
|
||||
LOG_ERROR(Service_Audio, "Biquad filter parameter is null");
|
||||
return;
|
||||
}
|
||||
if (parameter->state <= EffectInfoBase::ParameterState::Updated) {
|
||||
param_state = parameter->state;
|
||||
channel_count = parameter->channel_count;
|
||||
}
|
||||
} else {
|
||||
const auto* parameter =
|
||||
reinterpret_cast<const BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter());
|
||||
if (!parameter) {
|
||||
LOG_ERROR(Service_Audio, "Biquad filter parameter is null");
|
||||
return;
|
||||
}
|
||||
param_state = parameter->state;
|
||||
channel_count = parameter->channel_count;
|
||||
}
|
||||
|
||||
if (channel_count <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (channel_count > 0 && param_state <= EffectInfoBase::ParameterState::Updated) {
|
||||
if (effect_info.IsEnabled()) {
|
||||
bool needs_init{false};
|
||||
|
||||
|
|
@ -401,18 +388,10 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset
|
|||
needs_init = true;
|
||||
break;
|
||||
case EffectInfoBase::ParameterState::Updating:
|
||||
case EffectInfoBase::ParameterState::Updated:
|
||||
if (render_context.behavior->IsBiquadFilterEffectStateClearBugFixed()) {
|
||||
needs_init = false;
|
||||
} else {
|
||||
needs_init = param_state == EffectInfoBase::ParameterState::Updating;
|
||||
}
|
||||
needs_init = !render_context.behavior->IsBiquadFilterEffectStateClearBugFixed();
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR(Service_Audio,
|
||||
"Invalid biquad parameter state {}, treating as uninitialized",
|
||||
static_cast<u32>(param_state));
|
||||
needs_init = true;
|
||||
case EffectInfoBase::ParameterState::Updated:
|
||||
needs_init = false;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -430,6 +409,7 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CommandGenerator::GenerateLightLimiterEffectCommand(const s16 buffer_offset,
|
||||
EffectInfoBase& effect_info,
|
||||
|
|
|
|||
Loading…
Reference in New Issue