slesTestPlayStream.cpp revision 16ce39d96d41884c7b0d1676553ab8167baaab74
1fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi/*
2fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi *
4fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * you may not use this file except in compliance with the License.
6fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * You may obtain a copy of the License at
7fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi *
8fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi *
10fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * See the License for the specific language governing permissions and
14fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi * limitations under the License.
15fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi */
16fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
17fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
18fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#include <stdlib.h>
19fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#include <stdio.h>
20fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//#include <string.h>
21fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#include <unistd.h>
22fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//#include <sys/time.h>
23fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
24fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#include "SLES/OpenSLES.h"
25fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#include "SLES/OpenSLES_Android.h"
26fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
27fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
28fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 2
29fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
30fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#define PREFETCHEVENT_ERROR_CANDIDATE \
31fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        (SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE)
32fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
3326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel TriviFILE *file;
3426043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
35fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
36fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//* Exits the application if an error is encountered */
37fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi#define CheckErr(x) ExitOnErrorFunc(x,__LINE__)
38fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
39fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line)
40fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
41fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (SL_RESULT_SUCCESS != result) {
42fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stderr, "%lu error code encountered at line %d, exiting\n", result, line);
43fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        exit(EXIT_FAILURE);
44fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
45fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
46fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
47fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivibool prefetchError = false;
48fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
49fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
50fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi/* AndroidBufferQueueItf callback for an audio player */
51fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel TriviSLresult AndroidBufferQueueCallback(
52fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi        SLAndroidBufferQueueItf caller,
53fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            void *pContext,
54fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            SLuint32 bufferId,
55fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            SLAint64 bufferLength,
56fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            void *pBufferDataLocation)
57fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi
58fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
59be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi    fprintf(stdout, "cb ");
6026043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
61fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    size_t nbRead = fread(pBufferDataLocation, 1, bufferLength, file);
6226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
63fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    SLAbufferQueueEvent event = SL_ANDROIDBUFFERQUEUE_EVENT_NONE;
6426043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    if (nbRead <= 0) {
65fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi        event = SL_ANDROIDBUFFERQUEUE_EVENT_EOS;
6626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    } else {
67fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi        event = SL_ANDROIDBUFFERQUEUE_EVENT_NONE; // no event to report
6826043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    }
69fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi
70be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi    //fprintf(stdout, "caller = %p\n", caller);
71be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi
72fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // enqueue the data right-away because in this example we're reading from a file, so we
73fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // can afford to do that. When streaming from the network, we would write from our cache
74fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // to this queue.
75fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // last param is NULL because we've already written the data in the buffer queue
76fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    (*caller)->Enqueue(caller, bufferId, nbRead, event, NULL);
77fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi
78ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    return SL_RESULT_SUCCESS;
79fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
80fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
81fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
82fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
83fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
84fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi/* Play some music from a URI  */
85fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivivoid TestPlayStream( SLObjectItf sl, const char* path)
86fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
87fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLEngineItf                EngineItf;
88fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
89fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLint32                    numOutputs = 0;
90fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLuint32                   deviceID = 0;
91fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
92fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLresult                   res;
93fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
94fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataSource               audioSource;
95fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    SLDataLocator_AndroidBufferQueue streamLocator;
96fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataFormat_MIME          mime;
97fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
98fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataSink                 audioSink;
99fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataLocator_OutputMix    locator_outputmix;
100fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
101fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLObjectItf                player;
102fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLPlayItf                  playItf;
103fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLVolumeItf                volItf;
104fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    SLAndroidBufferQueueItf    abqItf;
105fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
106fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLObjectItf                OutputMix;
107fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
108fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
109fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
110fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
11126043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    file = fopen(path, "rb");
11226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
113fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
114fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
115fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
116fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
117fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
118fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
119fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        required[i] = SL_BOOLEAN_FALSE;
120fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        iidArray[i] = SL_IID_NULL;
121fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
122fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
123fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    // Set arrays required[] and iidArray[] for VOLUME and PREFETCHSTATUS interface
124fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
125fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    iidArray[0] = SL_IID_VOLUME;
126fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    required[1] = SL_BOOLEAN_TRUE;
127fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    iidArray[1] = SL_IID_ANDROIDBUFFERQUEUE;
128fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    // Create Output Mix object to be used by player
129fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0,
130fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            iidArray, required); CheckErr(res);
131fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
132fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    // Realizing the Output Mix object in synchronous mode.
133fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
134fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
135fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
136fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Setup the data source structure for the URI */
137fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    streamLocator.locatorType  = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
138fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    streamLocator.numBuffers   = 0; // ignored at the moment
139fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    streamLocator.queueSize    = 0; // ignored at the moment
140fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    mime.formatType    = SL_DATAFORMAT_MIME;
14116ce39d96d41884c7b0d1676553ab8167baaab74Jean-Michel Trivi    mime.mimeType      = (SLchar *) "video/mp2ts";//(SLchar*)NULL;
14216ce39d96d41884c7b0d1676553ab8167baaab74Jean-Michel Trivi    mime.containerType = SL_CONTAINERTYPE_MPEG_TS;
143fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
144fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    audioSource.pFormat      = (void *)&mime;
145ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    audioSource.pLocator     = (void *)&streamLocator;
146fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
147fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Setup the data sink structure */
148fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    locator_outputmix.locatorType   = SL_DATALOCATOR_OUTPUTMIX;
149fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    locator_outputmix.outputMix    = OutputMix;
150fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    audioSink.pLocator           = (void *)&locator_outputmix;
151fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    audioSink.pFormat            = NULL;
152fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
153fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Create the audio player */
154fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink,
155fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            MAX_NUMBER_INTERFACES, iidArray, required); CheckErr(res);
156fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
157fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Realizing the player in synchronous mode. */
158fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res);
159fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "URI example: after Realize\n");
160fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
161fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Get interfaces */
162ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); CheckErr(res);
163fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
164ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_VOLUME,  (void*)&volItf); CheckErr(res);
165fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
166fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_ANDROIDBUFFERQUEUE, (void*)&abqItf);
167fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
168be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi
169be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi    res = (*abqItf)->RegisterCallback(abqItf, AndroidBufferQueueCallback, &abqItf); CheckErr(res);
170fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
171fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Display duration */
172fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLmillisecond durationInMsec = SL_TIME_UNKNOWN;
173fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->GetDuration(playItf, &durationInMsec);
174fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
175fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
176fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is unknown (before starting to prefetch)\n");
177fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    } else {
178fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is %lu ms (before starting to prefetch)\n",
179fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi                durationInMsec);
180fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
181fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
182fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Set the player volume */
18326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    res = (*volItf)->SetVolumeLevel( volItf, 0);//-300);
184fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
185fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
186fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Play the URI */
187fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /*     first cause the player to prefetch the data */
188fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "Before set to PAUSED\n");
189fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
190fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "After set to PAUSED\n");
191fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
192fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
193fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /*     wait until there's data to play */
194fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    //SLpermille fillLevel = 0;
195cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi /*
196cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi    SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
197fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLuint32 timeOutIndex = 2;
198fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0) &&
199fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            !prefetchError) {
200fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        usleep(1 * 1000 * 1000); // 1s
201ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi        //(*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus);
202fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        timeOutIndex--;
203fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
204fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
205fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (timeOutIndex == 0 || prefetchError) {
206fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stderr, "We\'re done waiting, failed to prefetch data in time, exiting\n");
207fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        goto destroyRes;
208cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi    }
209cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi*/
210fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
211fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Display duration again, */
212aa2fafdac2711436e5fd8faf162d7087a515cb1cJean-Michel Trivi/*    res = (*playItf)->GetDuration(playItf, &durationInMsec);
213fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
214fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
215fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is unknown (after prefetch completed)\n");
216fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    } else {
217fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is %lu ms (after prefetch completed)\n", durationInMsec);
218fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
219aa2fafdac2711436e5fd8faf162d7087a515cb1cJean-Michel Trivi*/
220fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
221fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "URI example: starting to play\n");
222fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
223fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
224fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
225fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Wait as long as the duration of the content before stopping */
22626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    //usleep(durationInMsec * 1000);
227cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi    int playTimeInSec = 15;
228cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi    fprintf(stdout, "Letting playback go on for %d sec\n", playTimeInSec);
229cb417262919560a715628f4317dc8a4de386f750Jean-Michel Trivi    usleep(playTimeInSec /*s*/ * 1000 * 1000);
23026043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
231fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
232fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Make sure player is stopped */
233fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "URI example: stopping playback\n");
234fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
235fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
236fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
237be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi    fprintf(stdout, "sleeping to verify playback stopped\n");
238be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi    usleep(2 /*s*/ * 1000 * 1000);
239be59fc5cfd9354d70d4b0e28bb2bca24a6ca6f22Jean-Michel Trivi
240fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel TrividestroyRes:
241fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
242fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Destroy the player */
243fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    (*player)->Destroy(player);
244fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
245fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Destroy Output Mix object */
246fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    (*OutputMix)->Destroy(OutputMix);
24726043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
24826043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    fclose(file);
249fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
250fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
251fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
252fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Triviint main(int argc, char* const argv[])
253fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
254fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLresult    res;
255fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLObjectItf sl;
256fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
257fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLVolumeItf, SLAndroidBufferQueue \n",
258fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            argv[0]);
259fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    fprintf(stdout, "and AudioPlayer with SL_DATALOCATOR_ANDROIDBUFFERQUEUE source / OutputMix sink\n");
260fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "Plays a sound and stops after its reported duration\n\n");
261fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
262fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (argc == 1) {
263fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Usage: %s path \n\t%s url\n", argv[0], argv[0]);
264fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Example: \"%s /sdcard/my.mp3\"  or \"%s file:///sdcard/my.mp3\"\n",
265fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi                argv[0], argv[0]);
266fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        exit(EXIT_FAILURE);
267fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
268fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
269fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLEngineOption EngineOption[] = {
270fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            {(SLuint32) SL_ENGINEOPTION_THREADSAFE,
271fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            (SLuint32) SL_BOOLEAN_TRUE}};
272fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
273fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
274fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
275fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Realizing the SL Engine in synchronous mode. */
276fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
277fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
278fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
279fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    TestPlayStream(sl, argv[1]);
280fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
281fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Shutdown OpenSL ES */
282fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    (*sl)->Destroy(sl);
283fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
284fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    return EXIT_SUCCESS;
285fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
286