Browse Source

[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>
pull/3227/head
MaranBr 3 days ago
committed by crueter
parent
commit
b95c4d2d5d
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 40
      src/audio_core/renderer/command/command_buffer.cpp
  2. 6
      src/audio_core/renderer/command/command_generator.cpp

40
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))}; effect_info.GetStateBuffer() + channel * sizeof(VoiceState::BiquadFilterState))};
if (behavior->IsEffectInfoVersion2Supported()) { if (behavior->IsEffectInfoVersion2Supported()) {
const auto& p{
const auto& parameter{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())}; *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 { } else {
const auto& p{
const auto& parameter{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())}; *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. // Effects always use the fixed-point coefficient path on the DSP.

6
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"); LOG_ERROR(Service_Audio, "Biquad filter parameter is null");
return; 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 { } else {
const auto* parameter = const auto* parameter =
reinterpret_cast<const BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter()); reinterpret_cast<const BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter());

Loading…
Cancel
Save