From 009e6bcd1b4d55f511fc947d2d029f3f68b50d5d Mon Sep 17 00:00:00 2001 From: merry Date: Fri, 20 Jan 2023 20:46:13 +0000 Subject: Audio: Implement PCM24 output (#4321) --- Ryujinx.Audio/Renderer/Dsp/PcmHelper.cs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'Ryujinx.Audio/Renderer') diff --git a/Ryujinx.Audio/Renderer/Dsp/PcmHelper.cs b/Ryujinx.Audio/Renderer/Dsp/PcmHelper.cs index 1459e3a0..0233a8d7 100644 --- a/Ryujinx.Audio/Renderer/Dsp/PcmHelper.cs +++ b/Ryujinx.Audio/Renderer/Dsp/PcmHelper.cs @@ -37,19 +37,32 @@ namespace Ryujinx.Audio.Renderer.Dsp } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TOutput ConvertSample(TInput value) where TInput: INumber, IMinMaxValue where TOutput : INumber, IMinMaxValue + public static void ConvertSampleToPcm8(Span output, ReadOnlySpan input) { - TInput conversionRate = TInput.CreateSaturating(TOutput.MaxValue / TOutput.CreateSaturating(TInput.MaxValue)); + for (int i = 0; i < input.Length; i++) + { + // Output most significant byte + output[i] = (sbyte)(input[i] >> 8); + } + } - return TOutput.CreateSaturating(value * conversionRate); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void ConvertSampleToPcm24(Span output, ReadOnlySpan input) + { + for (int i = 0; i < input.Length; i++) + { + output[i * 3 + 2] = (byte)(input[i] >> 8); + output[i * 3 + 1] = (byte)(input[i] & 0xff); + output[i * 3 + 0] = 0; + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void Convert(Span output, ReadOnlySpan input) where TInput : INumber, IMinMaxValue where TOutput : INumber, IMinMaxValue + public static void ConvertSampleToPcm32(Span output, ReadOnlySpan input) { for (int i = 0; i < input.Length; i++) { - output[i] = ConvertSample(input[i]); + output[i] = ((int)input[i]) << 16; } } -- cgit v1.2.3