slesTestPlayStream.cpp revision fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1
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
49ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi
50fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
51fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi/* AndroidBufferQueueItf callback for an audio player */
52fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel TriviSLresult AndroidBufferQueueCallback(
53fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi        SLAndroidBufferQueueItf caller,
54fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            void *pContext,
55fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            SLuint32 bufferId,
56fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            SLAint64 bufferLength,
57fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            void *pBufferDataLocation)
58fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi
59fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
60fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    fprintf(stdout, "AndroidBufferQueueCallback called\n");
6126043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
62fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    size_t nbRead = fread(pBufferDataLocation, 1, bufferLength, file);
6326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
64fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    SLAbufferQueueEvent event = SL_ANDROIDBUFFERQUEUE_EVENT_NONE;
6526043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    if (nbRead <= 0) {
66fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi        event = SL_ANDROIDBUFFERQUEUE_EVENT_EOS;
6726043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    } else {
68fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi        event = SL_ANDROIDBUFFERQUEUE_EVENT_NONE; // no event to report
6926043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    }
70fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi
71fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // enqueue the data right-away because in this example we're reading from a file, so we
72fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // can afford to do that. When streaming from the network, we would write from our cache
73fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // to this queue.
74fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    // last param is NULL because we've already written the data in the buffer queue
75fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    (*caller)->Enqueue(caller, bufferId, nbRead, event, NULL);
76fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi
77ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    return SL_RESULT_SUCCESS;
78fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
79fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
80fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
81fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
82fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
83fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi/* Play some music from a URI  */
84fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivivoid TestPlayStream( SLObjectItf sl, const char* path)
85fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
86fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLEngineItf                EngineItf;
87fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
88fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLint32                    numOutputs = 0;
89fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLuint32                   deviceID = 0;
90fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
91fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLresult                   res;
92fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
93fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataSource               audioSource;
94fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    SLDataLocator_AndroidBufferQueue streamLocator;
95fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataFormat_MIME          mime;
96fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
97fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataSink                 audioSink;
98fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLDataLocator_OutputMix    locator_outputmix;
99fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
100fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLObjectItf                player;
101fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLPlayItf                  playItf;
102fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLVolumeItf                volItf;
103fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    SLAndroidBufferQueueItf    abqItf;
104fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
105fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLObjectItf                OutputMix;
106fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
107fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
108fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
109fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
11026043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    file = fopen(path, "rb");
11126043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
112fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
113fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
114fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
115fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
116fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
117fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
118fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        required[i] = SL_BOOLEAN_FALSE;
119fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        iidArray[i] = SL_IID_NULL;
120fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
121fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
122fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    // Set arrays required[] and iidArray[] for VOLUME and PREFETCHSTATUS interface
123fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
124fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    iidArray[0] = SL_IID_VOLUME;
125fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    required[1] = SL_BOOLEAN_TRUE;
126fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    iidArray[1] = SL_IID_ANDROIDBUFFERQUEUE;
127fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    // Create Output Mix object to be used by player
128fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0,
129fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            iidArray, required); CheckErr(res);
130fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
131fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    // Realizing the Output Mix object in synchronous mode.
132fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
133fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
134fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
135fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Setup the data source structure for the URI */
136fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    streamLocator.locatorType  = SL_DATALOCATOR_ANDROIDBUFFERQUEUE;
137fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    streamLocator.numBuffers   = 0; // ignored at the moment
138fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    streamLocator.queueSize    = 0; // ignored at the moment
139fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    mime.formatType    = SL_DATAFORMAT_MIME;
140fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    mime.mimeType      = (SLchar*)NULL;
141fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
142fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
143fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    audioSource.pFormat      = (void *)&mime;
144ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    audioSource.pLocator     = (void *)&streamLocator;
145fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
146fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Setup the data sink structure */
147fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    locator_outputmix.locatorType   = SL_DATALOCATOR_OUTPUTMIX;
148fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    locator_outputmix.outputMix    = OutputMix;
149fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    audioSink.pLocator           = (void *)&locator_outputmix;
150fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    audioSink.pFormat            = NULL;
151fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
152fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Create the audio player */
153fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink,
154fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            MAX_NUMBER_INTERFACES, iidArray, required); CheckErr(res);
155fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
156fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Realizing the player in synchronous mode. */
157fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res);
158fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "URI example: after Realize\n");
159fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
160fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Get interfaces */
161ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); CheckErr(res);
162fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
163ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_VOLUME,  (void*)&volItf); CheckErr(res);
164fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
165fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_ANDROIDBUFFERQUEUE, (void*)&abqItf);
166fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
167fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    res = (*abqItf)->RegisterCallback(abqItf, AndroidBufferQueueCallback,
168fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi            &abqItf); CheckErr(res);
169fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
170fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Display duration */
171fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLmillisecond durationInMsec = SL_TIME_UNKNOWN;
172fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->GetDuration(playItf, &durationInMsec);
173fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
174fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
175fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is unknown (before starting to prefetch)\n");
176fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    } else {
177fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is %lu ms (before starting to prefetch)\n",
178fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi                durationInMsec);
179fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
180fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
181fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Set the player volume */
18226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    res = (*volItf)->SetVolumeLevel( volItf, 0);//-300);
183fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
184fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
185fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Play the URI */
186fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /*     first cause the player to prefetch the data */
187fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "Before set to PAUSED\n");
188fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
189fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "After set to PAUSED\n");
190fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
191fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
192fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /*     wait until there's data to play */
193fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    //SLpermille fillLevel = 0;
19426043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi /*   SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
195fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLuint32 timeOutIndex = 2;
196fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0) &&
197fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            !prefetchError) {
198fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        usleep(1 * 1000 * 1000); // 1s
199ad887a253969ac2017a1dbe062d0b76d505594c0Jean-Michel Trivi        //(*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus);
200fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        timeOutIndex--;
201fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
202fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
203fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (timeOutIndex == 0 || prefetchError) {
204fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stderr, "We\'re done waiting, failed to prefetch data in time, exiting\n");
205fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        goto destroyRes;
20626043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    }*/
207fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
208fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Display duration again, */
209fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->GetDuration(playItf, &durationInMsec);
210fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
211fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
212fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is unknown (after prefetch completed)\n");
213fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    } else {
214fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Content duration is %lu ms (after prefetch completed)\n", durationInMsec);
215fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
216fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
217fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "URI example: starting to play\n");
218fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
219fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
220fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
221fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Wait as long as the duration of the content before stopping */
22226043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    //usleep(durationInMsec * 1000);
22326043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    usleep(30 /*s*/ * 1000 * 1000);
22426043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
225fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
226fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Make sure player is stopped */
227fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "URI example: stopping playback\n");
228fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
229fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
230fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
231fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel TrividestroyRes:
232fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
233fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Destroy the player */
234fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    (*player)->Destroy(player);
235fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
236fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Destroy Output Mix object */
237fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    (*OutputMix)->Destroy(OutputMix);
23826043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi
23926043f06b7d6cb2f93a2f2e7846a4e59da722206Jean-Michel Trivi    fclose(file);
240fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
241fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
242fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi//-----------------------------------------------------------------
243fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Triviint main(int argc, char* const argv[])
244fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi{
245fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLresult    res;
246fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLObjectItf sl;
247fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
248fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLVolumeItf, SLAndroidBufferQueue \n",
249fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            argv[0]);
250fa62f9f2c20b446178c05e3e92407fe5dfdbf8a1Jean-Michel Trivi    fprintf(stdout, "and AudioPlayer with SL_DATALOCATOR_ANDROIDBUFFERQUEUE source / OutputMix sink\n");
251fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    fprintf(stdout, "Plays a sound and stops after its reported duration\n\n");
252fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
253fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    if (argc == 1) {
254fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Usage: %s path \n\t%s url\n", argv[0], argv[0]);
255fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        fprintf(stdout, "Example: \"%s /sdcard/my.mp3\"  or \"%s file:///sdcard/my.mp3\"\n",
256fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi                argv[0], argv[0]);
257fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi        exit(EXIT_FAILURE);
258fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    }
259fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
260fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    SLEngineOption EngineOption[] = {
261fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            {(SLuint32) SL_ENGINEOPTION_THREADSAFE,
262fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi            (SLuint32) SL_BOOLEAN_TRUE}};
263fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
264fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
265fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
266fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Realizing the SL Engine in synchronous mode. */
267fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
268fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    CheckErr(res);
269fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
270fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    TestPlayStream(sl, argv[1]);
271fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
272fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    /* Shutdown OpenSL ES */
273fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    (*sl)->Destroy(sl);
274fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi
275fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi    return EXIT_SUCCESS;
276fe6f6b9ed3683119721618e1aeaa8c7d6baee188Jean-Michel Trivi}
277