1 /*
2 * Copyright (C) 2011 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
17 /**
18 * Test for testing the creation of OpenSL ES objects under various configurations (determined
19 * by their data source and sink types) that are expected to be supported.
20 * The tests verify the creation and completion of the call to Realize() for the following objects:
21 * - Engine
22 * - OutputMix
23 * - AudioPlayer:
24 * * source is URI
25 * * source is FD
26 * * source is BufferQueue of PCM buffers
27 * * source is AndroidBufferQueue of MP2TS buffers
28 * * source is URI, sink is BufferQueue of PCM buffers
29 * * source is FD, sink is BufferQueue of PCM buffers
30 * * source is AndroidBufferQueue of AAC ADTS buffers, sink is BufferQueue of PCM buffers
31 * - AudioRecorder
32 * * source is IO device, sink is BufferQueue of PCM buffers
33 */
34
35 #define LOG_NDEBUG 0
36 #define LOG_TAG "SLObjectCreationTest"
37
38 #include <gtest/gtest.h>
39 #include <utils/Log.h>
40
41 #if !defined(BUILD_ONLY)
42 #include "SLES/OpenSLES.h"
43 #include "SLES/OpenSLES_Android.h"
44 #include "OpenSLESUT.h"
45 #endif
46
47 #if !defined(BUILD_ONLY)
48 //-----------------------------------------------------------------
49 /* Checks for error and displays the error code if any */
IsOk(SLresult res)50 bool IsOk(SLresult res) {
51 if (SL_RESULT_SUCCESS != res) {
52 const char *str = slesutResultToString(res);
53 if (NULL == str)
54 str = "unknown";
55 fprintf(stderr, "IsOk failure: %s (0x%x), exiting\n", str, res);
56 return false;
57 }
58 return true;
59 }
60
61 //-----------------------------------------------------------------
62 class SLObjectCreationTest : public ::testing::Test {
63
64 protected:
65 SLresult res;
66 SLObjectItf engineObj, outputMixObj, audioPlayerObj;
67 SLEngineItf engineItf;
68
69 SLDataSource audioSource;
70 SLDataSink audioSink;
71 SLDataLocator_URI locatorUriSrc;
72 SLDataLocator_AndroidBufferQueue locatorAbqSrc;
73 SLDataLocator_AndroidFD locatorFdSrc;
74 SLDataFormat_MIME formatMimeSrc;
75
76 SLDataLocator_OutputMix locatorOutputmixSnk;
77 SLDataLocator_AndroidSimpleBufferQueue locatorBqSnk;
78 SLDataFormat_PCM formatPcmSnk;
79
SLObjectCreationTest()80 SLObjectCreationTest() { }
81
~SLObjectCreationTest()82 virtual ~SLObjectCreationTest() { }
83
84 /* Test setup*/
SetUp()85 virtual void SetUp() {
86 ALOGV("Test Setup()");
87 res = SL_RESULT_UNKNOWN_ERROR;
88 engineItf = NULL;
89 engineObj = NULL;
90 outputMixObj = NULL;
91 audioPlayerObj = NULL;
92 // Engine creation
93 res = slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL);
94 ASSERT_TRUE(IsOk(res));
95 res = (*engineObj)->Realize(engineObj, SL_BOOLEAN_FALSE);
96 ASSERT_TRUE(IsOk(res));
97 res = (*engineObj)->GetInterface(engineObj, SL_IID_ENGINE, &engineItf);
98 ASSERT_TRUE(IsOk(res));
99 ASSERT_TRUE(NULL != engineItf);
100 }
101
TearDown()102 virtual void TearDown() {
103 ALOGV("Test TearDown()");
104 if (audioPlayerObj) {
105 (*audioPlayerObj)->Destroy(audioPlayerObj);
106 audioPlayerObj = NULL;
107 }
108 if (outputMixObj) {
109 (*outputMixObj)->Destroy(outputMixObj);
110 outputMixObj = NULL;
111 }
112 if (engineObj){
113 (*engineObj)->Destroy(engineObj);
114 engineObj = NULL;
115 }
116 }
117
118 //---------------------------------------------------------------------------------------------
119 // Test implementation convenience methods (to avoid code duplication)
120
AudioPlayerCreation()121 void AudioPlayerCreation() {
122 res = (*engineItf)->CreateAudioPlayer(engineItf, &audioPlayerObj,
123 &audioSource, &audioSink, 0, NULL/*iidArray*/, NULL/*required*/);
124 ASSERT_TRUE(IsOk(res));
125 ASSERT_TRUE(NULL != audioPlayerObj);
126 res = (*audioPlayerObj)->Realize(audioPlayerObj, SL_BOOLEAN_FALSE);
127 ASSERT_TRUE(IsOk(res));
128 }
129
OutputMixSinkInitialization()130 void OutputMixSinkInitialization() {
131 locatorOutputmixSnk.locatorType = SL_DATALOCATOR_OUTPUTMIX;
132 locatorOutputmixSnk.outputMix = outputMixObj; // created in OutputMixCreation()
133 audioSink.pLocator = &locatorOutputmixSnk;
134 audioSink.pFormat = NULL;
135 }
136
UriSourceInitialization()137 void UriSourceInitialization() {
138 locatorUriSrc.locatorType = SL_DATALOCATOR_URI;
139 locatorUriSrc.URI = (SLchar*) "/dummyPath/dummyFile.mp3";
140 formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
141 formatMimeSrc.mimeType = (SLchar *) NULL;
142 formatMimeSrc.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
143 audioSource.pLocator = &locatorUriSrc;
144 audioSource.pFormat = &formatMimeSrc;
145 }
146
FdSourceInitialization()147 void FdSourceInitialization() {
148 locatorFdSrc.locatorType = SL_DATALOCATOR_ANDROIDFD;
149 locatorFdSrc.fd = (SLint32) 1;// a positive value to fake a valid FD
150 locatorFdSrc.length = 10;
151 locatorFdSrc.offset = 0;
152 formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
153 formatMimeSrc.mimeType = (SLchar *) NULL;
154 formatMimeSrc.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
155 audioSource.pLocator = &locatorFdSrc;
156 audioSource.pFormat = &formatMimeSrc;
157 }
158
PcmBqSinkInitialization()159 void PcmBqSinkInitialization() {
160 locatorBqSnk.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
161 locatorBqSnk.numBuffers = 16;
162 formatPcmSnk.formatType = SL_DATAFORMAT_PCM;
163 formatPcmSnk.numChannels = 1;
164 formatPcmSnk.samplesPerSec = SL_SAMPLINGRATE_8;
165 formatPcmSnk.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
166 formatPcmSnk.containerSize = 16;
167 formatPcmSnk.channelMask = SL_SPEAKER_FRONT_LEFT;
168 formatPcmSnk.endianness = SL_BYTEORDER_LITTLEENDIAN;
169 audioSink.pLocator = (void *) &locatorBqSnk;
170 audioSink.pFormat = (void *) &formatPcmSnk;
171 }
172
173 //---------------------------------------------------------------------------------------------
174 // Tests
175
176 /* Test case for creating an AudioPlayer object */
OutputMixCreation()177 void OutputMixCreation() {
178 res = (*engineItf)->CreateOutputMix(engineItf, &outputMixObj,
179 0, NULL/*iidArray*/, NULL/*required*/);
180 ASSERT_TRUE(IsOk(res));
181 ASSERT_TRUE(NULL != outputMixObj);
182 res = (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE);
183 ASSERT_TRUE(IsOk(res));
184 }
185
186 /* Test case for creating an AudioPlayer object that plays from a URI */
AudioPlayerFromUriCreation()187 void AudioPlayerFromUriCreation() {
188 // source: URI
189 UriSourceInitialization();
190 // sink: OutputMix
191 OutputMixSinkInitialization();
192 // AudioPlayer creation
193 AudioPlayerCreation();
194 }
195
196 /* Test case for creating an AudioPlayer object that plays from a FD */
AudioPlayerFromFdCreation()197 void AudioPlayerFromFdCreation() {
198 // source: FD
199 FdSourceInitialization();
200 // sink: OutputMix
201 OutputMixSinkInitialization();
202 // AudioPlayer creation
203 AudioPlayerCreation();
204 }
205
206 /* Test case for creating an AudioPlayer object that plays from a PCM BufferQueue */
AudioPlayerFromPcmBqCreation()207 void AudioPlayerFromPcmBqCreation() {
208 // source: PCM BufferQueue
209 SLDataLocator_BufferQueue locatorBufferQueue;
210 locatorBufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
211 locatorBufferQueue.numBuffers = 16;
212 SLDataFormat_PCM pcm;
213 pcm.formatType = SL_DATAFORMAT_PCM;
214 pcm.numChannels = 2;
215 pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
216 pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
217 pcm.containerSize = 16;
218 pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
219 pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
220 audioSource.pLocator = &locatorBufferQueue;
221 audioSource.pFormat = &pcm;
222
223 // sink: OutputMix
224 OutputMixSinkInitialization();
225 // AudioPlayer creation
226 AudioPlayerCreation();
227 }
228
229 /* Test case for creating an AudioPlayer object that plays from Transport Stream ABQ */
AudioPlayerFromTsAbqCreation()230 void AudioPlayerFromTsAbqCreation() {
231 // source: transport stream in an AndroidBufferQueue
232 locatorAbqSrc.locatorType = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
233 locatorAbqSrc.numBuffers = 16;
234 formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
235 formatMimeSrc.mimeType = (SLchar *) "video/mp2ts";
236 formatMimeSrc.containerType = SL_CONTAINERTYPE_MPEG_TS;
237 audioSource.pFormat = (void *)&formatMimeSrc;
238 audioSource.pLocator = (void *)&locatorAbqSrc;
239
240 // sink: OutputMix
241 OutputMixSinkInitialization();
242 // AudioPlayer creation
243 AudioPlayerCreation();
244 }
245
246 /* Test case for creating an AudioPlayer object that decodes from a URI to a PCM BQ */
AudioPlayerFromUriToPcmBqCreation()247 void AudioPlayerFromUriToPcmBqCreation() {
248 // source: URI
249 UriSourceInitialization();
250 // sink: PCM BufferQueue
251 PcmBqSinkInitialization();
252 // AudioPlayer creation
253 AudioPlayerCreation();
254 }
255
256 /* Test case for creating an AudioPlayer object that decodes from a FD to a PCM BQ */
AudioPlayerFromFdToPcmBqCreation()257 void AudioPlayerFromFdToPcmBqCreation() {
258 // source: FD
259 FdSourceInitialization();
260 // sink: PCM BufferQueue
261 PcmBqSinkInitialization();
262 // AudioPlayer creation
263 AudioPlayerCreation();
264 }
265
266 /* Test case for creating an AudioPlayer object that decodes from a ADTS ABQ to a PCM BQ */
AudioPlayerFromAdtsAbqToPcmBqCreation()267 void AudioPlayerFromAdtsAbqToPcmBqCreation() {
268 // source: ADTS AndroidBufferQueue
269 locatorAbqSrc.locatorType = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
270 locatorAbqSrc.numBuffers = 16;
271 formatMimeSrc.formatType = SL_DATAFORMAT_MIME;
272 formatMimeSrc.mimeType = (SLchar *)"audio/aac-adts";
273 formatMimeSrc.containerType = SL_CONTAINERTYPE_RAW;
274 audioSource.pLocator = (void *) &locatorAbqSrc;
275 audioSource.pFormat = (void *) &formatMimeSrc;
276
277 // sink: PCM BufferQueue
278 PcmBqSinkInitialization();
279 // AudioPlayer creation
280 AudioPlayerCreation();
281 }
282
283 /* Test case for creating an AudioRecorder object */
AudioRecorderCreation(bool doNotRealize=false)284 void AudioRecorderCreation(bool doNotRealize = false) {
285 // source: IO device
286 SLDataLocator_IODevice locatorIoDeviceSrc;
287 locatorIoDeviceSrc.locatorType = SL_DATALOCATOR_IODEVICE;
288 locatorIoDeviceSrc.deviceType = SL_IODEVICE_AUDIOINPUT;
289 locatorIoDeviceSrc.deviceID = SL_DEFAULTDEVICEID_AUDIOINPUT;
290 locatorIoDeviceSrc.device = NULL;
291 audioSource.pLocator = (void *) &locatorIoDeviceSrc;
292 audioSource.pFormat = NULL;
293
294 // sink: PCM BufferQueue
295 PcmBqSinkInitialization();
296
297 // AudioRecorder creation
298 SLObjectItf audioRecorderObj = NULL;
299 res = (*engineItf)->CreateAudioRecorder(engineItf, &audioRecorderObj,
300 &audioSource, &audioSink, 0, NULL/*iidArray*/, NULL/*required*/);
301 ASSERT_TRUE(IsOk(res));
302 ASSERT_TRUE(NULL != audioRecorderObj);
303 if (!doNotRealize) {
304 res = (*audioRecorderObj)->Realize(audioRecorderObj, SL_BOOLEAN_FALSE);
305 ASSERT_TRUE(IsOk(res));
306 }
307
308 // AudioRecorder destruction
309 (*audioRecorderObj)->Destroy(audioRecorderObj);
310 }
311 };
312 #else
313 class SLObjectCreationTest : public ::testing::Test {
314 protected:
OutputMixCreation()315 void OutputMixCreation() { }
AudioPlayerFromUriCreation()316 void AudioPlayerFromUriCreation() { }
AudioPlayerFromFdCreation()317 void AudioPlayerFromFdCreation() { }
AudioPlayerFromPcmBqCreation()318 void AudioPlayerFromPcmBqCreation() { }
AudioPlayerFromTsAbqCreation()319 void AudioPlayerFromTsAbqCreation() { }
AudioPlayerFromUriToPcmBqCreation()320 void AudioPlayerFromUriToPcmBqCreation() { }
AudioPlayerFromFdToPcmBqCreation()321 void AudioPlayerFromFdToPcmBqCreation() { }
AudioPlayerFromAdtsAbqToPcmBqCreation()322 void AudioPlayerFromAdtsAbqToPcmBqCreation() { }
AudioRecorderCreation(bool)323 void AudioRecorderCreation(bool) { }
324 };
325 #endif
326
327 //-------------------------------------------------------------------------------------------------
TEST_F(SLObjectCreationTest,testEngineCreation)328 TEST_F(SLObjectCreationTest, testEngineCreation) {
329 ALOGV("Test Fixture: EngineCreation");
330 // nothing to do here that isn't done in SetUp()
331 }
332
TEST_F(SLObjectCreationTest,testOutputMixCreation)333 TEST_F(SLObjectCreationTest, testOutputMixCreation) {
334 ALOGV("Test Fixture: OutputMixCreation");
335 OutputMixCreation();
336 }
337
TEST_F(SLObjectCreationTest,testAudioPlayerFromUriCreation)338 TEST_F(SLObjectCreationTest, testAudioPlayerFromUriCreation) {
339 ALOGV("Test Fixture: AudioPlayerFromUriCreation");
340 // required for AudioPlayer creation
341 OutputMixCreation();
342 AudioPlayerFromUriCreation();
343 }
344
TEST_F(SLObjectCreationTest,testAudioPlayerFromFdCreation)345 TEST_F(SLObjectCreationTest, testAudioPlayerFromFdCreation) {
346 ALOGV("Test Fixture: AudioPlayerFromFdCreation");
347 // required for AudioPlayer creation
348 OutputMixCreation();
349 AudioPlayerFromFdCreation();
350 }
351
TEST_F(SLObjectCreationTest,testAudioPlayerFromPcmBqCreation)352 TEST_F(SLObjectCreationTest, testAudioPlayerFromPcmBqCreation) {
353 ALOGV("Test Fixture: AudioPlayerFromPcmBqCreation");
354 // required for AudioPlayer creation
355 OutputMixCreation();
356 AudioPlayerFromPcmBqCreation();
357 }
358
TEST_F(SLObjectCreationTest,testAudioPlayerFromTsAbqCreation)359 TEST_F(SLObjectCreationTest, testAudioPlayerFromTsAbqCreation) {
360 ALOGV("Test Fixture: AudioPlayerFromTsAbqCreation");
361 // required for AudioPlayer creation
362 OutputMixCreation();
363 AudioPlayerFromTsAbqCreation();
364 }
365
TEST_F(SLObjectCreationTest,testAudioPlayerFromUriToPcmBqCreation)366 TEST_F(SLObjectCreationTest, testAudioPlayerFromUriToPcmBqCreation) {
367 ALOGV("Test Fixture: AudioPlayerFromUriToPcmBqCreation");
368 AudioPlayerFromUriToPcmBqCreation();
369 }
370
TEST_F(SLObjectCreationTest,testAudioPlayerFromFdToPcmBqCreation)371 TEST_F(SLObjectCreationTest, testAudioPlayerFromFdToPcmBqCreation) {
372 ALOGV("Test Fixture: AudioPlayerFromFdToPcmBqCreation");
373 AudioPlayerFromFdToPcmBqCreation();
374 }
375
TEST_F(SLObjectCreationTest,testAudioPlayerFromAdtsAbqToPcmBqCreation)376 TEST_F(SLObjectCreationTest, testAudioPlayerFromAdtsAbqToPcmBqCreation) {
377 ALOGV("Test Fixture: AudioPlayerFromAdtsAbqToPcmBqCreation");
378 AudioPlayerFromAdtsAbqToPcmBqCreation();
379 }
380
TEST_F(SLObjectCreationTest,testAudioRecorderCreation)381 TEST_F(SLObjectCreationTest, testAudioRecorderCreation) {
382 ALOGV("Test Fixture: AudioRecorderCreation");
383 // cannot Realize as native test cannot have necessary permission.
384 AudioRecorderCreation(true);
385 }
386
main(int argc,char ** argv)387 int main(int argc, char **argv) {
388 testing::InitGoogleTest(&argc, argv);
389
390 return RUN_ALL_TESTS();
391 }
392