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