From 6b740e855d03edde44d172e332c8e3e9b51a709e Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Tue, 23 May 2017 14:31:24 -0700 Subject: [PATCH] Optimize the loudness computation NOTES: Loudness is now measured post-gating, for improved metering. Keep original algorithm, since other code depends on loudness behavior. --- libraries/audio-client/src/AudioClient.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index f55ee0cb72..9864b3f67a 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1017,16 +1017,16 @@ void AudioClient::handleAudioInput(QByteArray& audioBuffer) { _audioGate->removeDC(samples, samples, numFrames); } - // TODO: optimize this - const float CLIPPING_THRESHOLD = 0.90f; - float loudness = 0.0f; + int32_t loudness = 0; + assert(numSamples < 65536); // int32_t loudness cannot overflow bool didClip = false; for (int i = 0; i < numSamples; ++i) { - int16_t sample = std::abs(samples[i]); - loudness += (float)sample; - didClip = didClip || (sample > (AudioConstants::MAX_SAMPLE_VALUE * CLIPPING_THRESHOLD)); + const int32_t CLIPPING_THRESHOLD = (int32_t)(AudioConstants::MAX_SAMPLE_VALUE * 0.9f); + int32_t sample = std::abs((int32_t)samples[i]); + loudness += sample; + didClip |= (sample > CLIPPING_THRESHOLD); } - _lastInputLoudness = fabs(loudness / numSamples); + _lastInputLoudness = (float)loudness / numSamples; if (didClip) { _timeSinceLastClip = 0.0f;