From f5b7dd5997aeacc98002183d1b09576ece6618fa Mon Sep 17 00:00:00 2001
From: LotP1 <68976644+LotP1@users.noreply.github.com>
Date: Sat, 25 Oct 2025 20:21:59 +0200
Subject: [PATCH] Fix SP3 boot
---
.../Parameter/EffectInParameterVersion3.cs | 97 -------------------
.../Renderer/Server/Effect/BaseEffect.cs | 13 ---
.../Server/Effect/BiquadFilterEffect.cs | 15 +--
.../Renderer/Server/StateUpdater.cs | 64 +-----------
4 files changed, 11 insertions(+), 178 deletions(-)
delete mode 100644 src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion3.cs
diff --git a/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion3.cs b/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion3.cs
deleted file mode 100644
index 2cf4911a6..000000000
--- a/src/Ryujinx.Audio/Renderer/Parameter/EffectInParameterVersion3.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-using Ryujinx.Audio.Renderer.Common;
-using Ryujinx.Common.Utilities;
-using System;
-using System.Runtime.InteropServices;
-
-namespace Ryujinx.Audio.Renderer.Parameter
-{
- ///
- /// Input information for an effect version 2. (added with REV9)
- ///
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct EffectInParameterVersion3 : IEffectInParameter
- {
- ///
- /// Type of the effect.
- ///
- public EffectType Type;
-
- ///
- /// Set to true if the effect is new.
- ///
- [MarshalAs(UnmanagedType.I1)]
- public bool IsNew;
-
- ///
- /// Set to true if the effect must be active.
- ///
- [MarshalAs(UnmanagedType.I1)]
- public bool IsEnabled;
-
- ///
- /// Reserved/padding.
- ///
- private readonly byte _reserved1;
-
- ///
- /// The target mix id of the effect.
- ///
- public int MixId;
-
- ///
- /// Address of the processing workbuffer.
- ///
- /// This is additional data that could be required by the effect processing.
- public ulong BufferBase;
-
- ///
- /// Size of the processing workbuffer.
- ///
- /// This is additional data that could be required by the effect processing.
- public ulong BufferSize;
-
- ///
- /// Position of the effect while processing effects.
- ///
- public uint ProcessingOrder;
-
- ///
- /// Reserved/padding.
- ///
- private readonly uint _reserved2;
-
- ///
- /// Specific data storage.
- ///
- private SpecificDataStruct _specificDataStart;
-
- [StructLayout(LayoutKind.Sequential, Size = 0xA0, Pack = 1)]
- private struct SpecificDataStruct { }
-
- public Span SpecificData => SpanHelpers.AsSpan(ref _specificDataStart);
-
- readonly EffectType IEffectInParameter.Type => Type;
-
- readonly bool IEffectInParameter.IsNew => IsNew;
-
- readonly bool IEffectInParameter.IsEnabled => IsEnabled;
-
- readonly int IEffectInParameter.MixId => MixId;
-
- readonly ulong IEffectInParameter.BufferBase => BufferBase;
-
- readonly ulong IEffectInParameter.BufferSize => BufferSize;
-
- readonly uint IEffectInParameter.ProcessingOrder => ProcessingOrder;
-
- ///
- /// Check if the given channel count is valid.
- ///
- /// The channel count to check
- /// Returns true if the channel count is valid.
- public static bool IsChannelCountValid(int channelCount)
- {
- return channelCount is 1 or 2 or 4 or 6;
- }
- }
-}
diff --git a/src/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs b/src/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs
index 6324689e4..77d9b5c29 100644
--- a/src/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/Effect/BaseEffect.cs
@@ -174,19 +174,6 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
updateErrorInfo = new ErrorInfo();
}
-
- ///
- /// Update the internal state from a user version 3 parameter.
- ///
- /// The possible that was generated.
- /// The user parameter.
- /// The mapper to use.
- public virtual void Update(out ErrorInfo updateErrorInfo, in EffectInParameterVersion3 parameter, PoolMapper mapper)
- {
- Debug.Assert(IsTypeValid(in parameter));
-
- updateErrorInfo = new ErrorInfo();
- }
///
/// Get the work buffer DSP address at the given index.
diff --git a/src/Ryujinx.Audio/Renderer/Server/Effect/BiquadFilterEffect.cs b/src/Ryujinx.Audio/Renderer/Server/Effect/BiquadFilterEffect.cs
index f920c6873..55a898529 100644
--- a/src/Ryujinx.Audio/Renderer/Server/Effect/BiquadFilterEffect.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/Effect/BiquadFilterEffect.cs
@@ -25,13 +25,19 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
///
public Memory State { get; }
+ ///
+ /// The biquad filter effect version.
+ ///
+ public int BiquadFilterEffectVersion;
+
///
/// Create a new .
///
- public BiquadFilterEffect()
+ public BiquadFilterEffect(int version)
{
Parameter = new BiquadFilterEffectParameter2();
State = new BiquadFilterState[Constants.ChannelCountMax];
+ BiquadFilterEffectVersion = version;
}
public override EffectType TargetEffectType => EffectType.BiquadFilter;
@@ -45,11 +51,6 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
{
Update(out updateErrorInfo, in parameter, mapper);
}
-
- public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, in EffectInParameterVersion3 parameter, PoolMapper mapper)
- {
- Update(out updateErrorInfo, in parameter, mapper);
- }
public void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, in T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
{
@@ -57,7 +58,7 @@ namespace Ryujinx.Audio.Renderer.Server.Effect
UpdateParameterBase(in parameter);
- if (typeof(T) == typeof(EffectInParameterVersion3))
+ if (BiquadFilterEffectVersion == 2)
{
Parameter = MemoryMarshal.Cast(parameter.SpecificData)[0];
}
diff --git a/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs b/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs
index a02d70240..917d63716 100644
--- a/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs
+++ b/src/Ryujinx.Audio/Renderer/Server/StateUpdater.cs
@@ -300,7 +300,7 @@ namespace Ryujinx.Audio.Renderer.Server
return ResultCode.Success;
}
- private static void ResetEffect(ref BaseEffect effect, in T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
+ private void ResetEffect(ref BaseEffect effect, in T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
{
effect.ForceUnmapBuffers(mapper);
@@ -312,7 +312,8 @@ namespace Ryujinx.Audio.Renderer.Server
EffectType.Delay => new DelayEffect(),
EffectType.Reverb => new ReverbEffect(),
EffectType.Reverb3d => new Reverb3dEffect(),
- EffectType.BiquadFilter => new BiquadFilterEffect(),
+ EffectType.BiquadFilter when _behaviourInfo.IsBiquadFilterParameterFloatSupported() => new BiquadFilterEffect(2),
+ EffectType.BiquadFilter => new BiquadFilterEffect(1),
EffectType.Limiter => new LimiterEffect(),
EffectType.CaptureBuffer => new CaptureBufferEffect(),
EffectType.Compressor => new CompressorEffect(),
@@ -322,11 +323,6 @@ namespace Ryujinx.Audio.Renderer.Server
public ResultCode UpdateEffects(EffectContext context, bool isAudioRendererActive, PoolMapper mapper)
{
- if (_behaviourInfo.IsBiquadFilterParameterFloatSupported())
- {
- return UpdateEffectsVersion3(context, isAudioRendererActive, mapper);
- }
-
if (_behaviourInfo.IsEffectInfoVersion2Supported())
{
return UpdateEffectsVersion2(context, isAudioRendererActive, mapper);
@@ -334,60 +330,6 @@ namespace Ryujinx.Audio.Renderer.Server
return UpdateEffectsVersion1(context, isAudioRendererActive, mapper);
}
-
- public ResultCode UpdateEffectsVersion3(EffectContext context, bool isAudioRendererActive, PoolMapper mapper)
- {
- if (context.GetCount() * Unsafe.SizeOf() != _inputHeader.EffectsSize)
- {
- return ResultCode.InvalidUpdateInfo;
- }
-
- int initialOutputSize = _output.Length;
-
- long initialInputConsumed = _inputReader.Consumed;
-
- for (int i = 0; i < context.GetCount(); i++)
- {
- ref readonly EffectInParameterVersion3 parameter = ref _inputReader.GetRefOrRefToCopy(out _);
-
- ref EffectOutStatusVersion2 outStatus = ref SpanIOHelper.GetWriteRef(ref _output)[0];
-
- ref BaseEffect effect = ref context.GetEffect(i);
-
- if (!effect.IsTypeValid(in parameter))
- {
- ResetEffect(ref effect, in parameter, mapper);
- }
-
- effect.Update(out ErrorInfo updateErrorInfo, in parameter, mapper);
-
- if (updateErrorInfo.ErrorCode != ResultCode.Success)
- {
- _behaviourInfo.AppendError(ref updateErrorInfo);
- }
-
- effect.StoreStatus(ref outStatus, isAudioRendererActive);
-
- if (parameter.IsNew)
- {
- effect.InitializeResultState(ref context.GetDspState(i));
- effect.InitializeResultState(ref context.GetState(i));
- }
-
- effect.UpdateResultState(ref outStatus.ResultState, ref context.GetState(i));
- }
-
- int currentOutputSize = _output.Length;
-
- OutputHeader.EffectsSize = (uint)(Unsafe.SizeOf() * context.GetCount());
- OutputHeader.TotalSize += OutputHeader.EffectsSize;
-
- Debug.Assert((initialOutputSize - currentOutputSize) == OutputHeader.EffectsSize);
-
- _inputReader.SetConsumed(initialInputConsumed + _inputHeader.EffectsSize);
-
- return ResultCode.Success;
- }
public ResultCode UpdateEffectsVersion2(EffectContext context, bool isAudioRendererActive, PoolMapper mapper)
{