1c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi/* 2c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * 4c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * you may not use this file except in compliance with the License. 6c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * You may obtain a copy of the License at 7c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * 8c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * 10c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * See the License for the specific language governing permissions and 14c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * limitations under the License. 15c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi */ 16c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 17c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <stdlib.h> 18c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <stdio.h> 19c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <string.h> 20c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <unistd.h> 21c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <sys/time.h> 22c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <fcntl.h> 23c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 24a6c5e52ded343b557152156c33d33a10d29bf6f1Glenn Kasten#include <SLES/OpenSLES.h> 25a6c5e52ded343b557152156c33d33a10d29bf6f1Glenn Kasten#include <SLES/OpenSLES_Android.h> 26c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 27c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 28c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 29c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 30c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define TEST_MUTE 0 31c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define TEST_SOLO 1 32c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 33c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivistatic int testMode; 34c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi//----------------------------------------------------------------- 35c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi/* Exits the application if an error is encountered */ 36c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 37c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 38c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 39c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi{ 40c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 41d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stdout, "%u error code encountered at line %d, exiting\n", result, line); 424d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 43c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 44c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi} 45c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 46c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 47c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi//----------------------------------------------------------------- 48c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 49c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi/* Play an audio path by opening a file descriptor on that path */ 50c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivivoid TestPlayPathFromFD( SLObjectItf sl, const char* path, SLAint64 offset, SLAint64 size) 51c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi{ 52c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLresult result; 53c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLEngineItf EngineItf; 54c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 55c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Objects this application uses: one player and an ouput mix */ 56c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLObjectItf player, outputMix; 57c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 58c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Source of audio data to play */ 59c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataSource audioSource; 60c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_AndroidFD locatorFd; 61c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataFormat_MIME mime; 62c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 63c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Data sinks for the audio player */ 64c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataSink audioSink; 65c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 66c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 67c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Play and PrefetchStatus interfaces for the audio player */ 68c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLPlayItf playItf; 69c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLPrefetchStatusItf prefetchItf; 70c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 71c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 72c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 73c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 74c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 75c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 76c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 77c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 78c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 79c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 80c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 81c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 82c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 83c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 84c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* ------------------------------------------------------ */ 85c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Configuration of the output mix */ 86c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 87c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Create Output Mix object to be used by the player */ 884d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 0, iidArray, required); 89c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 90c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 91c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 92c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 93c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 94c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 95c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Setup the data sink structure */ 96c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 97c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locator_outputmix.outputMix = outputMix; 98c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSink.pLocator = (void*)&locator_outputmix; 99c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSink.pFormat = NULL; 100c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 101c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* ------------------------------------------------------ */ 102c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Configuration of the player */ 103c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 104c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Set arrays required[] and iidArray[] for SLPrefetchStatusItf interfaces */ 105c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* (SLPlayItf is implicit) */ 106c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 107c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi iidArray[0] = SL_IID_PREFETCHSTATUS; 108c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 109c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Setup the data source structure for the URI */ 110c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.locatorType = SL_DATALOCATOR_ANDROIDFD; 111c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi int fd = open(path, O_RDONLY); 112c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (fd == -1) { 1134d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten perror(path); 1144d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 115c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 116c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.fd = (SLint32) fd; 117c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.length = size; 118c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.offset = offset; 119c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 120c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 121c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 122c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 123c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 124c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 125c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 126c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSource.pFormat = (void*)&mime; 127c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSource.pLocator = (void*)&locatorFd; 128c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 129c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Create the audio player */ 130c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1, 131c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi iidArray, required); 132c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 133c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 134c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Realize the player in synchronous mode. */ 135c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 136c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 137c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 138c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Get the SLPlayItf, SLPrefetchStatusItf and SLAndroidStreamTypeItf interfaces for the player*/ 139c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 140c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 141c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 142c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 143c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 144c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 145c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Player configured\n"); 146c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 147c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* ------------------------------------------------------ */ 148c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Playback and test */ 149c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 150c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Start the data prefetching by setting the player to the paused state */ 151c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 152c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 153c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 154c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Wait until there's data to play */ 155c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 156c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 157c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi usleep(100 * 1000); 158c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 159c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 160c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 161c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 162c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Get duration */ 163c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 164c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 165c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 166c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 167c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi durationInMsec = 5000; 168c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 169c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 170c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Start playback */ 171c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 172c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 173c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 174c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi usleep(durationInMsec * 1000); 175c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 176c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Make sure player is stopped */ 177c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Stopping playback\n"); 178c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 179c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 180c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 181c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Destroy the player */ 182c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*player)->Destroy(player); 183c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 184c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Destroy Output Mix object */ 185c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*outputMix)->Destroy(outputMix); 186c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 187c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi close(fd); 188c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi} 189c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 190c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi//----------------------------------------------------------------- 191c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Triviint main(int argc, char* const argv[]) 192c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi{ 193c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLresult result; 194c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLObjectItf sl; 195c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 196c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf ", argv[0]); 197c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_AndroidFD source / OutputMix sink\n"); 198c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Plays the sound file designated by the given path, "); 199c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "starting at the specified offset, and using the specified length.\n"); 200c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Omit the length of the file for it to be computed by the system.\n"); 201c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 202c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (argc < 3) { 203c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Usage: \t%s path offsetInBytes [sizeInBytes]\n", argv[0]); 204c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3 0 344460\" \n", argv[0]); 2054d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 206c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 207c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 208c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLEngineOption EngineOption[] = { 209c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 210c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi }; 211c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 212c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 213c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 214c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 215c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 216c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 217c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 218c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 219c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (argc == 3) { 2204d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten fprintf(stdout, "no file size given, using SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE\n"); 221c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi TestPlayPathFromFD(sl, argv[1], (SLAint64)atoi(argv[2]), 222c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE); 223c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } else { 224c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi TestPlayPathFromFD(sl, argv[1], (SLAint64)atoi(argv[2]), (SLAint64)atoi(argv[3])); 225c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 226c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 227c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Shutdown OpenSL ES */ 228c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*sl)->Destroy(sl); 229c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 2304d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten return EXIT_SUCCESS; 231c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi} 232