• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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