1339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi/* 2339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * 4339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * you may not use this file except in compliance with the License. 6339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * You may obtain a copy of the License at 7339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * 8339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * 10339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * See the License for the specific language governing permissions and 14339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * limitations under the License. 15339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi */ 16339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 17339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include <stdlib.h> 18339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include <stdio.h> 19339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include <string.h> 20339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include <unistd.h> 21339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include <sys/time.h> 22339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include <fcntl.h> 23339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 24339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include "SLES/OpenSLES.h" 2548e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 26339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#include "SLES/OpenSLES_Android.h" 2748e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 28339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 29339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 30339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 31339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 32339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#define TIME_S_BETWEEN_BB_ON_OFF 3 33339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 34339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi//----------------------------------------------------------------- 35339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi/* Exits the application if an error is encountered */ 36339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 37339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 38339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 39339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi{ 40339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 41f78c9326cc333afd30346602bfbd419a17371b21Jean-Michel Trivi fprintf(stderr, "%lu error code encountered at line %d, exiting\n", result, line); 424d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 43339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 44339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi} 45339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 46339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 47339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi//----------------------------------------------------------------- 48339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 49339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi/* Play an audio path by opening a file descriptor on that path */ 50339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivivoid TestBassBoostPathFromFD( SLObjectItf sl, const char* path, int16_t boostStrength) 51339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi{ 52339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLresult result; 53339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLEngineItf EngineItf; 54339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 55339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Objects this application uses: one player and an ouput mix */ 56339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLObjectItf player, outputMix; 57339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 58339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Source of audio data to play */ 59339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLDataSource audioSource; 6048e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 61339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLDataLocator_AndroidFD locatorFd; 6248e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#else 6348e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten SLDataLocator_URI locatorUri; 6448e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 65339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLDataFormat_MIME mime; 66339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 67339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Data sinks for the audio player */ 68339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLDataSink audioSink; 69339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 70339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 714ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Interfaces for the audio player */ 72339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLPlayItf playItf; 73339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLPrefetchStatusItf prefetchItf; 74339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLBassBoostItf bbItf; 75339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 76339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 77339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 78339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 79339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 80339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 81339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 82339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 83339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 84339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 85339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 86339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi iidArray[i] = SL_IID_NULL; 87339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 88339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 89339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* ------------------------------------------------------ */ 90339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Configuration of the output mix */ 91339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 92339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Create Output Mix object to be used by the player */ 93339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required); 94339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 95339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 96339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 97339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 98339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 99339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 100339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Setup the data sink structure */ 101339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 102339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi locator_outputmix.outputMix = outputMix; 103339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi audioSink.pLocator = (void*)&locator_outputmix; 104339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi audioSink.pFormat = NULL; 105339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 106339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* ------------------------------------------------------ */ 107339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Configuration of the player */ 108339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 1094ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Set arrays required[] and iidArray[] for required interfaces */ 110339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* (SLPlayItf is implicit) */ 111339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 112339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi iidArray[0] = SL_IID_PREFETCHSTATUS; 113339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi required[1] = SL_BOOLEAN_TRUE; 114339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi iidArray[1] = SL_IID_BASSBOOST; 115339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 11648e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 117339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Setup the data source structure for the URI */ 118339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi locatorFd.locatorType = SL_DATALOCATOR_ANDROIDFD; 119339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi int fd = open(path, O_RDONLY); 120339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if (fd == -1) { 121339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(SL_RESULT_RESOURCE_ERROR); 122339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 123339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi locatorFd.fd = (SLint32) fd; 124339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi locatorFd.length = SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE; 125339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi locatorFd.offset = 0; 12648e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#else 12748e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten locatorUri.locatorType = SL_DATALOCATOR_URI; 12848e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten locatorUri.URI = (SLchar *) path; 12948e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 130339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 131339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 132339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 133339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 134339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi mime.mimeType = (SLchar*)NULL; 135339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 136339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 137339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi audioSource.pFormat = (void*)&mime; 13848e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 139339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi audioSource.pLocator = (void*)&locatorFd; 14048e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#else 14148e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten audioSource.pLocator = (void*)&locatorUri; 14248e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 143339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 144339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Create the audio player */ 145339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 2, 146339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi iidArray, required); 147339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 148339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 149339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Realize the player in synchronous mode. */ 150339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 151339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 152339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 1534ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Get the SLPlayItf, SLPrefetchStatusItf and SLBassBoostItf interfaces for the player */ 154339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 155339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 156339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 157339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 158339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 159339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 160339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_BASSBOOST, (void*)&bbItf); 161339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 162339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 163339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Player configured\n"); 164339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 165339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* ------------------------------------------------------ */ 166339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Playback and test */ 167339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 168339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Start the data prefetching by setting the player to the paused state */ 169339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 170339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 171339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 172339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Wait until there's data to play */ 173339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 174339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 175339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi usleep(100 * 1000); 176339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 177339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 178339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 179339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 180339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Get duration */ 181339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 182339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 183339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 184339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 185339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi durationInMsec = 5000; 186339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 187339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 188339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Start playback */ 189339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Starting to play\n"); 190339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING ); 191339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 192339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 193339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Configure BassBoost */ 194339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLboolean strengthSupported = SL_BOOLEAN_FALSE; 195339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*bbItf)->IsStrengthSupported(bbItf, &strengthSupported); 196339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 197339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if (SL_BOOLEAN_FALSE == strengthSupported) { 198339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "BassBoost strength is not supported on this platform. Too bad!\n"); 199339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 200339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "BassBoost strength is supported, setting strength to %d\n", boostStrength); 201339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*bbItf)->SetStrength(bbItf, boostStrength); 202339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 203339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 204339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 205339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLpermille strength = 0; 206339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*bbItf)->GetRoundedStrength(bbItf, &strength); 207339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 208339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Rounded strength of boost = %d\n", strength); 209339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 210339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 211339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Switch BassBoost on/off every TIME_S_BETWEEN_BB_ON_OFF seconds */ 212339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLboolean enabled = SL_BOOLEAN_TRUE; 213339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*bbItf)->SetEnabled(bbItf, enabled); 214339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 21534c8a5deb922e414bb348f9c5e6b411866518da8Jean-Michel Trivi for(unsigned int j=0 ; j<(durationInMsec/(1000*TIME_S_BETWEEN_BB_ON_OFF)) ; j++) { 216339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi usleep(TIME_S_BETWEEN_BB_ON_OFF * 1000 * 1000); 217339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*bbItf)->IsEnabled(bbItf, &enabled); 218339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 219339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi enabled = enabled == SL_BOOLEAN_TRUE ? SL_BOOLEAN_FALSE : SL_BOOLEAN_TRUE; 220339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*bbItf)->SetEnabled(bbItf, enabled); 221339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if (SL_BOOLEAN_TRUE == enabled) { 222339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "BassBoost on\n"); 223339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } else { 224339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "BassBoost off\n"); 225339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 226339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 227339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 228339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 229339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Make sure player is stopped */ 230339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Stopping playback\n"); 231339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 232339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 233339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 234339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Destroy the player */ 235339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi (*player)->Destroy(player); 236339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 237339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Destroy Output Mix object */ 238339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi (*outputMix)->Destroy(outputMix); 239339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 24048e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#ifdef ANDROID 241339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi close(fd); 24248e85e379e506045aca3a33c2c4cf03b3be6d4b1Glenn Kasten#endif 243339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi} 244339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 245339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi//----------------------------------------------------------------- 246339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Triviint main(int argc, char* const argv[]) 247339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi{ 248339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLresult result; 249339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLObjectItf sl; 250339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 251339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLBassBoostItf ", argv[0]); 252339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_AndroidFD source / OutputMix sink\n"); 253339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Plays the sound file designated by the given path, "); 254339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "and applies a bass boost effect of the specified strength,\n"); 255339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "where strength is a integer value between 0 and 1000.\n"); 256339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Every %d seconds, the BassBoost will be turned on and off.\n", 257339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi TIME_S_BETWEEN_BB_ON_OFF); 258339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 259339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi if (argc < 3) { 260339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Usage: \t%s path bass_boost_strength\n", argv[0]); 261339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3 1000\" \n", argv[0]); 2624d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 263339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi } 264339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 265339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi SLEngineOption EngineOption[] = { 266339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 267339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi }; 268339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 269339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 270339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 271339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 272339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 273339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 274339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi ExitOnError(result); 275339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 276339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi // intentionally not checking that argv[2], the bassboost strength, is between 0 and 1000 277339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi TestBassBoostPathFromFD(sl, argv[1], (int16_t)atoi(argv[2])); 278339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 279339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi /* Shutdown OpenSL ES */ 280339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi (*sl)->Destroy(sl); 281339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi 2824d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten return EXIT_SUCCESS; 283339d65cd8bd7607b5959068825c6c5a55a3250afJean-Michel Trivi} 284