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

◆ updateVolumeAndPeak()

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

Definition at line 122 of file audio_reactive.cpp.

122 {
123 // Get PCM data from AudioSample
124 const auto& pcmData = sample.pcm();
125 if (pcmData.empty()) {
126 mCurrentData.volume = 0.0f;
127 mCurrentData.volumeRaw = 0.0f;
128 mCurrentData.peak = 0.0f;
129 return;
130 }
131
132 // Use AudioSample's built-in RMS calculation
133 float rms = sample.rms();
134
135 // Calculate peak from PCM data
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 // Scale to 0-255 range (approximately)
143 mCurrentData.volumeRaw = rms / 128.0f; // Rough scaling
144 mCurrentData.volume = mCurrentData.volumeRaw;
145
146 // Peak detection
147 mCurrentData.peak = maxSample / 32768.0f * 255.0f;
148
149 // Update AGC tracking
150 if (mConfig.agcEnabled) {
151 // AGC with attack/decay behavior
152 float agcAttackRate = mConfig.attack / 255.0f * 0.2f + 0.01f; // 0.01 to 0.21
153 float agcDecayRate = mConfig.decay / 255.0f * 0.05f + 0.001f; // 0.001 to 0.051
154
155 // Track maximum level with attack/decay
156 if (maxSample > mMaxSample) {
157 // Rising - use attack rate (faster response)
158 mMaxSample = mMaxSample * (1.0f - agcAttackRate) + maxSample * agcAttackRate;
159 } else {
160 // Falling - use decay rate (slower response)
161 mMaxSample = mMaxSample * (1.0f - agcDecayRate) + maxSample * agcDecayRate;
162 }
163
164 // Update AGC multiplier with proper bounds
165 if (mMaxSample > 1000.0f) {
166 float targetLevel = 16384.0f; // Half of full scale
167 float newMultiplier = targetLevel / mMaxSample;
168
169 // Smooth AGC multiplier changes using attack/decay
170 if (newMultiplier > mAGCMultiplier) {
171 // Increasing gain - use attack rate
172 mAGCMultiplier = mAGCMultiplier * (1.0f - agcAttackRate) + newMultiplier * agcAttackRate;
173 } else {
174 // Decreasing gain - use decay rate
175 mAGCMultiplier = mAGCMultiplier * (1.0f - agcDecayRate) + newMultiplier * agcDecayRate;
176 }
177
178 // Clamp multiplier to reasonable bounds
179 mAGCMultiplier = (mAGCMultiplier < 0.1f) ? 0.1f : ((mAGCMultiplier > 10.0f) ? 10.0f : mAGCMultiplier);
180 }
181 }
182}
float rms(Slice< const int16_t > data)
Definition simple.h:98
AudioConfig 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: