repair interaction between AudioNoiseGate and Audio

This commit is contained in:
Stephen Birarda 2014-12-16 16:50:13 -08:00
parent 9491b8230b
commit b7099442c1
3 changed files with 24 additions and 16 deletions

View file

@ -638,6 +638,12 @@ void Audio::handleAudioInput() {
memset(networkAudioSamples, 0, numNetworkBytes); memset(networkAudioSamples, 0, numNetworkBytes);
if (!_muted) { 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 // we aren't muted, downsample the input audio
linearResampling((int16_t*) inputAudioSamples, networkAudioSamples, linearResampling((int16_t*) inputAudioSamples, networkAudioSamples,
inputSamplesRequired, numNetworkSamples, inputSamplesRequired, numNetworkSamples,
@ -646,8 +652,13 @@ void Audio::handleAudioInput() {
// only impose the noise gate and perform tone injection if we are sending mono audio // only impose the noise gate and perform tone injection if we are sending mono audio
if (!_isStereoInput && _isNoiseGateEnabled) { if (!_isStereoInput && _isNoiseGateEnabled) {
_inputGate.gateSamples(networkAudioSamples, numNetworkSamples); _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(); _lastInputLoudness = _inputGate.getLastLoudness();
_timeSinceLastClip = _inputGate.getTimeSinceLastClip();
if (_inputGate.clippedInLastFrame()) {
_timeSinceLastClip = 0.0f;
}
} else { } else {
float loudness = 0.0f; float loudness = 0.0f;
@ -660,8 +671,9 @@ void Audio::handleAudioInput() {
} }
} }
_lastInputLoudness = fabs(loudness / numNetworkSamples); _lastInputLoudness = fabs(loudness / numNetworkSamples);
} }
} else { } else {
// our input loudness is 0, since we're muted // our input loudness is 0, since we're muted
_lastInputLoudness = 0; _lastInputLoudness = 0;

View file

@ -22,7 +22,7 @@ AudioNoiseGate::AudioNoiseGate() :
_lastLoudness(0.0f), _lastLoudness(0.0f),
_quietestFrame(std::numeric_limits<float>::max()), _quietestFrame(std::numeric_limits<float>::max()),
_loudestFrame(0.0f), _loudestFrame(0.0f),
_timeSinceLastClip(-1.0f), _didClipInLastFrame(false),
_dcOffset(0.0f), _dcOffset(0.0f),
_measuredFloor(0.0f), _measuredFloor(0.0f),
_sampleCounter(0), _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 // Check clipping, adjust DC offset, and check if should open noise gate
// //
float measuredDcOffset = 0.0f; float measuredDcOffset = 0.0f;
// Increment the time since the last clip _didClipInLastFrame = false;
if (_timeSinceLastClip >= 0.0f) {
_timeSinceLastClip += (float) AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL
/ (float) AudioConstants::SAMPLE_RATE;
}
for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; i++) { for (int i = 0; i < numSamples; i++) {
measuredDcOffset += samples[i]; measuredDcOffset += samples[i];
samples[i] -= (int16_t) _dcOffset; samples[i] -= (int16_t) _dcOffset;
thisSample = fabsf(samples[i]); thisSample = fabsf(samples[i]);
if (thisSample >= ((float)AudioConstants::MAX_SAMPLE_VALUE * CLIPPING_THRESHOLD)) { if (thisSample >= ((float) AudioConstants::MAX_SAMPLE_VALUE * CLIPPING_THRESHOLD)) {
_timeSinceLastClip = 0.0f; _didClipInLastFrame = true;
} }
loudness += thisSample; 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) { if (_dcOffset == 0.0f) {
// On first frame, copy over measured offset // On first frame, copy over measured offset
_dcOffset = measuredDcOffset; _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; _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) { if (_quietestFrame > _lastLoudness) {
_quietestFrame = _lastLoudness; _quietestFrame = _lastLoudness;
@ -143,7 +139,7 @@ void AudioNoiseGate::gateSamples(int16_t* samples, int numSamples) {
} }
} }
if (!_isOpen) { if (!_isOpen) {
memset(samples, 0, AudioConstants::NETWORK_FRAME_BYTES_PER_CHANNEL); memset(samples, 0, numSamples * sizeof(int16_t));
_lastLoudness = 0; _lastLoudness = 0;
} }
} }

View file

@ -22,7 +22,7 @@ public:
void gateSamples(int16_t* samples, int numSamples); void gateSamples(int16_t* samples, int numSamples);
float getTimeSinceLastClip() const { return _timeSinceLastClip; } bool clippedInLastFrame() const { return _didClipInLastFrame; }
float getMeasuredFloor() const { return _measuredFloor; } float getMeasuredFloor() const { return _measuredFloor; }
float getLastLoudness() const { return _lastLoudness; } float getLastLoudness() const { return _lastLoudness; }
@ -33,7 +33,7 @@ private:
float _lastLoudness; float _lastLoudness;
float _quietestFrame; float _quietestFrame;
float _loudestFrame; float _loudestFrame;
float _timeSinceLastClip; bool _didClipInLastFrame;
float _dcOffset; float _dcOffset;
float _measuredFloor; float _measuredFloor;
float _sampleFrames[NUMBER_OF_NOISE_SAMPLE_FRAMES]; float _sampleFrames[NUMBER_OF_NOISE_SAMPLE_FRAMES];