From cb4aab3902a7fccb41cf059b92d36dddba174f19 Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Mon, 8 Sep 2014 15:28:55 -0700 Subject: [PATCH 1/2] allocate 8x buffer size (for pulse audio) / more audioGain loop unrolling w/frame alignment check --- interface/src/Audio.cpp | 10 ++- libraries/audio/src/AudioGain.h | 106 ++++++++++++++++++++++---------- 2 files changed, 81 insertions(+), 35 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 83b3ff299d..ff0f2fd759 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -403,6 +403,9 @@ void linearResampling(const int16_t* sourceSamples, int16_t* destinationSamples, } } +// $$$$$$$$$$$$$$ TEMPORARY $craighs$ +float _loopbackOutputToInputRatio; + void Audio::start() { // set up the desired audio format @@ -431,7 +434,10 @@ void Audio::start() { qDebug() << "Unable to set up audio output because of a problem with output format."; } - _inputFrameBuffer.initialize( _inputFormat.channelCount(), _audioInput->bufferSize() * 4 ); + _loopbackOutputToInputRatio = (_outputFormat.sampleRate() / (float) _inputFormat.sampleRate()) + * (_outputFormat.channelCount() / _inputFormat.channelCount()); + + _inputFrameBuffer.initialize( _inputFormat.channelCount(), _audioInput->bufferSize() * 8 ); _peq.initialize( _inputFormat.sampleRate() ); _inputGain.initialize(); _sourceGain.initialize(); @@ -535,6 +541,8 @@ void Audio::handleAudioInput() { float loopbackOutputToInputRatio = (_outputFormat.sampleRate() / (float) _inputFormat.sampleRate()) * (_outputFormat.channelCount() / _inputFormat.channelCount()); + assert(loopbackOutputToInputRatio == _loopbackOutputToInputRatio); + QByteArray loopBackByteArray(inputByteArray.size() * loopbackOutputToInputRatio, 0); linearResampling((int16_t*) inputByteArray.data(), (int16_t*) loopBackByteArray.data(), diff --git a/libraries/audio/src/AudioGain.h b/libraries/audio/src/AudioGain.h index c3fa299b02..ac1923528b 100644 --- a/libraries/audio/src/AudioGain.h +++ b/libraries/audio/src/AudioGain.h @@ -55,40 +55,78 @@ public: } float32_t** samples = frameBuffer.getFrameData(); - for (uint16_t j = 0; j < frameBuffer.getChannelCount(); ++j) { - for (uint16_t i = 0; i < frameBuffer.getFrameCount(); i += 32) { - samples[j][i + 0] *= _gain; - samples[j][i + 1] *= _gain; - samples[j][i + 2] *= _gain; - samples[j][i + 3] *= _gain; - samples[j][i + 4] *= _gain; - samples[j][i + 5] *= _gain; - samples[j][i + 6] *= _gain; - samples[j][i + 7] *= _gain; - samples[j][i + 8] *= _gain; - samples[j][i + 9] *= _gain; - samples[j][i + 10] *= _gain; - samples[j][i + 11] *= _gain; - samples[j][i + 12] *= _gain; - samples[j][i + 13] *= _gain; - samples[j][i + 14] *= _gain; - samples[j][i + 15] *= _gain; - samples[j][i + 16] *= _gain; - samples[j][i + 17] *= _gain; - samples[j][i + 18] *= _gain; - samples[j][i + 19] *= _gain; - samples[j][i + 20] *= _gain; - samples[j][i + 21] *= _gain; - samples[j][i + 22] *= _gain; - samples[j][i + 23] *= _gain; - samples[j][i + 24] *= _gain; - samples[j][i + 25] *= _gain; - samples[j][i + 26] *= _gain; - samples[j][i + 27] *= _gain; - samples[j][i + 28] *= _gain; - samples[j][i + 29] *= _gain; - samples[j][i + 30] *= _gain; - samples[j][i + 31] *= _gain; + + bool frameAlignment16 = (frameBuffer.getFrameCount() & 0x0F) == 0; + if (frameAlignment16) { + + if (frameBuffer.getChannelCount() == 1) { + + for (uint16_t i = 0; i < frameBuffer.getFrameCount(); i += 16) { + samples[0][i + 0] *= _gain; + samples[0][i + 1] *= _gain; + samples[0][i + 2] *= _gain; + samples[0][i + 3] *= _gain; + samples[0][i + 4] *= _gain; + samples[0][i + 5] *= _gain; + samples[0][i + 6] *= _gain; + samples[0][i + 7] *= _gain; + samples[0][i + 8] *= _gain; + samples[0][i + 9] *= _gain; + samples[0][i + 10] *= _gain; + samples[0][i + 11] *= _gain; + samples[0][i + 12] *= _gain; + samples[0][i + 13] *= _gain; + samples[0][i + 14] *= _gain; + samples[0][i + 15] *= _gain; + } + } + else if (frameBuffer.getChannelCount() == 2) { + + for (uint16_t i = 0; i < frameBuffer.getFrameCount(); i += 16) { + samples[0][i + 0] *= _gain; + samples[0][i + 1] *= _gain; + samples[0][i + 2] *= _gain; + samples[0][i + 3] *= _gain; + samples[0][i + 4] *= _gain; + samples[0][i + 5] *= _gain; + samples[0][i + 6] *= _gain; + samples[0][i + 7] *= _gain; + samples[0][i + 8] *= _gain; + samples[0][i + 9] *= _gain; + samples[0][i + 10] *= _gain; + samples[0][i + 11] *= _gain; + samples[0][i + 12] *= _gain; + samples[0][i + 13] *= _gain; + samples[0][i + 14] *= _gain; + samples[0][i + 15] *= _gain; + samples[1][i + 0] *= _gain; + samples[1][i + 1] *= _gain; + samples[1][i + 2] *= _gain; + samples[1][i + 3] *= _gain; + samples[1][i + 4] *= _gain; + samples[1][i + 5] *= _gain; + samples[1][i + 6] *= _gain; + samples[1][i + 7] *= _gain; + samples[1][i + 8] *= _gain; + samples[1][i + 9] *= _gain; + samples[1][i + 10] *= _gain; + samples[1][i + 11] *= _gain; + samples[1][i + 12] *= _gain; + samples[1][i + 13] *= _gain; + samples[1][i + 14] *= _gain; + samples[1][i + 15] *= _gain; + } + } + else { + assert("unsupported channel format"); + } + } + else { + + for (uint16_t j = 0; j < frameBuffer.getChannelCount(); ++j) { + for (uint16_t i = 0; i < frameBuffer.getFrameCount(); i += 1) { + samples[j][i] *= _gain; + } } } } From 424cffcd9990190825835dc307ea736667ab41fc Mon Sep 17 00:00:00 2001 From: Craig Hansen-Sturm Date: Mon, 8 Sep 2014 15:33:24 -0700 Subject: [PATCH 2/2] remove stray debugging info --- interface/src/Audio.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index ff0f2fd759..9e03a9df51 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -403,9 +403,6 @@ void linearResampling(const int16_t* sourceSamples, int16_t* destinationSamples, } } -// $$$$$$$$$$$$$$ TEMPORARY $craighs$ -float _loopbackOutputToInputRatio; - void Audio::start() { // set up the desired audio format @@ -434,9 +431,6 @@ void Audio::start() { qDebug() << "Unable to set up audio output because of a problem with output format."; } - _loopbackOutputToInputRatio = (_outputFormat.sampleRate() / (float) _inputFormat.sampleRate()) - * (_outputFormat.channelCount() / _inputFormat.channelCount()); - _inputFrameBuffer.initialize( _inputFormat.channelCount(), _audioInput->bufferSize() * 8 ); _peq.initialize( _inputFormat.sampleRate() ); _inputGain.initialize(); @@ -541,8 +535,6 @@ void Audio::handleAudioInput() { float loopbackOutputToInputRatio = (_outputFormat.sampleRate() / (float) _inputFormat.sampleRate()) * (_outputFormat.channelCount() / _inputFormat.channelCount()); - assert(loopbackOutputToInputRatio == _loopbackOutputToInputRatio); - QByteArray loopBackByteArray(inputByteArray.size() * loopbackOutputToInputRatio, 0); linearResampling((int16_t*) inputByteArray.data(), (int16_t*) loopBackByteArray.data(),