slesTestSlowDownUri.cpp revision c6853892c94800e72c0bd676d5d2136d48cea76e
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 1724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <stdlib.h> 1824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <stdio.h> 1924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <string.h> 2024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <unistd.h> 2124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#include <sys/time.h> 2224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 23c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h> 2424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 2524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 2624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3 2724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 2824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define REPETITIONS 4 // 4 repetitions, but will stop the looping before the end 2924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define INITIAL_RATE 2000 // 2x normal playback speed 3124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 3324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//* Exits the application if an error is encountered */ 3424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi#define CheckErr(x) ExitOnErrorFunc(x,__LINE__) 3524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 3624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line) 3724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 3824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 3958432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stderr, "%u error code encountered at line %d, exiting\n", result, line); 40c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten exit(EXIT_FAILURE); 4124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 4224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 4324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 4424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 4524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* PlayItf callback for an audio player */ 4624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid PlayEventCallback( SLPlayItf caller, void *pContext, SLuint32 event) 4724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 4824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "PlayEventCallback event = "); 4924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATEND) { 5024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATEND \n"); 5124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* slow playback down by 2x for next loop, if possible */ 5224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLpermille minRate, maxRate, stepSize, rate = 1000; 5324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 capa; 5424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPlaybackRateItf* pRateItf = (SLPlaybackRateItf*)pContext; 5524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLresult res = (**pRateItf)->GetRate(*pRateItf, &rate); CheckErr(res); 5624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (**pRateItf)->GetRateRange(*pRateItf, 0, &minRate, &maxRate, &stepSize, &capa); 5724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 5824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "old rate = %d, minRate=%d, maxRate=%d\n", rate, minRate, maxRate); 5924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi rate /= 2; 6024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (rate < minRate) { 6124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi rate = minRate; 6224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 6324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "new rate = %d\n", rate); 6424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (**pRateItf)->SetRate(*pRateItf, rate); CheckErr(res); 6524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 6624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATMARKER) { 6724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATMARKER "); 6824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 6924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADATNEWPOS) { 7024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADATNEWPOS "); 7124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 7224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADMOVING) { 7324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADMOVING "); 7424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 7524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PLAYEVENT_HEADSTALLED) { 7624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "SL_PLAYEVENT_HEADSTALLED"); 7724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 7824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "\n"); 7924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 8024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 8124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 8224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* PrefetchStatusItf callback for an audio player */ 8324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid PrefetchEventCallback( SLPrefetchStatusItf caller, void *pContext, SLuint32 event) 8424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 8524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLpermille level = 0; 8624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*caller)->GetFillLevel(caller, &level); 8724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 status; 8858432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten //fprintf(stdout, "\t\tPrefetchEventCallback: received event %u\n", event); 8924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*caller)->GetPrefetchStatus(caller, &status); 9024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if ((event & (SL_PREFETCHEVENT_STATUSCHANGE|SL_PREFETCHEVENT_FILLLEVELCHANGE)) 9124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi && (level == 0) && (status == SL_PREFETCHSTATUS_UNDERFLOW)) { 9224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "\t\tPrefetchEventCallback: Error while prefetching data, exiting\n"); 93c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten //exit(EXIT_FAILURE); 9424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 9524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PREFETCHEVENT_FILLLEVELCHANGE) { 9624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "\t\tPrefetchEventCallback: Buffer fill level is = %d\n", level); 9724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 9824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (event & SL_PREFETCHEVENT_STATUSCHANGE) { 9958432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "\t\tPrefetchEventCallback: Prefetch Status is = %u\n", status); 10024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 10124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 10224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 10324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 10424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 10524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 10624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 10724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi/* Play some music from a URI */ 10824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivivoid TestSlowDownUri( SLObjectItf sl, const char* path) 10924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 11024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLEngineItf EngineItf; 11124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 11224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLint32 numOutputs = 0; 11324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 deviceID = 0; 11424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 11524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLresult res; 11624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 11724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataSource audioSource; 11824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataLocator_URI uri; 11924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataFormat_MIME mime; 12024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 12124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataSink audioSink; 12224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLDataLocator_OutputMix locator_outputmix; 12324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 12424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLObjectItf player; 12524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPlayItf playItf; 12624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLSeekItf seekItf; 12724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPrefetchStatusItf prefetchItf; 12824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLPlaybackRateItf rateItf; 12924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 13024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLObjectItf OutputMix; 13124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 13224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLboolean required[MAX_NUMBER_INTERFACES]; 13324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 13424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 13524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Get the SL Engine Interface which is implicit */ 13624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); CheckErr(res); 13724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 13824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Initialize arrays required[] and iidArray[] */ 13924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 14024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[i] = SL_BOOLEAN_FALSE; 14124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[i] = SL_IID_NULL; 14224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 14324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 14424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 14524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[0] = SL_IID_VOLUME; 14624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi // Create Output Mix object to be used by player 147c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0, 14824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray, required); CheckErr(res); 14924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 15024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi // Realizing the Output Mix object in synchronous mode. 15124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE); CheckErr(res); 15224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 15324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Setup the data source structure for the URI */ 15424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uri.locatorType = SL_DATALOCATOR_URI; 15524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi uri.URI = (SLchar*) path; 15624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi mime.formatType = SL_DATAFORMAT_MIME; 15724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi mime.mimeType = (SLchar*)NULL; 15824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 15924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 16024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSource.pFormat = (void *)&mime; 16124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSource.pLocator = (void *)&uri; 16224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 16324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Setup the data sink structure */ 16424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 16524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi locator_outputmix.outputMix = OutputMix; 16624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSink.pLocator = (void *)&locator_outputmix; 16724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi audioSink.pFormat = NULL; 16824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 16924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /******************************************************/ 17024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Create the audio player */ 17124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[0] = SL_BOOLEAN_TRUE; 17224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[0] = SL_IID_SEEK; 17324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[1] = SL_BOOLEAN_TRUE; 17424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[1] = SL_IID_PREFETCHSTATUS; 17524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi required[2] = SL_BOOLEAN_TRUE; 17624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi iidArray[2] = SL_IID_PLAYBACKRATE; 17724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 17824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi MAX_NUMBER_INTERFACES, iidArray, required); CheckErr(res); 17924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Realizing the player in synchronous mode. */ 18124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res); 18224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "URI example: after Realize\n"); 18324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Get interfaces */ 18524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); CheckErr(res); 18624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_SEEK, (void*)&seekItf); CheckErr(res); 18824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 18924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_PLAYBACKRATE, (void*)&rateItf); CheckErr(res); 19024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 19124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 19224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 19324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*prefetchItf)->RegisterCallback(prefetchItf, PrefetchEventCallback, &prefetchItf); 19424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 19524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*prefetchItf)->SetCallbackEventsMask(prefetchItf, 19624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE); CheckErr(res); 19724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 19824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Configure fill level updates every 5 percent */ 19924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*prefetchItf)->SetFillUpdatePeriod(prefetchItf, 50); CheckErr(res); 20024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 20124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Display duration */ 20224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 20324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->GetDuration(playItf, &durationInMsec); CheckErr(res); 20424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 20524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Content duration is unknown (before starting to prefetch)\n"); 20624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } else { 20758432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "Content duration is %u ms (before starting to prefetch)\n", 20824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi durationInMsec); 20924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 21024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 21124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Loop on the whole of the content */ 21224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*seekItf)->SetLoop(seekItf, SL_BOOLEAN_TRUE, 0, SL_TIME_UNKNOWN); CheckErr(res); 21324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 21424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Set up marker and position callbacks */ 21524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->RegisterCallback(playItf, PlayEventCallback, &rateItf); CheckErr(res); 21624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetCallbackEventsMask(playItf, 21724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SL_PLAYEVENT_HEADATEND | SL_PLAYEVENT_HEADATMARKER | SL_PLAYEVENT_HEADATNEWPOS); 21824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetMarkerPosition(playItf, 1500); CheckErr(res); 21924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPositionUpdatePeriod(playItf, 500); CheckErr(res); 22024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 22124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Change the playback rate before playback */ 22224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*rateItf)->SetRate(rateItf, INITIAL_RATE); CheckErr(res); 22324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 22424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /******************************************************/ 22524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Play the URI */ 22624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* first cause the player to prefetch the data */ 22724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); CheckErr(res); 22824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 22924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* wait until there's data to play */ 23024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 23124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLuint32 timeOutIndex = 100; // 10s 23224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0)) { 23324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi usleep(100 * 1000); 23424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 23524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi timeOutIndex--; 23624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 23724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 23824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (timeOutIndex == 0) { 23924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stderr, "\nWe\'re done waiting, failed to prefetch data in time, exiting\n"); 24024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi goto destroyRes; 24124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 24224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 24324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Display duration again, */ 24424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->GetDuration(playItf, &durationInMsec); CheckErr(res); 24524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (durationInMsec == SL_TIME_UNKNOWN) { 24624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Content duration is unknown (after prefetch completed)\n"); 24724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } else { 24858432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten fprintf(stdout, "Content duration is %u ms (after prefetch completed)\n", durationInMsec); 24924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 25024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "starting to play\n"); 25224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); CheckErr(res); 25324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 25424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Wait as long as the duration of the content, times the repetitions, 25524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi * before stopping the loop */ 25624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi usleep( (REPETITIONS-1) * durationInMsec * 1100); 25724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*seekItf)->SetLoop(seekItf, SL_BOOLEAN_FALSE, 0, SL_TIME_UNKNOWN); CheckErr(res); 25824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "As of now, stopped looping (sound shouldn't repeat from now on)\n"); 25924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* wait some more to make sure it doesn't repeat */ 26024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi usleep(durationInMsec * 1000); 26124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 26224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Stop playback */ 26324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "stopping playback\n"); 26424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); CheckErr(res); 26524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 26624430c9070298f12e68b84c921add38da6ad0490Jean-Michel TrividestroyRes: 26724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 26824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Destroy the player */ 26924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*player)->Destroy(player); 27024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 27124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Destroy Output Mix object */ 27224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*OutputMix)->Destroy(OutputMix); 27324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 27424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 27524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi//----------------------------------------------------------------- 27624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Triviint main(int argc, char* const argv[]) 27724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi{ 27824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLresult res; 27924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLObjectItf sl; 28024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 28124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLSeekItf, SLPlaybackRateItf\n", 28224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi argv[0]); 28324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n"); 28424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Plays a sound and loops it %d times while changing the \n", REPETITIONS); 28524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "playback rate each time.\n\n"); 28624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 28724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi if (argc == 1) { 28824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Usage: \n\t%s path \n\t%s url\n", argv[0], argv[0]); 28924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi fprintf(stdout, "Example: \"%s /sdcard/my.mp3\" or \"%s file:///sdcard/my.mp3\"\n", 29024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi argv[0], argv[0]); 291c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten return EXIT_FAILURE; 29224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi } 29324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 29424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi SLEngineOption EngineOption[] = { 29524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi {(SLuint32) SL_ENGINEOPTION_THREADSAFE, 29624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (SLuint32) SL_BOOLEAN_TRUE}}; 29724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 29824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); 29924430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 30024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Realizing the SL Engine in synchronous mode. */ 30124430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 30224430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi CheckErr(res); 30324430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 30424430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi TestSlowDownUri(sl, argv[1]); 30524430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 30624430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi /* Shutdown OpenSL ES */ 30724430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi (*sl)->Destroy(sl); 30824430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi 309c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten return EXIT_SUCCESS; 31024430c9070298f12e68b84c921add38da6ad0490Jean-Michel Trivi} 311