1ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi/* 2ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * 4ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * you may not use this file except in compliance with the License. 6ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * You may obtain a copy of the License at 7ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * 8ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * 10ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * See the License for the specific language governing permissions and 14ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * limitations under the License. 15ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi */ 16ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 17ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include <stdlib.h> 18ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include <stdio.h> 19ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include <string.h> 20ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include <unistd.h> 21ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#include <sys/time.h> 22ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 23a6c5e52ded343b557152156c33d33a10d29bf6f1Glenn Kasten#include <SLES/OpenSLES.h> 2448e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 25a6c5e52ded343b557152156c33d33a10d29bf6f1Glenn Kasten#include <SLES/OpenSLES_Android.h> 2648e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 27ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 28ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 29d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 2 30ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 31ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 32ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi//----------------------------------------------------------------- 33ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi/* Exits the application if an error is encountered */ 34ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 35ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 36ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 37ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi{ 38ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 39d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stdout, "%u error code encountered at line %d, exiting\n", result, line); 404d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 41ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi } 42ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi} 43ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 44ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 45ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi//----------------------------------------------------------------- 46ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 47d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi/* Play an audio URIs on the given stream type */ 48d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivivoid TestStreamTypeConfiguration( SLObjectItf sl, const char* path, const SLint32 type) 49ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi{ 50ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLresult result; 51ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLEngineItf EngineItf; 52ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 53ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Objects this application uses: one player and an ouput mix */ 54ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLObjectItf player, outputMix; 55ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 56ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Source of audio data to play */ 57ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLDataSource audioSource; 58ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLDataLocator_URI uri; 59ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLDataFormat_MIME mime; 60ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 61ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Data sinks for the audio player */ 62ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLDataSink audioSink; 63ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 64ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 65ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Play, Volume and AndroidStreamType interfaces for the audio player */ 66ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLPlayItf playItf; 67ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLPrefetchStatusItf prefetchItf; 6848e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 69d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SLAndroidConfigurationItf configItf; 7048e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 71ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 72ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 73ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 74ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 75ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 76ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 77ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 78ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 79ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 80ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 81ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 82ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 83ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi } 84ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 85ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* ------------------------------------------------------ */ 86ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Configuration of the output mix */ 87ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 88ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Create Output Mix object to be used by the player */ 894d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 0, iidArray, required); 90ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 91ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 92ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 93ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 94ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 95ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 96ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Setup the data sink structure */ 97ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 98ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi locator_outputmix.outputMix = outputMix; 99ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi audioSink.pLocator = (void*)&locator_outputmix; 100ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi audioSink.pFormat = NULL; 101ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 102ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* ------------------------------------------------------ */ 103ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Configuration of the player */ 104ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 105d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi /* Set arrays required[] and iidArray[] for SLAndroidConfigurationItf interfaces */ 106ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* (SLPlayItf is implicit) */ 107ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 108ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi iidArray[0] = SL_IID_PREFETCHSTATUS; 10967829bfddb97775be06af15dd8181611b4af581eGlenn Kasten#ifdef ANDROID 110d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi required[1] = SL_BOOLEAN_TRUE; 111d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi iidArray[1] = SL_IID_ANDROIDCONFIGURATION; 11267829bfddb97775be06af15dd8181611b4af581eGlenn Kasten#endif 113d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi 114ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 115ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Setup the data source structure for the URI */ 116ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi uri.locatorType = SL_DATALOCATOR_URI; 117ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi uri.URI = (SLchar*) path; 118ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 119ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 120ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 121ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 122ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 123ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 124ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi audioSource.pFormat = (void*)&mime; 125ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi audioSource.pLocator = (void*)&uri; 126ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 127ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Create the audio player */ 128d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 129d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi MAX_NUMBER_INTERFACES, iidArray, required); 130d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi ExitOnError(result); 131d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi 132d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi /* Retrieve the configuration interface before the player is realized so its resources 133d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi * can be configured. 134d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi */ 135d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi#ifdef ANDROID 136d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_ANDROIDCONFIGURATION, (void*)&configItf); 137d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi ExitOnError(result); 138d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi 139d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi /* Set the Android audio stream type on the player */ 140d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi result = (*configItf)->SetConfiguration(configItf, 141d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SL_ANDROID_KEY_STREAM_TYPE, &type, sizeof(SLint32)); 142b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten if (SL_RESULT_PARAMETER_INVALID == result) { 143d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stderr, "invalid stream type %d\n", type); 144b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten } else { 145b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten ExitOnError(result); 146b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten } 147d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi#endif 148ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 149ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Realize the player in synchronous mode. */ 150ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 151ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 152ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 1531a6bb4f8e738c9387dc9629db294ea5de618a53cGlenn Kasten /* Get the SLPlayItf, SLPrefetchStatusItf and SLAndroidConfigurationItf interfaces for player */ 154ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 155ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 156ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 157ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 158ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 159ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 160ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, "Player configured\n"); 161ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 162ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* ------------------------------------------------------ */ 163ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Playback and test */ 164ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 165ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Start the data prefetching by setting the player to the paused state */ 166ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 167ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 168ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 169ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Wait until there's data to play */ 170ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 171ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 172ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi usleep(100 * 1000); 173ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 174ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 175ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi } 176ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 177ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Get duration */ 178ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 179ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 180ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 181ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 182ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi durationInMsec = 5000; 183ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi } 184ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 185ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Start playback */ 186ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 187ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 188ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 189231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi usleep((durationInMsec/2) * 1000); 190231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi 19148e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 192231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi /* Get the stream type during playback */ 193d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SLint32 currentType = -1; 194d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SLuint32 valueSize = sizeof(SLint32) * 2; // trying too big on purpose 195d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi result = (*configItf)->GetConfiguration(configItf, 196d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SL_ANDROID_KEY_STREAM_TYPE, &valueSize, NULL); 197d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi ExitOnError(result); 198d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi if (valueSize != sizeof(SLint32)) { 199d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stderr, "ERROR: size for stream type is %u, should be %u\n", 200d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi valueSize, sizeof(SLint32)); 201d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi } 202d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi result = (*configItf)->GetConfiguration(configItf, 203d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SL_ANDROID_KEY_STREAM_TYPE, &valueSize, ¤tType); 204231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi ExitOnError(result); 205231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi if (currentType != type) { 206d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stderr, "ERROR: stream type is %u, should be %u\n", currentType, type); 207231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi } 20848e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 209231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi 210231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi usleep((durationInMsec/2) * 1000); 211ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 212ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Make sure player is stopped */ 213ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, "Stopping playback\n"); 214ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 215ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 216ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 21748e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 218231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi /* Try again to get the stream type, just in case it changed behind our back */ 219d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi result = (*configItf)->GetConfiguration(configItf, 220d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi SL_ANDROID_KEY_STREAM_TYPE, &valueSize, ¤tType); 221231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi ExitOnError(result); 222231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi if (currentType != type) { 223d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stderr, "ERROR: stream type is %u, should be %u\n", currentType, type); 224231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi } 22548e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 226231d43481aef3975acc1ad81e96ea976caa5703dJean-Michel Trivi 227ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Destroy the player */ 228ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi (*player)->Destroy(player); 229ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 230ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Destroy Output Mix object */ 231ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi (*outputMix)->Destroy(outputMix); 232ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi} 233ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 234ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi//----------------------------------------------------------------- 235ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Triviint main(int argc, char* const argv[]) 236ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi{ 237ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLresult result; 238ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLObjectItf sl; 239ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 240d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLAndroidConfigurationItf\n", 241ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi argv[0]); 242ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n"); 243ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, "Plays a sound on the specified android stream type\n"); 244ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 245ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi if (argc < 3) { 246ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, "Usage: \t%s url stream_type\n", argv[0]); 247ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi fprintf(stdout, " where stream_type is one of the SL_ANDROID_STREAM_ constants.\n"); 248b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten fprintf(stdout, "Example: \"%s /sdcard/my.mp3 5\" \n", argv[0]); 249d968dacf7a35d52b6907283f3d95295a238340ccGlenn Kasten fprintf(stdout, "Stream type %d is the default (media or music), %d is notifications\n", 250b11def0293629d4d44ddbcd8a27c63504fd80ce1Glenn Kasten SL_ANDROID_STREAM_MEDIA, SL_ANDROID_STREAM_NOTIFICATION); 2514d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten return EXIT_FAILURE; 252ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi } 253ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 254ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi SLEngineOption EngineOption[] = { 255ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 256ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi }; 257ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 258ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 259ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 260ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 261ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 262ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 263ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi ExitOnError(result); 264ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 265d5c746ba436dfc4605672f4a9f8c0628521a9f21Jean-Michel Trivi TestStreamTypeConfiguration(sl, argv[1], (SLint32)atoi(argv[2])); 266ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 267ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi /* Shutdown OpenSL ES */ 268ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi (*sl)->Destroy(sl); 269ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi 2704d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten return EXIT_SUCCESS; 271ed3e92ee5465be1396418098a4ef231ceb0adf33Jean-Michel Trivi} 272