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) {