From 3301ad64f4a6cb7fb67c8371bb53030f677669a0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 11 Dec 2014 12:32:31 -0800 Subject: [PATCH 01/10] Split initGverb into create/configure --- interface/src/Audio.cpp | 31 ++++++++++++------------------- interface/src/Audio.h | 3 ++- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 101d16d3ba..7514e062ce 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -495,31 +495,24 @@ bool Audio::switchOutputToAudioDevice(const QString& outputDeviceName) { return switchOutputToAudioDevice(getNamedAudioDeviceForMode(QAudio::AudioOutput, outputDeviceName)); } -void Audio::initGverb() { +ty_gverb* Audio::createGverbFilter() { // Initialize a new gverb instance - _gverbLocal = gverb_new(_outputFormat.sampleRate(), _reverbOptions->getMaxRoomSize(), _reverbOptions->getRoomSize(), - _reverbOptions->getReverbTime(), _reverbOptions->getDamping(), _reverbOptions->getSpread(), - _reverbOptions->getInputBandwidth(), _reverbOptions->getEarlyLevel(), - _reverbOptions->getTailLevel()); - _gverb = gverb_new(_outputFormat.sampleRate(), _reverbOptions->getMaxRoomSize(), _reverbOptions->getRoomSize(), + ty_gverb* filter = gverb_new(_outputFormat.sampleRate(), _reverbOptions->getMaxRoomSize(), _reverbOptions->getRoomSize(), _reverbOptions->getReverbTime(), _reverbOptions->getDamping(), _reverbOptions->getSpread(), _reverbOptions->getInputBandwidth(), _reverbOptions->getEarlyLevel(), _reverbOptions->getTailLevel()); + return filter; +} + +void Audio::configureGverbFilter(ty_gverb* filter) { // Configure the instance (these functions are not super well named - they actually set several internal variables) - gverb_set_roomsize(_gverbLocal, _reverbOptions->getRoomSize()); - gverb_set_revtime(_gverbLocal, _reverbOptions->getReverbTime()); - gverb_set_damping(_gverbLocal, _reverbOptions->getDamping()); - gverb_set_inputbandwidth(_gverbLocal, _reverbOptions->getInputBandwidth()); - gverb_set_earlylevel(_gverbLocal, DB_CO(_reverbOptions->getEarlyLevel())); - gverb_set_taillevel(_gverbLocal, DB_CO(_reverbOptions->getTailLevel())); - - gverb_set_roomsize(_gverb, _reverbOptions->getRoomSize()); - gverb_set_revtime(_gverb, _reverbOptions->getReverbTime()); - gverb_set_damping(_gverb, _reverbOptions->getDamping()); - gverb_set_inputbandwidth(_gverb, _reverbOptions->getInputBandwidth()); - gverb_set_earlylevel(_gverb, DB_CO(_reverbOptions->getEarlyLevel())); - gverb_set_taillevel(_gverb, DB_CO(_reverbOptions->getTailLevel())); + gverb_set_roomsize(filter, _reverbOptions->getRoomSize()); + gverb_set_revtime(filter, _reverbOptions->getReverbTime()); + gverb_set_damping(filter, _reverbOptions->getDamping()); + gverb_set_inputbandwidth(filter, _reverbOptions->getInputBandwidth()); + gverb_set_earlylevel(filter, DB_CO(_reverbOptions->getEarlyLevel())); + gverb_set_taillevel(filter, DB_CO(_reverbOptions->getTailLevel())); } void Audio::updateGverbOptions() { diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 47fe00a84c..22a679370d 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -256,7 +256,8 @@ private: void processProceduralAudio(int16_t* monoInput, int numSamples); // Adds Reverb - void initGverb(); + ty_gverb* createGverbFilter(); + void configureGverbFilter(ty_gverb* filter); void updateGverbOptions(); void addReverb(ty_gverb* gverb, int16_t* samples, int numSamples, QAudioFormat& format, bool noEcho = false); From 1f35e130efec51565d4fae59d636ce0ac5fade6c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 11 Dec 2014 12:33:40 -0800 Subject: [PATCH 02/10] Smooth reverb wet level on room edges --- assignment-client/src/audio/AudioMixer.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index c3ec321c77..92f46c29ec 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -475,10 +475,20 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { for (int i = 0; i < _zoneReverbSettings.size(); ++i) { AudioMixerClientData* data = static_cast(node->getLinkedData()); glm::vec3 streamPosition = data->getAvatarAudioStream()->getPosition(); - if (_audioZones[_zoneReverbSettings[i].zone].contains(streamPosition)) { + AABox box = _audioZones[_zoneReverbSettings[i].zone]; + if (box.contains(streamPosition)) { hasReverb = true; reverbTime = _zoneReverbSettings[i].reverbTime; wetLevel = _zoneReverbSettings[i].wetLevel; + + // Modulate wet level with distance to wall + float MIN_ATTENUATION_DISTANCE = 2.0f; + float MAX_ATTENUATION = 0.75f; + glm::vec3 distanceToWalls = (box.getDimensions() / 2.0f) - glm::abs(streamPosition - box.calcCenter()); + float distanceToClosestWall = glm::min(distanceToWalls.x, distanceToWalls.z); + if (distanceToClosestWall < MIN_ATTENUATION_DISTANCE) { + wetLevel *= 1.0f - MAX_ATTENUATION * (1.0f - distanceToClosestWall / MIN_ATTENUATION_DISTANCE); + } break; } } From 3fbed61a675afde5f306197c4ba7fb2bb8a56810 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 11 Dec 2014 12:39:59 -0800 Subject: [PATCH 03/10] Correctly free filters --- interface/src/Audio.cpp | 5 +++++ interface/src/Audio.h | 1 + 2 files changed, 6 insertions(+) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 7514e062ce..9c450b8b64 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -139,6 +139,11 @@ Audio::Audio(QObject* parent) : initGverb(); } +Audio::~Audio() { + gverb_free(_gverb); + gverb_free(_gverbLocal); +} + void Audio::init(QGLWidget *parent) { _micTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mic.svg")); _muteTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mic-mute.svg")); diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 22a679370d..cef49088fa 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -85,6 +85,7 @@ public: // setup for audio I/O Audio(QObject* parent = 0); + ~Audio(); float getLastInputLoudness() const { return glm::max(_lastInputLoudness - _noiseGateMeasuredFloor, 0.0f); } float getTimeSinceLastClip() const { return _timeSinceLastClip; } From 96262fac36d238480a88d0c0e04ed4814e21abf6 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 11 Dec 2014 12:41:18 -0800 Subject: [PATCH 04/10] flush filters on reset / do not update on wetLevel change --- interface/src/Audio.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 9c450b8b64..aebd9d1795 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -157,6 +157,9 @@ void Audio::reset() { _toneSource.reset(); _sourceGain.reset(); _inputGain.reset(); + + gverb_flush(_gverb); + gverb_flush(_gverbLocal); } void Audio::resetStats() { @@ -530,7 +533,7 @@ void Audio::updateGverbOptions() { } if (_zoneReverbOptions.getWetLevel() != _receivedAudioStream.getWetLevel()) { _zoneReverbOptions.setWetLevel(_receivedAudioStream.getWetLevel()); - reverbChanged = true; + // Not part of actual filter config, no need to set reverbChanged to true } if (_reverbOptions != &_zoneReverbOptions) { From 58275ac3dde67c498376b027119be4891835870f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 11 Dec 2014 13:14:48 -0800 Subject: [PATCH 05/10] Flush gverb filters on turn off --- interface/src/Audio.cpp | 39 +++++++++++++++++++++++++++++++-------- interface/src/Audio.h | 2 +- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index aebd9d1795..aec586290e 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -135,8 +135,9 @@ Audio::Audio(QObject* parent) : connect(&_receivedAudioStream, &MixedProcessedAudioStream::addedStereoSamples, this, &Audio::addStereoSamplesToScope, Qt::DirectConnection); connect(&_receivedAudioStream, &MixedProcessedAudioStream::processSamples, this, &Audio::processReceivedSamples, Qt::DirectConnection); - // Initialize GVerb - initGverb(); + // create GVerb filters + _gverb = createGverbFilter(); + _gverbLocal = createGverbFilter(); } Audio::~Audio() { @@ -148,6 +149,10 @@ void Audio::init(QGLWidget *parent) { _micTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mic.svg")); _muteTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/mic-mute.svg")); _boxTextureId = parent->bindTexture(QImage(Application::resourcesPath() + "images/audio-box.svg")); + + // configure filters + configureGverbFilter(_gverb); + configureGverbFilter(_gverbLocal); } void Audio::reset() { @@ -463,12 +468,11 @@ void Audio::start() { _sourceGain.initialize(); _noiseSource.initialize(); _toneSource.initialize(); - _sourceGain.setParameters(0.25f,0.0f); - _inputGain.setParameters(1.0f,0.0f); + _sourceGain.setParameters(0.25f, 0.0f); + _inputGain.setParameters(1.0f, 0.0f); } void Audio::stop() { - _inputFrameBuffer.finalize(); _inputGain.finalize(); _sourceGain.finalize(); @@ -546,7 +550,21 @@ void Audio::updateGverbOptions() { } if (reverbChanged) { - initGverb(); + gverb_free(_gverb); + _gverb = createGverbFilter(); + configureGverbFilter(_gverb); + gverb_free(_gverbLocal); + _gverbLocal = createGverbFilter(); + configureGverbFilter(_gverbLocal); + } +} + +void Audio::setReverb(bool reverb) { + _reverb = reverb; + + if (!_reverb) { + gverb_flush(_gverb); + gverb_flush(_gverbLocal); } } @@ -565,8 +583,13 @@ void Audio::setReverbOptions(const AudioEffectOptions* options) { _scriptReverbOptions.setWetLevel(options->getWetLevel()); if (_reverbOptions == &_scriptReverbOptions) { - // Apply them to the reverb instance(s) - initGverb(); + // Apply them to the reverb instances + gverb_free(_gverb); + _gverb = createGverbFilter(); + configureGverbFilter(_gverb); + gverb_free(_gverbLocal); + _gverbLocal = createGverbFilter(); + configureGverbFilter(_gverbLocal); } } diff --git a/interface/src/Audio.h b/interface/src/Audio.h index cef49088fa..8176e1bdf5 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -165,7 +165,7 @@ public slots: float getInputVolume() const { return (_audioInput) ? _audioInput->volume() : 0.0f; } void setInputVolume(float volume) { if (_audioInput) _audioInput->setVolume(volume); } - void setReverb(bool reverb) { _reverb = reverb; } + void setReverb(bool reverb); void setReverbOptions(const AudioEffectOptions* options); const AudioStreamStats& getAudioMixerAvatarStreamAudioStats() const { return _audioMixerAvatarStreamAudioStats; } From 59e7c1ecc092c6526320624c58e189b1bb3f9e16 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 29 Dec 2014 15:31:27 -0800 Subject: [PATCH 06/10] Avoid int overflow --- interface/src/ModelUploader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index e702d9db76..26eac328ae 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -55,7 +55,7 @@ static const QString MODEL_URL = "/api/v1/models"; static const QString SETTING_NAME = "LastModelUploadLocation"; -static const int BYTES_PER_MEGABYTES = 1024 * 1024; +static const unsigned long BYTES_PER_MEGABYTES = 1024 * 1024; static const unsigned long MAX_SIZE = 50 * 1024 * BYTES_PER_MEGABYTES; // 50 GB (Virtually remove limit) static const int MAX_TEXTURE_SIZE = 1024; static const int TIMEOUT = 1000; From bd9668b9fa259c751c0f59ab128cc84429c9320b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 15 Jan 2015 18:23:43 -0800 Subject: [PATCH 07/10] Change WetLevel modulation --- assignment-client/src/audio/AudioMixer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index ee681b9942..1aa0c75086 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -487,11 +487,11 @@ void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) { // Modulate wet level with distance to wall float MIN_ATTENUATION_DISTANCE = 2.0f; - float MAX_ATTENUATION = 0.75f; + float MAX_ATTENUATION = -12; // dB glm::vec3 distanceToWalls = (box.getDimensions() / 2.0f) - glm::abs(streamPosition - box.calcCenter()); float distanceToClosestWall = glm::min(distanceToWalls.x, distanceToWalls.z); if (distanceToClosestWall < MIN_ATTENUATION_DISTANCE) { - wetLevel *= 1.0f - MAX_ATTENUATION * (1.0f - distanceToClosestWall / MIN_ATTENUATION_DISTANCE); + wetLevel += MAX_ATTENUATION * (1.0f - distanceToClosestWall / MIN_ATTENUATION_DISTANCE); } break; } From 5a81b8a5906be87d6ae2cfec2388b17151976a2e Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 13 Feb 2015 10:17:08 +0100 Subject: [PATCH 08/10] Do all the reverb at the input level --- libraries/audio-client/src/AudioClient.cpp | 53 +++++++++++++--------- libraries/audio-client/src/AudioClient.h | 2 +- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d72fa46fc3..6dcd1fa733 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -616,9 +616,10 @@ void AudioClient::setReverbOptions(const AudioEffectOptions* options) { } } -void AudioClient::addReverb(ty_gverb* gverb, int16_t* samplesData, int numSamples, QAudioFormat& audioFormat, bool noEcho) { +void AudioClient::addReverb(ty_gverb* gverb, int16_t* samplesData, int16_t* reverbAlone, int numSamples, + QAudioFormat& audioFormat, bool noEcho) { float wetFraction = DB_CO(_reverbOptions->getWetLevel()); - float dryFraction = (noEcho) ? 0.0f : (1.0f - wetFraction); + float dryFraction = 1.0f - wetFraction; float lValue,rValue; for (int sample = 0; sample < numSamples; sample += audioFormat.channelCount()) { @@ -633,11 +634,19 @@ void AudioClient::addReverb(ty_gverb* gverb, int16_t* samplesData, int numSample int lResult = glm::clamp((int)(samplesData[j] * dryFraction + lValue * wetFraction), AudioConstants::MIN_SAMPLE_VALUE, AudioConstants::MAX_SAMPLE_VALUE); samplesData[j] = (int16_t)lResult; + + if (noEcho) { + reverbAlone[j] = (int16_t)lValue * wetFraction; + } } else if (j == (sample + 1)) { // right channel int rResult = glm::clamp((int)(samplesData[j] * dryFraction + rValue * wetFraction), AudioConstants::MIN_SAMPLE_VALUE, AudioConstants::MAX_SAMPLE_VALUE); samplesData[j] = (int16_t)rResult; + + if (noEcho) { + reverbAlone[j] = (int16_t)rValue * wetFraction; + } } else { // ignore channels above 2 } @@ -647,9 +656,8 @@ void AudioClient::addReverb(ty_gverb* gverb, int16_t* samplesData, int numSample void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { // If there is server echo, reverb will be applied to the recieved audio stream so no need to have it here. - bool hasLocalReverb = (_reverb || _receivedAudioStream.hasReverb()) && - !_shouldEchoToServer; - if (_muted || !_audioOutput || (!_shouldEchoLocally && !hasLocalReverb)) { + bool hasReverb = _reverb || _receivedAudioStream.hasReverb(); + if (_muted || !_audioOutput || (!_shouldEchoLocally && !hasReverb)) { return; } @@ -671,24 +679,30 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { } } - static QByteArray loopBackByteArray; - loopBackByteArray.resize(numDestinationSamplesRequired(_inputFormat, _outputFormat, - inputByteArray.size() / sizeof(int16_t)) * sizeof(int16_t)); + int numInputSamples = inputByteArray.size() / sizeof(int16_t); + int16_t* inputSamples = reinterpret_cast(inputByteArray.data()); - possibleResampling(_loopbackResampler, - reinterpret_cast(inputByteArray.data()), - reinterpret_cast(loopBackByteArray.data()), - inputByteArray.size() / sizeof(int16_t), loopBackByteArray.size() / sizeof(int16_t), - _inputFormat, _outputFormat); + static QByteArray reverbAlone; + reverbAlone.resize(inputByteArray.size()); + int16_t* reverbAloneSamples = reinterpret_cast(reverbAlone.data()); - if (hasLocalReverb) { - int16_t* loopbackSamples = reinterpret_cast(loopBackByteArray.data()); - int numLoopbackSamples = loopBackByteArray.size() / sizeof(int16_t); + if (hasReverb) { updateGverbOptions(); - addReverb(_gverbLocal, loopbackSamples, numLoopbackSamples, _outputFormat, !_shouldEchoLocally); + addReverb(_gverbLocal, inputSamples, reverbAloneSamples, numInputSamples, + _outputFormat, !_shouldEchoLocally); } if (_loopbackOutputDevice) { + static QByteArray loopBackByteArray; + int numLoopbackSamples = numDestinationSamplesRequired(_inputFormat, _outputFormat, numInputSamples); + loopBackByteArray.resize(numLoopbackSamples * sizeof(int16_t)); + + possibleResampling(_loopbackResampler, + (_shouldEchoLocally) ? inputSamples : reverbAloneSamples, + reinterpret_cast(loopBackByteArray.data()), + numInputSamples, numLoopbackSamples, + _inputFormat, _outputFormat); + _loopbackOutputDevice->write(loopBackByteArray); } } @@ -884,11 +898,6 @@ void AudioClient::processReceivedSamples(const QByteArray& inputBuffer, QByteArr reinterpret_cast(outputBuffer.data()), numNetworkOutputSamples, numDeviceOutputSamples, _desiredOutputFormat, _outputFormat); - - if(_reverb || _receivedAudioStream.hasReverb()) { - updateGverbOptions(); - addReverb(_gverb, (int16_t*)outputBuffer.data(), numDeviceOutputSamples, _outputFormat); - } } void AudioClient::sendMuteEnvironmentPacket() { diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 0adf60fea8..183d8bc63f 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -251,7 +251,7 @@ private: ty_gverb* createGverbFilter(); void configureGverbFilter(ty_gverb* filter); void updateGverbOptions(); - void addReverb(ty_gverb* gverb, int16_t* samples, int numSamples, QAudioFormat& format, bool noEcho = false); + void addReverb(ty_gverb* gverb, int16_t* samples, int16_t* reverbAlone, int numSamples, QAudioFormat& format, bool noEcho = false); void handleLocalEchoAndReverb(QByteArray& inputByteArray); From f2790302839f3a150760efe077c4cfd9a26ab7b4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 16 Feb 2015 16:15:03 +0100 Subject: [PATCH 09/10] Remove _gverbLocal --- libraries/audio-client/src/AudioClient.cpp | 19 ++----------------- libraries/audio-client/src/AudioClient.h | 1 - 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index fd4f23fabf..7277ec4d90 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -104,7 +104,6 @@ AudioClient::AudioClient() : _audioSourceInjectEnabled(false), _reverb(false), _reverbOptions(&_scriptReverbOptions), - _gverbLocal(NULL), _gverb(NULL), _inputToNetworkResampler(NULL), _networkToOutputResampler(NULL), @@ -130,20 +129,14 @@ AudioClient::AudioClient() : connect(updateTimer, &QTimer::timeout, this, &AudioClient::checkDevices); updateTimer->start(DEVICE_CHECK_INTERVAL_MSECS); - // create GVerb filters + // create GVerb filter _gverb = createGverbFilter(); - _gverbLocal = createGverbFilter(); - // configure filters configureGverbFilter(_gverb); - configureGverbFilter(_gverbLocal); } AudioClient::~AudioClient() { stop(); - if (_gverbLocal) { - gverb_free(_gverbLocal); - } if (_gverb) { gverb_free(_gverb); } @@ -158,7 +151,6 @@ void AudioClient::reset() { _inputGain.reset(); gverb_flush(_gverb); - gverb_flush(_gverbLocal); } void AudioClient::audioMixerKilled() { @@ -582,9 +574,6 @@ void AudioClient::updateGverbOptions() { gverb_free(_gverb); _gverb = createGverbFilter(); configureGverbFilter(_gverb); - gverb_free(_gverbLocal); - _gverbLocal = createGverbFilter(); - configureGverbFilter(_gverbLocal); } } @@ -593,7 +582,6 @@ void AudioClient::setReverb(bool reverb) { if (!_reverb) { gverb_flush(_gverb); - gverb_flush(_gverbLocal); } } @@ -616,9 +604,6 @@ void AudioClient::setReverbOptions(const AudioEffectOptions* options) { gverb_free(_gverb); _gverb = createGverbFilter(); configureGverbFilter(_gverb); - gverb_free(_gverbLocal); - _gverbLocal = createGverbFilter(); - configureGverbFilter(_gverbLocal); } } @@ -694,7 +679,7 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { if (hasReverb) { updateGverbOptions(); - addReverb(_gverbLocal, inputSamples, reverbAloneSamples, numInputSamples, + addReverb(_gverb, inputSamples, reverbAloneSamples, numInputSamples, _outputFormat, !_shouldEchoLocally); } diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index bbba55afd2..d091fc0cc3 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -243,7 +243,6 @@ private: AudioEffectOptions _scriptReverbOptions; AudioEffectOptions _zoneReverbOptions; AudioEffectOptions* _reverbOptions; - ty_gverb* _gverbLocal; ty_gverb* _gverb; // possible soxr streams needed for resample From 17ce2e820fe9bf06bb054305f49d029662f90b80 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 16 Feb 2015 17:30:20 +0100 Subject: [PATCH 10/10] Cleanup addReverb() code --- libraries/audio-client/src/AudioClient.cpp | 39 ++++++++++++---------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 7277ec4d90..2264e31131 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -658,6 +658,10 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { if (!_loopbackOutputDevice && _loopbackAudioOutput) { // we didn't have the loopback output device going so set that up now _loopbackOutputDevice = _loopbackAudioOutput->start(); + + if (!_loopbackOutputDevice) { + return; + } } // do we need to setup a resampler? @@ -670,32 +674,31 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { } } - int numInputSamples = inputByteArray.size() / sizeof(int16_t); - int16_t* inputSamples = reinterpret_cast(inputByteArray.data()); + static QByteArray reverbAlone; // Intermediary for local reverb with no echo + static QByteArray loopBackByteArray; - static QByteArray reverbAlone; - reverbAlone.resize(inputByteArray.size()); + int numInputSamples = inputByteArray.size() / sizeof(int16_t); + int numLoopbackSamples = numDestinationSamplesRequired(_inputFormat, _outputFormat, numInputSamples); + + reverbAlone.resize(numInputSamples * sizeof(int16_t)); + loopBackByteArray.resize(numLoopbackSamples * sizeof(int16_t)); + + int16_t* inputSamples = reinterpret_cast(inputByteArray.data()); int16_t* reverbAloneSamples = reinterpret_cast(reverbAlone.data()); + int16_t* loopbackSamples = reinterpret_cast(loopBackByteArray.data()); if (hasReverb) { updateGverbOptions(); addReverb(_gverb, inputSamples, reverbAloneSamples, numInputSamples, - _outputFormat, !_shouldEchoLocally); + _inputFormat, !_shouldEchoLocally); } - if (_loopbackOutputDevice) { - static QByteArray loopBackByteArray; - int numLoopbackSamples = numDestinationSamplesRequired(_inputFormat, _outputFormat, numInputSamples); - loopBackByteArray.resize(numLoopbackSamples * sizeof(int16_t)); - - possibleResampling(_loopbackResampler, - (_shouldEchoLocally) ? inputSamples : reverbAloneSamples, - reinterpret_cast(loopBackByteArray.data()), - numInputSamples, numLoopbackSamples, - _inputFormat, _outputFormat); - - _loopbackOutputDevice->write(loopBackByteArray); - } + possibleResampling(_loopbackResampler, + (_shouldEchoLocally) ? inputSamples : reverbAloneSamples, loopbackSamples, + numInputSamples, numLoopbackSamples, + _inputFormat, _outputFormat); + + _loopbackOutputDevice->write(loopBackByteArray); } void AudioClient::handleAudioInput() {