diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 312a6c5699..9f993e653d 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -66,8 +66,10 @@ Audio::Audio(Oscilloscope* scope, int16_t initialJitterBufferSamples, QObject* p _noiseGateSampleCounter(0), _noiseGateOpen(false), _noiseGateEnabled(true), + _toneInjectionEnabled(false), _noiseGateFramesToClose(0), _totalPacketsReceived(0), + _totalInputAudioSamples(0), _collisionSoundMagnitude(0.0f), _collisionSoundFrequency(0.0f), _collisionSoundNoise(0.0f), @@ -390,7 +392,7 @@ void Audio::handleAudioInput() { inputSamplesRequired, NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, _inputFormat, _desiredInputFormat); - + // // Impose Noise Gate // @@ -421,13 +423,15 @@ void Audio::handleAudioInput() { const float DC_OFFSET_AVERAGING = 0.99f; const float CLIPPING_THRESHOLD = 0.90f; + // + // Check clipping, adjust DC offset, and check if should open noise gate + // float measuredDcOffset = 0.f; - // Increment the time since the last clip if (_timeSinceLastClip >= 0.0f) { _timeSinceLastClip += (float) NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL / (float) SAMPLE_RATE; } - + for (int i = 0; i < NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL; i++) { measuredDcOffset += monoAudioSamples[i]; monoAudioSamples[i] -= (int16_t) _dcOffset; @@ -489,6 +493,16 @@ void Audio::handleAudioInput() { _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 QMetaObject::invokeMethod(_scope, "addSamples", Qt::QueuedConnection, @@ -683,7 +697,9 @@ void Audio::toggleAudioNoiseReduction() { _noiseGateEnabled = !_noiseGateEnabled; } - +void Audio::toggleToneInjection() { + _toneInjectionEnabled = !_toneInjectionEnabled; +} // Take a pointer to the acquired microphone input samples and add procedural sounds void Audio::addProceduralSounds(int16_t* monoInput, int numSamples) { diff --git a/interface/src/Audio.h b/interface/src/Audio.h index f98e18eb0b..170572a4d7 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -81,6 +81,7 @@ public slots: void reset(); void toggleMute(); void toggleAudioNoiseReduction(); + void toggleToneInjection(); virtual void handleAudioByteArray(const QByteArray& audioByteArray); @@ -135,8 +136,10 @@ private: int _noiseGateSampleCounter; bool _noiseGateOpen; bool _noiseGateEnabled; + bool _toneInjectionEnabled; int _noiseGateFramesToClose; int _totalPacketsReceived; + int _totalInputAudioSamples; float _collisionSoundMagnitude; float _collisionSoundFrequency; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 4d93016d4e..122d4c5654 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -360,6 +360,12 @@ Menu::Menu() : false, appInstance->getAudio(), SLOT(toggleMute())); + addCheckableActionToQMenuAndActionHash(audioDebugMenu, MenuOption::AudioToneInjection, + 0, + false, + appInstance->getAudio(), + SLOT(toggleToneInjection())); + addActionToQMenuAndActionHash(developerMenu, MenuOption::PasteToVoxel, Qt::CTRL | Qt::SHIFT | Qt::Key_V, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index c7c4c6ecea..206593ce80 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -242,6 +242,7 @@ namespace MenuOption { const QString FilterSixense = "Smooth Sixense Movement"; const QString Enable3DTVMode = "Enable 3DTV Mode"; const QString AudioNoiseReduction = "Audio Noise Reduction"; + const QString AudioToneInjection = "Inject Test Tone"; const QString EchoServerAudio = "Echo Server Audio"; const QString EchoLocalAudio = "Echo Local Audio"; const QString MuteAudio = "Mute Microphone";