From b95c4d2d5d0cce6cc266027b6661020e9e5a2256 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Mon, 29 Dec 2025 20:24:57 +0100 Subject: [PATCH] [audio_core] Fix broken biquad effect (#3225) This fixes the broken biquad effect. Thanks to Forrest Mark X for showing us where the problem was occurring in the code. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3225 Reviewed-by: Maufeat Reviewed-by: DraVee Co-authored-by: MaranBr Co-committed-by: MaranBr --- .../renderer/command/command_buffer.cpp | 40 +++++++++---------- .../renderer/command/command_generator.cpp | 6 ++- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/audio_core/renderer/command/command_buffer.cpp b/src/audio_core/renderer/command/command_buffer.cpp index 804aba438d..66f78f26b4 100644 --- a/src/audio_core/renderer/command/command_buffer.cpp +++ b/src/audio_core/renderer/command/command_buffer.cpp @@ -272,35 +272,31 @@ void CommandBuffer::GenerateBiquadFilterCommand(const s32 node_id, EffectInfoBas effect_info.GetStateBuffer() + channel * sizeof(VoiceState::BiquadFilterState))}; if (behavior->IsEffectInfoVersion2Supported()) { - const auto& p{ + const auto& parameter{ *reinterpret_cast(effect_info.GetParameter())}; - if (!IsChannelCountValid(p.channel_count) || channel < 0 || channel >= p.channel_count) { - return; - } - - cmd.input = buffer_offset + p.inputs[channel]; - cmd.output = buffer_offset + p.outputs[channel]; + 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]; - // Convert float coefficients to Q2.14 fixed-point as expected by the legacy DSP path. - cmd.biquad.b[0] = ToQ14Clamped(p.b[0]); - cmd.biquad.b[1] = ToQ14Clamped(p.b[1]); - cmd.biquad.b[2] = ToQ14Clamped(p.b[2]); - cmd.biquad.a[0] = ToQ14Clamped(p.a[0]); - cmd.biquad.a[1] = ToQ14Clamped(p.a[1]); + // Convert float coefficients to Q2.14 fixed-point as expected by the legacy DSP path. + cmd.biquad.b[0] = ToQ14Clamped(parameter.b[0]); + cmd.biquad.b[1] = ToQ14Clamped(parameter.b[1]); + 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& p{ + const auto& parameter{ *reinterpret_cast(effect_info.GetParameter())}; - if (!IsChannelCountValid(p.channel_count) || channel < 0 || channel >= p.channel_count) { - return; - } - - cmd.input = buffer_offset + p.inputs[channel]; - cmd.output = buffer_offset + p.outputs[channel]; + 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 = p.b; - cmd.biquad.a = p.a; + cmd.biquad.b = parameter.b; + cmd.biquad.a = parameter.a; + } } // Effects always use the fixed-point coefficient path on the DSP. diff --git a/src/audio_core/renderer/command/command_generator.cpp b/src/audio_core/renderer/command/command_generator.cpp index bec6abbaf9..29d7c11d16 100644 --- a/src/audio_core/renderer/command/command_generator.cpp +++ b/src/audio_core/renderer/command/command_generator.cpp @@ -374,8 +374,10 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset LOG_ERROR(Service_Audio, "Biquad filter parameter is null"); return; } - param_state = parameter->state; - channel_count = parameter->channel_count; + if (parameter->state <= EffectInfoBase::ParameterState::Updated) { + param_state = parameter->state; + channel_count = parameter->channel_count; + } } else { const auto* parameter = reinterpret_cast(effect_info.GetParameter());