1ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi/*
2ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
3ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi *
4ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
5ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * you may not use this file except in compliance with the License.
6ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * You may obtain a copy of the License at
7ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi *
8ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
9ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi *
10ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
11ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
12ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * See the License for the specific language governing permissions and
14ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi * limitations under the License.
15ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi */
16ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
17ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#include <stdlib.h>
18ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#include <stdio.h>
19ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#include <string.h>
20ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#include <unistd.h>
21ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#include <sys/time.h>
22ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
232dc537a086811c9a97e1f925ace16be7d0b0fcb4Glenn Kasten#include "SLES/OpenSLES.h"
24ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
25ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
268c5a381a265210f069a370565f10ce31bf886346Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 2
27ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
28ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#define TEST_MUTE 0
29ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#define TEST_SOLO 1
30ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
31ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivistatic int testMode;
32ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi//-----------------------------------------------------------------
33ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi/* Exits the application if an error is encountered */
34ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__)
35ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
36ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line)
37ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi{
38ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    if (SL_RESULT_SUCCESS != result) {
39ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        fprintf(stdout, "%lu error code encountered at line %d, exiting\n", result, line);
404d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten        exit(EXIT_FAILURE);
41ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    }
42ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi}
43ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
44ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
45ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi//-----------------------------------------------------------------
46ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
478c5a381a265210f069a370565f10ce31bf886346Jean-Michel Trivi/* Play an audio URIs, play, pause, stop  */
48ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivivoid TestPlayUri( SLObjectItf sl, const char* path)
49ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi{
50ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLresult  result;
51ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLEngineItf EngineItf;
52ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
53ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Objects this application uses: one player and an ouput mix */
54ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLObjectItf  player, outputMix;
55ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
56ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Source of audio data to play */
57ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLDataSource      audioSource;
58ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLDataLocator_URI uri;
59ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLDataFormat_MIME mime;
60ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
61ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Data sinks for the audio player */
62ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLDataSink               audioSink;
63ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLDataLocator_OutputMix  locator_outputmix;
64ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
65ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Play, Volume and PrefetchStatus interfaces for the audio player */
66ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLPlayItf           playItf;
67ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLMuteSoloItf       muteSoloItf;
68ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLPrefetchStatusItf prefetchItf;
69ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
70ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
71ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
72ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
73ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
74ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
75ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
76ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
77ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
78ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
79ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        required[i] = SL_BOOLEAN_FALSE;
80ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        iidArray[i] = SL_IID_NULL;
81ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    }
82ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
83ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* ------------------------------------------------------ */
84ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Configuration of the output mix  */
85ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
86ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Create Output Mix object to be used by the player */
874d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten     result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 0, iidArray, required);
88ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi     ExitOnError(result);
89ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
90ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Realize the Output Mix object in synchronous mode */
91ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE);
92ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
93ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
94ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Setup the data sink structure */
95ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
96ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    locator_outputmix.outputMix   = outputMix;
97ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    audioSink.pLocator            = (void*)&locator_outputmix;
98ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    audioSink.pFormat             = NULL;
99ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
100ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* ------------------------------------------------------ */
101ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Configuration of the player  */
102ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
103ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Set arrays required[] and iidArray[] for SLMuteSoloItf and SLPrefetchStatusItf interfaces */
104ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /*  (SLPlayItf is implicit) */
105ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
106ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    iidArray[0] = SL_IID_MUTESOLO;
107ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    required[1] = SL_BOOLEAN_TRUE;
108ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    iidArray[1] = SL_IID_PREFETCHSTATUS;
109ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
110ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Setup the data source structure for the URI */
111ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    uri.locatorType = SL_DATALOCATOR_URI;
112ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    uri.URI         =  (SLchar*) path;
113ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    mime.formatType = SL_DATAFORMAT_MIME;
114ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /*     this is how ignored mime information is specified, according to OpenSL ES spec
115ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi     *     in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */
116ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    mime.mimeType      = (SLchar*)NULL;
117ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
118ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
119ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    audioSource.pFormat  = (void*)&mime;
120ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    audioSource.pLocator = (void*)&uri;
121ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
122ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Create the audio player */
1238c5a381a265210f069a370565f10ce31bf886346Jean-Michel Trivi    result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink,
1248c5a381a265210f069a370565f10ce31bf886346Jean-Michel Trivi            MAX_NUMBER_INTERFACES, iidArray, required);
125ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
126ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
127ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Realize the player in synchronous mode. */
128ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result);
129ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "URI example: after Realize\n");
130ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
131ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Get the SLPlayItf, SLPrefetchStatusItf and SLMuteSoloItf interfaces for the player */
132ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
133ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
134ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
135ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf);
136ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
137ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
138ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_MUTESOLO, (void*)&muteSoloItf);
139ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
140ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
141ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
142ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "Player configured\n");
143ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
144ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* ------------------------------------------------------ */
145ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Playback and test */
146ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
147ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Start the data prefetching by setting the player to the paused state */
148ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
149ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
150ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
151ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Wait until there's data to play */
152ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
153ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) {
154ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        usleep(100 * 1000);
155ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus);
156ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    }
157ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
158ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
159ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Testing play states */
160ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* let it play for 2s */
161ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "----- Playing\n");
162ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
163ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
164ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    usleep(2 * 1000 * 1000);
165ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
16649f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    /* pause for 1s*/
16749f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    fprintf(stdout, "----- Pausing (1s)\n");
168ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
169ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
170ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    usleep(2 * 1000 * 1000);
171ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
172ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* resume */
17349f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    fprintf(stdout, "----- Playing (2s, should have resumed where it paused)\n");
174ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
175ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
176ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    usleep(2 * 1000 * 1000);
177ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
17849f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    /* stop */
17949f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    fprintf(stdout, "----- Stopping\n");
18049f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
18149f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    ExitOnError(result);
18249f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi
18349f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    /* play for 2s */
18449f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    fprintf(stdout, "----- Playing (2s, should have started from the beginning\n");
18549f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
18649f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    ExitOnError(result);
18749f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    usleep(2 * 1000 * 1000);
18849f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi
18949f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    /* stop */
19049f02bb3bb095a45c05e0f1a64ed13053287cc82Jean-Michel Trivi    fprintf(stdout, "----- Stopping\n");
191ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
192ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
193ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
194ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel TrividestroyKillKill:
195ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
196ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Destroy the players */
197ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    (*player)->Destroy(player);
198ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
199ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Destroy Output Mix object */
200ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    (*outputMix)->Destroy(outputMix);
201ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi}
202ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
203ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi//-----------------------------------------------------------------
204ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Triviint main(int argc, char* const argv[])
205ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi{
206ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLresult    result;
207ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLObjectItf sl;
208ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
209ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLVolumeItf, SLMuteSoloItf\n",
210ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi            argv[0]);
211ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n");
212ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "Plays a sound and alternates the muting of the channels (for 5s).\n");
213ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, " and then alternates the solo\'ing of the channels (for 5s).\n");
214ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    fprintf(stdout, "Stops after 10s\n");
215ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
216ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    if (argc == 1) {
217ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        fprintf(stdout, "Usage: \t%s url\n", argv[0]);
218ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        fprintf(stdout, "Example: \"%s /sdcard/my.mp3\"\n", argv[0]);
2194d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten        exit(EXIT_FAILURE);
220ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    }
221ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
222ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    SLEngineOption EngineOption[] = {
223ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi            {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE}
224ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    };
225ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
226ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
227ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
228ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
229ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Realizing the SL Engine in synchronous mode. */
230ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
231ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    ExitOnError(result);
232ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
233ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    if (argc > 1) {
234ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi        TestPlayUri(sl, argv[1]);
235ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    }
236ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
237ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    /* Shutdown OpenSL ES */
238ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi    (*sl)->Destroy(sl);
239ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi
2404d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten    return EXIT_SUCCESS;
241ba6f5a8583a5dabbd05a690b334844dffa179091Jean-Michel Trivi}
242