mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 17:01:18 +02:00
repair interaction between AudioNoiseGate and Audio
This commit is contained in:
parent
9491b8230b
commit
b7099442c1
3 changed files with 24 additions and 16 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue