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