1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker /*
18*bebae9c0SAndroid Build Coastguard Worker * Copyright (c) 2009 The Khronos Group Inc.
19*bebae9c0SAndroid Build Coastguard Worker *
20*bebae9c0SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy of this
21*bebae9c0SAndroid Build Coastguard Worker * software and /or associated documentation files (the "Materials "), to deal in the
22*bebae9c0SAndroid Build Coastguard Worker * Materials without restriction, including without limitation the rights to use, copy,
23*bebae9c0SAndroid Build Coastguard Worker * modify, merge, publish, distribute, sublicense, and/or sell copies of the Materials,
24*bebae9c0SAndroid Build Coastguard Worker * and to permit persons to whom the Materials are furnished to do so, subject to
25*bebae9c0SAndroid Build Coastguard Worker * the following conditions:
26*bebae9c0SAndroid Build Coastguard Worker *
27*bebae9c0SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
28*bebae9c0SAndroid Build Coastguard Worker * in all copies or substantial portions of the Materials.
29*bebae9c0SAndroid Build Coastguard Worker *
30*bebae9c0SAndroid Build Coastguard Worker * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31*bebae9c0SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32*bebae9c0SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33*bebae9c0SAndroid Build Coastguard Worker * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
34*bebae9c0SAndroid Build Coastguard Worker * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
35*bebae9c0SAndroid Build Coastguard Worker * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
36*bebae9c0SAndroid Build Coastguard Worker * CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
37*bebae9c0SAndroid Build Coastguard Worker * MATERIALS.
38*bebae9c0SAndroid Build Coastguard Worker */
39*bebae9c0SAndroid Build Coastguard Worker
40*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h>
41*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h>
42*bebae9c0SAndroid Build Coastguard Worker #include <string.h>
43*bebae9c0SAndroid Build Coastguard Worker #include <unistd.h>
44*bebae9c0SAndroid Build Coastguard Worker #include <sys/time.h>
45*bebae9c0SAndroid Build Coastguard Worker
46*bebae9c0SAndroid Build Coastguard Worker
47*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES.h>
48*bebae9c0SAndroid Build Coastguard Worker
49*bebae9c0SAndroid Build Coastguard Worker
50*bebae9c0SAndroid Build Coastguard Worker #define MAX_NUMBER_INTERFACES 3
51*bebae9c0SAndroid Build Coastguard Worker
52*bebae9c0SAndroid Build Coastguard Worker /* Local storage for Audio data in 16 bit words */
53*bebae9c0SAndroid Build Coastguard Worker #define AUDIO_DATA_STORAGE_SIZE (4096 * 100)
54*bebae9c0SAndroid Build Coastguard Worker /* Audio data buffer size in 16 bit words. 8 data segments are used in
55*bebae9c0SAndroid Build Coastguard Worker this simple example */
56*bebae9c0SAndroid Build Coastguard Worker #define AUDIO_DATA_BUFFER_SIZE (4096/8)
57*bebae9c0SAndroid Build Coastguard Worker
58*bebae9c0SAndroid Build Coastguard Worker /* Checks for error. If any errors exit the application! */
CheckErr(SLresult res)59*bebae9c0SAndroid Build Coastguard Worker void CheckErr( SLresult res )
60*bebae9c0SAndroid Build Coastguard Worker {
61*bebae9c0SAndroid Build Coastguard Worker if ( res != SL_RESULT_SUCCESS )
62*bebae9c0SAndroid Build Coastguard Worker {
63*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "%u SL failure, exiting\n", res);
64*bebae9c0SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
65*bebae9c0SAndroid Build Coastguard Worker }
66*bebae9c0SAndroid Build Coastguard Worker else {
67*bebae9c0SAndroid Build Coastguard Worker //fprintf(stdout, "%d SL success, proceeding...\n", res);
68*bebae9c0SAndroid Build Coastguard Worker }
69*bebae9c0SAndroid Build Coastguard Worker }
70*bebae9c0SAndroid Build Coastguard Worker
71*bebae9c0SAndroid Build Coastguard Worker /* Structure for passing information to callback function */
72*bebae9c0SAndroid Build Coastguard Worker typedef struct CallbackCntxt_ {
73*bebae9c0SAndroid Build Coastguard Worker SLPlayItf playItf;
74*bebae9c0SAndroid Build Coastguard Worker SLint16* pDataBase; // Base adress of local audio data storage
75*bebae9c0SAndroid Build Coastguard Worker SLint16* pData; // Current adress of local audio data storage
76*bebae9c0SAndroid Build Coastguard Worker SLuint32 size;
77*bebae9c0SAndroid Build Coastguard Worker } CallbackCntxt;
78*bebae9c0SAndroid Build Coastguard Worker
79*bebae9c0SAndroid Build Coastguard Worker /* Local storage for Audio data */
80*bebae9c0SAndroid Build Coastguard Worker SLint16 pcmData[AUDIO_DATA_STORAGE_SIZE];
81*bebae9c0SAndroid Build Coastguard Worker
82*bebae9c0SAndroid Build Coastguard Worker /* Callback for Buffer Queue events */
BufferQueueCallback(SLBufferQueueItf queueItf,void * pContext)83*bebae9c0SAndroid Build Coastguard Worker void BufferQueueCallback(
84*bebae9c0SAndroid Build Coastguard Worker SLBufferQueueItf queueItf,
85*bebae9c0SAndroid Build Coastguard Worker void *pContext)
86*bebae9c0SAndroid Build Coastguard Worker {
87*bebae9c0SAndroid Build Coastguard Worker //fprintf(stdout, "BufferQueueCallback called\n");
88*bebae9c0SAndroid Build Coastguard Worker SLresult res;
89*bebae9c0SAndroid Build Coastguard Worker //fprintf(stdout, " pContext=%p\n", pContext);
90*bebae9c0SAndroid Build Coastguard Worker CallbackCntxt *pCntxt = (CallbackCntxt*)pContext;
91*bebae9c0SAndroid Build Coastguard Worker
92*bebae9c0SAndroid Build Coastguard Worker if(pCntxt->pData < (pCntxt->pDataBase + pCntxt->size))
93*bebae9c0SAndroid Build Coastguard Worker {
94*bebae9c0SAndroid Build Coastguard Worker //fprintf(stdout, "callback: before enqueue\n");
95*bebae9c0SAndroid Build Coastguard Worker res = (*queueItf)->Enqueue(queueItf, (void*) pCntxt->pData,
96*bebae9c0SAndroid Build Coastguard Worker 2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
97*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
98*bebae9c0SAndroid Build Coastguard Worker /* Increase data pointer by buffer size */
99*bebae9c0SAndroid Build Coastguard Worker pCntxt->pData += AUDIO_DATA_BUFFER_SIZE;
100*bebae9c0SAndroid Build Coastguard Worker }
101*bebae9c0SAndroid Build Coastguard Worker //fprintf(stdout, "end of BufferQueueCallback()\n");
102*bebae9c0SAndroid Build Coastguard Worker }
103*bebae9c0SAndroid Build Coastguard Worker
104*bebae9c0SAndroid Build Coastguard Worker /* Play some audio from a buffer queue */
TestPlaySawtoothBufferQueue(SLObjectItf sl)105*bebae9c0SAndroid Build Coastguard Worker void TestPlaySawtoothBufferQueue( SLObjectItf sl )
106*bebae9c0SAndroid Build Coastguard Worker {
107*bebae9c0SAndroid Build Coastguard Worker SLEngineItf EngineItf;
108*bebae9c0SAndroid Build Coastguard Worker
109*bebae9c0SAndroid Build Coastguard Worker SLresult res;
110*bebae9c0SAndroid Build Coastguard Worker
111*bebae9c0SAndroid Build Coastguard Worker SLDataSource audioSource;
112*bebae9c0SAndroid Build Coastguard Worker SLDataLocator_BufferQueue bufferQueue;
113*bebae9c0SAndroid Build Coastguard Worker SLDataFormat_PCM pcm;
114*bebae9c0SAndroid Build Coastguard Worker
115*bebae9c0SAndroid Build Coastguard Worker SLDataSink audioSink;
116*bebae9c0SAndroid Build Coastguard Worker SLDataLocator_OutputMix locator_outputmix;
117*bebae9c0SAndroid Build Coastguard Worker
118*bebae9c0SAndroid Build Coastguard Worker SLObjectItf player;
119*bebae9c0SAndroid Build Coastguard Worker SLPlayItf playItf;
120*bebae9c0SAndroid Build Coastguard Worker SLBufferQueueItf bufferQueueItf;
121*bebae9c0SAndroid Build Coastguard Worker SLBufferQueueState state;
122*bebae9c0SAndroid Build Coastguard Worker
123*bebae9c0SAndroid Build Coastguard Worker SLObjectItf OutputMix;
124*bebae9c0SAndroid Build Coastguard Worker //SLVolumeItf volumeItf;
125*bebae9c0SAndroid Build Coastguard Worker
126*bebae9c0SAndroid Build Coastguard Worker int i;
127*bebae9c0SAndroid Build Coastguard Worker
128*bebae9c0SAndroid Build Coastguard Worker SLboolean required[MAX_NUMBER_INTERFACES];
129*bebae9c0SAndroid Build Coastguard Worker SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
130*bebae9c0SAndroid Build Coastguard Worker
131*bebae9c0SAndroid Build Coastguard Worker /* Callback context for the buffer queue callback function */
132*bebae9c0SAndroid Build Coastguard Worker CallbackCntxt cntxt;
133*bebae9c0SAndroid Build Coastguard Worker
134*bebae9c0SAndroid Build Coastguard Worker /* Get the SL Engine Interface which is implicit */
135*bebae9c0SAndroid Build Coastguard Worker res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
136*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
137*bebae9c0SAndroid Build Coastguard Worker
138*bebae9c0SAndroid Build Coastguard Worker /* Initialize arrays required[] and iidArray[] */
139*bebae9c0SAndroid Build Coastguard Worker for (i=0;i<MAX_NUMBER_INTERFACES;i++)
140*bebae9c0SAndroid Build Coastguard Worker {
141*bebae9c0SAndroid Build Coastguard Worker required[i] = SL_BOOLEAN_FALSE;
142*bebae9c0SAndroid Build Coastguard Worker iidArray[i] = SL_IID_NULL;
143*bebae9c0SAndroid Build Coastguard Worker }
144*bebae9c0SAndroid Build Coastguard Worker
145*bebae9c0SAndroid Build Coastguard Worker // Set arrays required[] and iidArray[] for VOLUME interface
146*bebae9c0SAndroid Build Coastguard Worker required[0] = SL_BOOLEAN_TRUE;
147*bebae9c0SAndroid Build Coastguard Worker iidArray[0] = SL_IID_VOLUME;
148*bebae9c0SAndroid Build Coastguard Worker // Create Output Mix object to be used by player
149*bebae9c0SAndroid Build Coastguard Worker res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0,
150*bebae9c0SAndroid Build Coastguard Worker iidArray, required); CheckErr(res);
151*bebae9c0SAndroid Build Coastguard Worker
152*bebae9c0SAndroid Build Coastguard Worker // Realizing the Output Mix object in synchronous mode.
153*bebae9c0SAndroid Build Coastguard Worker res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
154*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
155*bebae9c0SAndroid Build Coastguard Worker
156*bebae9c0SAndroid Build Coastguard Worker #if 0
157*bebae9c0SAndroid Build Coastguard Worker res = (*OutputMix)->GetInterface(OutputMix, SL_IID_VOLUME,
158*bebae9c0SAndroid Build Coastguard Worker (void*)&volumeItf); CheckErr(res);
159*bebae9c0SAndroid Build Coastguard Worker #endif
160*bebae9c0SAndroid Build Coastguard Worker
161*bebae9c0SAndroid Build Coastguard Worker /* Setup the data source structure for the buffer queue */
162*bebae9c0SAndroid Build Coastguard Worker bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
163*bebae9c0SAndroid Build Coastguard Worker bufferQueue.numBuffers = 4; /* Four buffers in our buffer queue */
164*bebae9c0SAndroid Build Coastguard Worker
165*bebae9c0SAndroid Build Coastguard Worker /* Setup the format of the content in the buffer queue */
166*bebae9c0SAndroid Build Coastguard Worker pcm.formatType = SL_DATAFORMAT_PCM;
167*bebae9c0SAndroid Build Coastguard Worker pcm.numChannels = 1;//2;
168*bebae9c0SAndroid Build Coastguard Worker pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
169*bebae9c0SAndroid Build Coastguard Worker pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
170*bebae9c0SAndroid Build Coastguard Worker pcm.containerSize = 16;
171*bebae9c0SAndroid Build Coastguard Worker pcm.channelMask = SL_SPEAKER_FRONT_LEFT;// | SL_SPEAKER_FRONT_RIGHT;
172*bebae9c0SAndroid Build Coastguard Worker pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
173*bebae9c0SAndroid Build Coastguard Worker
174*bebae9c0SAndroid Build Coastguard Worker audioSource.pFormat = (void *)&pcm;
175*bebae9c0SAndroid Build Coastguard Worker audioSource.pLocator = (void *)&bufferQueue;
176*bebae9c0SAndroid Build Coastguard Worker
177*bebae9c0SAndroid Build Coastguard Worker /* Setup the data sink structure */
178*bebae9c0SAndroid Build Coastguard Worker locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
179*bebae9c0SAndroid Build Coastguard Worker locator_outputmix.outputMix = OutputMix;
180*bebae9c0SAndroid Build Coastguard Worker audioSink.pLocator = (void *)&locator_outputmix;
181*bebae9c0SAndroid Build Coastguard Worker audioSink.pFormat = NULL;
182*bebae9c0SAndroid Build Coastguard Worker
183*bebae9c0SAndroid Build Coastguard Worker /* Initialize the audio data to play */
184*bebae9c0SAndroid Build Coastguard Worker unsigned int j;
185*bebae9c0SAndroid Build Coastguard Worker for (j = 0; j < sizeof(pcmData)/sizeof(pcmData[0]); ++j) {
186*bebae9c0SAndroid Build Coastguard Worker pcmData[j] = j*(100 + j / 200);// % 1000;
187*bebae9c0SAndroid Build Coastguard Worker }
188*bebae9c0SAndroid Build Coastguard Worker
189*bebae9c0SAndroid Build Coastguard Worker /* Initialize the context for Buffer queue callbacks */
190*bebae9c0SAndroid Build Coastguard Worker cntxt.pDataBase = /*(void*)&*/pcmData;
191*bebae9c0SAndroid Build Coastguard Worker cntxt.pData = cntxt.pDataBase;
192*bebae9c0SAndroid Build Coastguard Worker cntxt.size = sizeof(pcmData) / 2;
193*bebae9c0SAndroid Build Coastguard Worker
194*bebae9c0SAndroid Build Coastguard Worker /* Set arrays required[] and iidArray[] for SEEK interface
195*bebae9c0SAndroid Build Coastguard Worker (PlayItf is implicit) */
196*bebae9c0SAndroid Build Coastguard Worker required[0] = SL_BOOLEAN_TRUE;
197*bebae9c0SAndroid Build Coastguard Worker iidArray[0] = SL_IID_BUFFERQUEUE;
198*bebae9c0SAndroid Build Coastguard Worker
199*bebae9c0SAndroid Build Coastguard Worker /* Create the music player */
200*bebae9c0SAndroid Build Coastguard Worker res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player,
201*bebae9c0SAndroid Build Coastguard Worker &audioSource, &audioSink, 1, iidArray, required); CheckErr(res);
202*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "bufferQueue example: after CreateAudioPlayer\n");
203*bebae9c0SAndroid Build Coastguard Worker
204*bebae9c0SAndroid Build Coastguard Worker /* Realizing the player in synchronous mode. */
205*bebae9c0SAndroid Build Coastguard Worker res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res);
206*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "bufferQueue example: after Realize\n");
207*bebae9c0SAndroid Build Coastguard Worker
208*bebae9c0SAndroid Build Coastguard Worker /* Get seek and play interfaces */
209*bebae9c0SAndroid Build Coastguard Worker res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
210*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
211*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "bufferQueue example: after GetInterface(PLAY)\n");
212*bebae9c0SAndroid Build Coastguard Worker
213*bebae9c0SAndroid Build Coastguard Worker res = (*player)->GetInterface(player, SL_IID_BUFFERQUEUE,
214*bebae9c0SAndroid Build Coastguard Worker (void*)&bufferQueueItf); CheckErr(res);
215*bebae9c0SAndroid Build Coastguard Worker
216*bebae9c0SAndroid Build Coastguard Worker /* Setup to receive buffer queue event callbacks */
217*bebae9c0SAndroid Build Coastguard Worker res = (*bufferQueueItf)->RegisterCallback(bufferQueueItf,
218*bebae9c0SAndroid Build Coastguard Worker BufferQueueCallback, &cntxt); CheckErr(res);
219*bebae9c0SAndroid Build Coastguard Worker
220*bebae9c0SAndroid Build Coastguard Worker #if 0
221*bebae9c0SAndroid Build Coastguard Worker /* Before we start set volume to -3dB (-300mB) */
222*bebae9c0SAndroid Build Coastguard Worker res = (*volumeItf)->SetVolumeLevel(volumeItf, -300); CheckErr(res);
223*bebae9c0SAndroid Build Coastguard Worker #endif
224*bebae9c0SAndroid Build Coastguard Worker
225*bebae9c0SAndroid Build Coastguard Worker /* Enqueue a few buffers to get the ball rolling */
226*bebae9c0SAndroid Build Coastguard Worker res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
227*bebae9c0SAndroid Build Coastguard Worker 2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
228*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
229*bebae9c0SAndroid Build Coastguard Worker cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
230*bebae9c0SAndroid Build Coastguard Worker
231*bebae9c0SAndroid Build Coastguard Worker res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
232*bebae9c0SAndroid Build Coastguard Worker 2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
233*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
234*bebae9c0SAndroid Build Coastguard Worker cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
235*bebae9c0SAndroid Build Coastguard Worker
236*bebae9c0SAndroid Build Coastguard Worker res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
237*bebae9c0SAndroid Build Coastguard Worker 2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
238*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
239*bebae9c0SAndroid Build Coastguard Worker cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
240*bebae9c0SAndroid Build Coastguard Worker
241*bebae9c0SAndroid Build Coastguard Worker /* Play the PCM samples using a buffer queue */
242*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "bufferQueue example: starting to play\n");
243*bebae9c0SAndroid Build Coastguard Worker res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
244*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
245*bebae9c0SAndroid Build Coastguard Worker
246*bebae9c0SAndroid Build Coastguard Worker /* Wait until the PCM data is done playing, the buffer queue callback
247*bebae9c0SAndroid Build Coastguard Worker will continue to queue buffers until the entire PCM data has been
248*bebae9c0SAndroid Build Coastguard Worker played. This is indicated by waiting for the count member of the
249*bebae9c0SAndroid Build Coastguard Worker SLBufferQueueState to go to zero.
250*bebae9c0SAndroid Build Coastguard Worker */
251*bebae9c0SAndroid Build Coastguard Worker res = (*bufferQueueItf)->GetState(bufferQueueItf, &state);
252*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
253*bebae9c0SAndroid Build Coastguard Worker
254*bebae9c0SAndroid Build Coastguard Worker // while (state.playIndex < 100) {
255*bebae9c0SAndroid Build Coastguard Worker while (state.count) {
256*bebae9c0SAndroid Build Coastguard Worker usleep(10000);
257*bebae9c0SAndroid Build Coastguard Worker (*bufferQueueItf)->GetState(bufferQueueItf, &state);
258*bebae9c0SAndroid Build Coastguard Worker }
259*bebae9c0SAndroid Build Coastguard Worker
260*bebae9c0SAndroid Build Coastguard Worker /* Make sure player is stopped */
261*bebae9c0SAndroid Build Coastguard Worker res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
262*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
263*bebae9c0SAndroid Build Coastguard Worker /* Destroy the player */
264*bebae9c0SAndroid Build Coastguard Worker (*player)->Destroy(player);
265*bebae9c0SAndroid Build Coastguard Worker
266*bebae9c0SAndroid Build Coastguard Worker /* Destroy Output Mix object */
267*bebae9c0SAndroid Build Coastguard Worker (*OutputMix)->Destroy(OutputMix);
268*bebae9c0SAndroid Build Coastguard Worker }
269*bebae9c0SAndroid Build Coastguard Worker
270*bebae9c0SAndroid Build Coastguard Worker
271*bebae9c0SAndroid Build Coastguard Worker
main(int argc __unused,char * const argv[]__unused)272*bebae9c0SAndroid Build Coastguard Worker int main(int argc __unused, char* const argv[] __unused)
273*bebae9c0SAndroid Build Coastguard Worker {
274*bebae9c0SAndroid Build Coastguard Worker SLresult res;
275*bebae9c0SAndroid Build Coastguard Worker SLObjectItf sl;
276*bebae9c0SAndroid Build Coastguard Worker
277*bebae9c0SAndroid Build Coastguard Worker SLEngineOption EngineOption[] = {
278*bebae9c0SAndroid Build Coastguard Worker {(SLuint32) SL_ENGINEOPTION_THREADSAFE,
279*bebae9c0SAndroid Build Coastguard Worker (SLuint32) SL_BOOLEAN_TRUE}};
280*bebae9c0SAndroid Build Coastguard Worker
281*bebae9c0SAndroid Build Coastguard Worker res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
282*bebae9c0SAndroid Build Coastguard Worker CheckErr(res);
283*bebae9c0SAndroid Build Coastguard Worker /* Realizing the SL Engine in synchronous mode. */
284*bebae9c0SAndroid Build Coastguard Worker res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); CheckErr(res);
285*bebae9c0SAndroid Build Coastguard Worker
286*bebae9c0SAndroid Build Coastguard Worker /* Run the test */
287*bebae9c0SAndroid Build Coastguard Worker TestPlaySawtoothBufferQueue(sl);
288*bebae9c0SAndroid Build Coastguard Worker
289*bebae9c0SAndroid Build Coastguard Worker /* Shutdown OpenSL ES */
290*bebae9c0SAndroid Build Coastguard Worker (*sl)->Destroy(sl);
291*bebae9c0SAndroid Build Coastguard Worker
292*bebae9c0SAndroid Build Coastguard Worker return EXIT_SUCCESS;
293*bebae9c0SAndroid Build Coastguard Worker }
294