slesTestPlayFdPath.cpp revision c6853892c94800e72c0bd676d5d2136d48cea76e
1989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi/* 2989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * 4989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * you may not use this file except in compliance with the License. 6989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * You may obtain a copy of the License at 7989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * 8989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * 10989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * See the License for the specific language governing permissions and 14989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * limitations under the License. 15989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi */ 16989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 17989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#include <stdlib.h> 18989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#include <stdio.h> 19989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#include <string.h> 20989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#include <unistd.h> 21989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#include <sys/time.h> 22989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#include <fcntl.h> 23989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 24c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h> 25c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES_Android.h> 26989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 27989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 28989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 29989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 30989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#define TEST_MUTE 0 31989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#define TEST_SOLO 1 32989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 33989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivistatic int testMode; 34989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi//----------------------------------------------------------------- 35989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi/* Exits the application if an error is encountered */ 36989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 37989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 38989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 39989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi{ 40989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 4158432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "%u error code encountered at line %d, exiting\n", result, line); 42c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten exit(EXIT_FAILURE); 43989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 44989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi} 45989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 46989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 47989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi//----------------------------------------------------------------- 48989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 49989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi/* Play an audio path by opening a file descriptor on that path */ 50989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivivoid TestPlayPathFromFD( SLObjectItf sl, const char* path, SLAint64 offset, SLAint64 size) 51989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi{ 52989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLresult result; 53989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLEngineItf EngineItf; 54989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 55989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Objects this application uses: one player and an ouput mix */ 56989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLObjectItf player, outputMix; 57989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 58989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Source of audio data to play */ 59989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataSource audioSource; 60989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_AndroidFD locatorFd; 61989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataFormat_MIME mime; 62989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 63989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Data sinks for the audio player */ 64989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataSink audioSink; 65989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 66989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 67989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Play and PrefetchStatus interfaces for the audio player */ 68989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLPlayItf playItf; 69989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLPrefetchStatusItf prefetchItf; 70989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 71989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 72989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 73989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 74989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 75989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 76989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 77989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 78989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 79989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 80989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 81989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi iidArray[i] = SL_IID_NULL; 82989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 83989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 84989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* ------------------------------------------------------ */ 85989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Configuration of the output mix */ 86989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 87989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Create Output Mix object to be used by the player */ 88c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 0, iidArray, required); 89989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 90989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 91989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 92989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 93989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 94989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 95989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Setup the data sink structure */ 96989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 97989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi locator_outputmix.outputMix = outputMix; 98989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi audioSink.pLocator = (void*)&locator_outputmix; 99989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi audioSink.pFormat = NULL; 100989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 101989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* ------------------------------------------------------ */ 102989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Configuration of the player */ 103989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 104989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Set arrays required[] and iidArray[] for SLPrefetchStatusItf interfaces */ 105989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* (SLPlayItf is implicit) */ 106989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 107989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi iidArray[0] = SL_IID_PREFETCHSTATUS; 108989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 109989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Setup the data source structure for the URI */ 110989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi locatorFd.locatorType = SL_DATALOCATOR_ANDROIDFD; 111989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi int fd = open(path, O_RDONLY); 112989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (fd == -1) { 113c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten perror(path); 114c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten exit(EXIT_FAILURE); 115989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 116989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi locatorFd.fd = (SLint32) fd; 117989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi locatorFd.length = size; 118989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi locatorFd.offset = offset; 119989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 120989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 121989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 122989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 123989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi mime.mimeType = (SLchar*)NULL; 124989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 125989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 126989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi audioSource.pFormat = (void*)&mime; 127989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi audioSource.pLocator = (void*)&locatorFd; 128989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 129989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Create the audio player */ 130989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1, 131989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi iidArray, required); 132989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 133989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 134989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Realize the player in synchronous mode. */ 135989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 136989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 137989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 138989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Get the SLPlayItf, SLPrefetchStatusItf and SLAndroidStreamTypeItf interfaces for the player*/ 139989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 140989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 141989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 142989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 143989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 144989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 145989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "Player configured\n"); 146989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 147989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* ------------------------------------------------------ */ 148989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Playback and test */ 149989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 150989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Start the data prefetching by setting the player to the paused state */ 151989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 152989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 153989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 154989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Wait until there's data to play */ 155989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 156989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 157989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi usleep(100 * 1000); 158989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 159989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 160989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 161989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 162989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Get duration */ 163989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 164989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 165989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 166989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 167989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi durationInMsec = 5000; 168989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 169989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 170989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Start playback */ 171989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 172989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 173989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 174989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi usleep(durationInMsec * 1000); 175989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 176989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Make sure player is stopped */ 177989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "Stopping playback\n"); 178989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 179989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 180989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 181989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Destroy the player */ 182989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (*player)->Destroy(player); 183989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 184989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Destroy Output Mix object */ 185989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (*outputMix)->Destroy(outputMix); 186989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 187989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi close(fd); 188989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi} 189989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 190989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi//----------------------------------------------------------------- 191989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Triviint main(int argc, char* const argv[]) 192989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi{ 193989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLresult result; 194989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLObjectItf sl; 195989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 196989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf ", argv[0]); 197989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_AndroidFD source / OutputMix sink\n"); 198989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "Plays the sound file designated by the given path, "); 199989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "starting at the specified offset, and using the specified length.\n"); 200989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "Omit the length of the file for it to be computed by the system.\n"); 201989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 202989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (argc < 3) { 203989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "Usage: \t%s path offsetInBytes [sizeInBytes]\n", argv[0]); 204989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3 0 344460\" \n", argv[0]); 205c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten exit(EXIT_FAILURE); 206989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 207989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 208989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SLEngineOption EngineOption[] = { 209989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 210989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi }; 211989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 212989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 213989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 214989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 215989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 216989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 217989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi ExitOnError(result); 218989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 219989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi if (argc == 3) { 220c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten fprintf(stdout, "no file size given, using SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE\n"); 221989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi TestPlayPathFromFD(sl, argv[1], (SLAint64)atoi(argv[2]), 222989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE); 223989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } else { 224989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi TestPlayPathFromFD(sl, argv[1], (SLAint64)atoi(argv[2]), (SLAint64)atoi(argv[3])); 225989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi } 226989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 227989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi /* Shutdown OpenSL ES */ 228989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi (*sl)->Destroy(sl); 229989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi 230c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten return EXIT_SUCCESS; 231989ab369777ef514ac3ba6cdb893de9ae0c976bcJean-Michel Trivi} 232