From 98d83ac4cef4792d1c9a6ab202aaeb4fe221a5e1 Mon Sep 17 00:00:00 2001 From: Gabriel A Date: Wed, 15 May 2024 22:21:21 -0300 Subject: [PATCH] Update BiquadFilterState size + other fixes --- .../Renderer/Common/VoiceUpdateState.cs | 1 - .../Renderer/Dsp/State/BiquadFilterState.cs | 6 ++++- .../Renderer/Server/CommandGenerator.cs | 23 +++++++++---------- .../Server/Splitter/SplitterContext.cs | 8 ++++--- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs b/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs index 608381af11..7f881373f3 100644 --- a/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs +++ b/src/Ryujinx.Audio/Renderer/Common/VoiceUpdateState.cs @@ -15,7 +15,6 @@ namespace Ryujinx.Audio.Renderer.Common { public const int Align = 0x10; public const int BiquadStateOffset = 0x0; - public const int BiquadStateSize = 0x10; /// /// The state of the biquad filters of this voice. diff --git a/src/Ryujinx.Audio/Renderer/Dsp/State/BiquadFilterState.cs b/src/Ryujinx.Audio/Renderer/Dsp/State/BiquadFilterState.cs index f9a32b3f99..58a2d9cce1 100644 --- a/src/Ryujinx.Audio/Renderer/Dsp/State/BiquadFilterState.cs +++ b/src/Ryujinx.Audio/Renderer/Dsp/State/BiquadFilterState.cs @@ -2,12 +2,16 @@ using System.Runtime.InteropServices; namespace Ryujinx.Audio.Renderer.Dsp.State { - [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x10)] + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x20)] public struct BiquadFilterState { public float State0; public float State1; public float State2; public float State3; + public float State4; + public float State5; + public float State6; + public float State7; } } diff --git a/src/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs b/src/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs index e70b562a4e..d798230c1d 100644 --- a/src/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs +++ b/src/Ryujinx.Audio/Renderer/Server/CommandGenerator.cs @@ -12,7 +12,7 @@ using Ryujinx.Audio.Renderer.Server.Voice; using Ryujinx.Audio.Renderer.Utils; using System; using System.Diagnostics; -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; namespace Ryujinx.Audio.Renderer.Server { @@ -143,7 +143,7 @@ namespace Ryujinx.Audio.Renderer.Server if (supportsOptimizedPath && voiceState.BiquadFilters[0].Enable && voiceState.BiquadFilters[1].Enable) { - Memory biquadStateRawMemory = SpanMemoryManager.Cast(state)[..(VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount)]; + Memory biquadStateRawMemory = SpanMemoryManager.Cast(state)[..(Unsafe.SizeOf() * Constants.VoiceBiquadFilterCount)]; Memory stateMemory = SpanMemoryManager.Cast(biquadStateRawMemory); _commandBuffer.GenerateMultiTapBiquadFilter(baseIndex, voiceState.BiquadFilters.AsSpan(), stateMemory, bufferOffset, bufferOffset, voiceState.BiquadFilterNeedInitialization, nodeId); @@ -156,8 +156,7 @@ namespace Ryujinx.Audio.Renderer.Server if (filter.Enable) { - Memory biquadStateRawMemory = SpanMemoryManager.Cast(state)[..(VoiceUpdateState.BiquadStateSize * Constants.VoiceBiquadFilterCount)]; - + Memory biquadStateRawMemory = SpanMemoryManager.Cast(state)[..(Unsafe.SizeOf() * Constants.VoiceBiquadFilterCount)]; Memory stateMemory = SpanMemoryManager.Cast(biquadStateRawMemory); _commandBuffer.GenerateBiquadFilter( @@ -210,9 +209,9 @@ namespace Ryujinx.Audio.Renderer.Server ref bqf0, ref bqf1, bqfState[..1], + bqfState.Slice(1, 1), bqfState.Slice(2, 1), - bqfState.Slice(4, 1), - bqfState.Slice(6, 1), + bqfState.Slice(3, 1), !destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(), true, @@ -233,7 +232,7 @@ namespace Ryujinx.Audio.Renderer.Server state, ref bqf0, bqfState[..1], - bqfState.Slice(2, 1), + bqfState.Slice(1, 1), !destination.IsBiquadFilterEnabledPrev(), true, isFirstMixBuffer, @@ -252,7 +251,7 @@ namespace Ryujinx.Audio.Renderer.Server state, ref bqf1, bqfState[..1], - bqfState.Slice(2, 1), + bqfState.Slice(1, 1), !destination.IsBiquadFilterEnabledPrev(), true, isFirstMixBuffer, @@ -863,9 +862,9 @@ namespace Ryujinx.Audio.Renderer.Server ref bqf0, ref bqf1, bqfState[..1], + bqfState.Slice(1, 1), bqfState.Slice(2, 1), - bqfState.Slice(4, 1), - bqfState.Slice(6, 1), + bqfState.Slice(3, 1), !destination.IsBiquadFilterEnabledPrev(), !destination.IsBiquadFilterEnabledPrev(), false, @@ -886,7 +885,7 @@ namespace Ryujinx.Audio.Renderer.Server Memory.Empty, ref bqf0, bqfState[..1], - bqfState.Slice(2, 1), + bqfState.Slice(1, 1), !destination.IsBiquadFilterEnabledPrev(), false, isFirstMixBuffer, @@ -905,7 +904,7 @@ namespace Ryujinx.Audio.Renderer.Server Memory.Empty, ref bqf1, bqfState[..1], - bqfState.Slice(2, 1), + bqfState.Slice(1, 1), !destination.IsBiquadFilterEnabledPrev(), false, isFirstMixBuffer, diff --git a/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterContext.cs b/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterContext.cs index b79423bfc6..a7b82a6bdc 100644 --- a/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterContext.cs +++ b/src/Ryujinx.Audio/Renderer/Server/Splitter/SplitterContext.cs @@ -19,7 +19,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter /// /// Amount of biquad filter states per splitter destination. /// - public const int BqfStatesPerDestination = 8; + public const int BqfStatesPerDestination = 4; /// /// Storage for . @@ -271,7 +271,9 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter 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); @@ -325,7 +327,7 @@ namespace Ryujinx.Audio.Renderer.Server.Splitter /// Return true if the update was successful. public bool Update(ref SequenceReader input) { - if (_splitterDestinationsV1.IsEmpty || _splitters.IsEmpty) + if (!UsingSplitter()) { return true; }