slesTestPlayUri.cpp revision 1be90f9197d7a48e788b5e40fd15d73a877acef0
11be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi/*
21be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
31be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *
41be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
51be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * you may not use this file except in compliance with the License.
61be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * You may obtain a copy of the License at
71be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *
81be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
91be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *
101be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
111be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
121be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * See the License for the specific language governing permissions and
141be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * limitations under the License.
151be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi */
161be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
171be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi/*
181be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * Copyright (c) 2009 The Khronos Group Inc.
191be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *
201be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * Permission is hereby granted, free of charge, to any person obtaining a copy of this
211be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * software and /or associated documentation files (the "Materials "), to deal in the
221be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * Materials without restriction, including without limitation the rights to use, copy,
231be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * modify, merge, publish, distribute, sublicense, and/or sell copies of the Materials,
241be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * and to permit persons to whom the Materials are furnished to do so, subject to
251be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * the following conditions:
261be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *
271be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * The above copyright notice and this permission notice shall be included
281be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * in all copies or substantial portions of the Materials.
291be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi *
301be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
311be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
321be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
331be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
341be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
351be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
361be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
371be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi * MATERIALS.
381be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi */
391be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
401be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#define LOG_NDEBUG 0
411be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#define LOG_TAG "slesTestPlayUri"
421be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
431be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <utils/Log.h>
441be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <getopt.h>
451be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <stdlib.h>
461be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <stdio.h>
471be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <string.h>
481be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <unistd.h>
491be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include <sys/time.h>
501be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
511be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#include "OpenSLES.h"
521be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
531be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
541be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3
551be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi#define MAX_NUMBER_OUTPUT_DEVICES 6
561be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
571be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
581be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi//-----------------------------------------------------------------
591be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi/* Checks for error. If any errors exit the application! */
601be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivivoid CheckErr( SLresult res )
611be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi{
621be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    if ( res != SL_RESULT_SUCCESS )
631be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        {
641be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            fprintf(stdout, "%d SL failure, exiting\n", res);
651be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            exit(1);
661be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        }
671be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    else {
681be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        //fprintf(stdout, "%d SL success, proceeding...\n", res);
691be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    }
701be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi}
711be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
721be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
731be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi//-----------------------------------------------------------------
741be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
751be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi/* Play some music from a buffer queue  */
761be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivivoid TestPlayUri( SLObjectItf sl, const char* path)
771be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi{
781be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLEngineItf                EngineItf;
791be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
801be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLint32                    numOutputs = 0;
811be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLuint32                   deviceID = 0;
821be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
831be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLresult                   res;
841be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
851be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLDataSource               audioSource;
861be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLDataLocator_URI          uri;
871be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLDataFormat_MIME          mime;
881be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
891be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLDataSink                 audioSink;
901be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLDataLocator_OutputMix    locator_outputmix;
911be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
921be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLObjectItf                player;
931be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLPlayItf                  playItf;
941be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLVolumeItf                volItf;
951be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLBufferQueueItf           bufferQueueItf;
961be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLBufferQueueState         state;
971be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
981be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLObjectItf                OutputMix;
991be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1001be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    int                        i;
1011be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1021be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
1031be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
1041be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1051be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
1061be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
1071be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1081be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1091be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
1101be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    for (i=0;i<MAX_NUMBER_INTERFACES;i++)
1111be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        {
1121be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            required[i] = SL_BOOLEAN_FALSE;
1131be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            iidArray[i] = SL_IID_NULL;
1141be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        }
1151be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1161be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    // Set arrays required[] and iidArray[] for VOLUME interface
1171be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
1181be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    iidArray[0] = SL_IID_VOLUME;
1191be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    // Create Output Mix object to be used by player
1201be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 1,
1211be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            iidArray, required); CheckErr(res);
1221be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1231be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    // Realizing the Output Mix object in synchronous mode.
1241be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
1251be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1261be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1271be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Setup the data source structure for the URI */
1281be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    uri.locatorType = SL_DATALOCATOR_URI;
1291be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    uri.URI         =  (SLchar*) path;
1301be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    mime.formatType    = SL_DATAFORMAT_MIME;
1311be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /*mime.mimeType      = (SLchar*)"audio/mpeg";
1321be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    mime.containerType = SL_CONTAINERTYPE_MP3;*/
1331be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1341be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    audioSource.pFormat      = (void *)&mime;
1351be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    audioSource.pLocator     = (void *)&uri;
1361be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1371be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Setup the data sink structure */
1381be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    locator_outputmix.locatorType   = SL_DATALOCATOR_OUTPUTMIX;
1391be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    locator_outputmix.outputMix    = OutputMix;
1401be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    audioSink.pLocator           = (void *)&locator_outputmix;
1411be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    audioSink.pFormat            = NULL;
1421be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1431be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Create the audio player */
1441be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player,
1451be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            &audioSource, &audioSink, 1, iidArray, required); CheckErr(res);
1461be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1471be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Realizing the player in synchronous mode. */
1481be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res);
1491be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    fprintf(stdout, "URI example: after Realize\n");
1501be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1511be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Get play and vol interfaces */
1521be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
1531be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1541be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1551be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_VOLUME,
1561be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi                (void*)&volItf); CheckErr(res);
1571be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1581be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1591be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Set the player volume */
1601be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*volItf)->SetVolumeLevel( volItf, -300);
1611be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1621be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1631be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Play the URI */
1641be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    fprintf(stdout, "URI example: starting to play\n");
1651be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
1661be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1671be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1681be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Play 10s of the URI */
1691be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    usleep(10 * 1000 * 1000);
1701be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1711be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Make sure player is stopped */
1721be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    fprintf(stdout, "URI example: stopping playback\n");
1731be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
1741be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
1751be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1761be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Destroy the player */
1771be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    (*player)->Destroy(player);
1781be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1791be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Destroy Output Mix object */
1801be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    (*OutputMix)->Destroy(OutputMix);
1811be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi}
1821be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1831be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi//-----------------------------------------------------------------
1841be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Triviint main(int argc, char* const argv[])
1851be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi{
1861be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    LOGV("Starting slesTestPlayUri\n");
1871be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1881be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLresult    res;
1891be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLObjectItf sl;
1901be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1911be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    if (argc == 1) {
1921be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        fprintf(stdout, "Usage: \n\t%s path \n\t%s url\n", argv[0], argv[0]);
1931be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        fprintf(stdout, "Example: \"%s /sdcard/my.mp3\"  or \"%s file:///sdcard/my.mp3\"\n", argv[0], argv[0]);
1941be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi        exit(1);
1951be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    }
1961be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
1971be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    SLEngineOption EngineOption[] = {
1981be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            {(SLuint32) SL_ENGINEOPTION_THREADSAFE,
1991be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi            (SLuint32) SL_BOOLEAN_TRUE}};
2001be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
2011be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
2021be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
2031be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Realizing the SL Engine in synchronous mode. */
2041be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
2051be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    CheckErr(res);
2061be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
2071be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    TestPlayUri(sl, argv[1]);
2081be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
2091be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    /* Shutdown OpenSL ES */
2101be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    (*sl)->Destroy(sl);
2111be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    exit(0);
2121be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi
2131be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi    return 0;
2141be90f9197d7a48e788b5e40fd15d73a877acef0Jean-Michel Trivi}
215