Update BiquadFilterState size + other fixes

This commit is contained in:
Gabriel A 2024-05-15 22:21:21 -03:00
commit 98d83ac4ce
4 changed files with 21 additions and 17 deletions

View file

@ -15,7 +15,6 @@ namespace Ryujinx.Audio.Renderer.Common
{ {
public const int Align = 0x10; public const int Align = 0x10;
public const int BiquadStateOffset = 0x0; public const int BiquadStateOffset = 0x0;
public const int BiquadStateSize = 0x10;
/// <summary> /// <summary>
/// The state of the biquad filters of this voice. /// The state of the biquad filters of this voice.

View file

@ -2,12 +2,16 @@ using System.Runtime.InteropServices;
namespace Ryujinx.Audio.Renderer.Dsp.State namespace Ryujinx.Audio.Renderer.Dsp.State
{ {
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x10)] [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x20)]
public struct BiquadFilterState public struct BiquadFilterState
{ {
public float State0; public float State0;
public float State1; public float State1;
public float State2; public float State2;
public float State3; public float State3;
public float State4;
public float State5;
public float State6;
public float State7;
} }
} }

View file

@ -12,7 +12,7 @@ using Ryujinx.Audio.Renderer.Server.Voice;
using Ryujinx.Audio.Renderer.Utils; using Ryujinx.Audio.Renderer.Utils;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.CompilerServices;
namespace Ryujinx.Audio.Renderer.Server namespace Ryujinx.Audio.Renderer.Server
{ {
@ -143,7 +143,7 @@ namespace Ryujinx.Audio.Renderer.Server
if (supportsOptimizedPath && voiceState.BiquadFilters[0].Enable && voiceState.BiquadFilters[1].Enable) if (supportsOptimizedPath && voiceState.BiquadFilters[0].Enable && voiceState.BiquadFilters[1].Enable)
{ {
Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state)[..(VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount)]; Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state)[..(Unsafe.SizeOf<BiquadFilterState>() * Constants.VoiceBiquadFilterCount)];
Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory); Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory);
_commandBuffer.GenerateMultiTapBiquadFilter(baseIndex, voiceState.BiquadFilters.AsSpan(), stateMemory, bufferOffset, bufferOffset, voiceState.BiquadFilterNeedInitialization, nodeId); _commandBuffer.GenerateMultiTapBiquadFilter(baseIndex, voiceState.BiquadFilters.AsSpan(), stateMemory, bufferOffset, bufferOffset, voiceState.BiquadFilterNeedInitialization, nodeId);
@ -156,8 +156,7 @@ namespace Ryujinx.Audio.Renderer.Server
if (filter.Enable) if (filter.Enable)
{ {
Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state)[..(VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount)]; Memory<byte> biquadStateRawMemory = SpanMemoryManager<byte>.Cast(state)[..(Unsafe.SizeOf<BiquadFilterState>() * Constants.VoiceBiquadFilterCount)];
Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory); Memory<BiquadFilterState> stateMemory = SpanMemoryManager<BiquadFilterState>.Cast(biquadStateRawMemory);
_commandBuffer.GenerateBiquadFilter( _commandBuffer.GenerateBiquadFilter(
@ -210,9 +209,9 @@ namespace Ryujinx.Audio.Renderer.Server
ref bqf0, ref bqf0,
ref bqf1, ref bqf1,
bqfState[..1], bqfState[..1],
bqfState.Slice(1, 1),
bqfState.Slice(2, 1), bqfState.Slice(2, 1),
bqfState.Slice(4, 1), bqfState.Slice(3, 1),
bqfState.Slice(6, 1),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
true, true,
@ -233,7 +232,7 @@ namespace Ryujinx.Audio.Renderer.Server
state, state,
ref bqf0, ref bqf0,
bqfState[..1], bqfState[..1],
bqfState.Slice(2, 1), bqfState.Slice(1, 1),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
true, true,
isFirstMixBuffer, isFirstMixBuffer,
@ -252,7 +251,7 @@ namespace Ryujinx.Audio.Renderer.Server
state, state,
ref bqf1, ref bqf1,
bqfState[..1], bqfState[..1],
bqfState.Slice(2, 1), bqfState.Slice(1, 1),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
true, true,
isFirstMixBuffer, isFirstMixBuffer,
@ -863,9 +862,9 @@ namespace Ryujinx.Audio.Renderer.Server
ref bqf0, ref bqf0,
ref bqf1, ref bqf1,
bqfState[..1], bqfState[..1],
bqfState.Slice(1, 1),
bqfState.Slice(2, 1), bqfState.Slice(2, 1),
bqfState.Slice(4, 1), bqfState.Slice(3, 1),
bqfState.Slice(6, 1),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
false, false,
@ -886,7 +885,7 @@ namespace Ryujinx.Audio.Renderer.Server
Memory<VoiceUpdateState>.Empty, Memory<VoiceUpdateState>.Empty,
ref bqf0, ref bqf0,
bqfState[..1], bqfState[..1],
bqfState.Slice(2, 1), bqfState.Slice(1, 1),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
false, false,
isFirstMixBuffer, isFirstMixBuffer,
@ -905,7 +904,7 @@ namespace Ryujinx.Audio.Renderer.Server
Memory<VoiceUpdateState>.Empty, Memory<VoiceUpdateState>.Empty,
ref bqf1, ref bqf1,
bqfState[..1], bqfState[..1],
bqfState.Slice(2, 1), bqfState.Slice(1, 1),
!destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(),
false, false,
isFirstMixBuffer, isFirstMixBuffer,

View file

@ -19,7 +19,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter
/// <summary> /// <summary>
/// Amount of biquad filter states per splitter destination. /// Amount of biquad filter states per splitter destination.
/// </summary> /// </summary>
public const int BqfStatesPerDestination = 8; public const int BqfStatesPerDestination = 4;
/// <summary> /// <summary>
/// Storage for <see cref="SplitterState"/>. /// Storage for <see cref="SplitterState"/>.
@ -271,7 +271,9 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter
if (parameter.IsMagicValid()) if (parameter.IsMagicValid())
{ {
if (parameter.Id >= 0 && parameter.Id < _splitterDestinationsV1.Length) int length = _splitterDestinationsV2.IsEmpty ? _splitterDestinationsV1.Length : _splitterDestinationsV2.Length;
if (parameter.Id >= 0 && parameter.Id < length)
{ {
SplitterDestination destination = GetDestination(parameter.Id); SplitterDestination destination = GetDestination(parameter.Id);
@ -325,7 +327,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter
/// <returns>Return true if the update was successful.</returns> /// <returns>Return true if the update was successful.</returns>
public bool Update(ref SequenceReader<byte> input) public bool Update(ref SequenceReader<byte> input)
{ {
if (_splitterDestinationsV1.IsEmpty || _splitters.IsEmpty) if (!UsingSplitter())
{ {
return true; return true;
} }