diff --git a/src/audio_core/renderer/command/command_buffer.cpp b/src/audio_core/renderer/command/command_buffer.cpp index a0a574fc64..792149f3d2 100644 --- a/src/audio_core/renderer/command/command_buffer.cpp +++ b/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(node_id)}; + const auto& parameter_v2{ + *reinterpret_cast(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( + 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(cmd); + return; + } + auto& cmd{GenerateStart(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(node_id)}; + if (behavior->IsEffectInfoVersion2Supported()) { + const auto& parameter_v2{ + *reinterpret_cast(effect_info.GetParameter())}; + cmd.input_index = buffer_offset + parameter_v2.inputs[channel]; + cmd.output_index = buffer_offset + parameter_v2.outputs[channel]; + GenerateEnd(cmd); + return; + } + const auto& parameter{ *reinterpret_cast(effect_info.GetParameter())}; cmd.input_index = buffer_offset + parameter.inputs[channel]; diff --git a/src/audio_core/renderer/command/command_generator.cpp b/src/audio_core/renderer/command/command_generator.cpp index f97db5899e..1a699a91ca 100644 --- a/src/audio_core/renderer/command/command_generator.cpp +++ b/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(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(effect_info.GetParameter())}; if (effect_info.IsEnabled()) { diff --git a/src/audio_core/renderer/effect/biquad_filter.h b/src/audio_core/renderer/effect/biquad_filter.h index 5a22899abd..382c0c766a 100644 --- a/src/audio_core/renderer/effect/biquad_filter.h +++ b/src/audio_core/renderer/effect/biquad_filter.h @@ -25,12 +25,12 @@ public: "BiquadFilterInfo::ParameterVersion1 has the wrong size!"); struct ParameterVersion2 { - /* 0x00 */ std::array inputs; - /* 0x06 */ std::array outputs; - /* 0x0C */ std::array b; - /* 0x12 */ std::array a; - /* 0x16 */ s8 channel_count; - /* 0x17 */ ParameterState state; + bool enable; + s8 channel_count; + s8 inputs[MaxChannels]; + s8 outputs[MaxChannels]; + std::array b; + std::array a; }; static_assert(sizeof(ParameterVersion2) <= sizeof(EffectInfoBase::InParameterVersion2), "BiquadFilterInfo::ParameterVersion2 has the wrong size!");