11cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau/*
21cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * Copyright (C) 2010 The Android Open Source Project
31cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *
41cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * Licensed under the Apache License, Version 2.0 (the "License");
51cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * you may not use this file except in compliance with the License.
61cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * You may obtain a copy of the License at
71cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *
81cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *      http://www.apache.org/licenses/LICENSE-2.0
91cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *
101cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * Unless required by applicable law or agreed to in writing, software
111cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * distributed under the License is distributed on an "AS IS" BASIS,
121cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * See the License for the specific language governing permissions and
141cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * limitations under the License.
151cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau */
161cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
171cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau/*
181cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * Copyright (c) 2009 The Khronos Group Inc.
191cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *
201cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * Permission is hereby granted, free of charge, to any person obtaining a copy of this
211cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * software and /or associated documentation files (the "Materials "), to deal in the
221cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * Materials without restriction, including without limitation the rights to use, copy,
231cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * modify, merge, publish, distribute, sublicense, and/or sell copies of the Materials,
241cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * and to permit persons to whom the Materials are furnished to do so, subject to
251cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * the following conditions:
261cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *
271cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * The above copyright notice and this permission notice shall be included
281cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * in all copies or substantial portions of the Materials.
291cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau *
301cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
311cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
321cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
331cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
341cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
351cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
361cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
371cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau * MATERIALS.
381cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau */
391cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
401cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#define LOG_NDEBUG 0
411cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#define LOG_TAG "slesTestPlayUri"
421cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
431cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <utils/Log.h>
441cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <getopt.h>
451cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <stdlib.h>
461cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <stdio.h>
471cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <string.h>
481cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <unistd.h>
491cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <sys/time.h>
501cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#include <gtest/gtest.h>
51a6c5e52ded343b557152156c33d33a10d29bf6f1Glenn Kasten#include <SLES/OpenSLES.h>
521cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
531cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
541cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#define MAX_NUMBER_INTERFACES 3
551cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau#define MAX_NUMBER_OUTPUT_DEVICES 6
561cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
571cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau//The expected playback duration
580a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Triviconst int MP3_DURATION = 71030; //71 secs
591cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
601cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
611cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau//-----------------------------------------------------------------
621cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau/* Checks for error. If any errors exit the application! */
631cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lauvoid CheckErr( SLresult res )
641cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau{
651cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if ( res != SL_RESULT_SUCCESS )  {
660a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        fprintf(stderr, "%u SL failure, exiting\n", res);
671cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        //Fail the test case
681cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        ASSERT_TRUE(false);
691cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
701cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau}
711cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
721cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau//-----------------------------------------------------------------
731cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau/* PrefetchStatusItf callback for an audio player */
741cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lauvoid PrefetchEventCallback( SLPrefetchStatusItf caller,  void *pContext, SLuint32 event)
751cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau{
761cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLpermille level = 0;
771cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    (*caller)->GetFillLevel(caller, &level);
781cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLuint32 status;
790a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi    fprintf(stdout, "\t\tPrefetchEventCallback: received event %u\n", event);
801cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    (*caller)->GetPrefetchStatus(caller, &status);
811cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if ((event & (SL_PREFETCHEVENT_STATUSCHANGE|SL_PREFETCHEVENT_FILLLEVELCHANGE))
821cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau            && (level == 0) && (status == SL_PREFETCHSTATUS_UNDERFLOW)) {
831cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        fprintf(stderr, "\t\tPrefetchEventCallback: Error while prefetching data, exiting\n");
841cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        ASSERT_TRUE(false);
851cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
861cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if (event & SL_PREFETCHEVENT_FILLLEVELCHANGE) {
87b47ed9082f7be9da24523316298bbfcb3dbffc9aJean-Michel Trivi        fprintf(stdout, "\t\tPrefetchEventCallback: Buffer fill level is = %d\n", level);
881cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
891cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if (event & SL_PREFETCHEVENT_STATUSCHANGE) {
900a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        fprintf(stdout, "\t\tPrefetchEventCallback: Prefetch Status is = %u\n", status);
911cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
921cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
931cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau}
941cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
951cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
961cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau//-----------------------------------------------------------------
971cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
981cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau/* Play some music from a URI  */
991cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lauvoid TestPlayUri( SLObjectItf sl, const char* path)
1001cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau{
1011cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLEngineItf                EngineItf;
1021cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1031cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLint32                    numOutputs = 0;
1041cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLuint32                   deviceID = 0;
1051cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1061cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLresult                   res;
1071cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1081cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLDataSource               audioSource;
1091cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLDataLocator_URI          uri;
1101cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLDataFormat_MIME          mime;
1111cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1121cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLDataSink                 audioSink;
1131cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLDataLocator_OutputMix    locator_outputmix;
1141cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1151cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLObjectItf                player;
1161cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLPlayItf                  playItf;
1171cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLVolumeItf                volItf;
1181cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLPrefetchStatusItf        prefetchItf;
1191cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1201cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLObjectItf                OutputMix;
1211cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1221cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLboolean required[MAX_NUMBER_INTERFACES];
1231cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
1241cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1251cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Get the SL Engine Interface which is implicit */
1261cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
1271cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1281cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1291cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Initialize arrays required[] and iidArray[] */
1301cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
1311cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        required[i] = SL_BOOLEAN_FALSE;
1321cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        iidArray[i] = SL_IID_NULL;
1331cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
1341cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1351cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    // Set arrays required[] and iidArray[] for VOLUME and PREFETCHSTATUS interface
1361cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    required[0] = SL_BOOLEAN_TRUE;
1371cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    iidArray[0] = SL_IID_VOLUME;
1381cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    required[1] = SL_BOOLEAN_TRUE;
1391cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    iidArray[1] = SL_IID_PREFETCHSTATUS;
1401cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    // Create Output Mix object to be used by player
1414d7c8c742d5b09895e7ce3d07d314b6ada56123dGlenn Kasten    res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0,
1421cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau            iidArray, required); CheckErr(res);
1431cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1441cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    // Realizing the Output Mix object in synchronous mode.
1451cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
1461cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1471cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1481cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Setup the data source structure for the URI */
1491cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    uri.locatorType = SL_DATALOCATOR_URI;
1501cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    uri.URI         =  (SLchar*) path;
1511cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    mime.formatType    = SL_DATAFORMAT_MIME;
1521cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    mime.mimeType      = (SLchar*)NULL;
1531cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
1541cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1551cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    audioSource.pFormat      = (void *)&mime;
1561cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    audioSource.pLocator     = (void *)&uri;
1571cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1581cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Setup the data sink structure */
1591cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    locator_outputmix.locatorType   = SL_DATALOCATOR_OUTPUTMIX;
1601cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    locator_outputmix.outputMix    = OutputMix;
1611cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    audioSink.pLocator           = (void *)&locator_outputmix;
1621cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    audioSink.pFormat            = NULL;
1631cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1641cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Create the audio player */
1651cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player,
166b47ed9082f7be9da24523316298bbfcb3dbffc9aJean-Michel Trivi            &audioSource, &audioSink, 2, iidArray, required); CheckErr(res);
1671cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1681cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Realizing the player in synchronous mode. */
1691cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res);
1701cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1711cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Get interfaces */
1721cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
1731cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1741cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1751cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*player)->GetInterface(player, SL_IID_VOLUME,  (void*)&volItf);
1761cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1771cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1781cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf);
1791cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1801cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*prefetchItf)->RegisterCallback(prefetchItf, PrefetchEventCallback, &prefetchItf);
1811cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1821cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*prefetchItf)->SetCallbackEventsMask(prefetchItf,
1831cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau            SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE);
1841cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1851cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Display duration */
1861cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLmillisecond durationInMsec = SL_TIME_UNKNOWN;
1871cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*playItf)->GetDuration(playItf, &durationInMsec);
1881cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1891cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1901cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Set the player volume */
1911cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*volItf)->SetVolumeLevel( volItf, -300);
1921cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1931cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1941cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Play the URI */
1951cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /*     first cause the player to prefetch the data */
1961cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
1971cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
1981cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
1991cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /*     wait until there's data to play */
2001cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    //SLpermille fillLevel = 0;
2011cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
2021cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLuint32 timeOutIndex = 100; // 10s
2031cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0)) {
2041cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        usleep(100 * 1000);
2051cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus);
2061cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        timeOutIndex--;
2071cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2081cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2091cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if (timeOutIndex == 0) {
2100a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        fprintf(stderr, "Error: Failed to prefetch data in time, exiting\n");
2111cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        ASSERT_TRUE(false);
2121cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau       // goto destroyRes;
2131cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2141cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2151cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Display duration again, */
2161cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*playItf)->GetDuration(playItf, &durationInMsec);
2171cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
2181cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if (durationInMsec == SL_TIME_UNKNOWN) {
2190a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        fprintf(stderr, "Error: GetDuration returned SL_TIME_UNKNOWN (after prefetch completed)\n");
2200a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        ASSERT_TRUE(false);
2210a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi    }
2220a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi    SLint32 durationDiffMsec = durationInMsec - MP3_DURATION;
2230a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi    if (durationDiffMsec < 0) { durationDiffMsec *= -1; }
2240a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi    if (durationDiffMsec > (MP3_DURATION/20)) {
2250a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        fprintf(stderr, "Error: GetDuration returned %d, more than 5percent off from expected %d\n",
2260a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi                durationInMsec, MP3_DURATION);
2271cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        ASSERT_TRUE(false);
2281cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2291cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2301cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
2311cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
2321cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2331cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Play for the song duration*/
2341cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    usleep(MP3_DURATION * 1000);
2351cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2361cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Validate the play position*/
2371cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLmillisecond currentPositionInMsec = SL_TIME_UNKNOWN;
2381cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau           res = (*playItf)->GetPosition(playItf, &currentPositionInMsec);
2391cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau           CheckErr(res);
2401cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    if (currentPositionInMsec == SL_TIME_UNKNOWN) {
2410a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi      fprintf(stderr, "Error: GetPosition returns SL_TIME_UNKNOWN after expected duration\n");
2421cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau      ASSERT_TRUE(false);
2431cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    } else if ( currentPositionInMsec <= 0 ||
2441cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        currentPositionInMsec > (MP3_DURATION * 1.1) ){
2450a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi        fprintf(stderr, "Error: GetPosition returns %i, should be expected duration for test\n",
2466bc9decd2605337cfff7ee34e0ca8a785664672dYu Shan Emily Lau                (int) currentPositionInMsec);
2471cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        ASSERT_TRUE(false);
2481cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2491cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2501cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Make sure player is stopped */
2511cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
2521cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    CheckErr(res);
2531cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2541cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily LaudestroyRes:
2551cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2561cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Destroy the player */
2571cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    (*player)->Destroy(player);
2581cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2591cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    /* Destroy Output Mix object */
2601cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    (*OutputMix)->Destroy(OutputMix);
2610a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi
2620a0d3a3d3f7bfa284905166c806b62109a0bfaadJean-Michel Trivi    fprintf(stdout, "End of test reached\n");
2631cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau}
2641cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2651cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2661cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau// The fixture for testing class MimeUri
2671cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lauclass MimeUri: public ::testing::Test {
2681cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Laupublic:
2691cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLresult res;
2701cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    SLObjectItf sl;
2711cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2721cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lauprotected:
2731cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    MimeUri() {
2741cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        // You can do set-up work for each test here.
2751cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        SLEngineOption EngineOption[] = { { (SLuint32) SL_ENGINEOPTION_THREADSAFE,
2761cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau            (SLuint32) SL_BOOLEAN_TRUE } };
2771cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2781cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        res = slCreateEngine(&sl, 1, EngineOption, 0, NULL, NULL);
2791cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        CheckErr(res);
2801cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2811cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        /* Realizing the SL Engine in synchronous mode. */
2821cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
2831cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        CheckErr(res);
2841cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2851cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2861cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    virtual ~MimeUri() {
2871cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        // You can do clean-up work that doesn't throw exceptions here.
2881cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        (*sl)->Destroy(sl);
2891cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2901cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2911cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    virtual void SetUp() {
2921cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        // Code here will be called immediately after the constructor (right
2931cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        // before each test).
2941cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2951cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
2961cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
2971cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    virtual void TearDown() {
2981cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        // Code here will be called immediately after each test (right
2991cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau        // before the destructor).
3001cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
3011cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    }
3021cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau};
3031cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
3041cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily LauTEST_F(MimeUri, testPlayAbsPath){
3051cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    TestPlayUri(sl, "/sdcard/media_api/music/MP3_256kbps_2ch.mp3");
3061cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau}
3071cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
3081cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily LauTEST_F(MimeUri, testPlayfilePath){
3091cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    TestPlayUri(sl, "file:///sdcard/media_api/music/MP3_256kbps_2ch.mp3");
3101cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau}
3111cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau
3121cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau//-----------------------------------------------------------------
3131cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lauint main(int argc, char **argv)
3141cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau{
3151cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    testing::InitGoogleTest(&argc, argv);
3161cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau    return RUN_ALL_TESTS();
3171cd86b2b1d0b099bd9114e842794f8551597b144Yu Shan Emily Lau}
318