1*05767d91SRobert Wu /*
2*05767d91SRobert Wu * Copyright 2018 The Android Open Source Project
3*05767d91SRobert Wu *
4*05767d91SRobert Wu * Licensed under the Apache License, Version 2.0 (the "License");
5*05767d91SRobert Wu * you may not use this file except in compliance with the License.
6*05767d91SRobert Wu * You may obtain a copy of the License at
7*05767d91SRobert Wu *
8*05767d91SRobert Wu * http://www.apache.org/licenses/LICENSE-2.0
9*05767d91SRobert Wu *
10*05767d91SRobert Wu * Unless required by applicable law or agreed to in writing, software
11*05767d91SRobert Wu * distributed under the License is distributed on an "AS IS" BASIS,
12*05767d91SRobert Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*05767d91SRobert Wu * See the License for the specific language governing permissions and
14*05767d91SRobert Wu * limitations under the License.
15*05767d91SRobert Wu */
16*05767d91SRobert Wu
17*05767d91SRobert Wu #include <gtest/gtest.h>
18*05767d91SRobert Wu #include <oboe/Oboe.h>
19*05767d91SRobert Wu
20*05767d91SRobert Wu using namespace oboe;
21*05767d91SRobert Wu
22*05767d91SRobert Wu class MyCallback : public AudioStreamDataCallback {
23*05767d91SRobert Wu public:
onAudioReady(AudioStream * oboeStream,void * audioData,int32_t numFrames)24*05767d91SRobert Wu DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
25*05767d91SRobert Wu return DataCallbackResult::Continue;
26*05767d91SRobert Wu }
27*05767d91SRobert Wu };
28*05767d91SRobert Wu
29*05767d91SRobert Wu class StreamClosedReturnValues : public ::testing::Test {
30*05767d91SRobert Wu
31*05767d91SRobert Wu protected:
32*05767d91SRobert Wu
openStream()33*05767d91SRobert Wu bool openStream() {
34*05767d91SRobert Wu Result r = mBuilder.openStream(&mStream);
35*05767d91SRobert Wu EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
36*05767d91SRobert Wu return (r == Result::OK);
37*05767d91SRobert Wu }
38*05767d91SRobert Wu
releaseStream()39*05767d91SRobert Wu bool releaseStream() {
40*05767d91SRobert Wu Result r = mStream->release();
41*05767d91SRobert Wu if (getSdkVersion() > __ANDROID_API_R__ && mBuilder.getAudioApi() != AudioApi::OpenSLES) {
42*05767d91SRobert Wu EXPECT_EQ(r, Result::OK) << "Failed to release stream. " << convertToText(r);
43*05767d91SRobert Wu return (r == Result::OK);
44*05767d91SRobert Wu } else {
45*05767d91SRobert Wu EXPECT_EQ(r, Result::ErrorUnimplemented) << "Did not get ErrorUnimplemented" << convertToText(r);
46*05767d91SRobert Wu return (r == Result::ErrorUnimplemented);
47*05767d91SRobert Wu }
48*05767d91SRobert Wu }
49*05767d91SRobert Wu
closeStream()50*05767d91SRobert Wu bool closeStream() {
51*05767d91SRobert Wu Result r = mStream->close();
52*05767d91SRobert Wu EXPECT_EQ(r, Result::OK) << "Failed to close stream. " << convertToText(r);
53*05767d91SRobert Wu return (r == Result::OK);
54*05767d91SRobert Wu }
55*05767d91SRobert Wu
openAndCloseStream()56*05767d91SRobert Wu bool openAndCloseStream() {
57*05767d91SRobert Wu if (!openStream() || !closeStream())
58*05767d91SRobert Wu return false;
59*05767d91SRobert Wu StreamState s = mStream->getState();
60*05767d91SRobert Wu EXPECT_EQ(s, StreamState::Closed) << "Stream state " << convertToText(mStream->getState());
61*05767d91SRobert Wu return (s == StreamState::Closed);
62*05767d91SRobert Wu }
63*05767d91SRobert Wu
getNanoseconds()64*05767d91SRobert Wu static int64_t getNanoseconds() {
65*05767d91SRobert Wu struct timespec time;
66*05767d91SRobert Wu int result = clock_gettime(CLOCK_MONOTONIC, &time);
67*05767d91SRobert Wu if (result < 0) {
68*05767d91SRobert Wu return result;
69*05767d91SRobert Wu }
70*05767d91SRobert Wu return (time.tv_sec * (int64_t)1e9) + time.tv_nsec;
71*05767d91SRobert Wu }
72*05767d91SRobert Wu
73*05767d91SRobert Wu // ASSERT_* requires a void return type.
measureCloseTime(int32_t delayMillis)74*05767d91SRobert Wu void measureCloseTime(int32_t delayMillis) {
75*05767d91SRobert Wu ASSERT_TRUE(openStream());
76*05767d91SRobert Wu mStream->setDelayBeforeCloseMillis(delayMillis);
77*05767d91SRobert Wu ASSERT_EQ(delayMillis, mStream->getDelayBeforeCloseMillis());
78*05767d91SRobert Wu // Measure time it takes to close.
79*05767d91SRobert Wu int64_t startTimeMillis = getNanoseconds() / 1e6;
80*05767d91SRobert Wu ASSERT_TRUE(closeStream());
81*05767d91SRobert Wu int64_t stopTimeMillis = getNanoseconds() / 1e6;
82*05767d91SRobert Wu int32_t elapsedTimeMillis = (int32_t)(stopTimeMillis - startTimeMillis);
83*05767d91SRobert Wu ASSERT_GE(elapsedTimeMillis, delayMillis);
84*05767d91SRobert Wu }
85*05767d91SRobert Wu
testDelayBeforeClose()86*05767d91SRobert Wu void testDelayBeforeClose() {
87*05767d91SRobert Wu const int32_t delayMillis = 500;
88*05767d91SRobert Wu measureCloseTime(delayMillis);
89*05767d91SRobert Wu }
90*05767d91SRobert Wu
91*05767d91SRobert Wu AudioStreamBuilder mBuilder;
92*05767d91SRobert Wu AudioStream *mStream = nullptr;
93*05767d91SRobert Wu
94*05767d91SRobert Wu };
95*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetChannelCountReturnsLastKnownValue)96*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetChannelCountReturnsLastKnownValue){
97*05767d91SRobert Wu
98*05767d91SRobert Wu mBuilder.setChannelCount(2);
99*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
100*05767d91SRobert Wu ASSERT_EQ(mStream->getChannelCount(), 2);
101*05767d91SRobert Wu }
102*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetDirectionReturnsLastKnownValue)103*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetDirectionReturnsLastKnownValue){
104*05767d91SRobert Wu
105*05767d91SRobert Wu // Note that when testing on the emulator setting the direction to Input will result in ErrorInternal when
106*05767d91SRobert Wu // opening the stream
107*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
108*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
109*05767d91SRobert Wu ASSERT_EQ(mStream->getDirection(), Direction::Input);
110*05767d91SRobert Wu }
111*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetSampleRateReturnsLastKnownValue)112*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetSampleRateReturnsLastKnownValue){
113*05767d91SRobert Wu
114*05767d91SRobert Wu mBuilder.setSampleRate(8000);
115*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
116*05767d91SRobert Wu ASSERT_EQ(mStream->getSampleRate(), 8000);
117*05767d91SRobert Wu }
118*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetFramesPerCallbackReturnsLastKnownValue)119*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetFramesPerCallbackReturnsLastKnownValue) {
120*05767d91SRobert Wu
121*05767d91SRobert Wu mBuilder.setFramesPerCallback(192);
122*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
123*05767d91SRobert Wu ASSERT_EQ(mStream->getFramesPerCallback(), 192);
124*05767d91SRobert Wu }
125*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetFormatReturnsLastKnownValue)126*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetFormatReturnsLastKnownValue) {
127*05767d91SRobert Wu
128*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::I16);
129*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
130*05767d91SRobert Wu ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
131*05767d91SRobert Wu }
132*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetBufferSizeInFramesReturnsLastKnownValue)133*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetBufferSizeInFramesReturnsLastKnownValue) {
134*05767d91SRobert Wu
135*05767d91SRobert Wu ASSERT_TRUE(openStream());
136*05767d91SRobert Wu int32_t bufferSize = mStream->getBufferSizeInFrames();
137*05767d91SRobert Wu ASSERT_TRUE(closeStream());
138*05767d91SRobert Wu ASSERT_EQ(mStream->getBufferSizeInFrames(), bufferSize);
139*05767d91SRobert Wu }
140*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetBufferCapacityInFramesReturnsLastKnownValue)141*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetBufferCapacityInFramesReturnsLastKnownValue) {
142*05767d91SRobert Wu
143*05767d91SRobert Wu ASSERT_TRUE(openStream());
144*05767d91SRobert Wu int32_t bufferCapacity = mStream->getBufferCapacityInFrames();
145*05767d91SRobert Wu ASSERT_TRUE(closeStream());
146*05767d91SRobert Wu ASSERT_EQ(mStream->getBufferCapacityInFrames(), bufferCapacity);
147*05767d91SRobert Wu }
148*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetSharingModeReturnsLastKnownValue)149*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetSharingModeReturnsLastKnownValue) {
150*05767d91SRobert Wu
151*05767d91SRobert Wu ASSERT_TRUE(openStream());
152*05767d91SRobert Wu SharingMode s = mStream->getSharingMode();
153*05767d91SRobert Wu ASSERT_TRUE(closeStream());
154*05767d91SRobert Wu ASSERT_EQ(mStream->getSharingMode(), s);
155*05767d91SRobert Wu }
156*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetPerformanceModeReturnsLastKnownValue)157*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetPerformanceModeReturnsLastKnownValue) {
158*05767d91SRobert Wu
159*05767d91SRobert Wu ASSERT_TRUE(openStream());
160*05767d91SRobert Wu PerformanceMode p = mStream->getPerformanceMode();
161*05767d91SRobert Wu ASSERT_TRUE(closeStream());
162*05767d91SRobert Wu ASSERT_EQ(mStream->getPerformanceMode(), p);
163*05767d91SRobert Wu }
164*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetDeviceIdReturnsLastKnownValue)165*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetDeviceIdReturnsLastKnownValue) {
166*05767d91SRobert Wu
167*05767d91SRobert Wu ASSERT_TRUE(openStream());
168*05767d91SRobert Wu int32_t d = mStream->getDeviceId();
169*05767d91SRobert Wu ASSERT_TRUE(closeStream());
170*05767d91SRobert Wu ASSERT_EQ(mStream->getDeviceId(), d);
171*05767d91SRobert Wu }
172*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetDataCallbackReturnsLastKnownValue)173*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetDataCallbackReturnsLastKnownValue) {
174*05767d91SRobert Wu
175*05767d91SRobert Wu AudioStreamDataCallback *callback = new MyCallback();
176*05767d91SRobert Wu mBuilder.setDataCallback(callback);
177*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
178*05767d91SRobert Wu
179*05767d91SRobert Wu AudioStreamDataCallback *callback2 = mStream->getDataCallback();
180*05767d91SRobert Wu ASSERT_EQ(callback, callback2);
181*05767d91SRobert Wu }
182*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetUsageReturnsLastKnownValue)183*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetUsageReturnsLastKnownValue){
184*05767d91SRobert Wu ASSERT_TRUE(openStream());
185*05767d91SRobert Wu Usage u = mStream->getUsage();
186*05767d91SRobert Wu ASSERT_TRUE(closeStream());
187*05767d91SRobert Wu ASSERT_EQ(mStream->getUsage(), u);
188*05767d91SRobert Wu }
189*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetContentTypeReturnsLastKnownValue)190*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetContentTypeReturnsLastKnownValue){
191*05767d91SRobert Wu ASSERT_TRUE(openStream());
192*05767d91SRobert Wu ContentType c = mStream->getContentType();
193*05767d91SRobert Wu ASSERT_TRUE(closeStream());
194*05767d91SRobert Wu ASSERT_EQ(mStream->getContentType(), c);
195*05767d91SRobert Wu }
196*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetInputPresetReturnsLastKnownValue)197*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetInputPresetReturnsLastKnownValue){
198*05767d91SRobert Wu ASSERT_TRUE(openStream());
199*05767d91SRobert Wu auto i = mStream->getInputPreset();
200*05767d91SRobert Wu ASSERT_TRUE(closeStream());
201*05767d91SRobert Wu ASSERT_EQ(mStream->getInputPreset(), i);
202*05767d91SRobert Wu }
203*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetSessionIdReturnsLastKnownValue)204*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetSessionIdReturnsLastKnownValue){
205*05767d91SRobert Wu ASSERT_TRUE(openStream());
206*05767d91SRobert Wu auto s = mStream->getSessionId();
207*05767d91SRobert Wu ASSERT_TRUE(closeStream());
208*05767d91SRobert Wu ASSERT_EQ(mStream->getSessionId(), s);
209*05767d91SRobert Wu }
210*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,StreamStateIsClosed)211*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, StreamStateIsClosed){
212*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
213*05767d91SRobert Wu ASSERT_EQ(mStream->getState(), StreamState::Closed);
214*05767d91SRobert Wu }
215*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetXRunCountReturnsLastKnownValue)216*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetXRunCountReturnsLastKnownValue){
217*05767d91SRobert Wu
218*05767d91SRobert Wu ASSERT_TRUE(openStream());
219*05767d91SRobert Wu if (mStream->isXRunCountSupported()){
220*05767d91SRobert Wu auto i = mStream->getXRunCount();
221*05767d91SRobert Wu ASSERT_EQ(mStream->getXRunCount(), i);
222*05767d91SRobert Wu }
223*05767d91SRobert Wu ASSERT_TRUE(closeStream());
224*05767d91SRobert Wu }
225*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetFramesPerBurstReturnsLastKnownValue)226*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetFramesPerBurstReturnsLastKnownValue){
227*05767d91SRobert Wu
228*05767d91SRobert Wu ASSERT_TRUE(openStream());
229*05767d91SRobert Wu auto f = mStream->getFramesPerBurst();
230*05767d91SRobert Wu ASSERT_TRUE(closeStream());
231*05767d91SRobert Wu ASSERT_EQ(mStream->getFramesPerBurst(), f);
232*05767d91SRobert Wu }
233*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetBytesPerFrameReturnsLastKnownValue)234*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetBytesPerFrameReturnsLastKnownValue){
235*05767d91SRobert Wu ASSERT_TRUE(openStream());
236*05767d91SRobert Wu auto f = mStream->getBytesPerFrame();
237*05767d91SRobert Wu ASSERT_TRUE(closeStream());
238*05767d91SRobert Wu ASSERT_EQ(mStream->getBytesPerFrame(), f);
239*05767d91SRobert Wu }
240*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetBytesPerSampleReturnsLastKnownValue)241*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetBytesPerSampleReturnsLastKnownValue){
242*05767d91SRobert Wu ASSERT_TRUE(openStream());
243*05767d91SRobert Wu auto f = mStream->getBytesPerSample();
244*05767d91SRobert Wu ASSERT_TRUE(closeStream());
245*05767d91SRobert Wu ASSERT_EQ(mStream->getBytesPerSample(), f);
246*05767d91SRobert Wu }
247*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetFramesWrittenReturnsLastKnownValue)248*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetFramesWrittenReturnsLastKnownValue){
249*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::I16);
250*05767d91SRobert Wu mBuilder.setChannelCount(1);
251*05767d91SRobert Wu ASSERT_TRUE(openStream());
252*05767d91SRobert Wu ASSERT_EQ(mStream->setBufferSizeInFrames(mStream->getBufferCapacityInFrames()), Result::OK);
253*05767d91SRobert Wu mStream->start();
254*05767d91SRobert Wu
255*05767d91SRobert Wu int16_t buffer[4] = { 1, 2, 3, 4 };
256*05767d91SRobert Wu Result r = mStream->write(&buffer, 4, 0);
257*05767d91SRobert Wu if (r != Result::OK) {
258*05767d91SRobert Wu FAIL() << "Could not write to audio stream";
259*05767d91SRobert Wu }
260*05767d91SRobert Wu
261*05767d91SRobert Wu auto f = mStream->getFramesWritten();
262*05767d91SRobert Wu ASSERT_EQ(f, 4);
263*05767d91SRobert Wu
264*05767d91SRobert Wu ASSERT_TRUE(closeStream());
265*05767d91SRobert Wu ASSERT_EQ(mStream->getFramesWritten(), f);
266*05767d91SRobert Wu }
267*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetFramesReadReturnsLastKnownValue)268*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetFramesReadReturnsLastKnownValue) {
269*05767d91SRobert Wu
270*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
271*05767d91SRobert Wu mBuilder.setFormat(AudioFormat::I16);
272*05767d91SRobert Wu mBuilder.setChannelCount(1);
273*05767d91SRobert Wu
274*05767d91SRobert Wu ASSERT_TRUE(openStream());
275*05767d91SRobert Wu mStream->start();
276*05767d91SRobert Wu
277*05767d91SRobert Wu int16_t buffer[192];
278*05767d91SRobert Wu auto r = mStream->read(&buffer, 192, 1000 * kNanosPerMillisecond);
279*05767d91SRobert Wu ASSERT_EQ(r.value(), 192);
280*05767d91SRobert Wu
281*05767d91SRobert Wu auto f = mStream->getFramesRead();
282*05767d91SRobert Wu ASSERT_EQ(f, 192);
283*05767d91SRobert Wu
284*05767d91SRobert Wu ASSERT_TRUE(closeStream());
285*05767d91SRobert Wu ASSERT_EQ(mStream->getFramesRead(), f);
286*05767d91SRobert Wu }
287*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetTimestampReturnsErrorClosedIfSupported)288*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetTimestampReturnsErrorClosedIfSupported){
289*05767d91SRobert Wu
290*05767d91SRobert Wu ASSERT_TRUE(openStream());
291*05767d91SRobert Wu
292*05767d91SRobert Wu int64_t framePosition;
293*05767d91SRobert Wu int64_t presentationTime;
294*05767d91SRobert Wu
295*05767d91SRobert Wu auto r = mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime);
296*05767d91SRobert Wu bool isTimestampSupported = (r == Result::OK);
297*05767d91SRobert Wu
298*05767d91SRobert Wu ASSERT_TRUE(closeStream());
299*05767d91SRobert Wu
300*05767d91SRobert Wu if (isTimestampSupported){
301*05767d91SRobert Wu ASSERT_EQ(mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime), Result::ErrorClosed);
302*05767d91SRobert Wu }
303*05767d91SRobert Wu }
304*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetAudioApiReturnsLastKnownValue)305*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetAudioApiReturnsLastKnownValue){
306*05767d91SRobert Wu ASSERT_TRUE(openStream());
307*05767d91SRobert Wu AudioApi a = mStream->getAudioApi();
308*05767d91SRobert Wu ASSERT_TRUE(closeStream());
309*05767d91SRobert Wu ASSERT_EQ(mStream->getAudioApi(), a);
310*05767d91SRobert Wu }
311*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,GetUsesAAudioReturnsLastKnownValue)312*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, GetUsesAAudioReturnsLastKnownValue){
313*05767d91SRobert Wu ASSERT_TRUE(openStream());
314*05767d91SRobert Wu bool a = mStream->usesAAudio();
315*05767d91SRobert Wu ASSERT_TRUE(closeStream());
316*05767d91SRobert Wu ASSERT_EQ(mStream->usesAAudio(), a);
317*05767d91SRobert Wu }
318*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,StreamStateControlsReturnClosed)319*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, StreamStateControlsReturnClosed){
320*05767d91SRobert Wu
321*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
322*05767d91SRobert Wu Result r = mStream->close();
323*05767d91SRobert Wu EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
324*05767d91SRobert Wu r = mStream->start();
325*05767d91SRobert Wu EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
326*05767d91SRobert Wu EXPECT_EQ(mStream->pause(), Result::ErrorClosed);
327*05767d91SRobert Wu EXPECT_EQ(mStream->flush(), Result::ErrorClosed);
328*05767d91SRobert Wu EXPECT_EQ(mStream->stop(), Result::ErrorClosed);
329*05767d91SRobert Wu EXPECT_EQ(mStream->requestStart(), Result::ErrorClosed);
330*05767d91SRobert Wu EXPECT_EQ(mStream->requestPause(), Result::ErrorClosed);
331*05767d91SRobert Wu EXPECT_EQ(mStream->requestFlush(), Result::ErrorClosed);
332*05767d91SRobert Wu EXPECT_EQ(mStream->requestStop(), Result::ErrorClosed);
333*05767d91SRobert Wu }
334*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,WaitForStateChangeReturnsClosed)335*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, WaitForStateChangeReturnsClosed){
336*05767d91SRobert Wu
337*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
338*05767d91SRobert Wu StreamState next;
339*05767d91SRobert Wu Result r = mStream->waitForStateChange(StreamState::Open, &next, 0);
340*05767d91SRobert Wu EXPECT_TRUE(r == Result::OK || r == Result::ErrorClosed) << convertToText(r);
341*05767d91SRobert Wu }
342*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,SetBufferSizeInFramesReturnsClosed)343*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, SetBufferSizeInFramesReturnsClosed){
344*05767d91SRobert Wu
345*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
346*05767d91SRobert Wu auto r = mStream->setBufferSizeInFrames(192);
347*05767d91SRobert Wu ASSERT_EQ(r.error(), Result::ErrorClosed);
348*05767d91SRobert Wu }
349*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,CalculateLatencyInMillisReturnsClosedIfSupported)350*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, CalculateLatencyInMillisReturnsClosedIfSupported){
351*05767d91SRobert Wu
352*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
353*05767d91SRobert Wu
354*05767d91SRobert Wu if (mStream->getAudioApi() == AudioApi::AAudio){
355*05767d91SRobert Wu auto r = mStream->calculateLatencyMillis();
356*05767d91SRobert Wu ASSERT_EQ(r.error(), Result::ErrorInvalidState);
357*05767d91SRobert Wu }
358*05767d91SRobert Wu }
359*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,ReadReturnsClosed)360*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, ReadReturnsClosed){
361*05767d91SRobert Wu
362*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
363*05767d91SRobert Wu
364*05767d91SRobert Wu int buffer[8]{0};
365*05767d91SRobert Wu auto r = mStream->read(buffer, 1, 0);
366*05767d91SRobert Wu ASSERT_EQ(r.error(), Result::ErrorClosed);
367*05767d91SRobert Wu }
368*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,WriteReturnsClosed)369*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, WriteReturnsClosed){
370*05767d91SRobert Wu
371*05767d91SRobert Wu ASSERT_TRUE(openAndCloseStream());
372*05767d91SRobert Wu
373*05767d91SRobert Wu int buffer[8]{0};
374*05767d91SRobert Wu auto r = mStream->write(buffer, 1, 0);
375*05767d91SRobert Wu ASSERT_EQ(r.error(), Result::ErrorClosed);
376*05767d91SRobert Wu }
377*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,DelayBeforeCloseInput)378*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, DelayBeforeCloseInput){
379*05767d91SRobert Wu if (AudioStreamBuilder::isAAudioRecommended()) {
380*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
381*05767d91SRobert Wu testDelayBeforeClose();
382*05767d91SRobert Wu }
383*05767d91SRobert Wu }
384*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,DelayBeforeCloseOutput)385*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, DelayBeforeCloseOutput){
386*05767d91SRobert Wu if (AudioStreamBuilder::isAAudioRecommended()) {
387*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
388*05767d91SRobert Wu testDelayBeforeClose();
389*05767d91SRobert Wu }
390*05767d91SRobert Wu }
391*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,DelayBeforeCloseInputOpenSL)392*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, DelayBeforeCloseInputOpenSL){
393*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
394*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
395*05767d91SRobert Wu testDelayBeforeClose();
396*05767d91SRobert Wu }
397*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,DelayBeforeCloseOutputOpenSL)398*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, DelayBeforeCloseOutputOpenSL){
399*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
400*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
401*05767d91SRobert Wu testDelayBeforeClose();
402*05767d91SRobert Wu }
403*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,TestReleaseInput)404*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, TestReleaseInput){
405*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
406*05767d91SRobert Wu ASSERT_TRUE(openStream());
407*05767d91SRobert Wu ASSERT_TRUE(releaseStream());
408*05767d91SRobert Wu ASSERT_TRUE(closeStream());
409*05767d91SRobert Wu }
410*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,TestReleaseInputOpenSLES)411*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, TestReleaseInputOpenSLES){
412*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
413*05767d91SRobert Wu mBuilder.setDirection(Direction::Input);
414*05767d91SRobert Wu ASSERT_TRUE(openStream());
415*05767d91SRobert Wu ASSERT_TRUE(releaseStream());
416*05767d91SRobert Wu ASSERT_TRUE(closeStream());
417*05767d91SRobert Wu }
418*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,TestReleaseOutput)419*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, TestReleaseOutput){
420*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
421*05767d91SRobert Wu ASSERT_TRUE(openStream());
422*05767d91SRobert Wu ASSERT_TRUE(releaseStream());
423*05767d91SRobert Wu ASSERT_TRUE(closeStream());
424*05767d91SRobert Wu }
425*05767d91SRobert Wu
TEST_F(StreamClosedReturnValues,TestReleaseOutputOpenSLES)426*05767d91SRobert Wu TEST_F(StreamClosedReturnValues, TestReleaseOutputOpenSLES){
427*05767d91SRobert Wu mBuilder.setAudioApi(AudioApi::OpenSLES);
428*05767d91SRobert Wu mBuilder.setDirection(Direction::Output);
429*05767d91SRobert Wu ASSERT_TRUE(openStream());
430*05767d91SRobert Wu ASSERT_TRUE(releaseStream());
431*05767d91SRobert Wu ASSERT_TRUE(closeStream());
432*05767d91SRobert Wu }
433