diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 7a52c91421..ef45f98b5d 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -638,6 +638,12 @@ void Audio::handleAudioInput() { memset(networkAudioSamples, 0, numNetworkBytes); if (!_muted) { + + // Increment the time since the last clip + if (_timeSinceLastClip >= 0.0f) { + _timeSinceLastClip += (float) numNetworkSamples / (float) AudioConstants::SAMPLE_RATE; + } + // we aren't muted, downsample the input audio linearResampling((int16_t*) inputAudioSamples, networkAudioSamples, inputSamplesRequired, numNetworkSamples, @@ -646,8 +652,13 @@ void Audio::handleAudioInput() { // only impose the noise gate and perform tone injection if we are sending mono audio if (!_isStereoInput && _isNoiseGateEnabled) { _inputGate.gateSamples(networkAudioSamples, numNetworkSamples); + + // if we performed the noise gate we can get values from it instead of enumerating the samples again _lastInputLoudness = _inputGate.getLastLoudness(); - _timeSinceLastClip = _inputGate.getTimeSinceLastClip(); + + if (_inputGate.clippedInLastFrame()) { + _timeSinceLastClip = 0.0f; + } } else { float loudness = 0.0f; @@ -660,8 +671,9 @@ void Audio::handleAudioInput() { } } - _lastInputLoudness = fabs(loudness / numNetworkSamples); + _lastInputLoudness = fabs(loudness / numNetworkSamples); } + } else { // our input loudness is 0, since we're muted _lastInputLoudness = 0; diff --git a/interface/src/audio/AudioNoiseGate.cpp b/interface/src/audio/AudioNoiseGate.cpp index 041b961f94..318e5a40e0 100644 --- a/interface/src/audio/AudioNoiseGate.cpp +++ b/interface/src/audio/AudioNoiseGate.cpp @@ -22,7 +22,7 @@ AudioNoiseGate::AudioNoiseGate() : _lastLoudness(0.0f), _quietestFrame(std::numeric_limits::max()), _loudestFrame(0.0f), - _timeSinceLastClip(-1.0f), + _didClipInLastFrame(false), _dcOffset(0.0f), _measuredFloor(0.0f), _sampleCounter(0), @@ -66,19 +66,15 @@ void AudioNoiseGate::gateSamples(int16_t* samples, int numSamples) { // Check clipping, adjust DC offset, and check if should open noise gate // float measuredDcOffset = 0.0f; - // Increment the time since the last clip - if (_timeSinceLastClip >= 0.0f) { - _timeSinceLastClip += (float) AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL - / (float) AudioConstants::SAMPLE_RATE; - } + _didClipInLastFrame = false; - for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; i++) { + for (int i = 0; i < numSamples; i++) { measuredDcOffset += samples[i]; samples[i] -= (int16_t) _dcOffset; thisSample = fabsf(samples[i]); - if (thisSample >= ((float)AudioConstants::MAX_SAMPLE_VALUE * CLIPPING_THRESHOLD)) { - _timeSinceLastClip = 0.0f; + if (thisSample >= ((float) AudioConstants::MAX_SAMPLE_VALUE * CLIPPING_THRESHOLD)) { + _didClipInLastFrame = true; } loudness += thisSample; @@ -88,7 +84,7 @@ void AudioNoiseGate::gateSamples(int16_t* samples, int numSamples) { } } - measuredDcOffset /= AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; + measuredDcOffset /= numSamples; if (_dcOffset == 0.0f) { // On first frame, copy over measured offset _dcOffset = measuredDcOffset; @@ -96,7 +92,7 @@ void AudioNoiseGate::gateSamples(int16_t* samples, int numSamples) { _dcOffset = DC_OFFSET_AVERAGING * _dcOffset + (1.0f - DC_OFFSET_AVERAGING) * measuredDcOffset; } - _lastLoudness = fabs(loudness / AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL); + _lastLoudness = fabs(loudness / numSamples); if (_quietestFrame > _lastLoudness) { _quietestFrame = _lastLoudness; @@ -143,7 +139,7 @@ void AudioNoiseGate::gateSamples(int16_t* samples, int numSamples) { } } if (!_isOpen) { - memset(samples, 0, AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL); + memset(samples, 0, numSamples * sizeof(int16_t)); _lastLoudness = 0; } } diff --git a/interface/src/audio/AudioNoiseGate.h b/interface/src/audio/AudioNoiseGate.h index 26afbd9ca2..bfb9ec28d5 100644 --- a/interface/src/audio/AudioNoiseGate.h +++ b/interface/src/audio/AudioNoiseGate.h @@ -22,7 +22,7 @@ public: void gateSamples(int16_t* samples, int numSamples); - float getTimeSinceLastClip() const { return _timeSinceLastClip; } + bool clippedInLastFrame() const { return _didClipInLastFrame; } float getMeasuredFloor() const { return _measuredFloor; } float getLastLoudness() const { return _lastLoudness; } @@ -33,7 +33,7 @@ private: float _lastLoudness; float _quietestFrame; float _loudestFrame; - float _timeSinceLastClip; + bool _didClipInLastFrame; float _dcOffset; float _measuredFloor; float _sampleFrames[NUMBER_OF_NOISE_SAMPLE_FRAMES];