19309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/*
29309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
39309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *
49309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
59309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * you may not use this file except in compliance with the License.
69309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * You may obtain a copy of the License at
79309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *
89309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
99309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *
109309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
119309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
129309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * See the License for the specific language governing permissions and
149309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * limitations under the License.
159309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi */
169309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
179309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/*
189309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * Copyright (c) 2009 The Khronos Group Inc.
199309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *
209309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * Permission is hereby granted, free of charge, to any person obtaining a copy of this
219309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * software and /or associated documentation files (the "Materials "), to deal in the
229309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * Materials without restriction, including without limitation the rights to use, copy,
239309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * modify, merge, publish, distribute, sublicense, and/or sell copies of the Materials,
249309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * and to permit persons to whom the Materials are furnished to do so, subject to
259309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * the following conditions:
269309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *
279309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * The above copyright notice and this permission notice shall be included
289309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * in all copies or substantial portions of the Materials.
299309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi *
309309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
319309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
329309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
339309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
349309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
359309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
369309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
379309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi * MATERIALS.
389309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi */
399309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
409309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi#include <stdlib.h>
41527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten#include <stdio.h>
42527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten#include <string.h>
43527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten#include <unistd.h>
44527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten#include <sys/time.h>
45527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten
469309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
47c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h>
489309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
499309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
509309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi#define MAX_NUMBER_INTERFACES 3
519309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
529309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Local storage for Audio data in 16 bit words */
539309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi#define AUDIO_DATA_STORAGE_SIZE 4096 * 100
549309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Audio data buffer size in 16 bit words. 8 data segments are used in
559309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivithis simple example */
569309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi#define AUDIO_DATA_BUFFER_SIZE 4096/8
579309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
589309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Checks for error. If any errors exit the application! */
599309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivivoid CheckErr( SLresult res )
609309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi{
619309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    if ( res != SL_RESULT_SUCCESS )
629309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        {
6358432eb9cea995c69b4f905e68b38c1b8216edebGlenn Kasten            fprintf(stdout, "%u SL failure, exiting\n", res);
64c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten            exit(EXIT_FAILURE);
659309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        }
669309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    else {
679309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        //fprintf(stdout, "%d SL success, proceeding...\n", res);
689309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    }
699309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi}
709309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
719309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Structure for passing information to callback function */
729309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivitypedef struct CallbackCntxt_ {
739309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLPlayItf  playItf;
749309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLint16*   pDataBase;    // Base adress of local audio data storage
759309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLint16*   pData;        // Current adress of local audio data storage
769309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLuint32   size;
779309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi} CallbackCntxt;
789309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
799309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Local storage for Audio data */
809309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel TriviSLint16 pcmData[AUDIO_DATA_STORAGE_SIZE];
819309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
829309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Callback for Buffer Queue events */
839309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivivoid BufferQueueCallback(
849309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        SLBufferQueueItf queueItf,
859309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        void *pContext)
869309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi{
879309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    //fprintf(stdout, "BufferQueueCallback called\n");
889309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLresult res;
899309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    //fprintf(stdout, " pContext=%p\n", pContext);
909309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CallbackCntxt *pCntxt = (CallbackCntxt*)pContext;
919309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
929309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    if(pCntxt->pData < (pCntxt->pDataBase + pCntxt->size))
939309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        {
944f064c143ef2b26347130a49788116b5d2e1252aGlenn Kasten            //fprintf(stdout, "callback: before enqueue\n");
959309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            res = (*queueItf)->Enqueue(queueItf, (void*) pCntxt->pData,
969309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi                    2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
979309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            CheckErr(res);
989309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            /* Increase data pointer by buffer size */
999309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            pCntxt->pData += AUDIO_DATA_BUFFER_SIZE;
1009309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        }
1019309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    //fprintf(stdout, "end of BufferQueueCallback()\n");
1029309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi}
1039309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1049309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi/* Play some audio from a buffer queue  */
1059309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivivoid TestPlaySawtoothBufferQueue( SLObjectItf sl )
1069309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi{
1079309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLEngineItf                EngineItf;
1089309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1099309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLint32                    numOutputs = 0;
1109309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLuint32                   deviceID = 0;
1119309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1129309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLresult                   res;
1139309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1149309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLDataSource               audioSource;
1159309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLDataLocator_BufferQueue  bufferQueue;
1169309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLDataFormat_PCM           pcm;
1179309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1189309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLDataSink                 audioSink;
1199309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLDataLocator_OutputMix    locator_outputmix;
1209309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1219309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLObjectItf                player;
1229309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLPlayItf                  playItf;
1239309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLBufferQueueItf           bufferQueueItf;
1249309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLBufferQueueState         state;
1259309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1269309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLObjectItf                OutputMix;
1279309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLVolumeItf                volumeItf;
1289309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1299309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    int                        i;
1309309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1319309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
1329309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
1339309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1349309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Callback context for the buffer queue callback function */
1359309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CallbackCntxt cntxt;
1369309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1379309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
1389309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
1399309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
1409309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1419309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
1429309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    for (i=0;i<MAX_NUMBER_INTERFACES;i++)
1439309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        {
1449309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            required[i] = SL_BOOLEAN_FALSE;
1459309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            iidArray[i] = SL_IID_NULL;
1469309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        }
1479309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1489309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    // Set arrays required[] and iidArray[] for VOLUME interface
1499309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
1509309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    iidArray[0] = SL_IID_VOLUME;
1519309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    // Create Output Mix object to be used by player
152c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten    res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0,
1539309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            iidArray, required); CheckErr(res);
1549309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1559309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    // Realizing the Output Mix object in synchronous mode.
1569309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE);
1579309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
1589309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
159c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten#if 0
1609309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*OutputMix)->GetInterface(OutputMix, SL_IID_VOLUME,
1619309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            (void*)&volumeItf); CheckErr(res);
162c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten#endif
1639309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1649309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Setup the data source structure for the buffer queue */
1659309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
1669309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    bufferQueue.numBuffers = 4;  /* Four buffers in our buffer queue */
1679309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1689309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Setup the format of the content in the buffer queue */
1699309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.formatType = SL_DATAFORMAT_PCM;
1709309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.numChannels = 1;//2;
1719309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
1729309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
1739309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.containerSize = 16;
1749309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.channelMask = SL_SPEAKER_FRONT_LEFT;// | SL_SPEAKER_FRONT_RIGHT;
1759309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
1769309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1779309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    audioSource.pFormat      = (void *)&pcm;
1789309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    audioSource.pLocator     = (void *)&bufferQueue;
1799309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1809309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Setup the data sink structure */
1819309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    locator_outputmix.locatorType   = SL_DATALOCATOR_OUTPUTMIX;
1829309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    locator_outputmix.outputMix    = OutputMix;
1839309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    audioSink.pLocator           = (void *)&locator_outputmix;
1849309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    audioSink.pFormat            = NULL;
1859309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1869309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Initialize the audio data to play */
1879309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    unsigned int j;
1889309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    for (j = 0; j < sizeof(pcmData)/sizeof(pcmData[0]); ++j) {
1899309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        pcmData[j] = j*(100 + j / 200);// % 1000;
1909309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    }
1919309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1929309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Initialize the context for Buffer queue callbacks */
193527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    cntxt.pDataBase = /*(void*)&*/pcmData;
1949309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    cntxt.pData = cntxt.pDataBase;
1959309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    cntxt.size = sizeof(pcmData) / 2;
1969309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
1979309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Set arrays required[] and iidArray[] for SEEK interface
1989309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi          (PlayItf is implicit) */
1999309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
2009309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    iidArray[0] = SL_IID_BUFFERQUEUE;
2019309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2029309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Create the music player */
2039309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player,
2049309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            &audioSource, &audioSink, 1, iidArray, required); CheckErr(res);
2059309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    fprintf(stdout, "bufferQueue example: after CreateAudioPlayer\n");
2069309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2079309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Realizing the player in synchronous mode. */
2089309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*player)->Realize(player, SL_BOOLEAN_FALSE); CheckErr(res);
2099309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    fprintf(stdout, "bufferQueue example: after Realize\n");
2109309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2119309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Get seek and play interfaces */
2129309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
2139309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2149309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    fprintf(stdout, "bufferQueue example: after GetInterface(PLAY)\n");
2159309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2169309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*player)->GetInterface(player, SL_IID_BUFFERQUEUE,
2179309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            (void*)&bufferQueueItf); CheckErr(res);
2189309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2199309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Setup to receive buffer queue event callbacks */
2209309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*bufferQueueItf)->RegisterCallback(bufferQueueItf,
221276cab2d983b892d1b634474b6249f6bec400c76Glenn Kasten            BufferQueueCallback, &cntxt); CheckErr(res);
2229309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
223c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten#if 0
2249309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Before we start set volume to -3dB (-300mB) */
2259309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*volumeItf)->SetVolumeLevel(volumeItf, -300); CheckErr(res);
226c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten#endif
2279309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2289309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Enqueue a few buffers to get the ball rolling */
2299309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
2309309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
2319309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2329309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
2339309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2349309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
2359309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
2369309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2379309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
2389309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2399309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*bufferQueueItf)->Enqueue(bufferQueueItf, cntxt.pData,
2409309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi            2 * AUDIO_DATA_BUFFER_SIZE); /* Size given in bytes. */
2419309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2429309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    cntxt.pData += AUDIO_DATA_BUFFER_SIZE;
2439309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2449309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Play the PCM samples using a buffer queue */
2459309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    fprintf(stdout, "bufferQueue example: starting to play\n");
2469309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
2479309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2489309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2499309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Wait until the PCM data is done playing, the buffer queue callback
2509309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi           will continue to queue buffers until the entire PCM data has been
2519309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi           played. This is indicated by waiting for the count member of the
2529309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi           SLBufferQueueState to go to zero.
2539309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi     */
2549309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*bufferQueueItf)->GetState(bufferQueueItf, &state);
2559309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2569309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    // while (state.playIndex < 100) {
2584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten    while (state.count) {
2599309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        usleep(10000);
2609309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi        (*bufferQueueItf)->GetState(bufferQueueItf, &state);
2619309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    }
2629309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2639309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Make sure player is stopped */
2649309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
2659309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    CheckErr(res);
2669309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Destroy the player */
2679309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    (*player)->Destroy(player);
2689309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2699309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    /* Destroy Output Mix object */
2709309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi    (*OutputMix)->Destroy(OutputMix);
2719309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi}
2729309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2739309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
2749309fe7834ab02adfacb2d6b4ac02852d3aa121dJean-Michel Trivi
275527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kastenint main(int argc, char* const argv[])
276527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten{
277527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    SLresult    res;
278527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    SLObjectItf sl;
279527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten
280527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    SLEngineOption EngineOption[] = {
281527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten            {(SLuint32) SL_ENGINEOPTION_THREADSAFE,
282527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten            (SLuint32) SL_BOOLEAN_TRUE}};
283527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten
284527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
285527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    CheckErr(res);
286527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    /* Realizing the SL Engine in synchronous mode. */
287527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); CheckErr(res);
288527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten
289527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    /* Run the test */
290527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    TestPlaySawtoothBufferQueue(sl);
291527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten
292527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    /* Shutdown OpenSL ES */
293527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten    (*sl)->Destroy(sl);
294527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten
295c2303eb5497c488db786dcb2b8514db229452536Glenn Kasten    return EXIT_SUCCESS;
296527b7d2e606abdbde0e29fe75f7e9a67285629d2Glenn Kasten}
297