From 85f68662b08a3ec3e0a4067d4e8a6c4b8261b206 Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Sun, 14 Sep 2014 12:22:29 -0700 Subject: [PATCH 1/5] implement Gordon-Smith 2-pole quadrature oscillator --- libraries/audio/src/AudioSourceTone.h | 32 ++++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/libraries/audio/src/AudioSourceTone.h b/libraries/audio/src/AudioSourceTone.h index 5ebe1ba2a9..a21806460f 100644 --- a/libraries/audio/src/AudioSourceTone.h +++ b/libraries/audio/src/AudioSourceTone.h @@ -12,6 +12,7 @@ #ifndef hifi_AudioSourceTone_h #define hifi_AudioSourceTone_h +// Implemenbts a Gordon-Smith oscillator class AudioSourceTone { static uint32_t _frameOffset; @@ -19,6 +20,16 @@ class AudioSourceTone float32_t _amplitude; float32_t _sampleRate; float32_t _omega; + float32_t _epsilon; + float32_t _yq1; + float32_t _y1; + + void updateCoefficients() { + _omega = _frequency / _sampleRate * TWO_PI; + _epsilon = 2.0f * sinf(_omega / 2.0f); + _yq1 = cosf(-1.0f * _omega); + _y1 = sinf(+1.04 * _omega); + } public: AudioSourceTone() { @@ -30,22 +41,20 @@ public: } void initialize() { - _frameOffset = 0; - setParameters(SAMPLE_RATE, 220.0f, 0.9f); + setParameters(SAMPLE_RATE, 220.0f, 0.708f); } void finalize() { } void reset() { - _frameOffset = 0; } void setParameters(const float32_t sampleRate, const float32_t frequency, const float32_t amplitude) { _sampleRate = std::max(sampleRate, 1.0f); _frequency = std::max(frequency, 1.0f); _amplitude = std::max(amplitude, 1.0f); - _omega = _frequency / _sampleRate * TWO_PI; + updateCoefficients(); } void getParameters(float32_t& sampleRate, float32_t& frequency, float32_t& amplitude) { @@ -56,15 +65,22 @@ public: void render(AudioBufferFloat32& frameBuffer) { - // note: this is a placeholder implementation. final version will not include any transcendental ops in our render loop - float32_t** samples = frameBuffer.getFrameData(); + float32_t yq; + float32_t y; for (uint16_t i = 0; i < frameBuffer.getFrameCount(); ++i) { + + yq = _yq1 - (_epsilon * _y1); + y = _y1 + (_epsilon * yq); + + // update delays + _yq1 = yq; + _y1 = y; + for (uint16_t j = 0; j < frameBuffer.getChannelCount(); ++j) { - samples[j][i] = sinf((i + _frameOffset) * _omega); + samples[j][i] = _amplitude * y; } } - _frameOffset += frameBuffer.getFrameCount(); } }; From 4a63f9f764a0aaebb2f048e66eca8fa1af024b3b Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Sun, 14 Sep 2014 12:22:32 -0700 Subject: [PATCH 2/5] implement Gordon-Smith 2-pole quadrature oscillator --- libraries/audio/src/AudioSourceTone.cpp | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 libraries/audio/src/AudioSourceTone.cpp diff --git a/libraries/audio/src/AudioSourceTone.cpp b/libraries/audio/src/AudioSourceTone.cpp deleted file mode 100644 index 80a6aed48e..0000000000 --- a/libraries/audio/src/AudioSourceTone.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// AudioSourceTone.cpp -// hifi -// -// Created by Craig Hansen-Sturm on 8/10/14. -// Copyright 2014 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include -#include -#include -#include "AudioRingBuffer.h" -#include "AudioFormat.h" -#include "AudioBuffer.h" -#include "AudioSourceTone.h" - -uint32_t AudioSourceTone::_frameOffset = 0; From 089267a937e2adadf153bfedf22a3804f1742f32 Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Sun, 14 Sep 2014 12:26:25 -0700 Subject: [PATCH 3/5] completely remove new audio objects from playback rendering path when they are unused --- interface/src/Audio.cpp | 42 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 80500d392d..71b64d7c6e 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -506,30 +506,34 @@ void Audio::handleAudioInput() { QByteArray inputByteArray = _inputDevice->readAll(); - int16_t* inputFrameData = (int16_t*)inputByteArray.data(); - const int inputFrameCount = inputByteArray.size() / sizeof(int16_t); + if (!_muted && (_audioSourceInjectEnabled || _peqEnabled)) { + + int16_t* inputFrameData = (int16_t*)inputByteArray.data(); + const int inputFrameCount = inputByteArray.size() / sizeof(int16_t); - _inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, false /*copy in*/); + _inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, false /*copy in*/); - // _inputGain.render(_inputFrameBuffer); // input/mic gain+mute - - // Add audio source injection if enabled - if (_audioSourceInjectEnabled && !_muted) { - - if (_toneSourceEnabled) { // sine generator - _toneSource.render(_inputFrameBuffer); +#if ENABLE_INPUT_GAIN + _inputGain.render(_inputFrameBuffer); // input/mic gain+mute +#endif + // Add audio source injection if enabled + if (_audioSourceInjectEnabled) { + + if (_toneSourceEnabled) { // sine generator + _toneSource.render(_inputFrameBuffer); + } + else if(_noiseSourceEnabled) { // pink noise generator + _noiseSource.render(_inputFrameBuffer); + } + _sourceGain.render(_inputFrameBuffer); // post gain } - else if(_noiseSourceEnabled) { // pink noise generator - _noiseSource.render(_inputFrameBuffer); + if (_peqEnabled) { + _peq.render(_inputFrameBuffer); // 3-band parametric eq } - _sourceGain.render(_inputFrameBuffer); // post gain - } - if (_peqEnabled && !_muted) { - _peq.render(_inputFrameBuffer); // 3-band parametric eq - } - _inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, true /*copy out*/); - + _inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, true /*copy out*/); + } + if (Menu::getInstance()->isOptionChecked(MenuOption::EchoLocalAudio) && !_muted && _audioOutput) { // if this person wants local loopback add that to the locally injected audio From 0ba952b2f85949ff4223278894e46faa77113b3b Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Sun, 14 Sep 2014 12:32:48 -0700 Subject: [PATCH 4/5] cleanup/remove stray static _frameOffset --- libraries/audio/src/AudioSourceTone.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/audio/src/AudioSourceTone.h b/libraries/audio/src/AudioSourceTone.h index a21806460f..812e9fe2c2 100644 --- a/libraries/audio/src/AudioSourceTone.h +++ b/libraries/audio/src/AudioSourceTone.h @@ -12,10 +12,9 @@ #ifndef hifi_AudioSourceTone_h #define hifi_AudioSourceTone_h -// Implemenbts a Gordon-Smith oscillator +// Implements a two-pole Gordon-Smith oscillator class AudioSourceTone { - static uint32_t _frameOffset; float32_t _frequency; float32_t _amplitude; float32_t _sampleRate; From 1c955384fbdf52d96f73799ace892d073dc4d29d Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Mon, 15 Sep 2014 09:56:11 -0700 Subject: [PATCH 5/5] coding standard/typo --- libraries/audio/src/AudioSourceTone.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/audio/src/AudioSourceTone.h b/libraries/audio/src/AudioSourceTone.h index 812e9fe2c2..4a9046a6b2 100644 --- a/libraries/audio/src/AudioSourceTone.h +++ b/libraries/audio/src/AudioSourceTone.h @@ -27,7 +27,7 @@ class AudioSourceTone _omega = _frequency / _sampleRate * TWO_PI; _epsilon = 2.0f * sinf(_omega / 2.0f); _yq1 = cosf(-1.0f * _omega); - _y1 = sinf(+1.04 * _omega); + _y1 = sinf(+1.0f * _omega); } public: @@ -40,7 +40,9 @@ public: } void initialize() { - setParameters(SAMPLE_RATE, 220.0f, 0.708f); + const float32_t FREQUENCY_220_HZ = 220.0f; + const float32_t GAIN_MINUS_3DB = 0.708f; + setParameters(SAMPLE_RATE, FREQUENCY_220_HZ, GAIN_MINUS_3DB); } void finalize() {