195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau/* 295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * Copyright (C) 2010 The Android Open Source Project 395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * 495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * Licensed under the Apache License, Version 2.0 (the "License"); 595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * you may not use this file except in compliance with the License. 695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * You may obtain a copy of the License at 795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * 895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * http://www.apache.org/licenses/LICENSE-2.0 995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * 1095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * Unless required by applicable law or agreed to in writing, software 1195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * distributed under the License is distributed on an "AS IS" BASIS, 1295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * See the License for the specific language governing permissions and 1495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * limitations under the License. 1595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau */ 1695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 1795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau/* 1895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * Copyright (c) 2009 The Khronos Group Inc. 1995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * 2095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * Permission is hereby granted, free of charge, to any person obtaining a copy of this 2195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * software and /or associated documentation files (the "Materials "), to deal in the 2295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * Materials without restriction, including without limitation the rights to use, copy, 2395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * modify, merge, publish, distribute, sublicense, and/or sell copies of the Materials, 2495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * and to permit persons to whom the Materials are furnished to do so, subject to 2595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * the following conditions: 2695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * 2795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * The above copyright notice and this permission notice shall be included 2895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * in all copies or substantial portions of the Materials. 2995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * 3095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 3195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 3295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 3395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 3495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 3595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 3695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE 3795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau * MATERIALS. 3895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau */ 3995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 4095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#define LOG_NDEBUG 0 4195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#define LOG_TAG "slesTestPlayUri" 4295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 4395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <utils/Log.h> 4495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <getopt.h> 4595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <stdlib.h> 4695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <stdio.h> 4795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <string.h> 4895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <unistd.h> 4995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <sys/time.h> 5095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#include <gtest/gtest.h> 51c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h> 5295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 5395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 5495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#define MAX_NUMBER_INTERFACES 3 5595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau#define MAX_NUMBER_OUTPUT_DEVICES 6 5695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 5795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau//The expected playback duration 58ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Triviconst int MP3_DURATION = 71030; //71 secs 5995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 6095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 6195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau//----------------------------------------------------------------- 6295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau/* Checks for error. If any errors exit the application! */ 6395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lauvoid CheckErr( SLresult res ) 6495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau{ 6595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if ( res != SL_RESULT_SUCCESS ) { 66ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stderr, "%u SL failure, exiting\n", res); 6795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau //Fail the test case 6895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau ASSERT_TRUE(false); 6995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 7095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau} 7195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 7295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau//----------------------------------------------------------------- 7395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau/* PrefetchStatusItf callback for an audio player */ 7495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lauvoid PrefetchEventCallback( SLPrefetchStatusItf caller, void *pContext, SLuint32 event) 7595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau{ 7695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLpermille level = 0; 7795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (*caller)->GetFillLevel(caller, &level); 7895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLuint32 status; 79ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stdout, "\t\tPrefetchEventCallback: received event %u\n", event); 8095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (*caller)->GetPrefetchStatus(caller, &status); 8195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if ((event & (SL_PREFETCHEVENT_STATUSCHANGE|SL_PREFETCHEVENT_FILLLEVELCHANGE)) 8295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau && (level == 0) && (status == SL_PREFETCHSTATUS_UNDERFLOW)) { 8395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau fprintf(stderr, "\t\tPrefetchEventCallback: Error while prefetching data, exiting\n"); 8495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau ASSERT_TRUE(false); 8595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 8695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if (event & SL_PREFETCHEVENT_FILLLEVELCHANGE) { 875940f26b6c2da96c0f0b2293623ed692d1fd9026Jean-Michel Trivi fprintf(stdout, "\t\tPrefetchEventCallback: Buffer fill level is = %d\n", level); 8895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 8995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if (event & SL_PREFETCHEVENT_STATUSCHANGE) { 90ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stdout, "\t\tPrefetchEventCallback: Prefetch Status is = %u\n", status); 9195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 9295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 9395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau} 9495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 9595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 9695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau//----------------------------------------------------------------- 9795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 9895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau/* Play some music from a URI */ 9995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lauvoid TestPlayUri( SLObjectItf sl, const char* path) 10095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau{ 10195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLEngineItf EngineItf; 10295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 10395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLint32 numOutputs = 0; 10495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLuint32 deviceID = 0; 10595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 10695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLresult res; 10795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 10895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLDataSource audioSource; 10995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLDataLocator_URI uri; 11095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLDataFormat_MIME mime; 11195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 11295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLDataSink audioSink; 11395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLDataLocator_OutputMix locator_outputmix; 11495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 11595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLObjectItf player; 11695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLPlayItf playItf; 11795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLVolumeItf volItf; 11895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLPrefetchStatusItf prefetchItf; 11995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 12095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLObjectItf OutputMix; 12195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 12295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLboolean required[MAX_NUMBER_INTERFACES]; 12395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; 12495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 12595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Get the SL Engine Interface which is implicit */ 12695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); 12795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 12895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 12995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Initialize arrays required[] and iidArray[] */ 13095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) { 13195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau required[i] = SL_BOOLEAN_FALSE; 13295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau iidArray[i] = SL_IID_NULL; 13395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 13495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 13595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // Set arrays required[] and iidArray[] for VOLUME and PREFETCHSTATUS interface 13695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau required[0] = SL_BOOLEAN_TRUE; 13795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau iidArray[0] = SL_IID_VOLUME; 13895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau required[1] = SL_BOOLEAN_TRUE; 13995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau iidArray[1] = SL_IID_PREFETCHSTATUS; 14095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // Create Output Mix object to be used by player 141c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0, 14295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau iidArray, required); CheckErr(res); 14395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 14495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // Realizing the Output Mix object in synchronous mode. 14595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE); 14695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 14795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 14895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Setup the data source structure for the URI */ 14995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau uri.locatorType = SL_DATALOCATOR_URI; 15095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau uri.URI = (SLchar*) path; 15195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau mime.formatType = SL_DATAFORMAT_MIME; 15295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau mime.mimeType = (SLchar*)NULL; 15395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED; 15495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 15595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau audioSource.pFormat = (void *)&mime; 15695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau audioSource.pLocator = (void *)&uri; 15795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 15895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Setup the data sink structure */ 15995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 16095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau locator_outputmix.outputMix = OutputMix; 16195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau audioSink.pLocator = (void *)&locator_outputmix; 16295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau audioSink.pFormat = NULL; 16395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 16495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Create the audio player */ 16595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, 1665940f26b6c2da96c0f0b2293623ed692d1fd9026Jean-Michel Trivi &audioSource, &audioSink, 2, iidArray, required); CheckErr(res); 16795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 16895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Realizing the player in synchronous mode. */ 16995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res); 17095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 17195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Get interfaces */ 17295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); 17395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 17495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 17595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*player)->GetInterface(player, SL_IID_VOLUME, (void*)&volItf); 17695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 17795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 17895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf); 17995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 18095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*prefetchItf)->RegisterCallback(prefetchItf, PrefetchEventCallback, &prefetchItf); 18195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 18295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*prefetchItf)->SetCallbackEventsMask(prefetchItf, 18395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE); 18495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 18595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Display duration */ 18695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 18795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*playItf)->GetDuration(playItf, &durationInMsec); 18895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 18995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 19095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Set the player volume */ 19195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*volItf)->SetVolumeLevel( volItf, -300); 19295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 19395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 19495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Play the URI */ 19595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* first cause the player to prefetch the data */ 19695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED ); 19795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 19895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 19995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* wait until there's data to play */ 20095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau //SLpermille fillLevel = 0; 20195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW; 20295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLuint32 timeOutIndex = 100; // 10s 20395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau while ((prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) && (timeOutIndex > 0)) { 20495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau usleep(100 * 1000); 20595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus); 20695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau timeOutIndex--; 20795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 20895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 20995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if (timeOutIndex == 0) { 210ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stderr, "Error: Failed to prefetch data in time, exiting\n"); 21195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau ASSERT_TRUE(false); 21295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // goto destroyRes; 21395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 21495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 21595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Display duration again, */ 21695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*playItf)->GetDuration(playItf, &durationInMsec); 21795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 21895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if (durationInMsec == SL_TIME_UNKNOWN) { 219ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stderr, "Error: GetDuration returned SL_TIME_UNKNOWN (after prefetch completed)\n"); 220ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi ASSERT_TRUE(false); 221ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi } 222ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi SLint32 durationDiffMsec = durationInMsec - MP3_DURATION; 223ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi if (durationDiffMsec < 0) { durationDiffMsec *= -1; } 224ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi if (durationDiffMsec > (MP3_DURATION/20)) { 225ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stderr, "Error: GetDuration returned %d, more than 5percent off from expected %d\n", 226ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi durationInMsec, MP3_DURATION); 22795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau ASSERT_TRUE(false); 22895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 22995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 23095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING ); 23195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 23295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 23395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Play for the song duration*/ 23495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau usleep(MP3_DURATION * 1000); 23595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 23695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Validate the play position*/ 23795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLmillisecond currentPositionInMsec = SL_TIME_UNKNOWN; 23895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*playItf)->GetPosition(playItf, ¤tPositionInMsec); 23995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 24095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau if (currentPositionInMsec == SL_TIME_UNKNOWN) { 241ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stderr, "Error: GetPosition returns SL_TIME_UNKNOWN after expected duration\n"); 24295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau ASSERT_TRUE(false); 24395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } else if ( currentPositionInMsec <= 0 || 24495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau currentPositionInMsec > (MP3_DURATION * 1.1) ){ 245ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stderr, "Error: GetPosition returns %i, should be expected duration for test\n", 246791b3c0bb7bef1fd930a1b91274b972989f6a715Yu Shan Emily Lau (int) currentPositionInMsec); 24795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau ASSERT_TRUE(false); 24895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 24995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 25095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Make sure player is stopped */ 25195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED); 25295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 25395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 25495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily LaudestroyRes: 25595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 25695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Destroy the player */ 25795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (*player)->Destroy(player); 25895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 25995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Destroy Output Mix object */ 26095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (*OutputMix)->Destroy(OutputMix); 261ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi 262ebbc7dd54bb3a6b05ac899af97fc4b7d0ad6f400Jean-Michel Trivi fprintf(stdout, "End of test reached\n"); 26395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau} 26495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 26595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 26695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau// The fixture for testing class MimeUri 26795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lauclass MimeUri: public ::testing::Test { 26895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Laupublic: 26995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLresult res; 27095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLObjectItf sl; 27195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 27295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lauprotected: 27395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau MimeUri() { 27495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // You can do set-up work for each test here. 27595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau SLEngineOption EngineOption[] = { { (SLuint32) SL_ENGINEOPTION_THREADSAFE, 27695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (SLuint32) SL_BOOLEAN_TRUE } }; 27795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 27895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = slCreateEngine(&sl, 1, EngineOption, 0, NULL, NULL); 27995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 28095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 28195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau /* Realizing the SL Engine in synchronous mode. */ 28295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); 28395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau CheckErr(res); 28495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 28595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 28695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau virtual ~MimeUri() { 28795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // You can do clean-up work that doesn't throw exceptions here. 28895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau (*sl)->Destroy(sl); 28995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 29095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 29195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau virtual void SetUp() { 29295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // Code here will be called immediately after the constructor (right 29395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // before each test). 29495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 29595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 29695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 29795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau virtual void TearDown() { 29895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // Code here will be called immediately after each test (right 29995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau // before the destructor). 30095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 30195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau } 30295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau}; 30395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 30495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily LauTEST_F(MimeUri, testPlayAbsPath){ 30595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau TestPlayUri(sl, "/sdcard/media_api/music/MP3_256kbps_2ch.mp3"); 30695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau} 30795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 30895ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily LauTEST_F(MimeUri, testPlayfilePath){ 30995ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau TestPlayUri(sl, "file:///sdcard/media_api/music/MP3_256kbps_2ch.mp3"); 31095ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau} 31195ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau 31295ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau//----------------------------------------------------------------- 31395ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lauint main(int argc, char **argv) 31495ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau{ 31595ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau testing::InitGoogleTest(&argc, argv); 31695ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau return RUN_ALL_TESTS(); 31795ba463b7fd020b23dc48ac0049b9c107add7990Yu Shan Emily Lau} 318