aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/oboe/AudioStream.h7
-rw-r--r--samples/hello-oboe/src/main/cpp/PlayAudioEngine.cpp4
-rw-r--r--src/aaudio/AudioStreamAAudio.cpp6
-rw-r--r--src/aaudio/AudioStreamAAudio.h2
-rw-r--r--src/common/LatencyTuner.cpp44
-rw-r--r--src/opensles/AudioStreamBuffered.h4
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;