aboutsummaryrefslogtreecommitdiff
path: root/src/audio_core/renderer/command
diff options
context:
space:
mode:
authorMaranBr <maranbr@outlook.com>2025-12-29 20:24:57 +0100
committercrueter <crueter@eden-emu.dev>2025-12-29 20:24:57 +0100
commitb95c4d2d5d0cce6cc266027b6661020e9e5a2256 (patch)
tree2a75c7b1843597c38bae700c131a1e67f29f0d7b /src/audio_core/renderer/command
parentd76edfc683d147ea03a6ec6d5cf93c183630e7bc (diff)
[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 <sahyno1996@gmail.com> Reviewed-by: DraVee <dravee@eden-emu.dev> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
Diffstat (limited to 'src/audio_core/renderer/command')
-rw-r--r--src/audio_core/renderer/command/command_buffer.cpp40
-rw-r--r--src/audio_core/renderer/command/command_generator.cpp6
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<BiquadFilterInfo::ParameterVersion2*>(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<BiquadFilterInfo::ParameterVersion1*>(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<const BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter());