// // Copyright (c) 2019-2021 Ryujinx // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // 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 object Lock = new object(); /// /// 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; } } } }