slesTestSendToPresetReverb.cpp revision 7c7511aa96e54d94df836357fbbf76c681f20a26
165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2010 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <stdlib.h> 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <stdio.h> 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string.h> 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <unistd.h> 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <sys/time.h> 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <fcntl.h> 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "SLES/OpenSLES.h" 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifdef ANDROID 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "SLES/OpenSLES_Android.h" 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define MAX_NUMBER_INTERFACES 3 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define TIME_S_BETWEEN_SETTING_CHANGE 5 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//----------------------------------------------------------------- 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* Exits the application if an error is encountered */ 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennvoid ExitOnErrorFunc( SLresult result , int line) 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn{ 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (SL_RESULT_SUCCESS != result) { 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn fprintf(stderr, "%u error code encountered at line %d, exiting\n", result, line); 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn exit(EXIT_FAILURE); 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn//----------------------------------------------------------------- 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* Play an audio path and feed a global reverb */ 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennvoid TestSendToPresetReverb( SLObjectItf sl, const char* path, int preset, SLmillibel directLevel, 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLmillibel sendLevel, bool alwaysOn) 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn{ 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLresult result; 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLEngineItf EngineItf; 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Objects this application uses: one player and an ouput mix */ 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLObjectItf player, outputMix; 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Source of audio data to play */ 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLDataSource audioSource; 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#ifdef ANDROID 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLDataLocator_AndroidFD locatorFd; 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#else 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLDataLocator_URI locatorUri; 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#endif 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLDataFormat_MIME mime; 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Data sinks for the audio player */ 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLDataSink audioSink; 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLDataLocator_OutputMix locator_outputmix; 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Interfaces for the audio player */ 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLPlayItf playItf; 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLPrefetchStatusItf prefetchItf; 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLEffectSendItf effectSendItf; 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Interface for the output mix */ 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLPresetReverbItf reverbItf; 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLboolean required[MAX_NUMBER_INTERFACES]; 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Get the SL Engine Interface which is implicit */ 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ExitOnError(result); 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Initialize arrays required[] and iidArray[] */ 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn required[i] = SL_BOOLEAN_FALSE; 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn iidArray[i] = SL_IID_NULL; 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* ------------------------------------------------------ */ 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Configuration of the output mix */ 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Set arrays required[] and iidArray[] for required interfaces */ 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn required[0] = SL_BOOLEAN_TRUE; 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn iidArray[0] = SL_IID_PRESETREVERB; 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Create Output Mix object to be used by the player */ 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required); 10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ExitOnError(result); 10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Realize the Output Mix object in synchronous mode */ 10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ExitOnError(result); 10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Get the SLPresetReverbItf for the output mix */ 10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn result = (*outputMix)->GetInterface(outputMix, SL_IID_PRESETREVERB, (void*)&reverbItf); 11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ExitOnError(result); 11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Setup the data sink structure */ 11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn locator_outputmix.outputMix = outputMix; 11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn audioSink.pLocator = (void*)&locator_outputmix; 11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn audioSink.pFormat = NULL; 11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /* Select the reverb preset */ 11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn fprintf(stdout, "\nUsing preset "); 12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn switch(preset) { 12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_NONE: 12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn fprintf(stdout, "SL_REVERBPRESET_NONE, don't expect to hear reverb\n"); 12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn break; 12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_SMALLROOM: fprintf(stdout, "SL_REVERBPRESET_SMALLROOM\n"); break; 12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_MEDIUMROOM: fprintf(stdout, "SL_REVERBPRESET_MEDIUMROOM\n"); break; 12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_LARGEROOM: fprintf(stdout, "SL_REVERBPRESET_LARGEROOM\n"); break; 12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_MEDIUMHALL: fprintf(stdout, "SL_REVERBPRESET_MEDIUMHALL\n"); break; 12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_LARGEHALL: fprintf(stdout, "SL_REVERBPRESET_LARGEHALL\n"); break; 12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn case SL_REVERBPRESET_PLATE: fprintf(stdout, "SL_REVERBPRESET_PLATE\n"); break; 13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn default: 13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn fprintf(stdout, "unknown, use at your own risk\n"); break; 13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn result = (*reverbItf)->SetPreset(reverbItf, preset); 13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ExitOnError(result); 135 136 /* ------------------------------------------------------ */ 137 /* Configuration of the player */ 138 139 /* Set arrays required[] and iidArray[] for required interfaces */ 140 /* (SLPlayItf is implicit) */ 141 required[0] = SL_BOOLEAN_TRUE; 142 iidArray[0] = SL_IID_PREFETCHSTATUS; 143 required[1] = SL_BOOLEAN_TRUE; 144 iidArray[1] = SL_IID_EFFECTSEND; 145 146#ifdef ANDROID 147 /* Setup the data source structure for the URI */ 148 locatorFd.locatorType = SL_DATALOCATOR_ANDROIDFD; 149 int fd = open(path, O_RDONLY); 150 if (fd == -1) { 151 ExitOnError(SL_RESULT_RESOURCE_ERROR); 152 } 153 locatorFd.fd = (SLint32) fd; 154 locatorFd.length = SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE; 155 locatorFd.offset = 0; 156#else 157 locatorUri.locatorType = SL_DATALOCATOR_URI; 158 locatorUri.URI = (SLchar *) path; 159#endif 160 161 mime.formatType = SL_DATAFORMAT_MIME; 162 /* this is how ignored mime information is specified, according to OpenSL ES spec 163 * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 164 mime.mimeType = (SLchar*)NULL; 165 mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 166 167 audioSource.pFormat = (void*)&mime; 168#ifdef ANDROID 169 audioSource.pLocator = (void*)&locatorFd; 170#else 171 audioSource.pLocator = (void*)&locatorUri; 172#endif 173 174 /* Create the audio player */ 175 result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 2, 176 iidArray, required); 177 ExitOnError(result); 178 179 /* Realize the player in synchronous mode. */ 180 result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 181 fprintf(stdout, "URI example: after Realize\n"); 182 183 /* Get the SLPlayItf, SLPrefetchStatusItf and SLEffectSendItf interfaces for the player*/ 184 result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 185 ExitOnError(result); 186 187 result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 188 ExitOnError(result); 189 190 result = (*player)->GetInterface(player, SL_IID_EFFECTSEND, (void*)&effectSendItf); 191 ExitOnError(result); 192 193 fprintf(stdout, "Player configured\n"); 194 195 /* ------------------------------------------------------ */ 196 /* Playback and test */ 197 198 /* Start the data prefetching by setting the player to the paused state */ 199 result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 200 ExitOnError(result); 201 202 /* Wait until there's data to play */ 203 SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 204 while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) { 205 usleep(100 * 1000); 206 (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 207 ExitOnError(result); 208 } 209 210 /* Get duration */ 211 SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 212 result = (*playItf)->GetDuration(playItf, &durationInMsec); 213 ExitOnError(result); 214 if (durationInMsec == SL_TIME_UNKNOWN) { 215 durationInMsec = 10000; 216 } 217 218 /* Feed the output mix' reverb from the audio player using the given send level */ 219 result = (*effectSendItf)->EnableEffectSend(effectSendItf, reverbItf, SL_BOOLEAN_TRUE, 220 sendLevel); 221 ExitOnError(result); 222 223 result = (*effectSendItf)->SetDirectLevel(effectSendItf, directLevel); 224 ExitOnError(result); 225 fprintf(stdout, "Set direct level to %dmB\n", directLevel); 226 227 result = (*effectSendItf)->SetSendLevel(effectSendItf, reverbItf, sendLevel); 228 ExitOnError(result); 229 fprintf(stdout, "Set send level to %dmB\n", sendLevel); 230 231 /* Start playback */ 232 result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 233 ExitOnError(result); 234 235 /* Disable preset reverb every TIME_S_BETWEEN_SETTING_CHANGE seconds unless always on */ 236 SLboolean previousEnabled = SL_BOOLEAN_FALSE; 237 for(unsigned int j=0 ; j<(durationInMsec/(1000*TIME_S_BETWEEN_SETTING_CHANGE)) ; j++) { 238 SLboolean enabled; 239 enabled = alwaysOn || !previousEnabled; 240 if (enabled != previousEnabled) { 241 result = (*reverbItf)->SetPreset(reverbItf, enabled ? preset : SL_REVERBPRESET_NONE); 242 fprintf(stdout, "SetPreset(%d)=%d", enabled ? preset : SL_REVERBPRESET_NONE, result); 243 //ExitOnError(result); 244 previousEnabled = enabled; 245 if (enabled) { 246 fprintf(stdout, "Reverb on\n"); 247 } else { 248 fprintf(stdout, "Reverb off\n"); 249 } 250 } 251 usleep(TIME_S_BETWEEN_SETTING_CHANGE * 1000 * 1000); 252 } 253 254 /* Make sure player is stopped */ 255 fprintf(stdout, "Stopping playback\n"); 256 result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 257 ExitOnError(result); 258 259 /* Destroy the player */ 260 (*player)->Destroy(player); 261 262 /* Destroy Output Mix object */ 263 (*outputMix)->Destroy(outputMix); 264 265#ifdef ANDROID 266 close(fd); 267#endif 268} 269 270//----------------------------------------------------------------- 271int main(int argc, char* const argv[]) 272{ 273 const char *programName = argv[0]; 274 SLresult result; 275 SLObjectItf sl; 276 277 fprintf(stdout, "OpenSL ES test %s: exercises SLEffectSendItf ", programName); 278 fprintf(stdout, "on AudioPlayer and SLPresetReverbItf on OutputMix.\n"); 279 fprintf(stdout, "Plays the sound file designated by the given path, "); 280 fprintf(stdout, "and sends a specified amount of energy to a global reverb\n"); 281 fprintf(stdout, "(sendLevel in mB), with a given direct level (in mB).\n"); 282 fprintf(stdout, "Every %d seconds, the reverb turned on and off,\n", 283 TIME_S_BETWEEN_SETTING_CHANGE); 284 fprintf(stdout, "unless the --always-on option is specified before the path.\n"); 285 286 bool alwaysOn = false; 287 if (argc >= 2 && !strcmp(argv[1], "--always-on")) { 288 alwaysOn = true; 289 --argc; 290 ++argv; 291 } 292 293 if (argc < 5) { 294 fprintf(stdout, "Usage: \t%s [--always-on] path preset directLevel sendLevel\n", 295 programName); 296 fprintf(stdout, "Example: \"%s /sdcard/my.mp3 6 -2000 0\" \n", programName); 297 exit(EXIT_FAILURE); 298 } 299 300 SLEngineOption EngineOption[] = { 301 {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 302 }; 303 304 result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 305 ExitOnError(result); 306 307 /* Realizing the SL Engine in synchronous mode. */ 308 result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 309 ExitOnError(result); 310 311 // intentionally not checking that levels are of correct value 312 TestSendToPresetReverb(sl, argv[1], atoi(argv[2]), (SLmillibel)atoi(argv[3]), 313 (SLmillibel)atoi(argv[4]), alwaysOn); 314 315 /* Shutdown OpenSL ES */ 316 (*sl)->Destroy(sl); 317 318 return EXIT_SUCCESS; 319} 320