Browse Source

correct biquad filter v2 parameters

pull/3142/head
Maufeat 3 weeks ago
parent
commit
f42a8c85fe
  1. 38
      src/audio_core/renderer/command/command_buffer.cpp
  2. 20
      src/audio_core/renderer/command/command_generator.cpp
  3. 12
      src/audio_core/renderer/effect/biquad_filter.h

38
src/audio_core/renderer/command/command_buffer.cpp

@ -257,6 +257,35 @@ void CommandBuffer::GenerateBiquadFilterCommand(const s32 node_id, EffectInfoBas
const s16 buffer_offset, const s8 channel,
const bool needs_init,
const bool use_float_processing) {
if (behavior->IsEffectInfoVersion2Supported()) {
auto& cmd{GenerateStart<BiquadFilterCommand, CommandId::BiquadFilter>(node_id)};
const auto& parameter_v2{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())};
if (!IsChannelCountValid(parameter_v2.channel_count) || channel < 0 ||
channel >= parameter_v2.channel_count) {
return;
}
if (!parameter_v2.enable) {
// Effect disabled at parameter level: copy input -> output for this channel
GenerateCopyMixBufferCommand(node_id, effect_info, buffer_offset, channel);
return;
}
const auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(
effect_info.GetStateBuffer() + channel * sizeof(VoiceState::BiquadFilterState))};
cmd.input = buffer_offset + parameter_v2.inputs[channel];
cmd.output = buffer_offset + parameter_v2.outputs[channel];
cmd.biquad_float.numerator = parameter_v2.b;
cmd.biquad_float.denominator = parameter_v2.a;
cmd.use_float_coefficients = true;
cmd.state = memory_pool->Translate(CpuAddr(state), sizeof(VoiceState::BiquadFilterState));
cmd.needs_init = needs_init;
cmd.use_float_processing = use_float_processing;
GenerateEnd<BiquadFilterCommand>(cmd);
return;
}
auto& cmd{GenerateStart<BiquadFilterCommand, CommandId::BiquadFilter>(node_id)};
const auto& parameter{
@ -595,6 +624,15 @@ void CommandBuffer::GenerateCopyMixBufferCommand(const s32 node_id, EffectInfoBa
const s16 buffer_offset, const s8 channel) {
auto& cmd{GenerateStart<CopyMixBufferCommand, CommandId::CopyMixBuffer>(node_id)};
if (behavior->IsEffectInfoVersion2Supported()) {
const auto& parameter_v2{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())};
cmd.input_index = buffer_offset + parameter_v2.inputs[channel];
cmd.output_index = buffer_offset + parameter_v2.outputs[channel];
GenerateEnd<CopyMixBufferCommand>(cmd);
return;
}
const auto& parameter{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
cmd.input_index = buffer_offset + parameter.inputs[channel];

20
src/audio_core/renderer/command/command_generator.cpp

@ -361,6 +361,26 @@ void CommandGenerator::GenerateAuxCommand(const s16 buffer_offset, EffectInfoBas
void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset,
EffectInfoBase& effect_info,
const s32 node_id) {
if (render_context.behavior->IsEffectInfoVersion2Supported()) {
const auto& parameter_v2{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())};
const bool needs_init = false;
const bool use_float_processing = render_context.behavior->UseBiquadFilterFloatProcessing();
const s8 channels = parameter_v2.channel_count > 0 ? parameter_v2.channel_count : 2;
if (effect_info.IsEnabled()) {
for (s8 channel = 0; channel < channels; channel++) {
command_buffer.GenerateBiquadFilterCommand(
node_id, effect_info, buffer_offset, channel, needs_init, use_float_processing);
}
} else {
for (s8 channel = 0; channel < channels; channel++) {
command_buffer.GenerateCopyMixBufferCommand(node_id, effect_info, buffer_offset,
channel);
}
}
return;
}
const auto& parameter{
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
if (effect_info.IsEnabled()) {

12
src/audio_core/renderer/effect/biquad_filter.h

@ -25,12 +25,12 @@ public:
"BiquadFilterInfo::ParameterVersion1 has the wrong size!");
struct ParameterVersion2 {
/* 0x00 */ std::array<s8, MaxChannels> inputs;
/* 0x06 */ std::array<s8, MaxChannels> outputs;
/* 0x0C */ std::array<s16, 3> b;
/* 0x12 */ std::array<s16, 2> a;
/* 0x16 */ s8 channel_count;
/* 0x17 */ ParameterState state;
bool enable;
s8 channel_count;
s8 inputs[MaxChannels];
s8 outputs[MaxChannels];
std::array<f32, 3> b;
std::array<f32, 2> a;
};
static_assert(sizeof(ParameterVersion2) <= sizeof(EffectInfoBase::InParameterVersion2),
"BiquadFilterInfo::ParameterVersion2 has the wrong size!");

Loading…
Cancel
Save