slesTestPlayUri2.cpp revision ee21d26b4b66d0f19b826685b3070497523994d5
1b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/*
2b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi *
4b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * you may not use this file except in compliance with the License.
6b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * You may obtain a copy of the License at
7b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi *
8b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi *
10b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * See the License for the specific language governing permissions and
14b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * limitations under the License.
15b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi */
16b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
17b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define LOG_NDEBUG 0
18b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define LOG_TAG "slesTestPlayUri"
19b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
208eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#ifdef ANDROID
21b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <utils/Log.h>
228eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#else
238eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#define LOGV printf
248eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#endif
258eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten
26b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <getopt.h>
27b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <stdlib.h>
28b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <stdio.h>
29b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <string.h>
30b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <unistd.h>
31b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <sys/time.h>
32b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
33ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES.h"
34b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
35b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
36b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3
37b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define MAX_NUMBER_OUTPUT_DEVICES 6
38b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
39b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
40b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//-----------------------------------------------------------------
41b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* Exits the application if an error is encountered */
42b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivivoid ExitOnError( SLresult result )
43b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{
44b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (SL_RESULT_SUCCESS != result) {
45b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "%lu error code encountered, exiting\n", result);
46b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        exit(1);
47b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
48b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi}
49b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
50b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//-----------------------------------------------------------------
51b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* PlayItf callback for an audio player */
52b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivivoid PlayEventCallback( SLPlayItf caller,  void *pContext, SLuint32 event)
53b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{
54b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "PlayEventCallback event = ");
55b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (event & SL_PLAYEVENT_HEADATEND) {
56b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "SL_PLAYEVENT_HEADATEND ");
57b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
58b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (event & SL_PLAYEVENT_HEADATMARKER) {
59b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "SL_PLAYEVENT_HEADATMARKER ");
60b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
61b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (event & SL_PLAYEVENT_HEADATNEWPOS) {
62b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "SL_PLAYEVENT_HEADATNEWPOS ");
63b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
64b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (event & SL_PLAYEVENT_HEADMOVING) {
65b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "SL_PLAYEVENT_HEADMOVING ");
66b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
67b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (event & SL_PLAYEVENT_HEADSTALLED) {
68b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "SL_PLAYEVENT_HEADSTALLED");
69b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
70b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "\n");
71b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi}
72b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
73b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//-----------------------------------------------------------------
74b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
75b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* Play two audio URIs, pan them left and right  */
76b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivivoid TestPlayUri( SLObjectItf sl, const char* path, const char* path2)
77b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{
78b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLresult  result;
79b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLEngineItf EngineItf;
80b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
81b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Objects this application uses: two players and an ouput mix */
82b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLObjectItf  player, player2, outputMix;
83b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
84b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Source of audio data to play, we'll reuse the same source for two different players */
85b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLDataSource      audioSource;
86b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLDataLocator_URI uri;
87b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLDataFormat_MIME mime;
88b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
89b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Data sinks for the two audio players */
90b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLDataSink               audioSink;
91b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLDataLocator_OutputMix  locator_outputmix;
92b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
93b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Play, Volume and PrefetchStatus interfaces for the audio players */
94b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLPlayItf           playItf, playItf2;
95b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLVolumeItf         volItf, volItf2;
96b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLPrefetchStatusItf prefetchItf, prefetchItf2;
97b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
98b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
99b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
100b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
101b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
102b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
103b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
104b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
105b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
106b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
107b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        required[i] = SL_BOOLEAN_FALSE;
108b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        iidArray[i] = SL_IID_NULL;
109b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
110b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Set arrays required[] and iidArray[] for SLVolumeItf and SLPrefetchStatusItf interfaces */
111b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /*  (SLPlayItf is implicit) */
112b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
113b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    iidArray[0] = SL_IID_VOLUME;
114b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    required[1] = SL_BOOLEAN_TRUE;
115b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    iidArray[1] = SL_IID_PREFETCHSTATUS;
116b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
117b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* ------------------------------------------------------ */
118b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Configuration of the output mix  */
119b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
120b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Create Output Mix object to be used each player */
121b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi     result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required);
122b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi     ExitOnError(result);
123b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
124b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Realize the Output Mix object in synchronous mode */
125b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE);
126b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
127b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
128b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Setup the data sink structure */
129b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
130b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    locator_outputmix.outputMix   = outputMix;
131b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    audioSink.pLocator            = (void *)&locator_outputmix;
132b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    audioSink.pFormat             = NULL;
133b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
134b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* ------------------------------------------------------ */
135b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Configuration of the players  */
136b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
137b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Setup the data source structure for the first URI */
138b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    uri.locatorType = SL_DATALOCATOR_URI;
139b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    uri.URI         =  (SLchar*) path;
140b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    mime.formatType    = SL_DATAFORMAT_MIME;
141b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /*     this is how ignored mime information is specified, according to OpenSL ES spec
142b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi     *     in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */
143b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    mime.mimeType      = (SLchar*)NULL;
144b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
145b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
146b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    audioSource.pFormat      = (void *)&mime;
147b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    audioSource.pLocator     = (void *)&uri;
148b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
149b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Create the first audio player */
1504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 2,
151b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi            iidArray, required);
152b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
153b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
154b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Create the second audio player with a different path for its data source */
155b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    uri.URI =  (SLchar*) path2;
156b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    audioSource.pLocator = (void *)&uri;
1574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player2, &audioSource, &audioSink, 2,
158b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi            iidArray, required);
159b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
160b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
161b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Realize the players in synchronous mode. */
162b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result);
163b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player)->Realize(player2, SL_BOOLEAN_FALSE); ExitOnError(result);
164b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    //fprintf(stdout, "URI example: after Realize\n");
165b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
166b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Get the SLPlayItf, SLVolumeItf and SLPrefetchStatusItf interfaces for each player */
167b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
168b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
169b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player)->GetInterface(player2, SL_IID_PLAY, (void*)&playItf2);
170b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
171b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
172b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_VOLUME, (void*)&volItf);
173b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
174b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player2)->GetInterface(player2, SL_IID_VOLUME, (void*)&volItf2);
175b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
176b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
177b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf);
178b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
179b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*player2)->GetInterface(player2, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf2);
180b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
181b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
182b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /*  Setup to receive playback events */
183b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf)->RegisterCallback(playItf, PlayEventCallback, &playItf);
184b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
185b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf)->SetCallbackEventsMask(playItf,
186b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi            SL_PLAYEVENT_HEADATEND| SL_PLAYEVENT_HEADATMARKER | SL_PLAYEVENT_HEADATNEWPOS
187b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi            | SL_PLAYEVENT_HEADMOVING | SL_PLAYEVENT_HEADSTALLED);
188b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
189b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
190b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Set the player volume */
191b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*volItf)->SetVolumeLevel( volItf, -300);
192b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
193b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Pan the first player to the left */
194b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*volItf)->EnableStereoPosition( volItf, SL_BOOLEAN_TRUE); ExitOnError(result);
195b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*volItf)->SetStereoPosition( volItf, -1000); ExitOnError(result);
196b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Pan the second player to the right */
197b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*volItf2)->EnableStereoPosition( volItf2, SL_BOOLEAN_TRUE); ExitOnError(result);
198b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*volItf2)->SetStereoPosition( volItf2, 1000); ExitOnError(result);
199b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
200b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* ------------------------------------------------------ */
201b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Playback */
202b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
203b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Start the data prefetching by setting the players to the paused state */
204b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
205b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
206b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf2)->SetPlayState( playItf2, SL_PLAYSTATE_PAUSED );
207b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
208b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
209b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /*     wait until there's data to play */
210b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
211b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) {
212b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        usleep(100 * 1000);
213b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus);
214b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
215b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
216b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) {
217b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        usleep(100 * 1000);
218b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        (*prefetchItf2)->GetPrefetchStatus(prefetchItf2, &prefetchStatus);
219b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
220b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
221b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
222b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
223b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
224b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Wait 2s before starting the second player */
225b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    usleep(2000 * 1000);
226b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "URI example: starting to play %s\n", path2);
227b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf2)->SetPlayState( playItf2, SL_PLAYSTATE_PLAYING );
228b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
229b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
230b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Display duration */
231b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLmillisecond durationInMsec = SL_TIME_UNKNOWN;
232b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf)->GetDuration(playItf, &durationInMsec);
233b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
234b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
235b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "Content duration of first URI is unknown\n");
236b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    } else {
237b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "Content duration of first URI is %lu ms\n", durationInMsec);
238b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
239b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
240b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Wait as long as the duration of the first URI + 2s before stopping */
241b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
242b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        durationInMsec = 5000; /* arbitrary time when duration is unknown */
243b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
244b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    usleep((durationInMsec + 2000) * 1000);
245b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
246b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Make sure player is stopped */
247b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "URI example: stopping playback\n");
248b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
249b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
250b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*playItf2)->SetPlayState(playItf2, SL_PLAYSTATE_STOPPED);
251b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
252b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
253b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Destroy the players */
254b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    (*player)->Destroy(player);
255b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    (*player2)->Destroy(player2);
256b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
257b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Destroy Output Mix object */
258b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    (*outputMix)->Destroy(outputMix);
259b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi}
260b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
261b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//-----------------------------------------------------------------
262b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Triviint main(int argc, char* const argv[])
263b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{
264b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    LOGV("Starting %s\n", argv[0]);
265b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
266b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLresult    result;
267b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLObjectItf sl;
268b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
269b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLVolumeItf (incl. stereo position) ",
270b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi            argv[0]);
271b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n");
272b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "Plays two sounds (or twice the same) and pans them left and right.");
273b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    fprintf(stdout, "Stops after the end of the first + 2s\n");
274b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
275b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (argc == 1) {
276b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        fprintf(stdout, "Usage: \n\t%s url1 url2 \n\t%s url\n", argv[0], argv[0]);
2772a00e1105c1e051f13d2b5f3f69f02882de982eaGlenn Kasten        fprintf(stdout, "Example: \"%s /sdcard/my.mp3 http://blabla/my.wav\" ", argv[0]);
2782a00e1105c1e051f13d2b5f3f69f02882de982eaGlenn Kasten        fprintf(stdout, "or \"%s file:///sdcard/my.mp3\"\n", argv[0]);
279b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        exit(1);
280b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
281b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
282b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    SLEngineOption EngineOption[] = {
283b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi            {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE}
284b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    };
285b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
286b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
287b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
288b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
289b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Realizing the SL Engine in synchronous mode. */
290b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
291b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    ExitOnError(result);
292b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
293b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    if (argc == 2) {
294b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        TestPlayUri(sl, argv[1], argv[1]);
295b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    } else if (argc == 3) {
296b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi        TestPlayUri(sl, argv[1], argv[2]);
297b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    }
298b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
299b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    /* Shutdown OpenSL ES */
300b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    (*sl)->Destroy(sl);
301b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    exit(0);
302b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi
303b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi    return 0;
304b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi}
305