diff options
-rw-r--r-- | include/oboe/AudioStream.h | 7 | ||||
-rw-r--r-- | samples/hello-oboe/src/main/cpp/PlayAudioEngine.cpp | 4 | ||||
-rw-r--r-- | src/aaudio/AudioStreamAAudio.cpp | 6 | ||||
-rw-r--r-- | src/aaudio/AudioStreamAAudio.h | 2 | ||||
-rw-r--r-- | src/common/LatencyTuner.cpp | 44 | ||||
-rw-r--r-- | src/opensles/AudioStreamBuffered.h | 4 |
6 files changed, 35 insertions, 32 deletions
diff --git a/include/oboe/AudioStream.h b/include/oboe/AudioStream.h index cb0f84de..e1244265 100644 --- a/include/oboe/AudioStream.h +++ b/include/oboe/AudioStream.h @@ -132,10 +132,11 @@ public: * * An underrun or overrun can cause an audible "pop" or "glitch". * - * @return the count or negative error. + * @return a result which is either Result::OK with the xRun count as the value, or a + * Result::Error* code */ - virtual int32_t getXRunCount() const { - return static_cast<int32_t>(Result::ErrorUnimplemented); + virtual ResultWithValue<int32_t> getXRunCount() const { + return ResultWithValue<int32_t>(Result::ErrorUnimplemented); } /** diff --git a/samples/hello-oboe/src/main/cpp/PlayAudioEngine.cpp b/samples/hello-oboe/src/main/cpp/PlayAudioEngine.cpp index f2b64cc4..3dd58c1d 100644 --- a/samples/hello-oboe/src/main/cpp/PlayAudioEngine.cpp +++ b/samples/hello-oboe/src/main/cpp/PlayAudioEngine.cpp @@ -173,10 +173,10 @@ PlayAudioEngine::onAudioReady(oboe::AudioStream *audioStream, void *audioData, i * * See https://developer.android.com/studio/profile/systrace-commandline.html */ - int32_t underrunCount = audioStream->getXRunCount(); + auto underrunCountResult = audioStream->getXRunCount(); Trace::beginSection("numFrames %d, Underruns %d, buffer size %d", - numFrames, underrunCount, bufferSize); + numFrames, underrunCountResult.value(), bufferSize); int32_t channelCount = audioStream->getChannelCount(); diff --git a/src/aaudio/AudioStreamAAudio.cpp b/src/aaudio/AudioStreamAAudio.cpp index 267c8df2..072af55e 100644 --- a/src/aaudio/AudioStreamAAudio.cpp +++ b/src/aaudio/AudioStreamAAudio.cpp @@ -371,12 +371,12 @@ int64_t AudioStreamAAudio::getFramesWritten() const { } } -int32_t AudioStreamAAudio::getXRunCount() const { +ResultWithValue<int32_t> AudioStreamAAudio::getXRunCount() const { AAudioStream *stream = mAAudioStream.load(); if (stream != nullptr) { - return mLibLoader->stream_getXRunCount(stream); + return ResultWithValue<int32_t>::createBasedOnSign(mLibLoader->stream_getXRunCount(stream)); } else { - return static_cast<int32_t>(Result::ErrorNull); + return ResultWithValue<int32_t>(Result::ErrorNull); } } diff --git a/src/aaudio/AudioStreamAAudio.h b/src/aaudio/AudioStreamAAudio.h index c3febc00..3752e91d 100644 --- a/src/aaudio/AudioStreamAAudio.h +++ b/src/aaudio/AudioStreamAAudio.h @@ -71,7 +71,7 @@ public: ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override; int32_t getBufferSizeInFrames() const override; int32_t getFramesPerBurst() const override; - int32_t getXRunCount() const override; + ResultWithValue<int32_t> getXRunCount() const override; int64_t getFramesRead() const override; int64_t getFramesWritten() const override; diff --git a/src/common/LatencyTuner.cpp b/src/common/LatencyTuner.cpp index ffa91cb4..d30fc43f 100644 --- a/src/common/LatencyTuner.cpp +++ b/src/common/LatencyTuner.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,37 +37,39 @@ Result LatencyTuner::tune() { reset(); } - switch (mState) { - case State::Idle: - if (--mIdleCountDown <= 0) { - mState = State::Active; - } - mPreviousXRuns = mStream.getXRunCount(); - if (mPreviousXRuns < 0) { - result = static_cast<Result>(mPreviousXRuns); // error code - mState = State::Unsupported; - } - break; + // Set state to Active if the idle countdown has reached zero. + if (mState == State::Idle && --mIdleCountDown <= 0) { + mState = State::Active; + } + + // When state is Active attempt to change the buffer size if the number of xRuns has increased. + if (mState == State::Active) { - case State::Active: { - int32_t xRuns = mStream.getXRunCount(); - if ((xRuns - mPreviousXRuns) > 0) { - mPreviousXRuns = xRuns; + auto xRunCountResult = mStream.getXRunCount(); + if (xRunCountResult == Result::OK) { + if ((xRunCountResult.value() - mPreviousXRuns) > 0) { + mPreviousXRuns = xRunCountResult.value(); int32_t oldBufferSize = mStream.getBufferSizeInFrames(); int32_t requestedBufferSize = oldBufferSize + mStream.getFramesPerBurst(); auto setBufferResult = mStream.setBufferSizeInFrames(requestedBufferSize); - if (setBufferResult != Result::OK){ + if (setBufferResult != Result::OK) { result = setBufferResult; mState = State::Unsupported; - } else if (setBufferResult.value() == oldBufferSize){ + } else if (setBufferResult.value() == oldBufferSize) { mState = State::AtMax; } } + } else { + mState = State::Unsupported; } + } + + if (mState == State::Unsupported) { + result = Result::ErrorUnimplemented; + } - case State::AtMax: - case State::Unsupported: - break; + if (mState == State::AtMax) { + result = Result::OK; } return result; } diff --git a/src/opensles/AudioStreamBuffered.h b/src/opensles/AudioStreamBuffered.h index b4c919a2..ebb3bc06 100644 --- a/src/opensles/AudioStreamBuffered.h +++ b/src/opensles/AudioStreamBuffered.h @@ -51,8 +51,8 @@ public: int32_t getBufferCapacityInFrames() const override; - int32_t getXRunCount() const override { - return mXRunCount; + ResultWithValue<int32_t> getXRunCount() const override { + return ResultWithValue<int32_t>(mXRunCount); } int64_t getFramesWritten() const override; |