using Ryujinx.Audio.Renderer.Parameter; using Ryujinx.Audio.Renderer.Utils; using System; using System.Diagnostics; namespace Ryujinx.Audio.Renderer.Server.Effect { /// /// Effect context. /// public class EffectContext { /// /// Storage for . /// private BaseEffect[] _effects; /// /// The total effect count. /// private uint _effectCount; private EffectResultState[] _resultStatesCpu; private EffectResultState[] _resultStatesDsp; /// /// Create a new . /// public EffectContext() { _effects = null; _effectCount = 0; } /// /// Initialize the . /// /// The total effect count. /// The total result state count. public void Initialize(uint effectCount, uint resultStateCount) { _effectCount = effectCount; _effects = new BaseEffect[effectCount]; for (int i = 0; i < _effectCount; i++) { _effects[i] = new BaseEffect(); } _resultStatesCpu = new EffectResultState[resultStateCount]; _resultStatesDsp = new EffectResultState[resultStateCount]; } /// /// Get the total effect count. /// /// The total effect count. public uint GetCount() { return _effectCount; } /// /// Get a reference to a at the given . /// /// The index to use. /// A reference to a at the given . public ref BaseEffect GetEffect(int index) { Debug.Assert(index >= 0 && index < _effectCount); return ref _effects[index]; } /// /// Get a reference to a at the given . /// /// The index to use. /// A reference to a at the given . /// The returned should only be used when updating the server state. public ref EffectResultState GetState(int index) { Debug.Assert(index >= 0 && index < _resultStatesCpu.Length); return ref _resultStatesCpu[index]; } /// /// Get a reference to a at the given . /// /// The index to use. /// A reference to a at the given . /// The returned should only be used in the context of processing on the . public ref EffectResultState GetDspState(int index) { Debug.Assert(index >= 0 && index < _resultStatesDsp.Length); return ref _resultStatesDsp[index]; } /// /// Get a memory instance to a at the given . /// /// The index to use. /// A memory instance to a at the given . /// The returned should only be used in the context of processing on the . public Memory GetDspStateMemory(int index) { return SpanIOHelper.GetMemory(_resultStatesDsp.AsMemory(), index, (uint)_resultStatesDsp.Length); } /// /// Update internal state during command generation. /// public void UpdateResultStateForCommandGeneration() { for (int index = 0; index < _resultStatesCpu.Length; index++) { _effects[index].UpdateResultState(ref _resultStatesCpu[index], ref _resultStatesDsp[index]); } } } }