124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* 224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * 424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * you may not use this file except in compliance with the License. 624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * You may obtain a copy of the License at 724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * 824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * 1024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * See the License for the specific language governing permissions and 1424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * limitations under the License. 1524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi */ 1624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 173df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#include <assert.h> 183df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#include <pthread.h> 1924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <stdlib.h> 2024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <stdio.h> 2124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <string.h> 2224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <unistd.h> 2324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <sys/time.h> 2424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h> 2624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 2724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 2824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 2924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define REPETITIONS 4 // 4 repetitions, but will stop the looping before the end 3124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define INITIAL_RATE 2000 // 2x normal playback speed 3324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 343df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten// These are extensions to OpenSL ES 1.0.1 values 353df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 363df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#define SL_PREFETCHSTATUS_UNKNOWN 0 373df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#define SL_PREFETCHSTATUS_ERROR (-1) 383df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 393df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten// Mutex and condition shared with main program to protect prefetch_status 403df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 413df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kastenstatic pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 423df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kastenstatic pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 433df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn KastenSLuint32 prefetch_status = SL_PREFETCHSTATUS_UNKNOWN; 443df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 453df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten/* used to detect errors likely to have occured when the OpenSL ES framework fails to open 463df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten * a resource, for instance because a file URI is invalid, or an HTTP server doesn't respond. 473df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten */ 483df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#define PREFETCHEVENT_ERROR_CANDIDATE \ 493df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten (SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE) 503df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 5124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 5224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//* Exits the application if an error is encountered */ 5324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define CheckErr(x) ExitOnErrorFunc(x,__LINE__) 5424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 5524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 5624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 5724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 5858432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stderr, "%u error code encountered at line %d, exiting\n", result, line); 59c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten exit(EXIT_FAILURE); 6024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 6124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 6224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 6324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 6424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* PlayItf callback for an audio player */ 6524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid PlayEventCallback( SLPlayItf caller, void *pContext, SLuint32 event) 6624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 6724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "PlayEventCallback event = "); 6824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATEND) { 6924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATEND \n"); 7024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* slow playback down by 2x for next loop, if possible */ 7124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLpermille minRate, maxRate, stepSize, rate = 1000; 7224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 capa; 733df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(NULL != pContext); 743df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLPlaybackRateItf pRateItf = (SLPlaybackRateItf)pContext; 753df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLresult res = (*pRateItf)->GetRate(pRateItf, &rate); CheckErr(res); 763df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*pRateItf)->GetRateRange(pRateItf, 0, &minRate, &maxRate, &stepSize, &capa); 7724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 7824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "old rate = %d, minRate=%d, maxRate=%d\n", rate, minRate, maxRate); 7924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi rate /= 2; 8024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (rate < minRate) { 8124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi rate = minRate; 8224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 8324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "new rate = %d\n", rate); 843df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*pRateItf)->SetRate(pRateItf, rate); CheckErr(res); 853df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (res == SL_RESULT_FEATURE_UNSUPPORTED) { 863df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten fprintf(stderr, "new playback rate %d per mille is unsupported\n", rate); 873df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } else { 883df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten CheckErr(res); 893df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 9024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 9124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATMARKER) { 9224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATMARKER "); 9324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 9424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATNEWPOS) { 9524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATNEWPOS "); 9624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 9724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADMOVING) { 9824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADMOVING "); 9924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 10024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADSTALLED) { 10124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADSTALLED"); 10224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 10324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "\n"); 10424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 10524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 10624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 10724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* PrefetchStatusItf callback for an audio player */ 10824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid PrefetchEventCallback( SLPrefetchStatusItf caller, void *pContext, SLuint32 event) 10924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 1103df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten //fprintf(stdout, "\t\tPrefetchEventCallback: received event %u\n", event); 1113df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLresult result; 1123df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(pContext == NULL); 11324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLpermille level = 0; 1143df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten result = (*caller)->GetFillLevel(caller, &level); 1153df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten CheckErr(result); 11624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 status; 1173df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten result = (*caller)->GetPrefetchStatus(caller, &status); 1183df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten CheckErr(result); 11924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PREFETCHEVENT_FILLLEVELCHANGE) { 12024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "\t\tPrefetchEventCallback: Buffer fill level is = %d\n", level); 12124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 12224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PREFETCHEVENT_STATUSCHANGE) { 12358432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "\t\tPrefetchEventCallback: Prefetch Status is = %u\n", status); 12424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 1253df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLuint32 new_prefetch_status; 1263df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if ((event & PREFETCHEVENT_ERROR_CANDIDATE) == PREFETCHEVENT_ERROR_CANDIDATE 1273df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten && level == 0 && status == SL_PREFETCHSTATUS_UNDERFLOW) { 1283df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten fprintf(stdout, "\t\tPrefetchEventCallback: Error while prefetching data, exiting\n"); 1293df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten new_prefetch_status = SL_PREFETCHSTATUS_ERROR; 1303df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } else if (event == SL_PREFETCHEVENT_STATUSCHANGE && 1313df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten status == SL_PREFETCHSTATUS_SUFFICIENTDATA) { 1323df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten new_prefetch_status = status; 1333df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } else { 1343df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten return; 1353df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 1363df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten int ok; 1373df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten ok = pthread_mutex_lock(&mutex); 1383df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(ok == 0); 1393df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten prefetch_status = new_prefetch_status; 1403df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten ok = pthread_cond_signal(&cond); 1413df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(ok == 0); 1423df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten ok = pthread_mutex_unlock(&mutex); 1433df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(ok == 0); 14424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 14524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 1463df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten// Display rate capabilities in a nicely formatted way 1473df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 1483df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kastenvoid printCapabilities(SLuint32 capabilities) 1493df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten{ 1503df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten bool needBar = false; 1513df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("0x%x (", capabilities); 1523df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#define _(x) \ 1533df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (capabilities & SL_RATEPROP_##x) { \ 1543df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (needBar) \ 1553df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("|"); \ 1563df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("SL_RATEPROP_" #x); \ 1573df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten needBar = true; \ 1583df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten capabilities &= ~SL_RATEPROP_##x; \ 1593df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 1603df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten _(SILENTAUDIO) 1613df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten _(STAGGEREDAUDIO) 1623df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten _(NOPITCHCORAUDIO) 1633df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten _(PITCHCORAUDIO) 1643df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (capabilities != 0) { 1653df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (needBar) 1663df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("|"); 1673df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("0x%x", capabilities); 1683df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten needBar = true; 1693df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 1703df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (!needBar) 1713df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("N/A"); 1723df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf(")"); 1733df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten} 17424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 17524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 17624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 17724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* Play some music from a URI */ 17824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid TestSlowDownUri( SLObjectItf sl, const char* path) 17924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 18024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLEngineItf EngineItf; 18124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLint32 numOutputs = 0; 18324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 deviceID = 0; 18424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLresult res; 18624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataSource audioSource; 18824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataLocator_URI uri; 18924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataFormat_MIME mime; 19024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 19124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataSink audioSink; 19224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 19324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 19424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLObjectItf player; 19524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPlayItf playItf; 19624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLSeekItf seekItf; 19724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPrefetchStatusItf prefetchItf; 19824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPlaybackRateItf rateItf; 19924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 20024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLObjectItf OutputMix; 20124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 20224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 20324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 20424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 20524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 20624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); CheckErr(res); 20724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 20824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 20924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 21024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 21124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 21224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 21324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 21424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 21524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[0] = SL_IID_VOLUME; 21624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi // Create Output Mix object to be used by player 217c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0, 21824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray, required); CheckErr(res); 21924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 22024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi // Realizing the Output Mix object in synchronous mode. 22124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE); CheckErr(res); 22224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 22324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Setup the data source structure for the URI */ 22424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uri.locatorType = SL_DATALOCATOR_URI; 22524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uri.URI = (SLchar*) path; 22624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 22724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 22824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 22924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 23024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSource.pFormat = (void *)&mime; 23124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSource.pLocator = (void *)&uri; 23224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 23324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Setup the data sink structure */ 23424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 23524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi locator_outputmix.outputMix = OutputMix; 23624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSink.pLocator = (void *)&locator_outputmix; 23724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSink.pFormat = NULL; 23824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 23924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /******************************************************/ 24024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Create the audio player */ 24124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 24224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[0] = SL_IID_SEEK; 24324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[1] = SL_BOOLEAN_TRUE; 24424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[1] = SL_IID_PREFETCHSTATUS; 24524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[2] = SL_BOOLEAN_TRUE; 24624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[2] = SL_IID_PLAYBACKRATE; 24724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 24824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi MAX_NUMBER_INTERFACES, iidArray, required); CheckErr(res); 24924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Realizing the player in synchronous mode. */ 25124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res); 25224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 25324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Get interfaces */ 25524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); CheckErr(res); 25624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_SEEK, (void*)&seekItf); CheckErr(res); 25824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_PLAYBACKRATE, (void*)&rateItf); CheckErr(res); 26024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 26124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 26224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 2633df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*prefetchItf)->RegisterCallback(prefetchItf, PrefetchEventCallback, NULL); 26424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 26524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*prefetchItf)->SetCallbackEventsMask(prefetchItf, 26624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE); CheckErr(res); 26724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 26824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Configure fill level updates every 5 percent */ 26924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*prefetchItf)->SetFillUpdatePeriod(prefetchItf, 50); CheckErr(res); 27024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 27124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Display duration */ 27224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 27324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->GetDuration(playItf, &durationInMsec); CheckErr(res); 27424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 27524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Content duration is unknown (before starting to prefetch)\n"); 27624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } else { 27758432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "Content duration is %u ms (before starting to prefetch)\n", 27824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi durationInMsec); 27924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 28024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 28124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Loop on the whole of the content */ 28224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*seekItf)->SetLoop(seekItf, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN); CheckErr(res); 28324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 28424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Set up marker and position callbacks */ 2853df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*playItf)->RegisterCallback(playItf, PlayEventCallback, (void *) rateItf); CheckErr(res); 28624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetCallbackEventsMask(playItf, 28724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SL_PLAYEVENT_HEADATEND | SL_PLAYEVENT_HEADATMARKER | SL_PLAYEVENT_HEADATNEWPOS); 28824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetMarkerPosition(playItf, 1500); CheckErr(res); 28924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPositionUpdatePeriod(playItf, 500); CheckErr(res); 29024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 2913df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten /* Get the default rate */ 2923df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLpermille rate = 1234; 2933df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*rateItf)->GetRate(rateItf, &rate); CheckErr(res); 2943df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("default rate = %d per mille\n", rate); 2953df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(1000 == rate); 2963df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 2973df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten /* Get the default rate properties */ 2983df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLuint32 properties = 0; 2993df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*rateItf)->GetProperties(rateItf, &properties); CheckErr(res); 3003df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("default rate properties: "); 3013df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printCapabilities(properties); 3023df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("\n"); 3033df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten assert(SL_RATEPROP_NOPITCHCORAUDIO == properties); 3043df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 3053df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten /* Get all supported playback rate ranges */ 3063df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLuint8 index; 3073df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten for (index = 0; ; ++index) { 3083df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLpermille minRate, maxRate, stepSize; 3093df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten SLuint32 capabilities; 3103df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*rateItf)->GetRateRange(rateItf, index, &minRate, &maxRate, &stepSize, &capabilities); 3113df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (res == SL_RESULT_PARAMETER_INVALID) { 3123df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (index == 0) { 3133df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten fprintf(stderr, "implementation supports no rate ranges\n"); 3143df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 3153df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten break; 3163df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 3173df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten CheckErr(res); 3183df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (index == 255) { 3193df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten fprintf(stderr, "implementation supports way too many rate ranges, I'm giving up\n"); 3203df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten break; 3213df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 3223df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("range[%u]: min=%d, max=%d, capabilities=", index, minRate, maxRate); 3233df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printCapabilities(capabilities); 3243df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten printf("\n"); 3253df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 3263df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 32724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Change the playback rate before playback */ 3283df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten res = (*rateItf)->SetRate(rateItf, INITIAL_RATE); 3293df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (res == SL_RESULT_FEATURE_UNSUPPORTED || res == SL_RESULT_PARAMETER_INVALID) { 3303df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten fprintf(stderr, "initial playback rate %d per mille is unsupported\n", INITIAL_RATE); 3313df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } else { 3323df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten CheckErr(res); 3333df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 33424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 33524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /******************************************************/ 33624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Play the URI */ 33724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* first cause the player to prefetch the data */ 33824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); CheckErr(res); 33924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3403df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten // wait for prefetch status callback to indicate either sufficient data or error 3413df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten pthread_mutex_lock(&mutex); 3423df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten while (prefetch_status == SL_PREFETCHSTATUS_UNKNOWN) { 3433df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten pthread_cond_wait(&cond, &mutex); 34424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 3453df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten pthread_mutex_unlock(&mutex); 3463df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten if (prefetch_status == SL_PREFETCHSTATUS_ERROR) { 3473df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten fprintf(stderr, "Error during prefetch, exiting\n"); 34824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi goto destroyRes; 34924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 35024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 35124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Display duration again, */ 35224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->GetDuration(playItf, &durationInMsec); CheckErr(res); 35324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 35424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Content duration is unknown (after prefetch completed)\n"); 35524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } else { 35658432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "Content duration is %u ms (after prefetch completed)\n", durationInMsec); 35724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 35824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3593df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten /* Start playing */ 36024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "starting to play\n"); 36124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); CheckErr(res); 36224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 36324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Wait as long as the duration of the content, times the repetitions, 36424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * before stopping the loop */ 3653df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#if 1 36624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi usleep( (REPETITIONS-1) * durationInMsec * 1100); 3673df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#else 3683df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten int ii; 3693df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten for (ii = 0; ii < REPETITIONS; ++ii) { 3703df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten usleep(durationInMsec * 1100); 3713df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten PlayEventCallback(playItf, (void *) rateItf, SL_PLAYEVENT_HEADATEND); 3723df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten } 3733df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten#endif 3743df2017547e7c9b9818068fc6fd83f66fa58bdc1Glenn Kasten 37524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*seekItf)->SetLoop(seekItf, SL_BOOLEAN_FALSE, 0, SL_TIME_UNKNOWN); CheckErr(res); 37624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "As of now, stopped looping (sound shouldn't repeat from now on)\n"); 37724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* wait some more to make sure it doesn't repeat */ 37824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi usleep(durationInMsec * 1000); 37924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 38024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Stop playback */ 38124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "stopping playback\n"); 38224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); CheckErr(res); 38324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 38424430c9070298f12e68b84c921add38da6ad0490Jean-Michel TrividestroyRes: 38524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 38624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Destroy the player */ 38724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*player)->Destroy(player); 38824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 38924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Destroy Output Mix object */ 39024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*OutputMix)->Destroy(OutputMix); 39124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 39224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 39324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 39424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Triviint main(int argc, char* const argv[]) 39524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 39624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLresult res; 39724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLObjectItf sl; 39824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 39924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLSeekItf, SLPlaybackRateItf\n", 40024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi argv[0]); 40124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n"); 40224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Plays a sound and loops it %d times while changing the \n", REPETITIONS); 40324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "playback rate each time.\n\n"); 40424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 40524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (argc == 1) { 40624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Usage: \n\t%s path \n\t%s url\n", argv[0], argv[0]); 40724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3\" or \"%s file:///sdcard/my.mp3\"\n", 40824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi argv[0], argv[0]); 409c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten return EXIT_FAILURE; 41024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 41124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 41224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLEngineOption EngineOption[] = { 41324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, 41424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (SLuint32) SL_BOOLEAN_TRUE}}; 41524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 41624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 41724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 41824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 41924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 42024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 42124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 42224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi TestSlowDownUri(sl, argv[1]); 42324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 42424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Shutdown OpenSL ES */ 42524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*sl)->Destroy(sl); 42624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 427c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten return EXIT_SUCCESS; 42824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 429