FastLED 3.9.15
Loading...
Searching...
No Matches

◆ updateVolumeAndPeak()

void fl::AudioReactive::updateVolumeAndPeak ( const AudioSample & sample)
private

Definition at line 152 of file audio_reactive.cpp.

152 {
153 // Get PCM data from AudioSample
154 const auto& pcmData = sample.pcm();
155 if (pcmData.empty()) {
156 mCurrentData.volume = 0.0f;
157 mCurrentData.volumeRaw = 0.0f;
158 mCurrentData.peak = 0.0f;
159 return;
160 }
161
162 // Use AudioSample's built-in RMS calculation
163 float rms = sample.rms();
164
165 // Calculate peak from PCM data
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 // Scale to 0-255 range (approximately)
173 mCurrentData.volumeRaw = rms / 128.0f; // Rough scaling
174 mCurrentData.volume = mCurrentData.volumeRaw;
175
176 // Peak detection
177 mCurrentData.peak = maxSample / 32768.0f * 255.0f;
178
179 // Update AGC tracking
180 if (mConfig.agcEnabled) {
181 // AGC with attack/decay behavior
182 float agcAttackRate = mConfig.attack / 255.0f * 0.2f + 0.01f; // 0.01 to 0.21
183 float agcDecayRate = mConfig.decay / 255.0f * 0.05f + 0.001f; // 0.001 to 0.051
184
185 // Track maximum level with attack/decay
186 if (maxSample > mMaxSample) {
187 // Rising - use attack rate (faster response)
188 mMaxSample = mMaxSample * (1.0f - agcAttackRate) + maxSample * agcAttackRate;
189 } else {
190 // Falling - use decay rate (slower response)
191 mMaxSample = mMaxSample * (1.0f - agcDecayRate) + maxSample * agcDecayRate;
192 }
193
194 // Update AGC multiplier with proper bounds
195 if (mMaxSample > 1000.0f) {
196 float targetLevel = 16384.0f; // Half of full scale
197 float newMultiplier = targetLevel / mMaxSample;
198
199 // Smooth AGC multiplier changes using attack/decay
200 if (newMultiplier > mAGCMultiplier) {
201 // Increasing gain - use attack rate
202 mAGCMultiplier = mAGCMultiplier * (1.0f - agcAttackRate) + newMultiplier * agcAttackRate;
203 } else {
204 // Decreasing gain - use decay rate
205 mAGCMultiplier = mAGCMultiplier * (1.0f - agcDecayRate) + newMultiplier * agcDecayRate;
206 }
207
208 // Clamp multiplier to reasonable bounds
209 mAGCMultiplier = (mAGCMultiplier < 0.1f) ? 0.1f : ((mAGCMultiplier > 10.0f) ? 10.0f : mAGCMultiplier);
210 }
211 }
212}
float rms(Slice< const int16_t > data)
Definition simple.h:98
AudioReactiveConfig mConfig

References mAGCMultiplier, mConfig, mCurrentData, mMaxSample, fl::AudioSample::pcm(), fl::AudioSample::rms(), and rms().

Referenced by processSample().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: