slesTestPlayUri2.cpp revision ee21d26b4b66d0f19b826685b3070497523994d5
1b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* 2b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * 4b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * you may not use this file except in compliance with the License. 6b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * You may obtain a copy of the License at 7b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * 8b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * 10b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * See the License for the specific language governing permissions and 14b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * limitations under the License. 15b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi */ 16b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 17b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define LOG_NDEBUG 0 18b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define LOG_TAG "slesTestPlayUri" 19b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 208eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#ifdef ANDROID 21b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <utils/Log.h> 228eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#else 238eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#define LOGV printf 248eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten#endif 258eabaa529bf4796543a54bccc6f87def95e0b326Glenn Kasten 26b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <getopt.h> 27b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <stdlib.h> 28b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <stdio.h> 29b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <string.h> 30b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <unistd.h> 31b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#include <sys/time.h> 32b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 33ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES.h" 34b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 35b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 36b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 37b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi#define MAX_NUMBER_OUTPUT_DEVICES 6 38b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 39b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 40b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//----------------------------------------------------------------- 41b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* Exits the application if an error is encountered */ 42b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivivoid ExitOnError( SLresult result ) 43b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{ 44b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 45b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "%lu error code encountered, exiting\n", result); 46b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi exit(1); 47b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 48b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi} 49b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 50b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//----------------------------------------------------------------- 51b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* PlayItf callback for an audio player */ 52b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivivoid PlayEventCallback( SLPlayItf caller, void *pContext, SLuint32 event) 53b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{ 54b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "PlayEventCallback event = "); 55b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATEND) { 56b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATEND "); 57b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 58b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATMARKER) { 59b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATMARKER "); 60b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 61b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATNEWPOS) { 62b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATNEWPOS "); 63b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 64b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADMOVING) { 65b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADMOVING "); 66b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 67b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADSTALLED) { 68b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADSTALLED"); 69b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 70b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "\n"); 71b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi} 72b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 73b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//----------------------------------------------------------------- 74b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 75b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi/* Play two audio URIs, pan them left and right */ 76b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivivoid TestPlayUri( SLObjectItf sl, const char* path, const char* path2) 77b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{ 78b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLresult result; 79b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLEngineItf EngineItf; 80b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 81b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Objects this application uses: two players and an ouput mix */ 82b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLObjectItf player, player2, outputMix; 83b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 84b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Source of audio data to play, we'll reuse the same source for two different players */ 85b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLDataSource audioSource; 86b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLDataLocator_URI uri; 87b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLDataFormat_MIME mime; 88b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 89b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Data sinks for the two audio players */ 90b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLDataSink audioSink; 91b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 92b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 93b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Play, Volume and PrefetchStatus interfaces for the audio players */ 94b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLPlayItf playItf, playItf2; 95b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLVolumeItf volItf, volItf2; 96b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLPrefetchStatusItf prefetchItf, prefetchItf2; 97b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 98b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 99b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 100b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 101b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 102b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 103b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 104b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 105b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 106b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 107b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 108b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 109b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 110b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Set arrays required[] and iidArray[] for SLVolumeItf and SLPrefetchStatusItf interfaces */ 111b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* (SLPlayItf is implicit) */ 112b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 113b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi iidArray[0] = SL_IID_VOLUME; 114b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi required[1] = SL_BOOLEAN_TRUE; 115b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi iidArray[1] = SL_IID_PREFETCHSTATUS; 116b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 117b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* ------------------------------------------------------ */ 118b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Configuration of the output mix */ 119b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 120b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Create Output Mix object to be used each player */ 121b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required); 122b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 123b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 124b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 125b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 126b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 127b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 128b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Setup the data sink structure */ 129b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 130b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi locator_outputmix.outputMix = outputMix; 131b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi audioSink.pLocator = (void *)&locator_outputmix; 132b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi audioSink.pFormat = NULL; 133b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 134b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* ------------------------------------------------------ */ 135b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Configuration of the players */ 136b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 137b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Setup the data source structure for the first URI */ 138b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi uri.locatorType = SL_DATALOCATOR_URI; 139b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi uri.URI = (SLchar*) path; 140b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 141b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 142b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 143b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 144b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 145b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 146b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi audioSource.pFormat = (void *)&mime; 147b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi audioSource.pLocator = (void *)&uri; 148b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 149b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Create the first audio player */ 1504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 2, 151b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi iidArray, required); 152b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 153b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 154b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Create the second audio player with a different path for its data source */ 155b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi uri.URI = (SLchar*) path2; 156b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi audioSource.pLocator = (void *)&uri; 1574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player2, &audioSource, &audioSink, 2, 158b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi iidArray, required); 159b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 160b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 161b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Realize the players in synchronous mode. */ 162b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 163b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player)->Realize(player2, SL_BOOLEAN_FALSE); ExitOnError(result); 164b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi //fprintf(stdout, "URI example: after Realize\n"); 165b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 166b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Get the SLPlayItf, SLVolumeItf and SLPrefetchStatusItf interfaces for each player */ 167b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 168b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 169b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player)->GetInterface(player2, SL_IID_PLAY, (void*)&playItf2); 170b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 171b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 172b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_VOLUME, (void*)&volItf); 173b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 174b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player2)->GetInterface(player2, SL_IID_VOLUME, (void*)&volItf2); 175b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 176b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 177b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 178b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 179b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*player2)->GetInterface(player2, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf2); 180b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 181b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 182b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Setup to receive playback events */ 183b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf)->RegisterCallback(playItf, PlayEventCallback, &playItf); 184b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 185b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf)->SetCallbackEventsMask(playItf, 186b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SL_PLAYEVENT_HEADATEND| SL_PLAYEVENT_HEADATMARKER | SL_PLAYEVENT_HEADATNEWPOS 187b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi | SL_PLAYEVENT_HEADMOVING | SL_PLAYEVENT_HEADSTALLED); 188b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 189b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 190b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Set the player volume */ 191b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*volItf)->SetVolumeLevel( volItf, -300); 192b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 193b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Pan the first player to the left */ 194b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*volItf)->EnableStereoPosition( volItf, SL_BOOLEAN_TRUE); ExitOnError(result); 195b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*volItf)->SetStereoPosition( volItf, -1000); ExitOnError(result); 196b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Pan the second player to the right */ 197b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*volItf2)->EnableStereoPosition( volItf2, SL_BOOLEAN_TRUE); ExitOnError(result); 198b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*volItf2)->SetStereoPosition( volItf2, 1000); ExitOnError(result); 199b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 200b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* ------------------------------------------------------ */ 201b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Playback */ 202b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 203b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Start the data prefetching by setting the players to the paused state */ 204b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 205b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 206b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf2)->SetPlayState( playItf2, SL_PLAYSTATE_PAUSED ); 207b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 208b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 209b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* wait until there's data to play */ 210b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 211b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 212b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi usleep(100 * 1000); 213b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 214b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 215b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 216b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 217b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi usleep(100 * 1000); 218b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi (*prefetchItf2)->GetPrefetchStatus(prefetchItf2, &prefetchStatus); 219b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 220b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 221b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 222b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 223b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 224b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Wait 2s before starting the second player */ 225b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi usleep(2000 * 1000); 226b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "URI example: starting to play %s\n", path2); 227b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf2)->SetPlayState( playItf2, SL_PLAYSTATE_PLAYING ); 228b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 229b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 230b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Display duration */ 231b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 232b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 233b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 234b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 235b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "Content duration of first URI is unknown\n"); 236b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } else { 237b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "Content duration of first URI is %lu ms\n", durationInMsec); 238b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 239b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 240b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Wait as long as the duration of the first URI + 2s before stopping */ 241b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 242b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi durationInMsec = 5000; /* arbitrary time when duration is unknown */ 243b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 244b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi usleep((durationInMsec + 2000) * 1000); 245b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 246b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Make sure player is stopped */ 247b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "URI example: stopping playback\n"); 248b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 249b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 250b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*playItf2)->SetPlayState(playItf2, SL_PLAYSTATE_STOPPED); 251b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 252b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 253b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Destroy the players */ 254b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi (*player)->Destroy(player); 255b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi (*player2)->Destroy(player2); 256b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 257b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Destroy Output Mix object */ 258b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi (*outputMix)->Destroy(outputMix); 259b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi} 260b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 261b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi//----------------------------------------------------------------- 262b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Triviint main(int argc, char* const argv[]) 263b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi{ 264b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi LOGV("Starting %s\n", argv[0]); 265b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 266b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLresult result; 267b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLObjectItf sl; 268b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 269b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLVolumeItf (incl. stereo position) ", 270b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi argv[0]); 271b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n"); 272b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "Plays two sounds (or twice the same) and pans them left and right."); 273b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "Stops after the end of the first + 2s\n"); 274b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 275b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (argc == 1) { 276b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi fprintf(stdout, "Usage: \n\t%s url1 url2 \n\t%s url\n", argv[0], argv[0]); 2772a00e1105c1e051f13d2b5f3f69f02882de982eaGlenn Kasten fprintf(stdout, "Example: \"%s /sdcard/my.mp3 http://blabla/my.wav\" ", argv[0]); 2782a00e1105c1e051f13d2b5f3f69f02882de982eaGlenn Kasten fprintf(stdout, "or \"%s file:///sdcard/my.mp3\"\n", argv[0]); 279b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi exit(1); 280b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 281b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 282b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi SLEngineOption EngineOption[] = { 283b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 284b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi }; 285b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 286b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 287b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 288b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 289b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 290b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 291b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi ExitOnError(result); 292b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 293b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi if (argc == 2) { 294b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi TestPlayUri(sl, argv[1], argv[1]); 295b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } else if (argc == 3) { 296b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi TestPlayUri(sl, argv[1], argv[2]); 297b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi } 298b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 299b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi /* Shutdown OpenSL ES */ 300b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi (*sl)->Destroy(sl); 301b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi exit(0); 302b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi 303b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi return 0; 304b0dc406de15e71fb53df0bd070b611317bea1d73Jean-Michel Trivi} 305