From 3f3d922ecaefaa94c2f791b28e3be419a20a91a2 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Mon, 12 Dec 2016 12:01:02 -0800 Subject: [PATCH 1/3] No longer applying volume when reading audio injector buffer Since we also apply the gain in HRTF (on both server and client), the mono sources sort of had volume^2 applied to them. --- libraries/audio-client/src/AudioClient.cpp | 2 +- .../audio/src/AudioInjectorLocalBuffer.cpp | 17 +++-------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 72a20b6792..0d5436f787 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1132,7 +1132,7 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) { // stereo gets directly mixed into mixBuffer for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; i++) { - mixBuffer[i] += (float)_scratchBuffer[i] * (1/32768.0f); + mixBuffer[i] += (float)_scratchBuffer[i] * (1/32768.0f) * injector->getVolume(); } } else { diff --git a/libraries/audio/src/AudioInjectorLocalBuffer.cpp b/libraries/audio/src/AudioInjectorLocalBuffer.cpp index 27e93a678e..d3b78ffd0e 100644 --- a/libraries/audio/src/AudioInjectorLocalBuffer.cpp +++ b/libraries/audio/src/AudioInjectorLocalBuffer.cpp @@ -36,17 +36,6 @@ bool AudioInjectorLocalBuffer::seek(qint64 pos) { } } -void copy(char* to, char* from, int size, qreal factor) { - int16_t* toArray = (int16_t*) to; - int16_t* fromArray = (int16_t*) from; - int sampleSize = size / sizeof(int16_t); - - for (int i = 0; i < sampleSize; i++) { - *toArray = factor * (*fromArray); - toArray++; - fromArray++; - } -} qint64 AudioInjectorLocalBuffer::readData(char* data, qint64 maxSize) { if (!_isStopped) { @@ -60,7 +49,7 @@ qint64 AudioInjectorLocalBuffer::readData(char* data, qint64 maxSize) { bytesRead = bytesToEnd; } - copy(data, _rawAudioArray.data() + _currentOffset, bytesRead, _volume); + memcpy(data, _rawAudioArray.data() + _currentOffset, bytesRead); // now check if we are supposed to loop and if we can copy more from the beginning if (_shouldLoop && maxSize != bytesRead) { @@ -88,7 +77,7 @@ qint64 AudioInjectorLocalBuffer::recursiveReadFromFront(char* data, qint64 maxSi } // copy that amount - copy(data, _rawAudioArray.data(), bytesRead, _volume); + memcpy(data, _rawAudioArray.data(), bytesRead); // check if we need to call ourselves again and pull from the front again if (bytesRead < maxSize) { @@ -97,4 +86,4 @@ qint64 AudioInjectorLocalBuffer::recursiveReadFromFront(char* data, qint64 maxSi _currentOffset = bytesRead; return bytesRead; } -} \ No newline at end of file +} From d6b99ce57e53664f9108464200b29ca14c58964b Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 13 Dec 2016 17:34:56 -0800 Subject: [PATCH 2/3] Removed volume from AudioInjectorLocalBuffer Since it doesn't use it. Now clamping at 0-1 in the AudioInjector::getVolume() call. This is better -- one spot so it now always gets clamped. --- libraries/audio/src/AudioInjector.cpp | 1 - libraries/audio/src/AudioInjector.h | 2 +- libraries/audio/src/AudioInjectorLocalBuffer.cpp | 1 - libraries/audio/src/AudioInjectorLocalBuffer.h | 2 -- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index f996361690..e2261c0205 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -166,7 +166,6 @@ bool AudioInjector::injectLocally() { _localBuffer->open(QIODevice::ReadOnly); _localBuffer->setShouldLoop(_options.loop); - _localBuffer->setVolume(_options.volume); // give our current send position to the local buffer _localBuffer->setCurrentOffset(_currentSendOffset); diff --git a/libraries/audio/src/AudioInjector.h b/libraries/audio/src/AudioInjector.h index 2abc445034..c5e741365a 100644 --- a/libraries/audio/src/AudioInjector.h +++ b/libraries/audio/src/AudioInjector.h @@ -63,7 +63,7 @@ public: AudioFOA& getLocalFOA() { return _localFOA; } bool isLocalOnly() const { return _options.localOnly; } - float getVolume() const { return _options.volume; } + float getVolume() const { return glm::clamp(_options.volume, 0.0f, 1.0f); } glm::vec3 getPosition() const { return _options.position; } glm::quat getOrientation() const { return _options.orientation; } bool isStereo() const { return _options.stereo; } diff --git a/libraries/audio/src/AudioInjectorLocalBuffer.cpp b/libraries/audio/src/AudioInjectorLocalBuffer.cpp index d3b78ffd0e..a9fb4d9f78 100644 --- a/libraries/audio/src/AudioInjectorLocalBuffer.cpp +++ b/libraries/audio/src/AudioInjectorLocalBuffer.cpp @@ -17,7 +17,6 @@ AudioInjectorLocalBuffer::AudioInjectorLocalBuffer(const QByteArray& rawAudioArr _shouldLoop(false), _isStopped(false), _currentOffset(0), - _volume(1.0f) { } diff --git a/libraries/audio/src/AudioInjectorLocalBuffer.h b/libraries/audio/src/AudioInjectorLocalBuffer.h index 988b622ce7..07d8ae5b9f 100644 --- a/libraries/audio/src/AudioInjectorLocalBuffer.h +++ b/libraries/audio/src/AudioInjectorLocalBuffer.h @@ -30,7 +30,6 @@ public: void setShouldLoop(bool shouldLoop) { _shouldLoop = shouldLoop; } void setCurrentOffset(int currentOffset) { _currentOffset = currentOffset; } - void setVolume(float volume) { _volume = glm::clamp(volume, 0.0f, 1.0f); } private: qint64 recursiveReadFromFront(char* data, qint64 maxSize); @@ -40,7 +39,6 @@ private: bool _isStopped; int _currentOffset; - float _volume; }; #endif // hifi_AudioInjectorLocalBuffer_h From a8157ae2cdaaa5e5dda1e69a75741032379543ae Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 13 Dec 2016 17:48:30 -0800 Subject: [PATCH 3/3] Typo, plus some CR feedback --- libraries/audio-client/src/AudioClient.cpp | 3 ++- libraries/audio/src/AudioInjectorLocalBuffer.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 0d5436f787..aba407f38e 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1131,8 +1131,9 @@ void AudioClient::mixLocalAudioInjectors(float* mixBuffer) { } else if (injector->isStereo()) { // stereo gets directly mixed into mixBuffer + float gain = injector->getVolume(); for (int i = 0; i < AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; i++) { - mixBuffer[i] += (float)_scratchBuffer[i] * (1/32768.0f) * injector->getVolume(); + mixBuffer[i] += (float)_scratchBuffer[i] * (1/32768.0f) * gain; } } else { diff --git a/libraries/audio/src/AudioInjectorLocalBuffer.cpp b/libraries/audio/src/AudioInjectorLocalBuffer.cpp index a9fb4d9f78..049adb0cc6 100644 --- a/libraries/audio/src/AudioInjectorLocalBuffer.cpp +++ b/libraries/audio/src/AudioInjectorLocalBuffer.cpp @@ -16,7 +16,7 @@ AudioInjectorLocalBuffer::AudioInjectorLocalBuffer(const QByteArray& rawAudioArr _rawAudioArray(rawAudioArray), _shouldLoop(false), _isStopped(false), - _currentOffset(0), + _currentOffset(0) { }