mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 08:17:35 +02:00
Tweaks to VU meter, tone injector, and fix to noise gate
This commit is contained in:
parent
36c41a1fd3
commit
0b792985d3
3 changed files with 45 additions and 45 deletions
|
@ -14,12 +14,12 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="src/Application.cpp" line="3718"/>
|
<location filename="src/Application.cpp" line="3720"/>
|
||||||
<source>Open Script</source>
|
<source>Open Script</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="src/Application.cpp" line="3719"/>
|
<location filename="src/Application.cpp" line="3721"/>
|
||||||
<source>JavaScript Files (*.js)</source>
|
<source>JavaScript Files (*.js)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
|
@ -2531,20 +2531,21 @@ void Application::displayOverlay() {
|
||||||
const float CLIPPING_INDICATOR_TIME = 1.0f;
|
const float CLIPPING_INDICATOR_TIME = 1.0f;
|
||||||
const float AUDIO_METER_AVERAGING = 0.5;
|
const float AUDIO_METER_AVERAGING = 0.5;
|
||||||
const float LOG2 = log(2.f);
|
const float LOG2 = log(2.f);
|
||||||
const float MAX_LOG2_SAMPLE = 15.f;
|
const float METER_LOUDNESS_SCALE = 2.8f / 5.f;
|
||||||
|
const float LOG2_LOUDNESS_FLOOR = 11.f;
|
||||||
float audioLevel = 0.f;
|
float audioLevel = 0.f;
|
||||||
float loudness = _audio.getLastInputLoudness() + 1.f;
|
float loudness = _audio.getLastInputLoudness() + 1.f;
|
||||||
_trailingAudioLoudness = AUDIO_METER_AVERAGING * _trailingAudioLoudness + (1.f - AUDIO_METER_AVERAGING) * loudness;
|
|
||||||
|
|
||||||
|
_trailingAudioLoudness = AUDIO_METER_AVERAGING * _trailingAudioLoudness + (1.f - AUDIO_METER_AVERAGING) * loudness;
|
||||||
float log2loudness = log(_trailingAudioLoudness) / LOG2;
|
float log2loudness = log(_trailingAudioLoudness) / LOG2;
|
||||||
|
|
||||||
audioLevel = log2loudness / MAX_LOG2_SAMPLE * AUDIO_METER_SCALE_WIDTH;
|
if (log2loudness <= LOG2_LOUDNESS_FLOOR) {
|
||||||
|
audioLevel = (log2loudness / LOG2_LOUDNESS_FLOOR) * METER_LOUDNESS_SCALE * AUDIO_METER_SCALE_WIDTH;
|
||||||
|
|
||||||
if (log2loudness <= 11.f) {
|
|
||||||
audioLevel = log2loudness / 11.f * AUDIO_METER_SCALE_WIDTH / 5.f;
|
|
||||||
} else {
|
} else {
|
||||||
audioLevel = (log2loudness - 10.f) * AUDIO_METER_SCALE_WIDTH / 5.f;
|
audioLevel = (log2loudness - (LOG2_LOUDNESS_FLOOR - 1.f)) * METER_LOUDNESS_SCALE * AUDIO_METER_SCALE_WIDTH;
|
||||||
|
}
|
||||||
|
if (audioLevel > AUDIO_METER_SCALE_WIDTH) {
|
||||||
|
audioLevel = AUDIO_METER_SCALE_WIDTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isClipping = ((_audio.getTimeSinceLastClip() > 0.f) && (_audio.getTimeSinceLastClip() < CLIPPING_INDICATOR_TIME));
|
bool isClipping = ((_audio.getTimeSinceLastClip() > 0.f) && (_audio.getTimeSinceLastClip() < CLIPPING_INDICATOR_TIME));
|
||||||
|
|
|
@ -436,12 +436,12 @@ void Audio::handleAudioInput() {
|
||||||
measuredDcOffset += monoAudioSamples[i];
|
measuredDcOffset += monoAudioSamples[i];
|
||||||
monoAudioSamples[i] -= (int16_t) _dcOffset;
|
monoAudioSamples[i] -= (int16_t) _dcOffset;
|
||||||
thisSample = fabsf(monoAudioSamples[i]);
|
thisSample = fabsf(monoAudioSamples[i]);
|
||||||
if (thisSample > (32767.f * CLIPPING_THRESHOLD)) {
|
if (thisSample >= (32767.f * CLIPPING_THRESHOLD)) {
|
||||||
_timeSinceLastClip = 0.0f;
|
_timeSinceLastClip = 0.0f;
|
||||||
}
|
}
|
||||||
loudness += thisSample;
|
loudness += thisSample;
|
||||||
// Noise Reduction: Count peaks above the average loudness
|
// Noise Reduction: Count peaks above the average loudness
|
||||||
if (thisSample > (_noiseGateMeasuredFloor * NOISE_GATE_HEIGHT)) {
|
if (_noiseGateEnabled && (thisSample > (_noiseGateMeasuredFloor * NOISE_GATE_HEIGHT))) {
|
||||||
samplesOverNoiseGate++;
|
samplesOverNoiseGate++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -454,9 +454,20 @@ void Audio::handleAudioInput() {
|
||||||
_dcOffset = DC_OFFSET_AVERAGING * _dcOffset + (1.f - DC_OFFSET_AVERAGING) * measuredDcOffset;
|
_dcOffset = DC_OFFSET_AVERAGING * _dcOffset + (1.f - DC_OFFSET_AVERAGING) * measuredDcOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
// Add tone injection if enabled
|
||||||
|
const float TONE_FREQ = 220.f / SAMPLE_RATE * TWO_PI;
|
||||||
|
const float QUARTER_VOLUME = 8192.f;
|
||||||
|
if (_toneInjectionEnabled) {
|
||||||
|
loudness = 0.f;
|
||||||
|
for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) {
|
||||||
|
monoAudioSamples[i] = QUARTER_VOLUME * sinf(TONE_FREQ * (float)(i + _proceduralEffectSample));
|
||||||
|
loudness += fabsf(monoAudioSamples[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
_lastInputLoudness = fabs(loudness / NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
|
_lastInputLoudness = fabs(loudness / NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL);
|
||||||
|
|
||||||
|
// If Noise Gate is enabled, check and turn the gate on and off
|
||||||
|
if (!_toneInjectionEnabled && _noiseGateEnabled) {
|
||||||
float averageOfAllSampleFrames = 0.f;
|
float averageOfAllSampleFrames = 0.f;
|
||||||
_noiseSampleFrames[_noiseGateSampleCounter++] = _lastInputLoudness;
|
_noiseSampleFrames[_noiseGateSampleCounter++] = _lastInputLoudness;
|
||||||
if (_noiseGateSampleCounter == NUMBER_OF_NOISE_SAMPLE_FRAMES) {
|
if (_noiseGateSampleCounter == NUMBER_OF_NOISE_SAMPLE_FRAMES) {
|
||||||
|
@ -478,8 +489,6 @@ void Audio::handleAudioInput() {
|
||||||
_noiseGateSampleCounter = 0;
|
_noiseGateSampleCounter = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_noiseGateEnabled) {
|
|
||||||
if (samplesOverNoiseGate > NOISE_GATE_WIDTH) {
|
if (samplesOverNoiseGate > NOISE_GATE_WIDTH) {
|
||||||
_noiseGateOpen = true;
|
_noiseGateOpen = true;
|
||||||
_noiseGateFramesToClose = NOISE_GATE_CLOSE_FRAME_DELAY;
|
_noiseGateFramesToClose = NOISE_GATE_CLOSE_FRAME_DELAY;
|
||||||
|
@ -493,16 +502,6 @@ void Audio::handleAudioInput() {
|
||||||
_lastInputLoudness = 0;
|
_lastInputLoudness = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// Add tone injection if enabled
|
|
||||||
//
|
|
||||||
const float TONE_FREQ = 220.f / SAMPLE_RATE * TWO_PI;
|
|
||||||
const float QUARTER_VOLUME = 8192.f;
|
|
||||||
if (_toneInjectionEnabled) {
|
|
||||||
for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) {
|
|
||||||
monoAudioSamples[i] = QUARTER_VOLUME * sinf(TONE_FREQ * (float)(i + _proceduralEffectSample));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add input data just written to the scope
|
// add input data just written to the scope
|
||||||
QMetaObject::invokeMethod(_scope, "addSamples", Qt::QueuedConnection,
|
QMetaObject::invokeMethod(_scope, "addSamples", Qt::QueuedConnection,
|
||||||
|
|
Loading…
Reference in a new issue