122 {
123
124 const auto& pcmData = sample.pcm();
125 if (pcmData.empty()) {
129 return;
130 }
131
132
133 float rms = sample.rms();
134
135
136 float maxSample = 0.0f;
137 for (fl::i16 pcmSample : pcmData) {
138 float absSample = (pcmSample < 0) ? -pcmSample : pcmSample;
139 maxSample = (maxSample > absSample) ? maxSample : absSample;
140 }
141
142
145
146
148
149
151
152 float agcAttackRate =
mConfig.attack / 255.0f * 0.2f + 0.01f;
153 float agcDecayRate =
mConfig.decay / 255.0f * 0.05f + 0.001f;
154
155
157
159 } else {
160
162 }
163
164
166 float targetLevel = 16384.0f;
167 float newMultiplier = targetLevel /
mMaxSample;
168
169
171
173 } else {
174
176 }
177
178
180 }
181 }
182}
float rms(Slice< const int16_t > data)