using System; using System.Diagnostics; namespace Ryujinx.Audio.Renderer.Server.Upsampler { /// /// Upsampler manager. /// public class UpsamplerManager { /// /// Work buffer for upsampler. /// private Memory _upSamplerWorkBuffer; /// /// Global lock of the object. /// private readonly object Lock = new(); /// /// The upsamplers instances. /// private UpsamplerState[] _upsamplers; /// /// The count of upsamplers. /// private uint _count; /// /// Create a new . /// /// Work buffer for upsampler. /// The count of upsamplers. public UpsamplerManager(Memory upSamplerWorkBuffer, uint count) { _upSamplerWorkBuffer = upSamplerWorkBuffer; _count = count; _upsamplers = new UpsamplerState[_count]; } /// /// Allocate a new . /// /// A new or null if out of memory. public UpsamplerState Allocate() { int workBufferOffset = 0; lock (Lock) { for (int i = 0; i < _count; i++) { if (_upsamplers[i] == null) { _upsamplers[i] = new UpsamplerState(this, i, _upSamplerWorkBuffer.Slice(workBufferOffset, Constants.UpSampleEntrySize), Constants.TargetSampleCount); return _upsamplers[i]; } workBufferOffset += Constants.UpSampleEntrySize; } } return null; } /// /// Free a at the given index. /// /// The index of the to free. public void Free(int index) { lock (Lock) { Debug.Assert(_upsamplers[index] != null); _upsamplers[index] = null; } } } }