BufferQueue_test.cpp revision a15af1c45c3ad1d96e3012f1613a79a86c0b2547
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 */
18a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
19a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <assert.h>
20a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <math.h>
21a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <stdio.h>
22a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <stdlib.h>
23a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include <unistd.h>
24a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include "SLES/OpenSLES.h"
25a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
26a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#ifdef ANDROID
27a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#include "gtest/gtest.h"
28a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#else
29a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#define ASSERT_EQ(x, y) assert((x) == (y))
30a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten#endif
31a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
32a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kastentypedef struct {
33a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    short left;
34a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    short right;
35a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten} stereo;
36a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
37a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten// 1 second of stereo audio at 44.1 kHz
38a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kastenstatic stereo stereoBuffer1[44100 * 1];
39a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
40a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kastenstatic void do_my_testing()
41a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten{
42a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLresult result;
43a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
44a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // initialize the test tone to be a sine sweep from 441 Hz to 882 Hz
45a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    unsigned nframes = sizeof(stereoBuffer1) / sizeof(stereoBuffer1[0]);
46a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    float nframes_ = (float) nframes;
47a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLuint32 i;
48a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    for (i = 0; i < nframes; ++i) {
49a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        float i_ = (float) i;
50a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        float pcm_ = sin((i_*(1.0f+0.5f*(i_/nframes_))*0.01 * M_PI * 2.0));
51a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        int pcm = (int) (pcm_ * 32766.0);
52a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        assert(-32768 <= pcm && pcm <= 32767);
53a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        stereoBuffer1[i].left = pcm;
54a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        stereoBuffer1[nframes - 1 - i].right = pcm;
55a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    }
56a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
57a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // create engine
58a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLObjectItf engineObject;
59a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
60a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    ASSERT_EQ(SL_RESULT_SUCCESS, result);
61a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
62a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    ASSERT_EQ(SL_RESULT_SUCCESS, result);
63a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLEngineItf engineEngine;
64a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
65a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    ASSERT_EQ(SL_RESULT_SUCCESS, result);
66a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
67a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // create output mix
68a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLObjectItf outputmixObject;
69a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    result = (*engineEngine)->CreateOutputMix(engineEngine, &outputmixObject, 0, NULL, NULL);
70a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    ASSERT_EQ(SL_RESULT_SUCCESS, result);
71a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    result = (*outputmixObject)->Realize(outputmixObject, SL_BOOLEAN_FALSE);
72a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    ASSERT_EQ(SL_RESULT_SUCCESS, result);
73a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
74a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // set up data structures to create an audio player with buffer queue source and output mix sink
75a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLDataSource audiosrc;
76a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLDataSink audiosnk;
77a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLDataFormat_PCM pcm;
78a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLDataLocator_OutputMix locator_outputmix;
79a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLDataLocator_BufferQueue locator_bufferqueue;
80a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    locator_bufferqueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
81a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    locator_bufferqueue.numBuffers = 0;
82a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
83a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    locator_outputmix.outputMix = outputmixObject;
84a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.formatType = SL_DATAFORMAT_PCM;
85a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.numChannels = 2;
86a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
87a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
88a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.containerSize = 16;
89a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
90a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
91a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    audiosrc.pLocator = &locator_bufferqueue;
92a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    audiosrc.pFormat = &pcm;
93a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    audiosnk.pLocator = &locator_outputmix;
94a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    audiosnk.pFormat = NULL;
95a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLObjectItf playerObject;
96a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLInterfaceID ids[1] = {SL_IID_BUFFERQUEUE};
97a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    SLboolean flags[1] = {SL_BOOLEAN_TRUE};
98a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
99a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // try creating audio player with various invalid values for numBuffers
100a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    static const SLuint32 invalidNumBuffers[] = {0, 0xFFFFFFFF, 0x80000000, 0x10002, 0x102, 0x101, 0x100};
101a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    for (i = 0; i < sizeof(invalidNumBuffers) / sizeof(invalidNumBuffers[0]); ++i) {
102a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        locator_bufferqueue.numBuffers = invalidNumBuffers[i];
103a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk, 1, ids, flags);
104a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_PARAMETER_INVALID, result);
105a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    }
106a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
107a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // now try some valid values for numBuffers */
108a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    static const SLuint32 validNumBuffers[] = {1, 2, 3, 4, 5, 6, 7, 8, 255};
109a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    for (i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
110a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        locator_bufferqueue.numBuffers = validNumBuffers[i];
111a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk, 1, ids, flags);
112a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
113a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);
114a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
115a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // get the play interface
116a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        SLPlayItf playerPlay;
117a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay);
118a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
119a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        SLuint32 playerState;
120a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // verify that player is initially stopped
121a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
122a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
123a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_PLAYSTATE_STOPPED, playerState);
124a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // get the buffer queue interface
125a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        SLBufferQueueItf playerBufferQueue;
126a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerObject)->GetInterface(playerObject, SL_IID_BUFFERQUEUE, &playerBufferQueue);
127a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
128a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // verify that buffer queue is initially empty
129a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        SLBufferQueueState bufferqueueState;
130a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
131a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
132a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
133a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
134a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // try enqueuing the maximum number of buffers while stopped
135a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        SLuint32 j;
136a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        for (j = 0; j < validNumBuffers[i]; ++j) {
137a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
138a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
139a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // verify that each buffer is enqueued properly and increments the buffer count
140a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
141a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
142a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(j + 1, bufferqueueState.count);
143a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
144a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // verify that player is still stopped; enqueue should not affect play state
145a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
146a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
147a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_PLAYSTATE_STOPPED, playerState);
148a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        }
149a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // enqueue one more buffer and make sure it fails
150a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
151a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_BUFFER_INSUFFICIENT, result);
152a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // verify that the failed enqueue did not affect the buffer count
153a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
154a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
155a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(validNumBuffers[i], bufferqueueState.count);
156a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
157a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // now clear the buffer queue
158a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Clear(playerBufferQueue);
159a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
160a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // make sure the clear works
161a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
162a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
163a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
164a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
165a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // change play state from paused to stopped
166a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PAUSED);
167a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
168a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // verify that player is really paused
169a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
170a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
171a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_PLAYSTATE_PAUSED, playerState);
172a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // try enqueuing the maximum number of buffers while paused
173a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        for (j = 0; j < validNumBuffers[i]; ++j) {
174a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
175a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
176a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // verify that each buffer is enqueued properly and increments the buffer count
177a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
178a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
179a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(j + 1, bufferqueueState.count);
180a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
181a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // verify that player is still paused; enqueue should not affect play state
182a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
183a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
184a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_PLAYSTATE_PAUSED, playerState);
185a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        }
186a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // enqueue one more buffer and make sure it fails
187a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
188a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_BUFFER_INSUFFICIENT, result);
189a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // verify that the failed enqueue did not affect the buffer count
190a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
191a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
192a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(validNumBuffers[i], bufferqueueState.count);
193a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
194a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // now clear the buffer queue
195a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Clear(playerBufferQueue);
196a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
197a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // make sure the clear works
198a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
199a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
200a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
201a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
202a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // try every possible play state transition while buffer queue is empty
203a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        static const SLuint32 newStates1[] = {
204a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PAUSED,    // paused -> paused
205a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_STOPPED,   // paused -> stopped
206a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PAUSED,    // stopped -> paused, also done earlier
207a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PLAYING,   // paused -> playing
208a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PLAYING,   // playing -> playing
209a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_STOPPED,   // playing -> stopped
210a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_STOPPED,   // stopped -> stopped
211a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PLAYING,   // stopped -> playing
212a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PAUSED     // playing -> paused
213a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        };
214a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // initially the play state is (still) paused
215a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
216a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
217a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_PLAYSTATE_PAUSED, playerState);
218a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        for (j = 0; j < sizeof(newStates1) / sizeof(newStates1[0]); ++j) {
219a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // change play state
220a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerPlay)->SetPlayState(playerPlay, newStates1[j]);
221a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
222a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // make sure the new play state is taken
223a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
224a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
225a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(newStates1[j], playerState);
226a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // changing the play state should not affect the buffer count
227a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
228a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
229a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
230a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
231a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        }
232a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // finally the play state is (again) paused
233a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
234a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
235a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_PLAYSTATE_PAUSED, playerState);
236a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // enqueue a buffer
237a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
238a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
239a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // try several inaudible play state transitions while buffer queue is non-empty
240a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        static const SLuint32 newStates2[] = {
241a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PAUSED,    // paused -> paused
242a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_STOPPED,   // paused -> stopped
243a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_STOPPED,   // stopped -> stopped
244a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            SL_PLAYSTATE_PAUSED    // stopped -> paused
245a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        };
246a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        for (j = 0; j < sizeof(newStates2) / sizeof(newStates2[0]); ++j) {
247a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // change play state
248a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerPlay)->SetPlayState(playerPlay, newStates2[j]);
249a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
250a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // make sure the new play state is taken
251a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
252a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
253a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(newStates2[j], playerState);
254a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            // changing the play state should not affect the buffer count
255a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
256a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ(SL_RESULT_SUCCESS, result);
257a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ((SLuint32) 1, bufferqueueState.count);
258a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten            ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
259a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        }
260a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // clear the buffer queue
261a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Clear(playerBufferQueue);
262a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
263a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
264a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // now we're finally ready to make some noise
265a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
266a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // enqueue a buffer
267a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->Enqueue(playerBufferQueue, stereoBuffer1, sizeof(stereoBuffer1));
268a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
269a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // set play state to playing
270a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
271a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
272a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // state should be playing immediately after enqueue
273a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
274a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
275a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_PLAYSTATE_PLAYING, playerState);
276a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // buffer should still be on the queue
277a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
278a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
279a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 1, bufferqueueState.count);
280a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
281a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // wait 1.5 seconds
282a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        usleep(1500000);
283a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // state should still be playing
284a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerPlay)->GetPlayState(playerPlay, &playerState);
285a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
286a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_PLAYSTATE_PLAYING, playerState);
287a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // buffer should be removed from the queue
288a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        result = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
289a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ(SL_RESULT_SUCCESS, result);
290a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
291a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        ASSERT_EQ((SLuint32) 1, bufferqueueState.playIndex);
292a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        // destroy the player
293a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten        (*playerObject)->Destroy(playerObject);
294a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    }
295a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
296a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // destroy the output mix
297a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    (*outputmixObject)->Destroy(outputmixObject);
298a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    // destroy the engine
299a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    (*engineObject)->Destroy(engineObject);
300a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
301a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten}
302a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten
303a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kastenint main(int argc, char **argv)
304a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten{
305a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    do_my_testing();
306a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten    return EXIT_SUCCESS;
307a15af1c45c3ad1d96e3012f1613a79a86c0b2547Glenn Kasten}
308