aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Audio/Renderer/Dsp/State/CompressorState.cs
blob: 5ca8cd20a434a071673814a18008e2620bab7034 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using Ryujinx.Audio.Renderer.Dsp.Effect;
using Ryujinx.Audio.Renderer.Parameter.Effect;

namespace Ryujinx.Audio.Renderer.Dsp.State
{
    public struct CompressorState
    {
        public ExponentialMovingAverage InputMovingAverage;
        public float Unknown4;
        public ExponentialMovingAverage CompressionGainAverage;
        public float CompressorGainReduction;
        public float Unknown10;
        public float Unknown14;
        public float PreviousCompressionEmaAlpha;
        public float MakeupGain;
        public float OutputGain;

        public CompressorState(ref CompressorParameter parameter)
        {
            InputMovingAverage = new ExponentialMovingAverage(0.0f);
            Unknown4 = 1.0f;
            CompressionGainAverage = new ExponentialMovingAverage(1.0f);

            UpdateParameter(ref parameter);
        }

        public void UpdateParameter(ref CompressorParameter parameter)
        {
            float threshold = parameter.Threshold;
            float ratio = 1.0f / parameter.Ratio;
            float attackCoefficient = parameter.AttackCoefficient;
            float makeupGain;

            if (parameter.MakeupGainEnabled)
            {
                makeupGain = (threshold * 0.5f * (ratio - 1.0f)) - 3.0f;
            }
            else
            {
                makeupGain = 0.0f;
            }

            PreviousCompressionEmaAlpha = attackCoefficient;
            MakeupGain = makeupGain;
            CompressorGainReduction = (1.0f - ratio) / Constants.ChannelCountMax;
            Unknown10 = threshold - 1.5f;
            Unknown14 = threshold + 1.5f;
            OutputGain = FloatingPointHelper.DecibelToLinear(parameter.OutputGain + makeupGain);
        }
    }
}