blob: 04bc91ce39a533329e11311623c6546c76509268 [file] [log] [blame]
Don Turner94fe4852018-07-03 08:42:09 +01001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Don Turner94fe4852018-07-03 08:42:09 +010017#include <gtest/gtest.h>
Don Turnerff649d02018-07-04 18:35:02 +010018#include <oboe/Oboe.h>
Don Turner94fe4852018-07-03 08:42:09 +010019
20using namespace oboe;
21
Don Turnerff649d02018-07-04 18:35:02 +010022class MyCallback : public AudioStreamCallback {
23public:
24 DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
25 return DataCallbackResult::Continue;
26 }
27};
28
29
30
Don Turner94fe4852018-07-03 08:42:09 +010031class StreamClosedReturnValues : public ::testing::Test {
32
Don Turnerff649d02018-07-04 18:35:02 +010033protected:
Don Turner94fe4852018-07-03 08:42:09 +010034
Don Turnerff649d02018-07-04 18:35:02 +010035 void SetUp(){
36
37 }
38
39 bool openStream(){
40 Result r = mBuilder.openStream(&mStream);
41 EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
42 return (r == Result::OK);
43 }
44
45 void closeStream(){
Don Turner48f794e2018-08-24 12:53:05 +010046 if (mStream != nullptr){
47 Result r = mStream->close();
48 if (r != Result::OK){
49 FAIL() << "Failed to close stream. " << convertToText(r);
50 }
Don Turnerff649d02018-07-04 18:35:02 +010051 }
52 }
53
54 void openAndCloseStream(){
55
56 openStream();
57 closeStream();
58 ASSERT_EQ(mStream->getState(), StreamState::Closed) << "Stream state " << convertToText(mStream->getState());
59 }
60
61 AudioStreamBuilder mBuilder;
62 AudioStream *mStream = nullptr;
Don Turner94fe4852018-07-03 08:42:09 +010063
64};
65
66TEST_F(StreamClosedReturnValues, GetChannelCountReturnsLastKnownValue){
67
Don Turnerff649d02018-07-04 18:35:02 +010068 mBuilder.setChannelCount(2);
69 openAndCloseStream();
70 ASSERT_EQ(mStream->getChannelCount(), 2);
71}
72
73TEST_F(StreamClosedReturnValues, GetDirectionReturnsLastKnownValue){
74
75 // Note that when testing on the emulator setting the direction to Input will result in ErrorInternal when
76 // opening the stream
77 mBuilder.setDirection(Direction::Input);
78 openAndCloseStream();
79 ASSERT_EQ(mStream->getDirection(), Direction::Input);
80}
81
82TEST_F(StreamClosedReturnValues, GetSampleRateReturnsLastKnownValue){
83
84 mBuilder.setSampleRate(8000);
85 openAndCloseStream();
86 ASSERT_EQ(mStream->getSampleRate(), 8000);
87}
88
89TEST_F(StreamClosedReturnValues, GetFramesPerCallbackReturnsLastKnownValue) {
90
91 mBuilder.setFramesPerCallback(192);
92 openAndCloseStream();
93 ASSERT_EQ(mStream->getFramesPerCallback(), 192);
94}
95
96TEST_F(StreamClosedReturnValues, GetFormatReturnsLastKnownValue) {
97
98 mBuilder.setFormat(AudioFormat::I16);
99 openAndCloseStream();
100 ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
101}
102
103TEST_F(StreamClosedReturnValues, GetBufferSizeInFramesReturnsLastKnownValue) {
104
105 openStream();
106 int32_t bufferSize = mStream->getBufferSizeInFrames();
107 closeStream();
108 ASSERT_EQ(mStream->getBufferSizeInFrames(), bufferSize);
109}
110
111TEST_F(StreamClosedReturnValues, GetBufferCapacityInFramesReturnsLastKnownValue) {
112
113 openStream();
114 int32_t bufferCapacity = mStream->getBufferCapacityInFrames();
115 closeStream();
116 ASSERT_EQ(mStream->getBufferCapacityInFrames(), bufferCapacity);
117}
118
119TEST_F(StreamClosedReturnValues, GetSharingModeReturnsLastKnownValue) {
120
121 openStream();
122 SharingMode s = mStream->getSharingMode();
123 closeStream();
124 ASSERT_EQ(mStream->getSharingMode(), s);
125}
126
127TEST_F(StreamClosedReturnValues, GetPerformanceModeReturnsLastKnownValue) {
128
129 openStream();
130 PerformanceMode p = mStream->getPerformanceMode();
131 closeStream();
132 ASSERT_EQ(mStream->getPerformanceMode(), p);
133}
134
135TEST_F(StreamClosedReturnValues, GetDeviceIdReturnsLastKnownValue) {
136
137 openStream();
138 int32_t d = mStream->getDeviceId();
139 closeStream();
140 ASSERT_EQ(mStream->getDeviceId(), d);
141}
142
143TEST_F(StreamClosedReturnValues, GetCallbackReturnsLastKnownValue) {
144
145 AudioStreamCallback *callback = new MyCallback();
146 mBuilder.setCallback(callback);
147 openAndCloseStream();
148
149 AudioStreamCallback *callback2 = mStream->getCallback();
150 ASSERT_EQ(callback, callback2);
151}
152
153TEST_F(StreamClosedReturnValues, GetUsageReturnsLastKnownValue){
154 openStream();
155 Usage u = mStream->getUsage();
156 closeStream();
157 ASSERT_EQ(mStream->getUsage(), u);
158}
159
160TEST_F(StreamClosedReturnValues, GetContentTypeReturnsLastKnownValue){
161 openStream();
162 ContentType c = mStream->getContentType();
163 closeStream();
164 ASSERT_EQ(mStream->getContentType(), c);
165}
166
167TEST_F(StreamClosedReturnValues, GetInputPresetReturnsLastKnownValue){
168 openStream();
169 auto i = mStream->getInputPreset();
170 closeStream();
171 ASSERT_EQ(mStream->getInputPreset(), i);
172}
173
174TEST_F(StreamClosedReturnValues, GetSessionIdReturnsLastKnownValue){
175 openStream();
176 auto s = mStream->getSessionId();
177 closeStream();
178 ASSERT_EQ(mStream->getSessionId(), s);
179}
180
181TEST_F(StreamClosedReturnValues, StreamStateIsClosed){
182 openAndCloseStream();
183 ASSERT_EQ(mStream->getState(), StreamState::Closed);
184}
185
186TEST_F(StreamClosedReturnValues, GetXRunCountReturnsLastKnownValue){
187
188 openStream();
189 if (mStream->isXRunCountSupported()){
190 auto i = mStream->getXRunCount();
191 ASSERT_EQ(mStream->getXRunCount(), i);
192 }
193 closeStream();
194}
195
196TEST_F(StreamClosedReturnValues, GetFramesPerBurstReturnsLastKnownValue){
197
198 openStream();
199 auto f = mStream->getFramesPerBurst();
200 closeStream();
201 ASSERT_EQ(mStream->getFramesPerBurst(), f);
202}
203
Don Turnerff649d02018-07-04 18:35:02 +0100204TEST_F(StreamClosedReturnValues, GetBytesPerFrameReturnsLastKnownValue){
205 openStream();
206 auto f = mStream->getBytesPerFrame();
207 closeStream();
208 ASSERT_EQ(mStream->getBytesPerFrame(), f);
209}
210
211TEST_F(StreamClosedReturnValues, GetBytesPerSampleReturnsLastKnownValue){
212 openStream();
213 auto f = mStream->getBytesPerSample();
214 closeStream();
215 ASSERT_EQ(mStream->getBytesPerSample(), f);
216}
217
218TEST_F(StreamClosedReturnValues, GetFramesWrittenReturnsLastKnownValue){
219 mBuilder.setFormat(AudioFormat::I16);
220 mBuilder.setChannelCount(1);
221 openStream();
222 mStream->start();
223
224 int16_t buffer[4] = { 1, 2, 3, 4 };
225 Result r = mStream->write(&buffer, 4, 0);
226 if (r != Result::OK){
227 FAIL() << "Could not write to audio stream";
228 }
229
230 auto f = mStream->getFramesWritten();
231 ASSERT_EQ(f, 4);
232
233 closeStream();
234 ASSERT_EQ(mStream->getFramesWritten(), f);
235}
236
237// TODO: Reading a positive value doesn't work on OpenSL ES in this test - why?
238TEST_F(StreamClosedReturnValues, GetFramesReadReturnsLastKnownValue) {
239
240 mBuilder.setDirection(Direction::Input);
241 mBuilder.setFormat(AudioFormat::I16);
242 mBuilder.setChannelCount(1);
243
244 if (openStream()){
245 mStream->start();
246
247/*
248 int16_t buffer[192];
249 auto r = mStream->read(&buffer, 192, 0);
250 ASSERT_EQ(r.value(), 192);
251*/
252
253 auto f = mStream->getFramesRead();
254// ASSERT_EQ(f, 192);
255
256 closeStream();
257 ASSERT_EQ(mStream->getFramesRead(), f);
258 };
259}
260
261TEST_F(StreamClosedReturnValues, GetTimestampReturnsErrorClosedIfSupported){
262
263 openStream();
264
265 int64_t framePosition;
266 int64_t presentationTime;
267
268 auto r = mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime);
269 bool isTimestampSupported = (r == Result::OK);
270
271 closeStream();
272
273 if (isTimestampSupported){
274 ASSERT_EQ(mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime), Result::ErrorClosed);
275 }
276}
277
278TEST_F(StreamClosedReturnValues, GetAudioApiReturnsLastKnownValue){
279 openStream();
280 AudioApi a = mStream->getAudioApi();
281 closeStream();
282 ASSERT_EQ(mStream->getAudioApi(), a);
283}
284
285TEST_F(StreamClosedReturnValues, GetUsesAAudioReturnsLastKnownValue){
286 openStream();
287 bool a = mStream->usesAAudio();
288 closeStream();
289 ASSERT_EQ(mStream->usesAAudio(), a);
290}
291
292TEST_F(StreamClosedReturnValues, StreamStateControlsReturnClosed){
293
294 openAndCloseStream();
Don Turner0412fd52018-07-18 17:08:34 +0100295 Result r = mStream->close();
296 EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
297 r = mStream->start();
298 EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
Don Turnerff649d02018-07-04 18:35:02 +0100299 EXPECT_EQ(mStream->pause(), Result::ErrorClosed);
300 EXPECT_EQ(mStream->flush(), Result::ErrorClosed);
301 EXPECT_EQ(mStream->stop(), Result::ErrorClosed);
302 EXPECT_EQ(mStream->requestStart(), Result::ErrorClosed);
303 EXPECT_EQ(mStream->requestPause(), Result::ErrorClosed);
304 EXPECT_EQ(mStream->requestFlush(), Result::ErrorClosed);
305 EXPECT_EQ(mStream->requestStop(), Result::ErrorClosed);
306}
307
Don Turnerc174fc42018-07-19 20:14:00 +0100308TEST_F(StreamClosedReturnValues, WaitForStateChangeReturnsOK){
Don Turnerff649d02018-07-04 18:35:02 +0100309
310 openAndCloseStream();
311 StreamState next;
Don Turner23eea112018-07-27 12:24:31 +0100312 Result r = mStream->waitForStateChange(StreamState::Open, &next, 0);
313 ASSERT_EQ(r, Result::OK) << convertToText(r);
Don Turnerff649d02018-07-04 18:35:02 +0100314}
Don Turnerd5a82b72018-07-12 18:09:15 +0100315
316TEST_F(StreamClosedReturnValues, SetBufferSizeInFramesReturnsClosed){
317
318 openAndCloseStream();
319 auto r = mStream->setBufferSizeInFrames(192);
320 ASSERT_EQ(r.error(), Result::ErrorClosed);
321}
322
323TEST_F(StreamClosedReturnValues, CalculateLatencyInMillisReturnsClosedIfSupported){
324
325 openAndCloseStream();
326
327 if (mStream->getAudioApi() == AudioApi::AAudio){
328 auto r = mStream->calculateLatencyMillis();
329 ASSERT_EQ(r.error(), Result::ErrorClosed);
330 }
331}
332
333TEST_F(StreamClosedReturnValues, ReadReturnsClosed){
334
335 openAndCloseStream();
336
337 void *buffer;
338 auto r = mStream->read(buffer, 1, 0);
339 ASSERT_EQ(r.error(), Result::ErrorClosed);
340}
341
342TEST_F(StreamClosedReturnValues, WriteReturnsClosed){
343
344 openAndCloseStream();
345
346 void *buffer;
347 auto r = mStream->write(buffer, 1, 0);
348 ASSERT_EQ(r.error(), Result::ErrorClosed);
349}