diff options
Diffstat (limited to 'Ryujinx.Audio.Renderer/Server/Upsampler')
| -rw-r--r-- | Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerManager.cs | 101 | ||||
| -rw-r--r-- | Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerState.cs | 80 |
2 files changed, 181 insertions, 0 deletions
diff --git a/Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerManager.cs b/Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerManager.cs new file mode 100644 index 00000000..26218932 --- /dev/null +++ b/Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerManager.cs @@ -0,0 +1,101 @@ +// +// Copyright (c) 2019-2020 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 <https://www.gnu.org/licenses/>. +// + +using System; +using System.Diagnostics; + +namespace Ryujinx.Audio.Renderer.Server.Upsampler +{ + /// <summary> + /// Upsampler manager. + /// </summary> + public class UpsamplerManager + { + /// <summary> + /// Work buffer for upsampler. + /// </summary> + private Memory<float> _upSamplerWorkBuffer; + + /// <summary> + /// Global lock of the object. + /// </summary> + private object Lock = new object(); + + /// <summary> + /// The upsamplers instances. + /// </summary> + private UpsamplerState[] _upsamplers; + + /// <summary> + /// The count of upsamplers. + /// </summary> + private uint _count; + + /// <summary> + /// Create a new <see cref="UpsamplerManager"/>. + /// </summary> + /// <param name="upSamplerWorkBuffer">Work buffer for upsampler.</param> + /// <param name="count">The count of upsamplers.</param> + public UpsamplerManager(Memory<float> upSamplerWorkBuffer, uint count) + { + _upSamplerWorkBuffer = upSamplerWorkBuffer; + _count = count; + + _upsamplers = new UpsamplerState[_count]; + } + + /// <summary> + /// Allocate a new <see cref="UpsamplerState"/>. + /// </summary> + /// <returns>A new <see cref="UpsamplerState"/> or null if out of memory.</returns> + 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, RendererConstants.UpSampleEntrySize), RendererConstants.TargetSampleCount); + + return _upsamplers[i]; + } + + workBufferOffset += RendererConstants.UpSampleEntrySize; + } + } + + return null; + } + + /// <summary> + /// Free a <see cref="UpsamplerState"/> at the given index. + /// </summary> + /// <param name="index">The index of the <see cref="UpsamplerState"/> to free.</param> + public void Free(int index) + { + lock (Lock) + { + Debug.Assert(_upsamplers[index] != null); + + _upsamplers[index] = null; + } + } + } +} diff --git a/Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerState.cs b/Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerState.cs new file mode 100644 index 00000000..19ba7626 --- /dev/null +++ b/Ryujinx.Audio.Renderer/Server/Upsampler/UpsamplerState.cs @@ -0,0 +1,80 @@ +// +// Copyright (c) 2019-2020 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 <https://www.gnu.org/licenses/>. +// + +using System; + +namespace Ryujinx.Audio.Renderer.Server.Upsampler +{ + /// <summary> + /// Server state for a upsampling. + /// </summary> + public class UpsamplerState + { + /// <summary> + /// The output buffer containing the target samples. + /// </summary> + public Memory<float> OutputBuffer { get; } + + /// <summary> + /// The target sample count. + /// </summary> + public uint SampleCount { get; } + + /// <summary> + /// The index of the <see cref="UpsamplerState"/>. (used to free it) + /// </summary> + private int _index; + + /// <summary> + /// The <see cref="UpsamplerManager"/>. + /// </summary> + private UpsamplerManager _manager; + + /// <summary> + /// The source sample count. + /// </summary> + public uint SourceSampleCount; + + /// <summary> + /// The input buffer indices of the buffers holding the samples that need upsampling. + /// </summary> + public ushort[] InputBufferIndices; + + /// <summary> + /// Create a new <see cref="UpsamplerState"/>. + /// </summary> + /// <param name="manager">The upsampler manager.</param> + /// <param name="index">The index of the <see cref="UpsamplerState"/>. (used to free it)</param> + /// <param name="outputBuffer">The output buffer used to contain the target samples.</param> + /// <param name="sampleCount">The target sample count.</param> + public UpsamplerState(UpsamplerManager manager, int index, Memory<float> outputBuffer, uint sampleCount) + { + _manager = manager; + _index = index; + OutputBuffer = outputBuffer; + SampleCount = sampleCount; + } + + /// <summary> + /// Release the <see cref="UpsamplerState"/>. + /// </summary> + public void Release() + { + _manager.Free(_index); + } + } +} |
