xref: /aosp_15_r20/frameworks/wilhelm/tests/automated/BufferQueue_test.cpp (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker  *
4*bebae9c0SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker  *
8*bebae9c0SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker  *
10*bebae9c0SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker  * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker  */
16*bebae9c0SAndroid Build Coastguard Worker 
17*bebae9c0SAndroid Build Coastguard Worker /** \file BufferQueue_test.cpp */
18*bebae9c0SAndroid Build Coastguard Worker 
19*bebae9c0SAndroid Build Coastguard Worker #define LOG_NDEBUG 0
20*bebae9c0SAndroid Build Coastguard Worker #define LOG_TAG "BufferQueue_test"
21*bebae9c0SAndroid Build Coastguard Worker 
22*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
23*bebae9c0SAndroid Build Coastguard Worker #include <utils/Log.h>
24*bebae9c0SAndroid Build Coastguard Worker #else
25*bebae9c0SAndroid Build Coastguard Worker #define ALOGV printf
26*bebae9c0SAndroid Build Coastguard Worker #endif
27*bebae9c0SAndroid Build Coastguard Worker 
28*bebae9c0SAndroid Build Coastguard Worker #include <assert.h>
29*bebae9c0SAndroid Build Coastguard Worker #include <math.h>
30*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h>
31*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h>
32*bebae9c0SAndroid Build Coastguard Worker #include <unistd.h>
33*bebae9c0SAndroid Build Coastguard Worker #include <SLES/OpenSLES.h>
34*bebae9c0SAndroid Build Coastguard Worker #include "OpenSLESUT.h"
35*bebae9c0SAndroid Build Coastguard Worker #include <gtest/gtest.h>
36*bebae9c0SAndroid Build Coastguard Worker 
37*bebae9c0SAndroid Build Coastguard Worker typedef struct {
38*bebae9c0SAndroid Build Coastguard Worker     short left;
39*bebae9c0SAndroid Build Coastguard Worker     short right;
40*bebae9c0SAndroid Build Coastguard Worker } stereo;
41*bebae9c0SAndroid Build Coastguard Worker 
42*bebae9c0SAndroid Build Coastguard Worker // volume of sine wave in range 0.0 to 1.0
43*bebae9c0SAndroid Build Coastguard Worker static float gVolume = 1.0f;
44*bebae9c0SAndroid Build Coastguard Worker 
45*bebae9c0SAndroid Build Coastguard Worker // 1 second of stereo audio at 44.1 kHz
46*bebae9c0SAndroid Build Coastguard Worker static stereo stereoBuffer1[44100 * 1];
47*bebae9c0SAndroid Build Coastguard Worker static const SLuint32 invalidNumBuffers[] = { 0, 0xFFFFFFFF, 0x80000000, 0x10002, 0x102,
48*bebae9c0SAndroid Build Coastguard Worker         0x101, 0x100 };
49*bebae9c0SAndroid Build Coastguard Worker static const SLuint32 validNumBuffers[] = { 1, 2, 3, 4, 5, 6, 7, 8, 255 };
50*bebae9c0SAndroid Build Coastguard Worker 
51*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------
52*bebae9c0SAndroid Build Coastguard Worker /* Checks for error. If any errors exit the application! */
CheckErr(SLresult res)53*bebae9c0SAndroid Build Coastguard Worker void CheckErr(SLresult res) {
54*bebae9c0SAndroid Build Coastguard Worker     if (SL_RESULT_SUCCESS != res) {
55*bebae9c0SAndroid Build Coastguard Worker         const char *str = slesutResultToString(res);
56*bebae9c0SAndroid Build Coastguard Worker         if (NULL == str)
57*bebae9c0SAndroid Build Coastguard Worker             str = "unknown";
58*bebae9c0SAndroid Build Coastguard Worker         fprintf(stderr, "CheckErr failure: %s (0x%x), exiting\n", str, res);
59*bebae9c0SAndroid Build Coastguard Worker         //Fail the test case
60*bebae9c0SAndroid Build Coastguard Worker         FAIL();
61*bebae9c0SAndroid Build Coastguard Worker     }
62*bebae9c0SAndroid Build Coastguard Worker }
63*bebae9c0SAndroid Build Coastguard Worker 
64*bebae9c0SAndroid Build Coastguard Worker static const SLInterfaceID ids[1] = { SL_IID_BUFFERQUEUE };
65*bebae9c0SAndroid Build Coastguard Worker static const SLboolean flags[1] = { SL_BOOLEAN_TRUE };
66*bebae9c0SAndroid Build Coastguard Worker static const SLInterfaceID ids_mutesolo[2] = { SL_IID_BUFFERQUEUE, SL_IID_MUTESOLO };
67*bebae9c0SAndroid Build Coastguard Worker static const SLboolean flags_mutesolo[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };
68*bebae9c0SAndroid Build Coastguard Worker static const SLInterfaceID ids_seek[2] = { SL_IID_BUFFERQUEUE, SL_IID_SEEK };
69*bebae9c0SAndroid Build Coastguard Worker static const SLboolean flags_seek[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE };
70*bebae9c0SAndroid Build Coastguard Worker 
71*bebae9c0SAndroid Build Coastguard Worker // The fixture for testing class BufferQueue
72*bebae9c0SAndroid Build Coastguard Worker class TestBufferQueue: public ::testing::Test {
73*bebae9c0SAndroid Build Coastguard Worker public:
74*bebae9c0SAndroid Build Coastguard Worker     SLresult res;
75*bebae9c0SAndroid Build Coastguard Worker     SLObjectItf outputmixObject;
76*bebae9c0SAndroid Build Coastguard Worker     SLObjectItf engineObject;
77*bebae9c0SAndroid Build Coastguard Worker 
78*bebae9c0SAndroid Build Coastguard Worker     SLDataSource audiosrc;
79*bebae9c0SAndroid Build Coastguard Worker     SLDataSink audiosnk;
80*bebae9c0SAndroid Build Coastguard Worker     SLDataFormat_PCM pcm;
81*bebae9c0SAndroid Build Coastguard Worker     SLDataLocator_OutputMix locator_outputmix;
82*bebae9c0SAndroid Build Coastguard Worker     SLDataLocator_BufferQueue locator_bufferqueue;
83*bebae9c0SAndroid Build Coastguard Worker     SLBufferQueueItf playerBufferQueue;
84*bebae9c0SAndroid Build Coastguard Worker     SLBufferQueueState bufferqueueState;
85*bebae9c0SAndroid Build Coastguard Worker     SLPlayItf playerPlay;
86*bebae9c0SAndroid Build Coastguard Worker     SLObjectItf playerObject;
87*bebae9c0SAndroid Build Coastguard Worker     SLEngineItf engineEngine;
88*bebae9c0SAndroid Build Coastguard Worker     SLuint32 playerState;
89*bebae9c0SAndroid Build Coastguard Worker 
90*bebae9c0SAndroid Build Coastguard Worker protected:
TestBufferQueue()91*bebae9c0SAndroid Build Coastguard Worker     TestBufferQueue() {
92*bebae9c0SAndroid Build Coastguard Worker     }
93*bebae9c0SAndroid Build Coastguard Worker 
~TestBufferQueue()94*bebae9c0SAndroid Build Coastguard Worker     virtual ~TestBufferQueue() {
95*bebae9c0SAndroid Build Coastguard Worker 
96*bebae9c0SAndroid Build Coastguard Worker     }
97*bebae9c0SAndroid Build Coastguard Worker 
98*bebae9c0SAndroid Build Coastguard Worker     /*Test setup*/
SetUp()99*bebae9c0SAndroid Build Coastguard Worker     virtual void SetUp() {
100*bebae9c0SAndroid Build Coastguard Worker 
101*bebae9c0SAndroid Build Coastguard Worker         // create engine
102*bebae9c0SAndroid Build Coastguard Worker         res = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
103*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
104*bebae9c0SAndroid Build Coastguard Worker         res = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
105*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
106*bebae9c0SAndroid Build Coastguard Worker         res = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
107*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
108*bebae9c0SAndroid Build Coastguard Worker 
109*bebae9c0SAndroid Build Coastguard Worker         // create output mix
110*bebae9c0SAndroid Build Coastguard Worker         res = (*engineEngine)->CreateOutputMix(engineEngine, &outputmixObject, 0, NULL, NULL);
111*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
112*bebae9c0SAndroid Build Coastguard Worker         res = (*outputmixObject)->Realize(outputmixObject, SL_BOOLEAN_FALSE);
113*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
114*bebae9c0SAndroid Build Coastguard Worker 
115*bebae9c0SAndroid Build Coastguard Worker         locator_bufferqueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
116*bebae9c0SAndroid Build Coastguard Worker         locator_bufferqueue.numBuffers = 0;
117*bebae9c0SAndroid Build Coastguard Worker         locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
118*bebae9c0SAndroid Build Coastguard Worker         locator_outputmix.outputMix = outputmixObject;
119*bebae9c0SAndroid Build Coastguard Worker 
120*bebae9c0SAndroid Build Coastguard Worker         pcm.formatType = SL_DATAFORMAT_PCM;
121*bebae9c0SAndroid Build Coastguard Worker         pcm.numChannels = 2;
122*bebae9c0SAndroid Build Coastguard Worker         pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
123*bebae9c0SAndroid Build Coastguard Worker         pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
124*bebae9c0SAndroid Build Coastguard Worker         pcm.containerSize = 16;
125*bebae9c0SAndroid Build Coastguard Worker         pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
126*bebae9c0SAndroid Build Coastguard Worker         pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
127*bebae9c0SAndroid Build Coastguard Worker 
128*bebae9c0SAndroid Build Coastguard Worker         audiosrc.pLocator = &locator_bufferqueue;
129*bebae9c0SAndroid Build Coastguard Worker         audiosrc.pFormat = &pcm;
130*bebae9c0SAndroid Build Coastguard Worker         audiosnk.pLocator = &locator_outputmix;
131*bebae9c0SAndroid Build Coastguard Worker         audiosnk.pFormat = NULL;
132*bebae9c0SAndroid Build Coastguard Worker 
133*bebae9c0SAndroid Build Coastguard Worker         // initialize the test tone to be a sine sweep from 441 Hz to 882 Hz
134*bebae9c0SAndroid Build Coastguard Worker         unsigned nframes = sizeof(stereoBuffer1) / sizeof(stereoBuffer1[0]);
135*bebae9c0SAndroid Build Coastguard Worker         float nframes_ = (float) nframes;
136*bebae9c0SAndroid Build Coastguard Worker         SLuint32 i;
137*bebae9c0SAndroid Build Coastguard Worker         for (i = 0; i < nframes; ++i) {
138*bebae9c0SAndroid Build Coastguard Worker             float i_ = (float) i;
139*bebae9c0SAndroid Build Coastguard Worker             float pcm_ = sin((i_ * (1.0f + 0.5f * (i_ / nframes_)) * 0.01 * M_PI * 2.0));
140*bebae9c0SAndroid Build Coastguard Worker             int pcm = (int) (pcm_ * 32766.0 * gVolume);
141*bebae9c0SAndroid Build Coastguard Worker             ASSERT_TRUE(-32768 <= pcm && pcm <= 32767) << "pcm out of bound " << pcm;
142*bebae9c0SAndroid Build Coastguard Worker             stereoBuffer1[i].left = pcm;
143*bebae9c0SAndroid Build Coastguard Worker             stereoBuffer1[nframes - 1 - i].right = pcm;
144*bebae9c0SAndroid Build Coastguard Worker         }
145*bebae9c0SAndroid Build Coastguard Worker     }
146*bebae9c0SAndroid Build Coastguard Worker 
TearDown()147*bebae9c0SAndroid Build Coastguard Worker     virtual void TearDown() {
148*bebae9c0SAndroid Build Coastguard Worker         // Clean up the mixer and the engine
149*bebae9c0SAndroid Build Coastguard Worker         // (must be done in that order, and after player destroyed)
150*bebae9c0SAndroid Build Coastguard Worker         if (outputmixObject){
151*bebae9c0SAndroid Build Coastguard Worker             (*outputmixObject)->Destroy(outputmixObject);
152*bebae9c0SAndroid Build Coastguard Worker             outputmixObject = NULL;
153*bebae9c0SAndroid Build Coastguard Worker         }
154*bebae9c0SAndroid Build Coastguard Worker         if (engineObject){
155*bebae9c0SAndroid Build Coastguard Worker             (*engineObject)->Destroy(engineObject);
156*bebae9c0SAndroid Build Coastguard Worker             engineObject = NULL;
157*bebae9c0SAndroid Build Coastguard Worker         }
158*bebae9c0SAndroid Build Coastguard Worker     }
159*bebae9c0SAndroid Build Coastguard Worker 
DestroyPlayer()160*bebae9c0SAndroid Build Coastguard Worker     void DestroyPlayer() {
161*bebae9c0SAndroid Build Coastguard Worker         if (playerObject){
162*bebae9c0SAndroid Build Coastguard Worker             //printf("destroy player\n");
163*bebae9c0SAndroid Build Coastguard Worker             (*playerObject)->Destroy(playerObject);
164*bebae9c0SAndroid Build Coastguard Worker             playerObject = NULL;
165*bebae9c0SAndroid Build Coastguard Worker         }
166*bebae9c0SAndroid Build Coastguard Worker     }
167*bebae9c0SAndroid Build Coastguard Worker 
168*bebae9c0SAndroid Build Coastguard Worker     /* Test case for creating audio player with various invalid values for numBuffers*/
InvalidBuffer()169*bebae9c0SAndroid Build Coastguard Worker     void InvalidBuffer() {
170*bebae9c0SAndroid Build Coastguard Worker 
171*bebae9c0SAndroid Build Coastguard Worker         for (unsigned i = 0; i < sizeof(invalidNumBuffers) / sizeof(invalidNumBuffers[0]); ++i) {
172*bebae9c0SAndroid Build Coastguard Worker             SLuint32 numBuffers = invalidNumBuffers[i];
173*bebae9c0SAndroid Build Coastguard Worker 
174*bebae9c0SAndroid Build Coastguard Worker             locator_bufferqueue.numBuffers = numBuffers;
175*bebae9c0SAndroid Build Coastguard Worker             //printf("create audio player - invalid\n");
176*bebae9c0SAndroid Build Coastguard Worker             SLresult result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject,
177*bebae9c0SAndroid Build Coastguard Worker                                                             &audiosrc, &audiosnk, 1, ids, flags);
178*bebae9c0SAndroid Build Coastguard Worker             ASSERT_EQ(SL_RESULT_PARAMETER_INVALID, result);
179*bebae9c0SAndroid Build Coastguard Worker             ASSERT_EQ(NULL, playerObject);
180*bebae9c0SAndroid Build Coastguard Worker 
181*bebae9c0SAndroid Build Coastguard Worker         }
182*bebae9c0SAndroid Build Coastguard Worker     }
183*bebae9c0SAndroid Build Coastguard Worker 
184*bebae9c0SAndroid Build Coastguard Worker     /*Prepare the buffer*/
PrepareValidBuffer(SLuint32 numBuffers)185*bebae9c0SAndroid Build Coastguard Worker     void PrepareValidBuffer(SLuint32 numBuffers) {
186*bebae9c0SAndroid Build Coastguard Worker 
187*bebae9c0SAndroid Build Coastguard Worker         locator_bufferqueue.numBuffers = numBuffers;
188*bebae9c0SAndroid Build Coastguard Worker         //printf("create audio player - valid\n");
189*bebae9c0SAndroid Build Coastguard Worker         res = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk,
190*bebae9c0SAndroid Build Coastguard Worker                                                 1, ids, flags);
191*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
192*bebae9c0SAndroid Build Coastguard Worker         res = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE);
193*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
194*bebae9c0SAndroid Build Coastguard Worker         // get the play interface
195*bebae9c0SAndroid Build Coastguard Worker         res = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay);
196*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
197*bebae9c0SAndroid Build Coastguard Worker         // verify that player is initially stopped
198*bebae9c0SAndroid Build Coastguard Worker         res = (*playerPlay)->GetPlayState(playerPlay, &playerState);
199*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
200*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(SL_PLAYSTATE_STOPPED, playerState);
201*bebae9c0SAndroid Build Coastguard Worker 
202*bebae9c0SAndroid Build Coastguard Worker         // get the buffer queue interface
203*bebae9c0SAndroid Build Coastguard Worker         res = (*playerObject)->GetInterface(playerObject, SL_IID_BUFFERQUEUE, &playerBufferQueue);
204*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
205*bebae9c0SAndroid Build Coastguard Worker 
206*bebae9c0SAndroid Build Coastguard Worker         // verify that buffer queue is initially empty
207*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
208*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
209*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
210*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
211*bebae9c0SAndroid Build Coastguard Worker     }
212*bebae9c0SAndroid Build Coastguard Worker 
EnqueueMaxBuffer(SLuint32 numBuffers)213*bebae9c0SAndroid Build Coastguard Worker     void EnqueueMaxBuffer(SLuint32 numBuffers) {
214*bebae9c0SAndroid Build Coastguard Worker         SLuint32 j;
215*bebae9c0SAndroid Build Coastguard Worker 
216*bebae9c0SAndroid Build Coastguard Worker         for (j = 0; j < numBuffers; ++j) {
217*bebae9c0SAndroid Build Coastguard Worker             res = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
218*bebae9c0SAndroid Build Coastguard Worker             CheckErr(res);
219*bebae9c0SAndroid Build Coastguard Worker             // verify that each buffer is enqueued properly and increments the buffer count
220*bebae9c0SAndroid Build Coastguard Worker             res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
221*bebae9c0SAndroid Build Coastguard Worker             CheckErr(res);
222*bebae9c0SAndroid Build Coastguard Worker             ASSERT_EQ(j + 1, bufferqueueState.count);
223*bebae9c0SAndroid Build Coastguard Worker             ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
224*bebae9c0SAndroid Build Coastguard Worker         }
225*bebae9c0SAndroid Build Coastguard Worker     }
226*bebae9c0SAndroid Build Coastguard Worker 
EnqueueExtraBuffer(SLuint32 numBuffers)227*bebae9c0SAndroid Build Coastguard Worker     void EnqueueExtraBuffer(SLuint32 numBuffers) {
228*bebae9c0SAndroid Build Coastguard Worker         // enqueue one more buffer and make sure it fails
229*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->Enqueue(playerBufferQueue, "test", 4);
230*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(SL_RESULT_BUFFER_INSUFFICIENT, res);
231*bebae9c0SAndroid Build Coastguard Worker         // verify that the failed enqueue did not affect the buffer count
232*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
233*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
234*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(numBuffers, bufferqueueState.count);
235*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
236*bebae9c0SAndroid Build Coastguard Worker     }
237*bebae9c0SAndroid Build Coastguard Worker 
SetPlayerState(SLuint32 state)238*bebae9c0SAndroid Build Coastguard Worker     void SetPlayerState(SLuint32 state) {
239*bebae9c0SAndroid Build Coastguard Worker         res = (*playerPlay)->SetPlayState(playerPlay, state);
240*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
241*bebae9c0SAndroid Build Coastguard Worker         //verify the state can set correctly
242*bebae9c0SAndroid Build Coastguard Worker         GetPlayerState(state);
243*bebae9c0SAndroid Build Coastguard Worker     }
244*bebae9c0SAndroid Build Coastguard Worker 
GetPlayerState(SLuint32 state)245*bebae9c0SAndroid Build Coastguard Worker     void GetPlayerState(SLuint32 state) {
246*bebae9c0SAndroid Build Coastguard Worker         res = (*playerPlay)->GetPlayState(playerPlay, &playerState);
247*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
248*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(state, playerState);
249*bebae9c0SAndroid Build Coastguard Worker     }
250*bebae9c0SAndroid Build Coastguard Worker 
ClearQueue()251*bebae9c0SAndroid Build Coastguard Worker     void ClearQueue() {
252*bebae9c0SAndroid Build Coastguard Worker         // now clear the buffer queue
253*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->Clear(playerBufferQueue);
254*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
255*bebae9c0SAndroid Build Coastguard Worker         // make sure the clear works
256*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
257*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
258*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
259*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
260*bebae9c0SAndroid Build Coastguard Worker     }
261*bebae9c0SAndroid Build Coastguard Worker 
CheckBufferCount(SLuint32 ExpectedCount,SLuint32 ExpectedPlayIndex)262*bebae9c0SAndroid Build Coastguard Worker     void CheckBufferCount(SLuint32 ExpectedCount, SLuint32 ExpectedPlayIndex) {
263*bebae9c0SAndroid Build Coastguard Worker         // changing the play state should not affect the buffer count
264*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
265*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
266*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(ExpectedCount, bufferqueueState.count);
267*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(ExpectedPlayIndex, bufferqueueState.playIndex);
268*bebae9c0SAndroid Build Coastguard Worker     }
269*bebae9c0SAndroid Build Coastguard Worker 
PlayBufferQueue()270*bebae9c0SAndroid Build Coastguard Worker     void PlayBufferQueue() {
271*bebae9c0SAndroid Build Coastguard Worker         // enqueue a buffer
272*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->Enqueue(playerBufferQueue, stereoBuffer1,
273*bebae9c0SAndroid Build Coastguard Worker             sizeof(stereoBuffer1));
274*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
275*bebae9c0SAndroid Build Coastguard Worker         // set play state to playing
276*bebae9c0SAndroid Build Coastguard Worker         res = (*playerPlay)->SetPlayState(playerPlay, SL_PLAYSTATE_PLAYING);
277*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
278*bebae9c0SAndroid Build Coastguard Worker         // state should be playing immediately after enqueue
279*bebae9c0SAndroid Build Coastguard Worker         res = (*playerPlay)->GetPlayState(playerPlay, &playerState);
280*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
281*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(SL_PLAYSTATE_PLAYING, playerState);
282*bebae9c0SAndroid Build Coastguard Worker         // buffer should still be on the queue
283*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
284*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
285*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 1, bufferqueueState.count);
286*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.playIndex);
287*bebae9c0SAndroid Build Coastguard Worker         //ALOGV("Before 1.5 sec");
288*bebae9c0SAndroid Build Coastguard Worker         // wait 1.5 seconds
289*bebae9c0SAndroid Build Coastguard Worker         usleep(1500000);
290*bebae9c0SAndroid Build Coastguard Worker         //ALOGV("After 1.5 sec");
291*bebae9c0SAndroid Build Coastguard Worker         // state should still be playing
292*bebae9c0SAndroid Build Coastguard Worker         res = (*playerPlay)->GetPlayState(playerPlay, &playerState);
293*bebae9c0SAndroid Build Coastguard Worker         //ALOGV("GetPlayState");
294*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
295*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ(SL_PLAYSTATE_PLAYING, playerState);
296*bebae9c0SAndroid Build Coastguard Worker         // buffer should be removed from the queue
297*bebae9c0SAndroid Build Coastguard Worker         res = (*playerBufferQueue)->GetState(playerBufferQueue, &bufferqueueState);
298*bebae9c0SAndroid Build Coastguard Worker         CheckErr(res);
299*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 0, bufferqueueState.count);
300*bebae9c0SAndroid Build Coastguard Worker         ASSERT_EQ((SLuint32) 1, bufferqueueState.playIndex);
301*bebae9c0SAndroid Build Coastguard Worker         //ALOGV("TestEnd");
302*bebae9c0SAndroid Build Coastguard Worker     }
303*bebae9c0SAndroid Build Coastguard Worker };
304*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testInvalidBuffer)305*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testInvalidBuffer){
306*bebae9c0SAndroid Build Coastguard Worker     //ALOGV("Test Fixture: InvalidBuffer");
307*bebae9c0SAndroid Build Coastguard Worker     InvalidBuffer();
308*bebae9c0SAndroid Build Coastguard Worker }
309*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testMuteSolo)310*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testMuteSolo) {
311*bebae9c0SAndroid Build Coastguard Worker     // create audio player with buffer queue data source in stereo PCM format and ask for mute solo
312*bebae9c0SAndroid Build Coastguard Worker     locator_bufferqueue.numBuffers = 1;
313*bebae9c0SAndroid Build Coastguard Worker     SLresult result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc,
314*bebae9c0SAndroid Build Coastguard Worker             &audiosnk, 2, ids_mutesolo, flags_mutesolo);
315*bebae9c0SAndroid Build Coastguard Worker     ASSERT_EQ(SL_RESULT_SUCCESS, result);
316*bebae9c0SAndroid Build Coastguard Worker     ASSERT_TRUE(NULL != playerObject);
317*bebae9c0SAndroid Build Coastguard Worker     DestroyPlayer();
318*bebae9c0SAndroid Build Coastguard Worker     // create audio player with buffer queue data source in mono PCM format and ask for mute solo
319*bebae9c0SAndroid Build Coastguard Worker     pcm.numChannels = 1;
320*bebae9c0SAndroid Build Coastguard Worker     pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
321*bebae9c0SAndroid Build Coastguard Worker     result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk,
322*bebae9c0SAndroid Build Coastguard Worker             2, ids_mutesolo, flags_mutesolo);
323*bebae9c0SAndroid Build Coastguard Worker     ASSERT_EQ(SL_RESULT_FEATURE_UNSUPPORTED, result);
324*bebae9c0SAndroid Build Coastguard Worker     ASSERT_EQ(NULL, playerObject);
325*bebae9c0SAndroid Build Coastguard Worker     DestroyPlayer();
326*bebae9c0SAndroid Build Coastguard Worker }
327*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testSeek)328*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testSeek) {
329*bebae9c0SAndroid Build Coastguard Worker     // can create audio player with buffer queue data source and ask for seek
330*bebae9c0SAndroid Build Coastguard Worker     locator_bufferqueue.numBuffers = 1;
331*bebae9c0SAndroid Build Coastguard Worker     SLresult result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject,
332*bebae9c0SAndroid Build Coastguard Worker                                                     &audiosrc, &audiosnk, 2, ids_seek, flags_seek);
333*bebae9c0SAndroid Build Coastguard Worker     ASSERT_EQ(SL_RESULT_FEATURE_UNSUPPORTED, result);
334*bebae9c0SAndroid Build Coastguard Worker     ASSERT_EQ(NULL, playerObject);
335*bebae9c0SAndroid Build Coastguard Worker     DestroyPlayer();
336*bebae9c0SAndroid Build Coastguard Worker }
337*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testValidBuffer)338*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testValidBuffer) {
339*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
340*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
341*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
342*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
343*bebae9c0SAndroid Build Coastguard Worker     }
344*bebae9c0SAndroid Build Coastguard Worker }
345*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testEnqueueMaxBuffer)346*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testEnqueueMaxBuffer) {
347*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
348*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
349*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
350*bebae9c0SAndroid Build Coastguard Worker         EnqueueMaxBuffer(numBuffers);
351*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
352*bebae9c0SAndroid Build Coastguard Worker     }
353*bebae9c0SAndroid Build Coastguard Worker }
354*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testEnqueueExtraBuffer)355*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testEnqueueExtraBuffer) {
356*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
357*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
358*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
359*bebae9c0SAndroid Build Coastguard Worker         EnqueueMaxBuffer(numBuffers);
360*bebae9c0SAndroid Build Coastguard Worker         EnqueueExtraBuffer(numBuffers);
361*bebae9c0SAndroid Build Coastguard Worker         GetPlayerState(SL_PLAYSTATE_STOPPED);
362*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
363*bebae9c0SAndroid Build Coastguard Worker     }
364*bebae9c0SAndroid Build Coastguard Worker }
365*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testEnqueueAtStopped)366*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testEnqueueAtStopped) {
367*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
368*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
369*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
370*bebae9c0SAndroid Build Coastguard Worker         SetPlayerState(SL_PLAYSTATE_STOPPED);
371*bebae9c0SAndroid Build Coastguard Worker         EnqueueMaxBuffer(numBuffers);
372*bebae9c0SAndroid Build Coastguard Worker         CheckBufferCount(numBuffers, (SLuint32) 0);
373*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
374*bebae9c0SAndroid Build Coastguard Worker     }
375*bebae9c0SAndroid Build Coastguard Worker }
376*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testEnqueueAtPaused)377*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testEnqueueAtPaused) {
378*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
379*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
380*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
381*bebae9c0SAndroid Build Coastguard Worker         SetPlayerState(SL_PLAYSTATE_PAUSED);
382*bebae9c0SAndroid Build Coastguard Worker         EnqueueMaxBuffer(numBuffers);
383*bebae9c0SAndroid Build Coastguard Worker         CheckBufferCount(numBuffers, (SLuint32) 0);
384*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
385*bebae9c0SAndroid Build Coastguard Worker     }
386*bebae9c0SAndroid Build Coastguard Worker }
387*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testClearQueue)388*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testClearQueue) {
389*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
390*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
391*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
392*bebae9c0SAndroid Build Coastguard Worker         EnqueueMaxBuffer(numBuffers);
393*bebae9c0SAndroid Build Coastguard Worker         ClearQueue();
394*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
395*bebae9c0SAndroid Build Coastguard Worker     }
396*bebae9c0SAndroid Build Coastguard Worker }
397*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testStateTransitionEmptyQueue)398*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testStateTransitionEmptyQueue) {
399*bebae9c0SAndroid Build Coastguard Worker     static const SLuint32 newStates[] = {
400*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PAUSED,    // paused -> paused
401*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_STOPPED,   // paused -> stopped
402*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PAUSED,    // stopped -> paused
403*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PLAYING,   // paused -> playing
404*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PLAYING,   // playing -> playing
405*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_STOPPED,   // playing -> stopped
406*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_STOPPED,   // stopped -> stopped
407*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PLAYING,   // stopped -> playing
408*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PAUSED     // playing -> paused
409*bebae9c0SAndroid Build Coastguard Worker     };
410*bebae9c0SAndroid Build Coastguard Worker 
411*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
412*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
413*bebae9c0SAndroid Build Coastguard Worker         SLuint32 j;
414*bebae9c0SAndroid Build Coastguard Worker 
415*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
416*bebae9c0SAndroid Build Coastguard Worker         /* Set initial state to paused*/
417*bebae9c0SAndroid Build Coastguard Worker         SetPlayerState(SL_PLAYSTATE_PAUSED);
418*bebae9c0SAndroid Build Coastguard Worker 
419*bebae9c0SAndroid Build Coastguard Worker         for (j = 0; j < sizeof(newStates) / sizeof(newStates[0]); ++j) {
420*bebae9c0SAndroid Build Coastguard Worker             SetPlayerState(newStates[j]);
421*bebae9c0SAndroid Build Coastguard Worker             CheckBufferCount((SLuint32) 0, (SLuint32) 0);
422*bebae9c0SAndroid Build Coastguard Worker         }
423*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
424*bebae9c0SAndroid Build Coastguard Worker     }
425*bebae9c0SAndroid Build Coastguard Worker }
426*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testStateTransitionNonEmptyQueue)427*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testStateTransitionNonEmptyQueue) {
428*bebae9c0SAndroid Build Coastguard Worker     static const SLuint32 newStates[] = {
429*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PAUSED,    // paused -> paused
430*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_STOPPED,   // paused -> stopped
431*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_STOPPED,   // stopped -> stopped
432*bebae9c0SAndroid Build Coastguard Worker         SL_PLAYSTATE_PAUSED     // stopped -> paused
433*bebae9c0SAndroid Build Coastguard Worker     };
434*bebae9c0SAndroid Build Coastguard Worker 
435*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
436*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
437*bebae9c0SAndroid Build Coastguard Worker         SLuint32 j;
438*bebae9c0SAndroid Build Coastguard Worker 
439*bebae9c0SAndroid Build Coastguard Worker         /* Prepare the player */
440*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
441*bebae9c0SAndroid Build Coastguard Worker         EnqueueMaxBuffer(numBuffers);
442*bebae9c0SAndroid Build Coastguard Worker         SetPlayerState(SL_PLAYSTATE_PAUSED);
443*bebae9c0SAndroid Build Coastguard Worker 
444*bebae9c0SAndroid Build Coastguard Worker         for (j = 0; j < sizeof(newStates) / sizeof(newStates[0]); ++j) {
445*bebae9c0SAndroid Build Coastguard Worker             SetPlayerState(newStates[j]);
446*bebae9c0SAndroid Build Coastguard Worker             CheckBufferCount(numBuffers, (SLuint32) 0);
447*bebae9c0SAndroid Build Coastguard Worker         }
448*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
449*bebae9c0SAndroid Build Coastguard Worker     }
450*bebae9c0SAndroid Build Coastguard Worker }
451*bebae9c0SAndroid Build Coastguard Worker 
TEST_F(TestBufferQueue,testStatePlayBuffer)452*bebae9c0SAndroid Build Coastguard Worker TEST_F(TestBufferQueue, testStatePlayBuffer){
453*bebae9c0SAndroid Build Coastguard Worker     for (unsigned i = 0; i < sizeof(validNumBuffers) / sizeof(validNumBuffers[0]); ++i) {
454*bebae9c0SAndroid Build Coastguard Worker         SLuint32 numBuffers = validNumBuffers[i];
455*bebae9c0SAndroid Build Coastguard Worker         PrepareValidBuffer(numBuffers);
456*bebae9c0SAndroid Build Coastguard Worker         PlayBufferQueue();
457*bebae9c0SAndroid Build Coastguard Worker         DestroyPlayer();
458*bebae9c0SAndroid Build Coastguard Worker     }
459*bebae9c0SAndroid Build Coastguard Worker }
460*bebae9c0SAndroid Build Coastguard Worker 
main(int argc,char ** argv)461*bebae9c0SAndroid Build Coastguard Worker int main(int argc, char **argv) {
462*bebae9c0SAndroid Build Coastguard Worker     testing::InitGoogleTest(&argc, argv);
463*bebae9c0SAndroid Build Coastguard Worker #if 1   // temporary workaround if hardware volume control is not working
464*bebae9c0SAndroid Build Coastguard Worker     const char *VOLUME = getenv("BufferQueue_test_VOLUME");
465*bebae9c0SAndroid Build Coastguard Worker     if (NULL != VOLUME) {
466*bebae9c0SAndroid Build Coastguard Worker         float volume = atof(VOLUME);
467*bebae9c0SAndroid Build Coastguard Worker         if (volume >= 0.0f && volume <= 1.0f) {
468*bebae9c0SAndroid Build Coastguard Worker             gVolume = volume;
469*bebae9c0SAndroid Build Coastguard Worker         }
470*bebae9c0SAndroid Build Coastguard Worker     }
471*bebae9c0SAndroid Build Coastguard Worker #endif
472*bebae9c0SAndroid Build Coastguard Worker     return RUN_ALL_TESTS();
473*bebae9c0SAndroid Build Coastguard Worker }
474