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