152 {
153
154 const auto& pcmData = sample.pcm();
155 if (pcmData.empty()) {
159 return;
160 }
161
162
163 float rms = sample.rms();
164
165
166 float maxSample = 0.0f;
167 for (fl::i16 pcmSample : pcmData) {
168 float absSample = (pcmSample < 0) ? -pcmSample : pcmSample;
169 maxSample = (maxSample > absSample) ? maxSample : absSample;
170 }
171
172
175
176
178
179
181
182 float agcAttackRate =
mConfig.attack / 255.0f * 0.2f + 0.01f;
183 float agcDecayRate =
mConfig.decay / 255.0f * 0.05f + 0.001f;
184
185
187
189 } else {
190
192 }
193
194
196 float targetLevel = 16384.0f;
197 float newMultiplier = targetLevel /
mMaxSample;
198
199
201
203 } else {
204
206 }
207
208
210 }
211 }
212}
float rms(Slice< const int16_t > data)
AudioReactiveConfig mConfig