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, ¤tPositionInMsec); 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