Optimize the loudness computation

NOTES:
Loudness is now measured post-gating, for improved metering.
Keep original algorithm, since other code depends on loudness behavior.
This commit is contained in:
Ken Cooke 2017-05-23 14:31:24 -07:00
parent a6a29786ae
commit 6b740e855d

View file

@ -1017,16 +1017,16 @@ void AudioClient::handleAudioInput(QByteArray& audioBuffer) {
_audioGate->removeDC(samples, samples, numFrames); _audioGate->removeDC(samples, samples, numFrames);
} }
// TODO: optimize this int32_t loudness = 0;
const float CLIPPING_THRESHOLD = 0.90f; assert(numSamples < 65536); // int32_t loudness cannot overflow
float loudness = 0.0f;
bool didClip = false; bool didClip = false;
for (int i = 0; i < numSamples; ++i) { for (int i = 0; i < numSamples; ++i) {
int16_t sample = std::abs(samples[i]); const int32_t CLIPPING_THRESHOLD = (int32_t)(AudioConstants::MAX_SAMPLE_VALUE * 0.9f);
loudness += (float)sample; int32_t sample = std::abs((int32_t)samples[i]);
didClip = didClip || (sample > (AudioConstants::MAX_SAMPLE_VALUE * CLIPPING_THRESHOLD)); loudness += sample;
didClip |= (sample > CLIPPING_THRESHOLD);
} }
_lastInputLoudness = fabs(loudness / numSamples); _lastInputLoudness = (float)loudness / numSamples;
if (didClip) { if (didClip) {
_timeSinceLastClip = 0.0f; _timeSinceLastClip = 0.0f;