blob: 2b482129e97f28c4632add71203511c8abead534 [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(){
46 Result r = mStream->close();
47 if (r != Result::OK){
48 FAIL() << "Failed to close stream. " << convertToText(r);
49 }
50 }
51
52 void openAndCloseStream(){
53
54 openStream();
55 closeStream();
56 ASSERT_EQ(mStream->getState(), StreamState::Closed) << "Stream state " << convertToText(mStream->getState());
57 }
58
59 AudioStreamBuilder mBuilder;
60 AudioStream *mStream = nullptr;
Don Turner94fe4852018-07-03 08:42:09 +010061
62};
63
64TEST_F(StreamClosedReturnValues, GetChannelCountReturnsLastKnownValue){
65
Don Turnerff649d02018-07-04 18:35:02 +010066 mBuilder.setChannelCount(2);
67 openAndCloseStream();
68 ASSERT_EQ(mStream->getChannelCount(), 2);
69}
70
71TEST_F(StreamClosedReturnValues, GetDirectionReturnsLastKnownValue){
72
73 // Note that when testing on the emulator setting the direction to Input will result in ErrorInternal when
74 // opening the stream
75 mBuilder.setDirection(Direction::Input);
76 openAndCloseStream();
77 ASSERT_EQ(mStream->getDirection(), Direction::Input);
78}
79
80TEST_F(StreamClosedReturnValues, GetSampleRateReturnsLastKnownValue){
81
82 mBuilder.setSampleRate(8000);
83 openAndCloseStream();
84 ASSERT_EQ(mStream->getSampleRate(), 8000);
85}
86
87TEST_F(StreamClosedReturnValues, GetFramesPerCallbackReturnsLastKnownValue) {
88
89 mBuilder.setFramesPerCallback(192);
90 openAndCloseStream();
91 ASSERT_EQ(mStream->getFramesPerCallback(), 192);
92}
93
94TEST_F(StreamClosedReturnValues, GetFormatReturnsLastKnownValue) {
95
96 mBuilder.setFormat(AudioFormat::I16);
97 openAndCloseStream();
98 ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
99}
100
101TEST_F(StreamClosedReturnValues, GetBufferSizeInFramesReturnsLastKnownValue) {
102
103 openStream();
104 int32_t bufferSize = mStream->getBufferSizeInFrames();
105 closeStream();
106 ASSERT_EQ(mStream->getBufferSizeInFrames(), bufferSize);
107}
108
109TEST_F(StreamClosedReturnValues, GetBufferCapacityInFramesReturnsLastKnownValue) {
110
111 openStream();
112 int32_t bufferCapacity = mStream->getBufferCapacityInFrames();
113 closeStream();
114 ASSERT_EQ(mStream->getBufferCapacityInFrames(), bufferCapacity);
115}
116
117TEST_F(StreamClosedReturnValues, GetSharingModeReturnsLastKnownValue) {
118
119 openStream();
120 SharingMode s = mStream->getSharingMode();
121 closeStream();
122 ASSERT_EQ(mStream->getSharingMode(), s);
123}
124
125TEST_F(StreamClosedReturnValues, GetPerformanceModeReturnsLastKnownValue) {
126
127 openStream();
128 PerformanceMode p = mStream->getPerformanceMode();
129 closeStream();
130 ASSERT_EQ(mStream->getPerformanceMode(), p);
131}
132
133TEST_F(StreamClosedReturnValues, GetDeviceIdReturnsLastKnownValue) {
134
135 openStream();
136 int32_t d = mStream->getDeviceId();
137 closeStream();
138 ASSERT_EQ(mStream->getDeviceId(), d);
139}
140
141TEST_F(StreamClosedReturnValues, GetCallbackReturnsLastKnownValue) {
142
143 AudioStreamCallback *callback = new MyCallback();
144 mBuilder.setCallback(callback);
145 openAndCloseStream();
146
147 AudioStreamCallback *callback2 = mStream->getCallback();
148 ASSERT_EQ(callback, callback2);
149}
150
151TEST_F(StreamClosedReturnValues, GetUsageReturnsLastKnownValue){
152 openStream();
153 Usage u = mStream->getUsage();
154 closeStream();
155 ASSERT_EQ(mStream->getUsage(), u);
156}
157
158TEST_F(StreamClosedReturnValues, GetContentTypeReturnsLastKnownValue){
159 openStream();
160 ContentType c = mStream->getContentType();
161 closeStream();
162 ASSERT_EQ(mStream->getContentType(), c);
163}
164
165TEST_F(StreamClosedReturnValues, GetInputPresetReturnsLastKnownValue){
166 openStream();
167 auto i = mStream->getInputPreset();
168 closeStream();
169 ASSERT_EQ(mStream->getInputPreset(), i);
170}
171
172TEST_F(StreamClosedReturnValues, GetSessionIdReturnsLastKnownValue){
173 openStream();
174 auto s = mStream->getSessionId();
175 closeStream();
176 ASSERT_EQ(mStream->getSessionId(), s);
177}
178
179TEST_F(StreamClosedReturnValues, StreamStateIsClosed){
180 openAndCloseStream();
181 ASSERT_EQ(mStream->getState(), StreamState::Closed);
182}
183
184TEST_F(StreamClosedReturnValues, GetXRunCountReturnsLastKnownValue){
185
186 openStream();
187 if (mStream->isXRunCountSupported()){
188 auto i = mStream->getXRunCount();
189 ASSERT_EQ(mStream->getXRunCount(), i);
190 }
191 closeStream();
192}
193
194TEST_F(StreamClosedReturnValues, GetFramesPerBurstReturnsLastKnownValue){
195
196 openStream();
197 auto f = mStream->getFramesPerBurst();
198 closeStream();
199 ASSERT_EQ(mStream->getFramesPerBurst(), f);
200}
201
202TEST_F(StreamClosedReturnValues, IsPlayingReturnsFalse){
203
204 openAndCloseStream();
205 ASSERT_FALSE(mStream->isPlaying());
206}
207
208TEST_F(StreamClosedReturnValues, GetBytesPerFrameReturnsLastKnownValue){
209 openStream();
210 auto f = mStream->getBytesPerFrame();
211 closeStream();
212 ASSERT_EQ(mStream->getBytesPerFrame(), f);
213}
214
215TEST_F(StreamClosedReturnValues, GetBytesPerSampleReturnsLastKnownValue){
216 openStream();
217 auto f = mStream->getBytesPerSample();
218 closeStream();
219 ASSERT_EQ(mStream->getBytesPerSample(), f);
220}
221
222TEST_F(StreamClosedReturnValues, GetFramesWrittenReturnsLastKnownValue){
223 mBuilder.setFormat(AudioFormat::I16);
224 mBuilder.setChannelCount(1);
225 openStream();
226 mStream->start();
227
228 int16_t buffer[4] = { 1, 2, 3, 4 };
229 Result r = mStream->write(&buffer, 4, 0);
230 if (r != Result::OK){
231 FAIL() << "Could not write to audio stream";
232 }
233
234 auto f = mStream->getFramesWritten();
235 ASSERT_EQ(f, 4);
236
237 closeStream();
238 ASSERT_EQ(mStream->getFramesWritten(), f);
239}
240
241// TODO: Reading a positive value doesn't work on OpenSL ES in this test - why?
242TEST_F(StreamClosedReturnValues, GetFramesReadReturnsLastKnownValue) {
243
244 mBuilder.setDirection(Direction::Input);
245 mBuilder.setFormat(AudioFormat::I16);
246 mBuilder.setChannelCount(1);
247
248 if (openStream()){
249 mStream->start();
250
251/*
252 int16_t buffer[192];
253 auto r = mStream->read(&buffer, 192, 0);
254 ASSERT_EQ(r.value(), 192);
255*/
256
257 auto f = mStream->getFramesRead();
258// ASSERT_EQ(f, 192);
259
260 closeStream();
261 ASSERT_EQ(mStream->getFramesRead(), f);
262 };
263}
264
265TEST_F(StreamClosedReturnValues, GetTimestampReturnsErrorClosedIfSupported){
266
267 openStream();
268
269 int64_t framePosition;
270 int64_t presentationTime;
271
272 auto r = mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime);
273 bool isTimestampSupported = (r == Result::OK);
274
275 closeStream();
276
277 if (isTimestampSupported){
278 ASSERT_EQ(mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime), Result::ErrorClosed);
279 }
280}
281
282TEST_F(StreamClosedReturnValues, GetAudioApiReturnsLastKnownValue){
283 openStream();
284 AudioApi a = mStream->getAudioApi();
285 closeStream();
286 ASSERT_EQ(mStream->getAudioApi(), a);
287}
288
289TEST_F(StreamClosedReturnValues, GetUsesAAudioReturnsLastKnownValue){
290 openStream();
291 bool a = mStream->usesAAudio();
292 closeStream();
293 ASSERT_EQ(mStream->usesAAudio(), a);
294}
295
296TEST_F(StreamClosedReturnValues, StreamStateControlsReturnClosed){
297
298 openAndCloseStream();
Don Turner0412fd52018-07-18 17:08:34 +0100299 Result r = mStream->close();
300 EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
301 r = mStream->start();
302 EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
Don Turnerff649d02018-07-04 18:35:02 +0100303 EXPECT_EQ(mStream->pause(), Result::ErrorClosed);
304 EXPECT_EQ(mStream->flush(), Result::ErrorClosed);
305 EXPECT_EQ(mStream->stop(), Result::ErrorClosed);
306 EXPECT_EQ(mStream->requestStart(), Result::ErrorClosed);
307 EXPECT_EQ(mStream->requestPause(), Result::ErrorClosed);
308 EXPECT_EQ(mStream->requestFlush(), Result::ErrorClosed);
309 EXPECT_EQ(mStream->requestStop(), Result::ErrorClosed);
310}
311
312TEST_F(StreamClosedReturnValues, WaitForStateChangeReturnsClosed){
313
314 openAndCloseStream();
315 StreamState next;
316 ASSERT_EQ(mStream->waitForStateChange(StreamState::Open, &next, 0), Result::ErrorClosed);
317}
Don Turnerd5a82b72018-07-12 18:09:15 +0100318
319TEST_F(StreamClosedReturnValues, SetBufferSizeInFramesReturnsClosed){
320
321 openAndCloseStream();
322 auto r = mStream->setBufferSizeInFrames(192);
323 ASSERT_EQ(r.error(), Result::ErrorClosed);
324}
325
326TEST_F(StreamClosedReturnValues, CalculateLatencyInMillisReturnsClosedIfSupported){
327
328 openAndCloseStream();
329
330 if (mStream->getAudioApi() == AudioApi::AAudio){
331 auto r = mStream->calculateLatencyMillis();
332 ASSERT_EQ(r.error(), Result::ErrorClosed);
333 }
334}
335
336TEST_F(StreamClosedReturnValues, ReadReturnsClosed){
337
338 openAndCloseStream();
339
340 void *buffer;
341 auto r = mStream->read(buffer, 1, 0);
342 ASSERT_EQ(r.error(), Result::ErrorClosed);
343}
344
345TEST_F(StreamClosedReturnValues, WriteReturnsClosed){
346
347 openAndCloseStream();
348
349 void *buffer;
350 auto r = mStream->write(buffer, 1, 0);
351 ASSERT_EQ(r.error(), Result::ErrorClosed);
352}