diff --git a/src/opensles/AudioStreamOpenSLES.cpp b/src/opensles/AudioStreamOpenSLES.cpp index b99568ae6..bc9e2c349 100644 --- a/src/opensles/AudioStreamOpenSLES.cpp +++ b/src/opensles/AudioStreamOpenSLES.cpp @@ -130,7 +130,9 @@ Result AudioStreamOpenSLES::configureBufferSizes(int32_t sampleRate) { return Result::ErrorInvalidFormat; // causing bytesPerFrame == 0 } - mCallbackBuffer = std::make_unique(mBytesPerCallback); + for (int i = 0; i < kBufferQueueLength; ++i) { + mCallbackBuffer[i] = std::make_unique(mBytesPerCallback); + } if (!usingFIFO()) { mBufferCapacityInFrames = mFramesPerBurst * kBufferQueueLength; @@ -292,7 +294,10 @@ Result AudioStreamOpenSLES::close_l() { } SLresult AudioStreamOpenSLES::enqueueCallbackBuffer(SLAndroidSimpleBufferQueueItf bq) { - return (*bq)->Enqueue(bq, mCallbackBuffer.get(), mBytesPerCallback); + SLresult result = (*bq)->Enqueue( + bq, mCallbackBuffer[mCallbackBufferIndex].get(), mBytesPerCallback); + mCallbackBufferIndex = (mCallbackBufferIndex + 1) % kBufferQueueLength; + return result; } int32_t AudioStreamOpenSLES::getBufferDepth(SLAndroidSimpleBufferQueueItf bq) { @@ -304,7 +309,8 @@ int32_t AudioStreamOpenSLES::getBufferDepth(SLAndroidSimpleBufferQueueItf bq) { void AudioStreamOpenSLES::processBufferCallback(SLAndroidSimpleBufferQueueItf bq) { bool stopStream = false; // Ask the app callback to process the buffer. - DataCallbackResult result = fireDataCallback(mCallbackBuffer.get(), mFramesPerCallback); + DataCallbackResult result = + fireDataCallback(mCallbackBuffer[mCallbackBufferIndex].get(), mFramesPerCallback); if (result == DataCallbackResult::Continue) { // Pass the buffer to OpenSLES. SLresult enqueueResult = enqueueCallbackBuffer(bq); @@ -327,6 +333,7 @@ void AudioStreamOpenSLES::processBufferCallback(SLAndroidSimpleBufferQueueItf bq } if (stopStream) { requestStop(); + mCallbackBufferIndex = 0; } } diff --git a/src/opensles/AudioStreamOpenSLES.h b/src/opensles/AudioStreamOpenSLES.h index ebed3e546..18a13d0d3 100644 --- a/src/opensles/AudioStreamOpenSLES.h +++ b/src/opensles/AudioStreamOpenSLES.h @@ -121,7 +121,8 @@ class AudioStreamOpenSLES : public AudioStreamBuffered { MonotonicCounter mPositionMillis; // for tracking OpenSL ES service position private: - std::unique_ptr mCallbackBuffer; + std::unique_ptr mCallbackBuffer[kBufferQueueLength]; + int mCallbackBufferIndex = 0; std::atomic mState{StreamState::Uninitialized}; };