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);
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;

View file

@ -22,7 +22,7 @@ AudioNoiseGate::AudioNoiseGate() :
_lastLoudness(0.0f),
_quietestFrame(std::numeric_limits<float>::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;
}
}

View file

@ -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];