diff options
Diffstat (limited to 'samples/iolib/src/main/cpp/player/SimpleMultiPlayer.cpp')
-rw-r--r-- | samples/iolib/src/main/cpp/player/SimpleMultiPlayer.cpp | 68 |
1 files changed, 43 insertions, 25 deletions
diff --git a/samples/iolib/src/main/cpp/player/SimpleMultiPlayer.cpp b/samples/iolib/src/main/cpp/player/SimpleMultiPlayer.cpp index aa133bee..4948d88a 100644 --- a/samples/iolib/src/main/cpp/player/SimpleMultiPlayer.cpp +++ b/samples/iolib/src/main/cpp/player/SimpleMultiPlayer.cpp @@ -34,11 +34,12 @@ namespace iolib { constexpr int32_t kBufferSizeInBursts = 2; // Use 2 bursts as the buffer size (double buffer) SimpleMultiPlayer::SimpleMultiPlayer() - : mChannelCount(0), mOutputReset(false) + : mChannelCount(0), mOutputReset(false), mSampleRate(0), mNumSampleBuffers(0) {} -DataCallbackResult SimpleMultiPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, - int32_t numFrames) { +DataCallbackResult SimpleMultiPlayer::MyDataCallback::onAudioReady(AudioStream *oboeStream, + void *audioData, + int32_t numFrames) { StreamState streamState = oboeStream->getState(); if (streamState != StreamState::Open && streamState != StreamState::Started) { @@ -48,40 +49,42 @@ DataCallbackResult SimpleMultiPlayer::onAudioReady(AudioStream *oboeStream, void __android_log_print(ANDROID_LOG_ERROR, TAG, " streamState::Disconnected"); } - memset(audioData, 0, static_cast<size_t>(numFrames) * static_cast<size_t>(mChannelCount) - * sizeof(float)); + memset(audioData, 0, static_cast<size_t>(numFrames) * static_cast<size_t> + (mParent->mChannelCount) * sizeof(float)); // OneShotSampleSource* sources = mSampleSources.get(); - for(int32_t index = 0; index < mNumSampleBuffers; index++) { - if (mSampleSources[index]->isPlaying()) { - mSampleSources[index]->mixAudio((float*)audioData, mChannelCount, numFrames); + for(int32_t index = 0; index < mParent->mNumSampleBuffers; index++) { + if (mParent->mSampleSources[index]->isPlaying()) { + mParent->mSampleSources[index]->mixAudio((float*)audioData, mParent->mChannelCount, + numFrames); } } return DataCallbackResult::Continue; } -void SimpleMultiPlayer::onErrorAfterClose(AudioStream *oboeStream, Result error) { +void SimpleMultiPlayer::MyErrorCallback::onErrorAfterClose(AudioStream *oboeStream, Result error) { __android_log_print(ANDROID_LOG_INFO, TAG, "==== onErrorAfterClose() error:%d", error); - resetAll(); - if (openStream() && startStream()) { - mOutputReset = true; + mParent->resetAll(); + if (mParent->openStream() && mParent->startStream()) { + mParent->mOutputReset = true; } } -void SimpleMultiPlayer::onErrorBeforeClose(AudioStream *, Result error) { - __android_log_print(ANDROID_LOG_INFO, TAG, "==== onErrorBeforeClose() error:%d", error); -} - bool SimpleMultiPlayer::openStream() { __android_log_print(ANDROID_LOG_INFO, TAG, "openStream()"); + // Use shared_ptr to prevent use of a deleted callback. + mDataCallback = std::make_shared<MyDataCallback>(this); + mErrorCallback = std::make_shared<MyErrorCallback>(this); + // Create an audio stream AudioStreamBuilder builder; builder.setChannelCount(mChannelCount); // we will resample source data to device rate, so take default sample rate - builder.setCallback(this); + builder.setDataCallback(mDataCallback); + builder.setErrorCallback(mErrorCallback); builder.setPerformanceMode(PerformanceMode::LowLatency); builder.setSharingMode(SharingMode::Exclusive); builder.setSampleRateConversionQuality(SampleRateConversionQuality::Medium); @@ -113,16 +116,31 @@ bool SimpleMultiPlayer::openStream() { } bool SimpleMultiPlayer::startStream() { - Result result = mAudioStream->requestStart(); - if (result != Result::OK){ - __android_log_print( - ANDROID_LOG_ERROR, - TAG, - "requestStart failed. Error: %s", convertToText(result)); - return false; + int tryCount = 0; + while (tryCount < 3) { + bool wasOpenSuccessful = true; + // Assume that apenStream() was called successfully before startStream() call. + if (tryCount > 0) { + usleep(20 * 1000); // Sleep between tries to give the system time to settle. + wasOpenSuccessful = openStream(); // Try to open the stream again after the first try. + } + if (wasOpenSuccessful) { + Result result = mAudioStream->requestStart(); + if (result != Result::OK){ + __android_log_print( + ANDROID_LOG_ERROR, + TAG, + "requestStart failed. Error: %s", convertToText(result)); + mAudioStream->close(); + mAudioStream.reset(); + } else { + return true; + } + } + tryCount++; } - return true; + return false; } void SimpleMultiPlayer::setupAudioStream(int32_t channelCount) { |