UpsampleCommand.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Ryujinx.Audio.Renderer.Server.Upsampler;
  2. using System;
  3. using System.Runtime.CompilerServices;
  4. namespace Ryujinx.Audio.Renderer.Dsp.Command
  5. {
  6. public class UpsampleCommand : ICommand
  7. {
  8. public bool Enabled { get; set; }
  9. public int NodeId { get; }
  10. public CommandType CommandType => CommandType.Upsample;
  11. public ulong EstimatedProcessingTime { get; set; }
  12. public uint BufferCount { get; }
  13. public uint InputBufferIndex { get; }
  14. public uint InputSampleCount { get; }
  15. public uint InputSampleRate { get; }
  16. public UpsamplerState UpsamplerInfo { get; }
  17. public Memory<float> OutBuffer { get; }
  18. public UpsampleCommand(uint bufferOffset, UpsamplerState info, uint inputCount, Span<byte> inputBufferOffset, uint bufferCount, uint sampleCount, uint sampleRate, int nodeId)
  19. {
  20. Enabled = true;
  21. NodeId = nodeId;
  22. InputBufferIndex = 0;
  23. OutBuffer = info.OutputBuffer;
  24. BufferCount = bufferCount;
  25. InputSampleCount = sampleCount;
  26. InputSampleRate = sampleRate;
  27. info.SourceSampleCount = inputCount;
  28. info.InputBufferIndices = new ushort[inputCount];
  29. for (int i = 0; i < inputCount; i++)
  30. {
  31. info.InputBufferIndices[i] = (ushort)(bufferOffset + inputBufferOffset[i]);
  32. }
  33. UpsamplerInfo = info;
  34. }
  35. private Span<float> GetBuffer(int index, int sampleCount)
  36. {
  37. return UpsamplerInfo.OutputBuffer.Span.Slice(index * sampleCount, sampleCount);
  38. }
  39. public void Process(CommandList context)
  40. {
  41. float ratio = (float)InputSampleRate / Constants.TargetSampleRate;
  42. uint bufferCount = Math.Min(BufferCount, UpsamplerInfo.SourceSampleCount);
  43. for (int i = 0; i < bufferCount; i++)
  44. {
  45. Span<float> inputBuffer = context.GetBuffer(UpsamplerInfo.InputBufferIndices[i]);
  46. Span<float> outputBuffer = GetBuffer(UpsamplerInfo.InputBufferIndices[i], (int)UpsamplerInfo.SampleCount);
  47. float fraction = 0.0f;
  48. ResamplerHelper.ResampleForUpsampler(outputBuffer, inputBuffer, ratio, ref fraction, (int)(InputSampleCount / ratio));
  49. }
  50. }
  51. }
  52. }