tests: test framesPerCallback
Ensure honored for OpenSL ES.
See #766
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index bdfd618..f466733 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -25,13 +25,13 @@
# Build the test binary
add_executable(
- testOboe
+ testOboe
testUtilities.cpp
-# testFlowgraph.cpp
+# testFlowgraph.cpp
testStreamClosedMethods.cpp
- testStreamStates.cpp
testStreamWaitState.cpp
- testStreamOpen.cpp
testXRunBehaviour.cpp
+ testStreamOpen.cpp
+ testStreamStates.cpp
)
target_link_libraries(testOboe gtest oboe)
diff --git a/tests/testStreamOpen.cpp b/tests/testStreamOpen.cpp
index 4dc79e2..f20bf84 100644
--- a/tests/testStreamOpen.cpp
+++ b/tests/testStreamOpen.cpp
@@ -20,6 +20,15 @@
using namespace oboe;
+class NumFramesCallback : public AudioStreamCallback {
+public:
+ DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
+ framesPerCallback = numFrames;
+ return DataCallbackResult::Continue;
+ }
+
+ std::atomic<int32_t> framesPerCallback{0};
+};
class StreamOpen : public ::testing::Test {
@@ -28,6 +37,8 @@
bool openStream(){
Result r = mBuilder.openStream(&mStream);
EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
+ EXPECT_EQ(0, openCount) << "Should start with a fresh object every time.";
+ openCount++;
return (r == Result::OK);
}
@@ -38,16 +49,18 @@
FAIL() << "Failed to close stream. " << convertToText(r);
}
}
+ usleep(500 * 1000); // give previous stream time to settle
}
AudioStreamBuilder mBuilder;
AudioStream *mStream = nullptr;
-
+ int32_t openCount = 0;
};
TEST_F(StreamOpen, ForOpenSLESDefaultSampleRateIsUsed){
DefaultStreamValues::SampleRate = 44100;
+ DefaultStreamValues::FramesPerBurst = 192;
mBuilder.setAudioApi(AudioApi::OpenSLES);
openStream();
ASSERT_EQ(mStream->getSampleRate(), 44100);
@@ -56,8 +69,10 @@
TEST_F(StreamOpen, ForOpenSLESDefaultFramesPerBurstIsUsed){
- DefaultStreamValues::FramesPerBurst = 128;
+ DefaultStreamValues::SampleRate = 48000;
+ DefaultStreamValues::FramesPerBurst = 128; // used for low latency
mBuilder.setAudioApi(AudioApi::OpenSLES);
+ mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
openStream();
ASSERT_EQ(mStream->getFramesPerBurst(), 128);
closeStream();
@@ -93,6 +108,80 @@
ASSERT_EQ((int)mStream->getPerformanceMode(), (int)PerformanceMode::None);
closeStream();
}
+
+// Make sure the callback is called with the requested FramesPerCallback
+TEST_F(StreamOpen, OpenSLESFramesPerCallback) {
+ const int kRequestedFramesPerCallback = 417;
+ NumFramesCallback callback;
+
+ DefaultStreamValues::SampleRate = 48000;
+ DefaultStreamValues::ChannelCount = 2;
+ DefaultStreamValues::FramesPerBurst = 192;
+ mBuilder.setAudioApi(AudioApi::OpenSLES);
+ mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
+ mBuilder.setCallback(&callback);
+ openStream();
+ ASSERT_EQ(mStream->requestStart(), Result::OK);
+ int timeout = 20;
+ while (callback.framesPerCallback == 0 && timeout > 0) {
+ usleep(50 * 1000);
+ timeout--;
+ }
+ ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
+ ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
+ ASSERT_EQ(mStream->requestStop(), Result::OK);
+ closeStream();
+}
+
+/* TODO - This is hanging!
+// Make sure the LowLatency callback has the requested FramesPerCallback.
+TEST_F(StreamOpen, AAudioFramesPerCallbackLowLatency) {
+ const int kRequestedFramesPerCallback = 192;
+ NumFramesCallback callback;
+
+ mBuilder.setAudioApi(AudioApi::AAudio);
+ mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
+ mBuilder.setCallback(&callback);
+ mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
+ openStream();
+ ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
+ ASSERT_EQ(mStream->requestStart(), Result::OK);
+ int timeout = 20;
+ while (callback.framesPerCallback == 0 && timeout > 0) {
+ usleep(50 * 1000);
+ timeout--;
+ }
+ ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
+ ASSERT_EQ(mStream->requestStop(), Result::OK);
+ closeStream();
+}
+*/
+
+/* TODO - This is hanging!
+// Make sure the regular callback has the requested FramesPerCallback.
+TEST_F(StreamOpen, AAudioFramesPerCallbackNone) {
+ const int kRequestedFramesPerCallback = 1024;
+ NumFramesCallback callback;
+
+ mBuilder.setAudioApi(AudioApi::AAudio);
+ mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
+ mBuilder.setCallback(&callback);
+ mBuilder.setPerformanceMode(PerformanceMode::None);
+ openStream();
+ ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
+ ASSERT_EQ(mStream->setBufferSizeInFrames(mStream->getBufferCapacityInFrames()), Result::OK);
+ ASSERT_EQ(mStream->requestStart(), Result::OK);
+ int timeout = 20;
+ while (callback.framesPerCallback == 0 && timeout > 0) {
+ usleep(50 * 1000);
+ timeout--;
+ }
+ ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
+ ASSERT_EQ(mStream->requestStop(), Result::OK);
+ closeStream();
+}
+*/
+
TEST_F(StreamOpen, RecordingFormatUnspecifiedReturnsI16BeforeMarshmallow){
if (getSdkVersion() < __ANDROID_API_M__){