aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Audio/Renderer/Parameter/Effect/LimiterParameter.cs
blob: 23ccb8c88cb203121cad75d6e213fe63307c202f (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using Ryujinx.Audio.Renderer.Server.Effect;
using Ryujinx.Common.Memory;
using System.Runtime.InteropServices;

namespace Ryujinx.Audio.Renderer.Parameter.Effect
{
    /// <summary>
    /// <see cref="IEffectInParameter.SpecificData"/> for <see cref="Common.EffectType.Limiter"/>.
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct LimiterParameter
    {
        /// <summary>
        /// The input channel indices that will be used by the <see cref="Dsp.AudioProcessor"/>.
        /// </summary>
        public Array6<byte> Input;

        /// <summary>
        /// The output channel indices that will be used by the <see cref="Dsp.AudioProcessor"/>.
        /// </summary>
        public Array6<byte> Output;

        /// <summary>
        /// The maximum number of channels supported.
        /// </summary>
        public ushort ChannelCountMax;

        /// <summary>
        /// The total channel count used.
        /// </summary>
        public ushort ChannelCount;

        /// <summary>
        /// The target sample rate.
        /// </summary>
        /// <remarks>This is in kHz.</remarks>
        public int SampleRate;

        /// <summary>
        /// The look ahead max time.
        /// <remarks>This is in microseconds.</remarks>
        /// </summary>
        public int LookAheadTimeMax;

        /// <summary>
        /// The attack time.
        /// <remarks>This is in microseconds.</remarks>
        /// </summary>
        public int AttackTime;

        /// <summary>
        /// The release time.
        /// <remarks>This is in microseconds.</remarks>
        /// </summary>
        public int ReleaseTime;

        /// <summary>
        /// The look ahead time.
        /// <remarks>This is in microseconds.</remarks>
        /// </summary>
        public int LookAheadTime;

        /// <summary>
        /// The attack coefficient.
        /// </summary>
        public float AttackCoefficient;

        /// <summary>
        /// The release coefficient.
        /// </summary>
        public float ReleaseCoefficient;

        /// <summary>
        /// The threshold.
        /// </summary>
        public float Threshold;

        /// <summary>
        /// The input gain.
        /// </summary>
        public float InputGain;

        /// <summary>
        /// The output gain.
        /// </summary>
        public float OutputGain;

        /// <summary>
        /// The minimum samples stored in the delay buffer.
        /// </summary>
        public int DelayBufferSampleCountMin;

        /// <summary>
        /// The maximum samples stored in the delay buffer.
        /// </summary>
        public int DelayBufferSampleCountMax;

        /// <summary>
        /// The current usage status of the effect on the client side.
        /// </summary>
        public UsageState Status;

        /// <summary>
        /// Indicate if the limiter effect should output statistics.
        /// </summary>
        [MarshalAs(UnmanagedType.I1)]
        public bool StatisticsEnabled;

        /// <summary>
        /// Indicate to the DSP that the user did a statistics reset.
        /// </summary>
        [MarshalAs(UnmanagedType.I1)]
        public bool StatisticsReset;

        /// <summary>
        /// Reserved/padding.
        /// </summary>
        private readonly byte _reserved;

        /// <summary>
        /// Check if the <see cref="ChannelCount"/> is valid.
        /// </summary>
        /// <returns>Returns true if the <see cref="ChannelCount"/> is valid.</returns>
        public readonly bool IsChannelCountValid()
        {
            return EffectInParameterVersion1.IsChannelCountValid(ChannelCount);
        }

        /// <summary>
        /// Check if the <see cref="ChannelCountMax"/> is valid.
        /// </summary>
        /// <returns>Returns true if the <see cref="ChannelCountMax"/> is valid.</returns>
        public readonly bool IsChannelCountMaxValid()
        {
            return EffectInParameterVersion1.IsChannelCountValid(ChannelCountMax);
        }
    }
}