diff options
author | Mary-nyan <mary@mary.zone> | 2022-12-06 15:04:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-06 15:04:25 +0100 |
commit | 40311310d1a6d2fde2ee9f04bfa1f21ced7cbee2 (patch) | |
tree | beec52c0a73006552aae3b1d9538240ddc89e6ae /Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs | |
parent | dde9bb5c69d2e1a70df82af8accd3d01fb94b78d (diff) |
amadeus: Add missing compressor effect from REV11 (#4010)1.1.435
* amadeus: Add missing compressor effect from REV11
This was in my reversing notes but seems I completely forgot to
implement it
Also took the opportunity to simplify the Limiter effect a bit.
* Remove some outdated comment
* Address gdkchan's comments
Diffstat (limited to 'Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs')
-rw-r--r-- | Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs b/Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs index 226def46..6645e20a 100644 --- a/Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs +++ b/Ryujinx.Audio/Renderer/Dsp/FloatingPointHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection.Metadata; using System.Runtime.CompilerServices; namespace Ryujinx.Audio.Renderer.Dsp @@ -47,6 +48,53 @@ namespace Ryujinx.Audio.Renderer.Dsp } [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Log10(float x) + { + // NOTE: Nintendo uses an approximation of log10, we don't. + // As such, we support the same ranges as Nintendo to avoid unexpected behaviours. + return MathF.Pow(10, MathF.Max(x, 1.0e-10f)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float MeanSquare(ReadOnlySpan<float> inputs) + { + float res = 0.0f; + + foreach (float input in inputs) + { + res += (input * input); + } + + res /= inputs.Length; + + return res; + } + + /// <summary> + /// Map decibel to linear. + /// </summary> + /// <param name="db">The decibel value to convert</param> + /// <returns>Converted linear value/returns> + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DecibelToLinear(float db) + { + return MathF.Pow(10.0f, db / 20.0f); + } + + /// <summary> + /// Map decibel to linear in [0, 2] range. + /// </summary> + /// <param name="db">The decibel value to convert</param> + /// <returns>Converted linear value in [0, 2] range</returns> + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DecibelToLinearExtended(float db) + { + float tmp = MathF.Log2(DecibelToLinear(db)); + + return MathF.Truncate(tmp) + MathF.Pow(2.0f, tmp - MathF.Truncate(tmp)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float DegreesToRadians(float degrees) { return degrees * MathF.PI / 180.0f; |