14ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi/* 24ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 34ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * 44ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 54ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * you may not use this file except in compliance with the License. 64ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * You may obtain a copy of the License at 74ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * 84ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 94ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * 104ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 114ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 124ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * See the License for the specific language governing permissions and 144ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * limitations under the License. 154ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi */ 164ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 174ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include <stdlib.h> 184ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include <stdio.h> 194ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include <string.h> 204ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include <unistd.h> 214ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include <sys/time.h> 224ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include <fcntl.h> 234ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 244ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include "SLES/OpenSLES.h" 254ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#ifdef ANDROID 264ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#include "SLES/OpenSLES_Android.h" 274ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#endif 284ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 294ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 304ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 314ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 324ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#define TIME_S_BETWEEN_SETTING_CHANGE 5 334ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 344ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi//----------------------------------------------------------------- 354ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi/* Exits the application if an error is encountered */ 364ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 374ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 384ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 394ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi{ 404ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 414ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stderr, "%lu error code encountered at line %d, exiting\n", result, line); 424d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 434ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 444ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi} 454ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 464ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 474ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi//----------------------------------------------------------------- 484ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 494ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi/* Play an audio path and feed a global reverb */ 504ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivivoid TestSendToPresetReverb( SLObjectItf sl, const char* path, int preset, SLmillibel directLevel, 514ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLmillibel sendLevel) 524ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi{ 534ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLresult result; 544ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLEngineItf EngineItf; 554ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 564ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Objects this application uses: one player and an ouput mix */ 574ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLObjectItf player, outputMix; 584ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 594ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Source of audio data to play */ 604ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLDataSource audioSource; 614ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#ifdef ANDROID 624ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLDataLocator_AndroidFD locatorFd; 634ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#else 644ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLDataLocator_URI locatorUri; 654ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#endif 664ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLDataFormat_MIME mime; 674ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 684ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Data sinks for the audio player */ 694ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLDataSink audioSink; 704ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 714ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 724ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Interfaces for the audio player */ 734ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLPlayItf playItf; 744ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLEffectSendItf effectSendItf; 754ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 764ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Interface for the output mix */ 774ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLPresetReverbItf reverbItf; 784ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 794ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 804ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 814ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 824ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 834ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 844ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 854ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 864ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 874ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 884ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 894ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 904ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 914ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 924ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* ------------------------------------------------------ */ 934ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Configuration of the output mix */ 944ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 954ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Set arrays required[] and iidArray[] for required interfaces */ 964ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 974ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi iidArray[0] = SL_IID_PRESETREVERB; 984ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 994ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Create Output Mix object to be used by the player */ 1004ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required); 1014ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1024ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1034ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Realize the Output Mix object in synchronous mode */ 1044ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE); 1054ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1064ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1074ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Get the SLPresetReverbItf for the output mix */ 1084ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*outputMix)->GetInterface(outputMix, SL_IID_PRESETREVERB, (void*)&reverbItf); 1094ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1104ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1114ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Setup the data sink structure */ 1124ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 1134ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locator_outputmix.outputMix = outputMix; 1144ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi audioSink.pLocator = (void*)&locator_outputmix; 1154ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi audioSink.pFormat = NULL; 1164ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1174ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Select the reverb preset */ 1184ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "\nUsing preset "); 1194ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi switch(preset) { 1204ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_NONE: 1214ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "SL_REVERBPRESET_NONE, don't expect to hear reverb\n"); 1224ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi break; 1234ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_SMALLROOM: fprintf(stdout, "SL_REVERBPRESET_SMALLROOM\n"); break; 1244ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_MEDIUMROOM: fprintf(stdout, "SL_REVERBPRESET_MEDIUMROOM\n"); break; 1254ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_LARGEROOM: fprintf(stdout, "SL_REVERBPRESET_LARGEROOM\n"); break; 1264ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_MEDIUMHALL: fprintf(stdout, "SL_REVERBPRESET_MEDIUMHALL\n"); break; 1274ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_LARGEHALL: fprintf(stdout, "SL_REVERBPRESET_LARGEHALL\n"); break; 1284ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi case SL_REVERBPRESET_PLATE: fprintf(stdout, "SL_REVERBPRESET_PLATE\n"); break; 1294ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi default: 1304ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "unknown, use at your own risk\n"); break; 1314ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 1324ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*reverbItf)->SetPreset(reverbItf, preset); 1334ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1344ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1354ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* ------------------------------------------------------ */ 1364ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Configuration of the player */ 1374ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1384ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Set arrays required[] and iidArray[] for required interfaces */ 1394ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* (SLPlayItf is implicit) */ 1404ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 1414ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi iidArray[0] = SL_IID_PREFETCHSTATUS; 1424ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi required[1] = SL_BOOLEAN_TRUE; 1434ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi iidArray[1] = SL_IID_EFFECTSEND; 1444ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1454ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#ifdef ANDROID 1464ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Setup the data source structure for the URI */ 1474ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locatorFd.locatorType = SL_DATALOCATOR_ANDROIDFD; 1484ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi int fd = open(path, O_RDONLY); 1494ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi if (fd == -1) { 1504ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(SL_RESULT_RESOURCE_ERROR); 1514ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 1524ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locatorFd.fd = (SLint32) fd; 1534ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locatorFd.length = SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE; 1544ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locatorFd.offset = 0; 1554ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#else 1564ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locatorUri.locatorType = SL_DATALOCATOR_URI; 1574ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi locatorUri.URI = (SLchar *) path; 1584ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#endif 1594ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1604ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 1614ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* this is how ignored mime information is specified, according to OpenSL ES spec 1624ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi * in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */ 1634ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 1644ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 1654ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1664ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi audioSource.pFormat = (void*)&mime; 1674ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#ifdef ANDROID 1684ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi audioSource.pLocator = (void*)&locatorFd; 1694ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#else 1704ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi audioSource.pLocator = (void*)&locatorUri; 1714ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#endif 1724ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1734ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Create the audio player */ 1744ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 2, 1754ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi iidArray, required); 1764ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1774ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1784ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Realize the player in synchronous mode. */ 1794ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result); 1804ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 1814ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1824ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Get the SLPlayItf, SLPrefetchStatusItf and SLEffectSendItf interfaces for the player*/ 1834ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 1844ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1854ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1864ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*player)->GetInterface(player, SL_IID_EFFECTSEND, (void*)&effectSendItf); 1874ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1884ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1894ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Player configured\n"); 1904ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1914ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* ------------------------------------------------------ */ 1924ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Playback and test */ 1934ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 1944ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Get duration */ 1954ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 1964ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*playItf)->GetDuration(playItf, &durationInMsec); 1974ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 1984ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 1994ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi durationInMsec = 5000; 2004ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 2014ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2024ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Feed the output mix' reverb from the audio player using the given send level */ 2034ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*effectSendItf)->EnableEffectSend(effectSendItf, reverbItf, SL_BOOLEAN_TRUE, 2044ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi sendLevel); 2054ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2064ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2074ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*effectSendItf)->SetDirectLevel(effectSendItf, directLevel); 2084ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2094ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Set direct level to %dmB\n", directLevel); 2104ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2114ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*effectSendItf)->SetSendLevel(effectSendItf, reverbItf, sendLevel); 2124ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2134ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Set send level to %dmB\n", sendLevel); 2144ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2154ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Start playback */ 2164ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 2174ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2184ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2194ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Disable preset reverb every TIME_S_BETWEEN_SETTING_CHANGE seconds */ 2204ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLboolean enabled = SL_BOOLEAN_TRUE; 2214ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi for(unsigned int j=0 ; j<(durationInMsec/(1000*TIME_S_BETWEEN_SETTING_CHANGE)) ; j++) { 2224ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi enabled = !enabled; 2234ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*reverbItf)->SetPreset(reverbItf, enabled ? preset : SL_REVERBPRESET_NONE); 2244ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi if (enabled) { 2254ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Reverb on\n"); 2264ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } else { 2274ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Reverb off\n"); 2284ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 2294ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2304ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi usleep(TIME_S_BETWEEN_SETTING_CHANGE * 1000 * 1000); 2314ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 2324ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2334ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Make sure player is stopped */ 2344ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Stopping playback\n"); 2354ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 2364ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2374ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2384ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Destroy the player */ 2394ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi (*player)->Destroy(player); 2404ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2414ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Destroy Output Mix object */ 2424ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi (*outputMix)->Destroy(outputMix); 2434ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2444ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#ifdef ANDROID 2454ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi close(fd); 2464ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi#endif 2474ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi} 2484ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2494ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi//----------------------------------------------------------------- 2504ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Triviint main(int argc, char* const argv[]) 2514ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi{ 2524ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLresult result; 2534ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLObjectItf sl; 2544ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2554ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLEffectSendItf ", argv[0]); 2564ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "on AudioPlayer and SLPresetReverbItf on OutputMix.\n"); 2574ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Plays the sound file designated by the given path, "); 2584ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "and sends a specified amount of energy to a global reverb\n"); 2594ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "(sendLevel in mB), with a given direct level (in mB).\n"); 2604ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Every %d seconds, the reverb turned on and off.\n", 2614ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi TIME_S_BETWEEN_SETTING_CHANGE); 2624ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2634ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi if (argc < 5) { 2644ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Usage: \t%s path preset directLevel sendLevel\n", argv[0]); 2654ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3 6 -2000 0\" \n", argv[0]); 2664d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten exit(EXIT_FAILURE); 2674ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi } 2684ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2694ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi SLEngineOption EngineOption[] = { 2704ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE} 2714ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi }; 2724ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2734ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 2744ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2754ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2764ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 2774ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 2784ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi ExitOnError(result); 2794ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2804ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi // intentionally not checking that levels are of correct value 2814ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi TestSendToPresetReverb(sl, argv[1], atoi(argv[2]), (SLmillibel)atoi(argv[3]), 2824ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi (SLmillibel)atoi(argv[4])); 2834ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2844ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi /* Shutdown OpenSL ES */ 2854ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi (*sl)->Destroy(sl); 2864ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi 2874d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten return EXIT_SUCCESS; 2884ad709bd796914d15a32a35da92b5f39047f5a02Jean-Michel Trivi} 289