diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index bfe2f7e249..714cd0e3f3 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -321,9 +321,14 @@ int AudioMixer::addStreamToMixForListeningNodeWithStream(PositionalAudioStream* const float TWO_OVER_PI = 2.0f / PI; const float ZERO_DB = 1.0f; - const float NEGATIVE_ONE_DB = 0.891f; +// const float NEGATIVE_ONE_DB = 0.891f; const float NEGATIVE_THREE_DB = 0.708f; - + const float NEGATIVE_SIX_DB = 0.501f; + + const float FILTER_GAIN_AT_0 = ZERO_DB; // source is in front + const float FILTER_GAIN_AT_90 = NEGATIVE_SIX_DB; // source is incident to left or right ear + const float FILTER_GAIN_AT_180 = NEGATIVE_SIX_DB; // source is behind + const float FILTER_CUTOFF_FREQUENCY_HZ = 1000.0f; const float penumbraFilterFrequency = FILTER_CUTOFF_FREQUENCY_HZ; // constant frequency @@ -334,32 +339,25 @@ int AudioMixer::addStreamToMixForListeningNodeWithStream(PositionalAudioStream* // variable gain calculation broken down by quadrent if (bearingAngleToSource < -PI_OVER_TWO && bearingAngleToSource > -PI) { - // gainL(-pi/2,0b)->(-pi,-1db) penumbraFilterGainL = TWO_OVER_PI * - (ZERO_DB - NEGATIVE_ONE_DB) * (bearingAngleToSource + PI_OVER_TWO) + ZERO_DB; - // gainR(-pi/2,-3db)->(-pi,-1db) + (FILTER_GAIN_AT_0 - FILTER_GAIN_AT_180) * (bearingAngleToSource + PI_OVER_TWO) + FILTER_GAIN_AT_0; penumbraFilterGainR = TWO_OVER_PI * - (NEGATIVE_THREE_DB - NEGATIVE_ONE_DB) * (bearingAngleToSource + PI_OVER_TWO) + NEGATIVE_THREE_DB; + (FILTER_GAIN_AT_90 - FILTER_GAIN_AT_180) * (bearingAngleToSource + PI_OVER_TWO) + FILTER_GAIN_AT_90; } else if (bearingAngleToSource <= PI && bearingAngleToSource > PI_OVER_TWO) { - // gainL(+pi,-1db)->(pi/2,-3db) penumbraFilterGainL = TWO_OVER_PI * - (NEGATIVE_ONE_DB - NEGATIVE_THREE_DB) * (bearingAngleToSource - PI) + NEGATIVE_ONE_DB; - // gainR(+pi,-1db)->(pi/2,0db) + (FILTER_GAIN_AT_180 - FILTER_GAIN_AT_90) * (bearingAngleToSource - PI) + FILTER_GAIN_AT_180; penumbraFilterGainR = TWO_OVER_PI * - (NEGATIVE_ONE_DB - ZERO_DB) * (bearingAngleToSource - PI) + NEGATIVE_ONE_DB; + (FILTER_GAIN_AT_180 - FILTER_GAIN_AT_0) * (bearingAngleToSource - PI) + FILTER_GAIN_AT_180; } else if (bearingAngleToSource <= PI_OVER_TWO && bearingAngleToSource > 0) { - // gainL(+pi/2,-3db)->(0,0db) penumbraFilterGainL = TWO_OVER_PI * - (NEGATIVE_THREE_DB - ZERO_DB) * (bearingAngleToSource - PI_OVER_TWO) + NEGATIVE_THREE_DB; - // gainR(+p1/2,0db)->(0,0db) - penumbraFilterGainR = ZERO_DB; + (FILTER_GAIN_AT_90 - FILTER_GAIN_AT_0) * (bearingAngleToSource - PI_OVER_TWO) + FILTER_GAIN_AT_90; + penumbraFilterGainR = FILTER_GAIN_AT_0; } else { - // gainL(0,0db)->(-pi/2,0db) - penumbraFilterGainL = ZERO_DB; - // gainR(0,0db)->(-pi/2,-3db) + penumbraFilterGainL = FILTER_GAIN_AT_0; penumbraFilterGainR = TWO_OVER_PI * - (ZERO_DB - NEGATIVE_THREE_DB) * (bearingAngleToSource) + ZERO_DB; + (FILTER_GAIN_AT_0 - FILTER_GAIN_AT_90) * (bearingAngleToSource) + FILTER_GAIN_AT_0; } + #if 0 qDebug() << "avatar=" << listeningNodeStream diff --git a/domain-server/resources/web/settings/describe.json b/domain-server/resources/web/settings/describe.json index fee7ff21fc..2ea0aec0c7 100644 --- a/domain-server/resources/web/settings/describe.json +++ b/domain-server/resources/web/settings/describe.json @@ -67,7 +67,7 @@ "type": "checkbox", "label": "Enable Positional Filter", "help": "If enabled, positional audio stream uses lowpass filter", - "default": false + "default": true } } } diff --git a/libraries/audio/src/AudioSourceTone.cpp b/libraries/audio/src/AudioSourceTone.cpp new file mode 100644 index 0000000000..da6eea6a9e --- /dev/null +++ b/libraries/audio/src/AudioSourceTone.cpp @@ -0,0 +1,59 @@ +// +// 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" + +AudioSourceTone::AudioSourceTone() { + initialize(); +} + +AudioSourceTone::~AudioSourceTone() { + finalize(); +} + +void AudioSourceTone::finalize() { +} + +void AudioSourceTone::reset() { +} + +void AudioSourceTone::updateCoefficients() { + _omega = _frequency / _sampleRate * TWO_PI; + _epsilon = 2.0f * sinf(_omega / 2.0f); + _yq1 = cosf(-1.0f * _omega); + _y1 = sinf(+1.0f * _omega); +} + +void AudioSourceTone::initialize() { + 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 AudioSourceTone::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); + updateCoefficients(); +} + +void AudioSourceTone::getParameters(float32_t& sampleRate, float32_t& frequency, float32_t& amplitude) { + sampleRate = _sampleRate; + frequency = _frequency; + amplitude = _amplitude; +} + diff --git a/libraries/audio/src/AudioSourceTone.h b/libraries/audio/src/AudioSourceTone.h index 4a9046a6b2..22ec95496f 100644 --- a/libraries/audio/src/AudioSourceTone.h +++ b/libraries/audio/src/AudioSourceTone.h @@ -23,67 +23,41 @@ class AudioSourceTone 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.0f * _omega); - } + void updateCoefficients(); public: - AudioSourceTone() { - initialize(); - } + AudioSourceTone(); + ~AudioSourceTone(); - ~AudioSourceTone() { - finalize(); - } - - void initialize() { - 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() { - } - - void reset() { - } + void initialize(); + void finalize(); + void reset(); - 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); - updateCoefficients(); - } + void setParameters(const float32_t sampleRate, const float32_t frequency, const float32_t amplitude); + void getParameters(float32_t& sampleRate, float32_t& frequency, float32_t& amplitude); - void getParameters(float32_t& sampleRate, float32_t& frequency, float32_t& amplitude) { - sampleRate = _sampleRate; - frequency = _frequency; - amplitude = _amplitude; - } + void render(AudioBufferFloat32& frameBuffer); +}; - void render(AudioBufferFloat32& frameBuffer) { + +inline void AudioSourceTone::render(AudioBufferFloat32& frameBuffer) { + float32_t** samples = frameBuffer.getFrameData(); + float32_t yq; + float32_t y; + for (uint16_t i = 0; i < frameBuffer.getFrameCount(); ++i) { - 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] = _amplitude * y; - } + 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] = _amplitude * y; } } -}; +} #endif