slesTestPlayFdPath.cpp revision 2dc537a086811c9a97e1f925ace16be7d0b0fcb4
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#define LOG_NDEBUG 0 18c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define LOG_TAG "slesTest_playFdPath" 19c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 20c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <utils/Log.h> 21c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <getopt.h> 22c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <stdlib.h> 23c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <stdio.h> 24c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <string.h> 25c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <unistd.h> 26c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <sys/time.h> 27c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#include <fcntl.h> 28c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 292dc537a086811c9a97e1f925ace16be7d0b0fcb4Glenn Kasten#include "SLES/OpenSLES.h" 302dc537a086811c9a97e1f925ace16be7d0b0fcb4Glenn Kasten#include "SLES/OpenSLES_Android.h" 31c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 32c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 33c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 34c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define MAX_NUMBER_OUTPUT_DEVICES 6 35c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 36c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define TEST_MUTE 0 37c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define TEST_SOLO 1 38c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 39c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivistatic int testMode; 40c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi//----------------------------------------------------------------- 41c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi/* Exits the application if an error is encountered */ 42c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 43c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 44c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 45c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi{ 46c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 47c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "%lu error code encountered at line %d, exiting\n", result, line); 48c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi exit(1); 49c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 50c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi} 51c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 52c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 53c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi//----------------------------------------------------------------- 54c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 55c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi/* Play an audio path by opening a file descriptor on that path */ 56c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivivoid TestPlayPathFromFD( SLObjectItf sl, const char* path, SLAint64 offset, SLAint64 size) 57c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi{ 58c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLresult result; 59c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLEngineItf EngineItf; 60c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 61c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Objects this application uses: one player and an ouput mix */ 62c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLObjectItf player, outputMix; 63c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 64c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Source of audio data to play */ 65c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataSource audioSource; 66c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_AndroidFD locatorFd; 67c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataFormat_MIME mime; 68c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 69c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Data sinks for the audio player */ 70c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataSink audioSink; 71c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 72c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 73c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Play and PrefetchStatus interfaces for the audio player */ 74c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLPlayItf playItf; 75c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLPrefetchStatusItf prefetchItf; 76c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 77c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 78c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 79c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 80c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 81c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 82c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 83c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 84c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 85c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 86c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 87c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 88c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 89c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 90c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* ------------------------------------------------------ */ 91c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Configuration of the output mix */ 92c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 93c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Create Output Mix object to be used by the player */ 94c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required); 95c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 96c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 97c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 98c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 99c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 100c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 101c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Setup the data sink structure */ 102c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 103c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locator_outputmix.outputMix = outputMix; 104c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSink.pLocator = (void*)&locator_outputmix; 105c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSink.pFormat = NULL; 106c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 107c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* ------------------------------------------------------ */ 108c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Configuration of the player */ 109c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 110c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Set arrays required[] and iidArray[] for SLPrefetchStatusItf interfaces */ 111c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* (SLPlayItf is implicit) */ 112c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 113c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi iidArray[0] = SL_IID_PREFETCHSTATUS; 114c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 115c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Setup the data source structure for the URI */ 116c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.locatorType = SL_DATALOCATOR_ANDROIDFD; 117c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi int fd = open(path, O_RDONLY); 118c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (fd == -1) { 119c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(SL_RESULT_RESOURCE_ERROR); 120c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 121c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.fd = (SLint32) fd; 122c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.length = size; 123c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi locatorFd.offset = offset; 124c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 125c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 126c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 127c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 128c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 129c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 130c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 131c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSource.pFormat = (void*)&mime; 132c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi audioSource.pLocator = (void*)&locatorFd; 133c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 134c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Create the audio player */ 135c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1, 136c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi iidArray, required); 137c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 138c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 139c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Realize the player in synchronous mode. */ 140c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 141c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 142c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 143c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Get the SLPlayItf, SLPrefetchStatusItf and SLAndroidStreamTypeItf interfaces for the player*/ 144c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 145c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 146c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 147c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 148c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 149c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 150c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Player configured\n"); 151c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 152c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* ------------------------------------------------------ */ 153c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Playback and test */ 154c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 155c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Start the data prefetching by setting the player to the paused state */ 156c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 157c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 158c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 159c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Wait until there's data to play */ 160c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 161c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 162c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi usleep(100 * 1000); 163c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 164c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 165c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 166c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 167c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Get duration */ 168c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 169c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 170c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 171c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 172c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi durationInMsec = 5000; 173c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 174c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 175c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Start playback */ 176c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 177c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 178c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 179c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi usleep(durationInMsec * 1000); 180c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 181c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Make sure player is stopped */ 182c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Stopping playback\n"); 183c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 184c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 185c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 186c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Destroy the player */ 187c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*player)->Destroy(player); 188c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 189c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Destroy Output Mix object */ 190c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*outputMix)->Destroy(outputMix); 191c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 192c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi close(fd); 193c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi} 194c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 195c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi//----------------------------------------------------------------- 196c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Triviint main(int argc, char* const argv[]) 197c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi{ 198c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi LOGV("Starting %s\n", argv[0]); 199c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 200c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLresult result; 201c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLObjectItf sl; 202c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 203c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf ", argv[0]); 204c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_AndroidFD source / OutputMix sink\n"); 205c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Plays the sound file designated by the given path, "); 206c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "starting at the specified offset, and using the specified length.\n"); 207c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Omit the length of the file for it to be computed by the system.\n"); 208c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 209c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (argc < 3) { 210c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Usage: \t%s path offsetInBytes [sizeInBytes]\n", argv[0]); 211c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3 0 344460\" \n", argv[0]); 212c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi exit(1); 213c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 214c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 215c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SLEngineOption EngineOption[] = { 216c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 217c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi }; 218c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 219c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 220c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 221c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 222c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 223c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 224c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi ExitOnError(result); 225c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 226c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi if (argc == 3) { 227c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi fprintf(stdout, "\nno file size given, using SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE\n\n"); 228c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi TestPlayPathFromFD(sl, argv[1], (SLAint64)atoi(argv[2]), 229c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE); 230c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } else { 231c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi TestPlayPathFromFD(sl, argv[1], (SLAint64)atoi(argv[2]), (SLAint64)atoi(argv[3])); 232c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi } 233c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 234c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi /* Shutdown OpenSL ES */ 235c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi (*sl)->Destroy(sl); 236c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi exit(0); 237c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi 238c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi return 0; 239c5ac6a3baf25c4adde2186ad8235e889ebc11151Jean-Michel Trivi} 240