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