BufferQueue_test.cpp revision be2218961ac506ba9c2be0dddb2f74debd283bb8
1a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten/* 2a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 3a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * 4a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * you may not use this file except in compliance with the License. 6a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * You may obtain a copy of the License at 7a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * 8a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * 10a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * Unless required by applicable law or agreed to in writing, software 11a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * See the License for the specific language governing permissions and 14a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten * limitations under the License. 15a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten */ 16a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 17a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten/** \file BufferQueue_test.cpp */ 18b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 193b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#define LOG_NDEBUG 0 20b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten#define LOG_TAG "BufferQueue_test" 213b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 223b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#ifdef ANDROID 233b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#include <utils/Log.h> 243b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#else 253b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#define LOGV printf 263b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#endif 27a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 28a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <assert.h> 29a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <math.h> 30a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <stdio.h> 31a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <stdlib.h> 32a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <unistd.h> 33a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include "SLES/OpenSLES.h" 34be2218961ac506ba9c2be0dddb2f74debd283bb8Glenn Kasten#include "OpenSLESUT.h" 353b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau#include <gtest/gtest.h> 363b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 37a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kastentypedef struct { 38a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten short left; 39a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten short right; 40a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten} stereo; 41a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 4204c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten// volume of sine wave in range 0.0 to 1.0 4304c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kastenstatic float gVolume = 1.0f; 4404c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten 45a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten// 1 second of stereo audio at 44.1 kHz 46a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kastenstatic stereo stereoBuffer1[44100 * 1]; 47b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kastenstatic const SLuint32 invalidNumBuffers[] = { 0, 0xFFFFFFFF, 0x80000000, 0x10002, 0x102, 48b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 0x101, 0x100 }; 493b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Laustatic const SLuint32 validNumBuffers[] = { 1, 2, 3, 4, 5, 6, 7, 8, 255 }; 50a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 513b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau//----------------------------------------------------------------- 523b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau/* Checks for error. If any errors exit the application! */ 533b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lauvoid CheckErr(SLresult res) { 54b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten if (SL_RESULT_SUCCESS != res) { 557126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten const char *str = slesutResultToString(res); 567126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten if (NULL == str) 577126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten str = "unknown"; 587126c25d7c037e5086216cf540ecf40779c3585aGlenn Kasten fprintf(stderr, "CheckErr failure: %s (0x%lx), exiting\n", str, res); 593b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau //Fail the test case 60b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten FAIL(); 61a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten } 623b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 63a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 64b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kastenstatic const SLInterfaceID ids[1] = { SL_IID_BUFFERQUEUE }; 65b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kastenstatic const SLboolean flags[1] = { SL_BOOLEAN_TRUE }; 66104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kastenstatic const SLInterfaceID ids_mutesolo[2] = { SL_IID_BUFFERQUEUE, SL_IID_MUTESOLO }; 67104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kastenstatic const SLboolean flags_mutesolo[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 68104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kastenstatic const SLInterfaceID ids_seek[2] = { SL_IID_BUFFERQUEUE, SL_IID_SEEK }; 69104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kastenstatic const SLboolean flags_seek[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 70b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 713b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau// The fixture for testing class BufferQueue 723b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lauclass TestBufferQueue: public ::testing::Test { 733b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Laupublic: 743b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLresult res; 75a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLObjectItf outputmixObject; 763b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLObjectItf engineObject; 77a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 78a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLDataSource audiosrc; 79a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLDataSink audiosnk; 80a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLDataFormat_PCM pcm; 81a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLDataLocator_OutputMix locator_outputmix; 82a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLDataLocator_BufferQueue locator_bufferqueue; 833b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLBufferQueueItf playerBufferQueue; 843b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLBufferQueueState bufferqueueState; 853b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLPlayItf playerPlay; 86a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLObjectItf playerObject; 873b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLEngineItf engineEngine; 883b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLuint32 playerState; 893b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 903b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lauprotected: 913b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau TestBufferQueue() { 923b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 933b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 943b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau virtual ~TestBufferQueue() { 953b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 96a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten } 97a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 98b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten /*Test setup*/ 993b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau virtual void SetUp() { 100b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 101b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten // create engine 1023b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 1033b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 1043b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 1053b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 1063b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); 1073b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 1083b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 1093b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau // create output mix 1103b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*engineEngine)->CreateOutputMix(engineEngine, &outputmixObject, 0, NULL, NULL); 1113b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 1123b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*outputmixObject)->Realize(outputmixObject, SL_BOOLEAN_FALSE); 1133b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 1143b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 1153b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau locator_bufferqueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE; 1163b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau locator_bufferqueue.numBuffers = 0; 1173b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 1183b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau locator_outputmix.outputMix = outputmixObject; 1193b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 1203b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.formatType = SL_DATAFORMAT_PCM; 1213b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.numChannels = 2; 1223b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.samplesPerSec = SL_SAMPLINGRATE_44_1; 1233b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; 1243b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.containerSize = 16; 1253b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; 1263b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; 127b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 1283b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau audiosrc.pLocator = &locator_bufferqueue; 1293b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau audiosrc.pFormat = &pcm; 1303b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau audiosnk.pLocator = &locator_outputmix; 1313b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau audiosnk.pFormat = NULL; 1323b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 1333b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau // initialize the test tone to be a sine sweep from 441 Hz to 882 Hz 1343b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau unsigned nframes = sizeof(stereoBuffer1) / sizeof(stereoBuffer1[0]); 1353b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau float nframes_ = (float) nframes; 1363b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SLuint32 i; 1373b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau for (i = 0; i < nframes; ++i) { 1383b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau float i_ = (float) i; 1393b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau float pcm_ = sin((i_ * (1.0f + 0.5f * (i_ / nframes_)) * 0.01 * M_PI * 2.0)); 14004c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten int pcm = (int) (pcm_ * 32766.0 * gVolume); 1413b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau ASSERT_TRUE(-32768 <= pcm && pcm <= 32767) << "pcm out of bound " << pcm; 1423b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau stereoBuffer1[i].left = pcm; 1433b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau stereoBuffer1[nframes - 1 - i].right = pcm; 1443b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1453b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1463b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 1473b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau virtual void TearDown() { 148d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten // Clean up the mixer and the engine 149d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten // (must be done in that order, and after player destroyed) 1504597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten if (outputmixObject){ 1513b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau (*outputmixObject)->Destroy(outputmixObject); 1524597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten outputmixObject = NULL; 1533b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1544597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten if (engineObject){ 1553b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau (*engineObject)->Destroy(engineObject); 1564597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten engineObject = NULL; 1573b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1583b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1593b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 160d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten void DestroyPlayer() { 161d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten if (playerObject){ 162d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten //printf("destroy player\n"); 163d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten (*playerObject)->Destroy(playerObject); 164d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten playerObject = NULL; 165d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten } 166d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten } 167d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten 1683b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau /* Test case for creating audio player with various invalid values for numBuffers*/ 1693b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau void InvalidBuffer() { 170b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 171b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(invalidNumBuffers) / sizeof(invalidNumBuffers[0]); ++i) { 172b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = invalidNumBuffers[i]; 173b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 174b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten locator_bufferqueue.numBuffers = numBuffers; 175d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten //printf("create audio player - invalid\n"); 1764597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten SLresult result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, 1774597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten &audiosrc, &audiosnk, 1, ids, flags); 1783b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau ASSERT_EQ(SL_RESULT_PARAMETER_INVALID, result); 179d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten ASSERT_EQ(NULL, playerObject); 180b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 1813b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1823b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 1833b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 1843b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau /*Prepare the buffer*/ 185b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten void PrepareValidBuffer(SLuint32 numBuffers) { 1863b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 187b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten locator_bufferqueue.numBuffers = numBuffers; 188d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten //printf("create audio player - valid\n"); 1894597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten res = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk, 190b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 1, ids, flags); 1913b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 1923b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE); 1933b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 194a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // get the play interface 1953b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay); 1963b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 197a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // verify that player is initially stopped 1983b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerPlay)->GetPlayState(playerPlay, &playerState); 1993b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 200a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ(SL_PLAYSTATE_STOPPED, playerState); 2013b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 202a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // get the buffer queue interface 2033b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerObject)->GetInterface(playerObject, SL_IID_BUFFERQUEUE, &playerBufferQueue); 2043b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 2053b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 206a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // verify that buffer queue is initially empty 2073b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2083b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 209a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.count); 210a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex); 2113b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 2123b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 213b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten void EnqueueMaxBuffer(SLuint32 numBuffers) { 214a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten SLuint32 j; 2153b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 216b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (j = 0; j < numBuffers; ++j) { 2173b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4); 2183b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 219a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // verify that each buffer is enqueued properly and increments the buffer count 2203b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2213b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 222a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ(j + 1, bufferqueueState.count); 223a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex); 224a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten } 2253b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 2263b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 227b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten void EnqueueExtraBuffer(SLuint32 numBuffers) { 228a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // enqueue one more buffer and make sure it fails 2293b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4); 2303b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau ASSERT_EQ(SL_RESULT_BUFFER_INSUFFICIENT, res); 231a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // verify that the failed enqueue did not affect the buffer count 2323b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2333b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 234b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten ASSERT_EQ(numBuffers, bufferqueueState.count); 235a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex); 2363b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 2373b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 2383b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau void SetPlayerState(SLuint32 state) { 2393b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerPlay)->SetPlayState(playerPlay, state); 2403b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 2413b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau //verify the state can set correctly 2423b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau GetPlayerState(state); 2433b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 2443b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 2453b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau void GetPlayerState(SLuint32 state) { 2463b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerPlay)->GetPlayState(playerPlay, &playerState); 2473b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 2483b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau ASSERT_EQ(state, playerState); 2493b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 2503b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 2513b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau void ClearQueue() { 252a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // now clear the buffer queue 2533b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->Clear(playerBufferQueue); 2543b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 255a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // make sure the clear works 2563b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2573b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 258a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.count); 259a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex); 2603b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 261a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 2623b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau void CheckBufferCount(SLuint32 ExpectedCount, SLuint32 ExpectedPlayIndex) { 2633b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau // changing the play state should not affect the buffer count 2643b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2653b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 2663b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau ASSERT_EQ(ExpectedCount, bufferqueueState.count); 2673b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau ASSERT_EQ(ExpectedPlayIndex, bufferqueueState.playIndex); 2683b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 269a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 2703b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau void PlayBufferQueue() { 271a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // enqueue a buffer 2724597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten res = (*playerBufferQueue)->Enqueue(playerBufferQueue, stereoBuffer1, 2734597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten sizeof(stereoBuffer1)); 2743b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 275a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // set play state to playing 2763b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING); 2773b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 278a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // state should be playing immediately after enqueue 2793b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerPlay)->GetPlayState(playerPlay, &playerState); 2803b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 281a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ(SL_PLAYSTATE_PLAYING, playerState); 282a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // buffer should still be on the queue 2833b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2843b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 285a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 1, bufferqueueState.count); 286a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex); 28743ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten //LOGV("Before 1.5 sec"); 288a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // wait 1.5 seconds 289a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten usleep(1500000); 29043ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten //LOGV("After 1.5 sec"); 291a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // state should still be playing 2923b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerPlay)->GetPlayState(playerPlay, &playerState); 29343ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten //LOGV("GetPlayState"); 2943b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 295a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ(SL_PLAYSTATE_PLAYING, playerState); 296a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten // buffer should be removed from the queue 2973b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState); 2983b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau CheckErr(res); 299a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 0, bufferqueueState.count); 300a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten ASSERT_EQ((SLuint32) 1, bufferqueueState.playIndex); 30143ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten //LOGV("TestEnd"); 302a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten } 3033b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau}; 3044597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten 3053b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testInvalidBuffer){ 30643ad61e9e61b332f7d9f2b991954fcac4c11d691Glenn Kasten //LOGV("Test Fixture: InvalidBuffer"); 307b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten InvalidBuffer(); 3084597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten} 309a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 310104c000a6f36b871ca11e0394db1e5217f374cafGlenn KastenTEST_F(TestBufferQueue, testMuteSolo) { 311104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // create audio player with buffer queue data source in stereo PCM format and ask for mute solo 312104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten locator_bufferqueue.numBuffers = 1; 313104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLresult result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, 314104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &audiosnk, 2, ids_mutesolo, flags_mutesolo); 315104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten ASSERT_EQ(SL_RESULT_SUCCESS, result); 316104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten ASSERT_TRUE(NULL != playerObject); 317104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten DestroyPlayer(); 318104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // create audio player with buffer queue data source in mono PCM format and ask for mute solo 319104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten pcm.numChannels = 1; 320104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten pcm.channelMask = SL_SPEAKER_FRONT_CENTER; 321104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk, 322104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten 2, ids_mutesolo, flags_mutesolo); 323104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten ASSERT_EQ(SL_RESULT_FEATURE_UNSUPPORTED, result); 324104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten ASSERT_EQ(NULL, playerObject); 325104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten DestroyPlayer(); 326104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten} 327104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten 328104c000a6f36b871ca11e0394db1e5217f374cafGlenn KastenTEST_F(TestBufferQueue, testSeek) { 329104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten // can create audio player with buffer queue data source and ask for seek 330104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten locator_bufferqueue.numBuffers = 1; 331104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten SLresult result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, 332104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten &audiosrc, &audiosnk, 2, ids_seek, flags_seek); 333104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten ASSERT_EQ(SL_RESULT_FEATURE_UNSUPPORTED, result); 334104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten ASSERT_EQ(NULL, playerObject); 335104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten DestroyPlayer(); 336104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten} 337104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten 3383b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testValidBuffer) { 339b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 340b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 341b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 342d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 343b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 3443b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 3453b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 3463b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testEnqueueMaxBuffer) { 347b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 348b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 349b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 350b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueMaxBuffer(numBuffers); 351d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 352b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 353b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten} 354b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 355b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn KastenTEST_F(TestBufferQueue, testEnqueueExtraBuffer) { 356b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 357b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 358b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 359b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueMaxBuffer(numBuffers); 360b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueExtraBuffer(numBuffers); 361b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten GetPlayerState(SL_PLAYSTATE_STOPPED); 362d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 363b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 3643b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 365a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 366b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn KastenTEST_F(TestBufferQueue, testEnqueueAtStopped) { 367b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 368b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 369b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 370b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SetPlayerState(SL_PLAYSTATE_STOPPED); 371b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueMaxBuffer(numBuffers); 372b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten CheckBufferCount(numBuffers, (SLuint32) 0); 373d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 374b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 375a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten} 376a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten 377b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn KastenTEST_F(TestBufferQueue, testEnqueueAtPaused) { 378b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 379b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 380b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 381b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SetPlayerState(SL_PLAYSTATE_PAUSED); 382b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueMaxBuffer(numBuffers); 383b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten CheckBufferCount(numBuffers, (SLuint32) 0); 384d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 385b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 3863b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 3873b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 3883b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testClearQueue) { 389b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 390b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 391b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 392b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueMaxBuffer(numBuffers); 393b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten ClearQueue(); 394d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 395b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 3963b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 3973b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 3983b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testStateTransitionEmptyQueue) { 3993b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau static const SLuint32 newStates[] = { 4003b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PAUSED, // paused -> paused 4013b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_STOPPED, // paused -> stopped 4023b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PAUSED, // stopped -> paused 4033b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PLAYING, // paused -> playing 4043b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PLAYING, // playing -> playing 4053b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_STOPPED, // playing -> stopped 4063b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_STOPPED, // stopped -> stopped 4073b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PLAYING, // stopped -> playing 4083b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PAUSED // playing -> paused 4093b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau }; 4103b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 411b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 412b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 413b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 j; 414b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 415b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 416b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten /* Set initial state to paused*/ 417b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SetPlayerState(SL_PLAYSTATE_PAUSED); 4183b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 419b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (j = 0; j < sizeof(newStates) / sizeof(newStates[0]); ++j) { 420b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SetPlayerState(newStates[j]); 421b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten CheckBufferCount((SLuint32) 0, (SLuint32) 0); 422b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 423d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 4243b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 4253b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 4263b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 4273b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testStateTransitionNonEmptyQueue) { 4283b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau static const SLuint32 newStates[] = { 4293b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_PAUSED, // paused -> paused 4303b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_STOPPED, // paused -> stopped 4313b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau SL_PLAYSTATE_STOPPED, // stopped -> stopped 432b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SL_PLAYSTATE_PAUSED // stopped -> paused 4333b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau }; 4343b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 435b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 436b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 437b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 j; 4383b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 439b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten /* Prepare the player */ 440b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 441b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten EnqueueMaxBuffer(numBuffers); 442b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SetPlayerState(SL_PLAYSTATE_PAUSED); 443b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten 444b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (j = 0; j < sizeof(newStates) / sizeof(newStates[0]); ++j) { 445b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SetPlayerState(newStates[j]); 446b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten CheckBufferCount(numBuffers, (SLuint32) 0); 447b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 448d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 4493b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau } 4503b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau} 4513b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau 4523b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily LauTEST_F(TestBufferQueue, testStatePlayBuffer){ 453b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) { 454b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten SLuint32 numBuffers = validNumBuffers[i]; 455b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PrepareValidBuffer(numBuffers); 456b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten PlayBufferQueue(); 457d48ff338b8338c1e3e54e0f9dcd03567a0aa9de4Glenn Kasten DestroyPlayer(); 458b12deb54e78a45a8cfe380da7c047ec9ac3fe5d8Glenn Kasten } 4594597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten} 4604597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten 4613b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lauint main(int argc, char **argv) { 4623b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau testing::InitGoogleTest(&argc, argv); 46304c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten#if 1 // temporary workaround if hardware volume control is not working 46404c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten const char *VOLUME = getenv("BufferQueue_test_VOLUME"); 46504c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten if (NULL != VOLUME) { 46604c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten float volume = atof(VOLUME); 46704c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten if (volume >= 0.0f && volume <= 1.0f) { 46804c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten gVolume = volume; 46904c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten } 47004c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten } 47104c7354b8a9afcf2151c00c1dfbc64d0ba5d33ccGlenn Kasten#endif 4723b2a7f6713db24c529a117a67aaabbc676678748Yu Shan Emily Lau return RUN_ALL_TESTS(); 473a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten} 474