From 9e157ff1c5bdd48013ae6e5f8c808b875b0f3019 Mon Sep 17 00:00:00 2001 From: matsukaze Date: Fri, 4 Apr 2014 16:17:49 -0700 Subject: [PATCH] More audio fixes. --- interface/src/Audio.cpp | 22 +++++++++++++++------- interface/src/Audio.h | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 33fc6ec4d2..5efb120793 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -624,7 +624,7 @@ unsigned int Audio::timeValToSampleTick(const quint64 time, int sampleRate) { return sample; } -void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, QByteArray& spatialAudio, unsigned int numSamples) { +void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const QByteArray& spatialAudio, unsigned int numSamples) { // Calculate the number of remaining samples available. The source spatial audio buffer will get // clipped if there are insufficient samples available in the accumulation buffer. @@ -673,10 +673,12 @@ void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, QByteArray& spatial unsigned int accumulationCt = (_spatialAudioFinish - sampleTime) * _desiredOutputFormat.channelCount(); accumulationCt = (accumulationCt < numSamples) ? accumulationCt : numSamples; - int16_t* spatial = reinterpret_cast(spatialAudio.data()); + const int16_t* spatial = reinterpret_cast(spatialAudio.data()); int j = 0; for (int i = accumulationCt; --i >= 0; j++) { - int tmp = _spatialAudioRingBuffer[j + offset] + spatial[j]; + int t1 = _spatialAudioRingBuffer[j + offset]; + int t2 = spatial[j]; + int tmp = t1 + t2; _spatialAudioRingBuffer[j + offset] = static_cast(glm::clamp(tmp, std::numeric_limits::min(), std::numeric_limits::max())); } @@ -686,6 +688,7 @@ void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, QByteArray& spatial sampleCt = (remaining < sampleCt) ? remaining : sampleCt; if (sampleCt) { _spatialAudioRingBuffer.writeSamples((int16_t*)spatialAudio.data() + accumulationCt, sampleCt); + // Extend the finish time by the amount of unoverlapped samples _spatialAudioFinish += sampleCt / _desiredOutputFormat.channelCount(); } } @@ -744,12 +747,12 @@ void Audio::processReceivedAudio(unsigned int sampleTime, AudioRingBuffer& ringB if (_processSpatialAudio) { unsigned int sampleTime = _spatialAudioStart; QByteArray buffer; - buffer.resize(numDeviceOutputSamples * sizeof(int16_t)); + buffer.resize(numNetworkOutputSamples * sizeof(int16_t)); - ringBuffer.readSamples((int16_t*)buffer.data(), numDeviceOutputSamples); + ringBuffer.readSamples((int16_t*)buffer.data(), numNetworkOutputSamples); // Accumulate direct transmission of audio from sender to receiver addSpatialAudioToBuffer(sampleTime, buffer, numNetworkOutputSamples); - //addSpatialAudioToBuffer(sampleTime + 48000, ringBuffer); + //addSpatialAudioToBuffer(sampleTime + 48000, buffer, numNetworkOutputSamples); // Send audio off for spatial processing emit processSpatialAudio(sampleTime, buffer, _desiredOutputFormat); @@ -759,7 +762,7 @@ void Audio::processReceivedAudio(unsigned int sampleTime, AudioRingBuffer& ringB _spatialAudioRingBuffer.readSamples(ringBufferSamples, numNetworkOutputSamples); // Advance the start point for the next packet of audio to arrive - _spatialAudioStart += numNetworkOutputSamples; + _spatialAudioStart += numNetworkOutputSamples / _desiredOutputFormat.channelCount(); // Advance the read position by the same amount //ringBuffer.shiftReadPosition(numNetworkOutputSamples); @@ -838,6 +841,11 @@ void Audio::toggleToneInjection() { void Audio::toggleAudioSpatialProcessing() { _processSpatialAudio = !_processSpatialAudio; + if (_processSpatialAudio) { + _spatialAudioStart = 0; + _spatialAudioFinish = 0; + _spatialAudioRingBuffer.reset(); + } } // Take a pointer to the acquired microphone input samples and add procedural sounds diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 7520d97c0b..11ad235289 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -78,7 +78,7 @@ public slots: void start(); void stop(); void addReceivedAudioToBuffer(const QByteArray& audioByteArray); - void addSpatialAudioToBuffer(unsigned int sampleTime, QByteArray& spatialAudio, unsigned int numSamples); + void addSpatialAudioToBuffer(unsigned int sampleTime, const QByteArray& spatialAudio, unsigned int numSamples); void handleAudioInput(); void reset(); void toggleMute();