intbufq.c revision 4b65ef9efdf5aba01bea89d8cdd64f500560a28d
14b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten/* 24b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 34b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * 44b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 54b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * you may not use this file except in compliance with the License. 64b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * You may obtain a copy of the License at 74b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * 84b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 94b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * 104b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * Unless required by applicable law or agreed to in writing, software 114b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 124b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * See the License for the specific language governing permissions and 144b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten * limitations under the License. 154b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten */ 164b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 174b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten/* interactive buffer queue test program */ 184b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 194b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#include <math.h> 204b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#include <stdio.h> 214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#include <stdlib.h> 224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#include "OpenSLES.h" 234b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 244b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define checkResult(r) do { if ((r) != SL_RESULT_SUCCESS) fprintf(stderr, "error %d at %s:%d\n", \ 254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten (int) r, __FILE__, __LINE__); } while (0) 264b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastentypedef struct { 284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten short left; 294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten short right; 304b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten} frame_t; 314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SINE_FRAMES (44100*5) 334b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenframe_t sine[SINE_FRAMES]; 344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SQUARE_FRAMES (44100*5) 364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenframe_t square[SQUARE_FRAMES]; 374b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 384b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#define SAWTOOTH_FRAMES (44100*5) 394b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenframe_t sawtooth[SAWTOOTH_FRAMES]; 404b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn KastenSLBufferQueueItf expectedCaller = NULL; 424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenvoid *expectedContext = NULL; 434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenstatic void callback(SLBufferQueueItf caller, void *context) 454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten{ 464b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('.'); 474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (caller != expectedCaller) 484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten printf("caller %p expected %p\r\n", caller, expectedCaller); 494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (context != expectedContext) 504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten printf("context %p expected %p\r\n", context, expectedContext); 514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fflush(stdout); 524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten} 534b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 544b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenint main(int argc, char **argv) 554b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten{ 564b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLresult result; 574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // create engine 594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLObjectItf engineObject; 604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); 614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 624b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); 634b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 644b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLEngineItf engineEngine; 654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); 664b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 674b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 684b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // create output mix 694b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLObjectItf outputmixObject; 704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*engineEngine)->CreateOutputMix(engineEngine, &outputmixObject, 0, NULL, NULL); 714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*outputmixObject)->Realize(outputmixObject, SL_BOOLEAN_FALSE); 734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 744b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 754b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // create audio player 764b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLDataSource audiosrc; 774b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLDataSink audiosnk; 784b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLDataFormat_PCM pcm; 794b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLDataLocator_OutputMix locator_outputmix; 804b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLDataLocator_BufferQueue locator_bufferqueue; 814b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten locator_bufferqueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE; 824b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten locator_bufferqueue.numBuffers = 255; 834b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; 844b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten locator_outputmix.outputMix = outputmixObject; 854b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.formatType = SL_DATAFORMAT_PCM; 864b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.numChannels = 2; 874b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.samplesPerSec = SL_SAMPLINGRATE_44_1; 884b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16; 894b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.containerSize = 16; 904b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; 914b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; 924b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten audiosrc.pLocator = &locator_bufferqueue; 934b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten audiosrc.pFormat = &pcm; 944b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten audiosnk.pLocator = &locator_outputmix; 954b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten audiosnk.pFormat = NULL; 964b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLObjectItf playerObject; 974b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLInterfaceID ids[1] = {SL_IID_BUFFERQUEUE}; 984b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLboolean flags[1] = {SL_BOOLEAN_TRUE}; 994b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audiosrc, &audiosnk, 1, ids, flags); 1004b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1014b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerObject)->Realize(playerObject, SL_BOOLEAN_FALSE); 1024b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1034b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLPlayItf playerPlay; 1044b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_PLAY, &playerPlay); 1054b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1064b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLBufferQueueItf playerBufferqueue; 1074b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerObject)->GetInterface(playerObject, SL_IID_BUFFERQUEUE, &playerBufferqueue); 1084b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1094b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLuint32 state; 1104b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten state = SL_PLAYSTATE_PLAYING; 1114b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerPlay)->SetPlayState(playerPlay, state); 1124b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1134b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 1144b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten unsigned i; 1154b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten float pi2 = 3.14*2; 1164b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten float hz = 441; 1174b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten float sr = 44100; 1184b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten for (i = 0; i < SINE_FRAMES; ++i) { 1194b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten sine[i].left = sin((float) (i / (sr / hz)) * pi2 ) * 32000.0; 1204b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten sine[i].right = sine[i].left; 1214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten for (i = 0; i < SQUARE_FRAMES; ++i) { 1234b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten square[i].left = (i % (unsigned) (sr / hz)) < 50 ? 32767 : -32768; 1244b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten square[i].right = square[i].left; 1254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1264b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten for (i = 0; i < SAWTOOTH_FRAMES; ++i) { 1274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten sawtooth[i].left = ((((int) (i % (unsigned) (sr / hz))) - 50) / 100.0) * 60000.0 - 30000.0; 1284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten sawtooth[i].right = sawtooth[i].left; 1294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1304b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 1314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten set_conio_terminal_mode(); 1324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten int in_count = 0; 1334b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten unsigned count = 0; 1344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten for (;;) { 1354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten usleep(10000); 1364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (kbhit()) { 1374b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten frame_t *buffer; 1384b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten unsigned size; 1394b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLBufferQueueState bufqstate; 1404b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten int ch = getch(); 1414b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten switch (ch) { 1424b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case '0' ... '9': 1434b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (in_count) { 1444b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten count = count * 10 + (ch - '0'); 1454b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } else { 1464b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten count = ch - '0'; 1474b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten in_count = 1; 1484b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1494b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten continue; 1504b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'i': 1514b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten buffer = sine; 1524b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten size = sizeof(sine); 1534b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten goto enqueue; 1544b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'q': 1554b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten buffer = square; 1564b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten size = sizeof(square); 1574b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten goto enqueue; 1584b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'r': 1594b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (in_count) { 1604b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten expectedCaller = playerBufferqueue; 1614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten expectedContext = (void *) count; 1624b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } else { 1634b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten expectedCaller = NULL; 1644b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten expectedContext = (void *) NULL; 1654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1664b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerBufferqueue)->RegisterCallback(playerBufferqueue, in_count ? 1674b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten callback : NULL, expectedContext); 1684b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1694b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 1704b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'a': 1714b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten buffer = sawtooth; 1724b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten size = sizeof(sawtooth); 1734b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastenenqueue: 1744b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten for (i = 0; i < (in_count ? count : 1); ++i) { 1754b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerBufferqueue)->Enqueue(playerBufferqueue, buffer, size); 1764b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1774b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 1784b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 1794b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'c': 1804b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerBufferqueue)->Clear(playerBufferqueue); 1814b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1824b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('\r'); 1834b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerBufferqueue)->GetState(playerBufferqueue, &bufqstate); 1844b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1854b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (bufqstate.count != 0) 1864b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten printf("\rcount=%u\r\n", (unsigned) bufqstate.count); 1874b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#if 0 1884b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('\r'); 1894b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('\n'); 1904b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 1914b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fflush(stdout); 1924b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 1934b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'g': 1944b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerBufferqueue)->GetState(playerBufferqueue, &bufqstate); 1954b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 1964b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten printf("\rplayIndex=%u\r\n", (unsigned) bufqstate.playIndex); 1974b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten printf("count=%u\r\n", (unsigned) bufqstate.count); 1984b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 1994b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'p': 2004b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten state = SL_PLAYSTATE_PAUSED; 2014b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten goto setplaystate; 2024b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 's': 2034b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten state = SL_PLAYSTATE_STOPPED; 2044b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten goto setplaystate; 2054b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'P': 2064b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten state = SL_PLAYSTATE_PLAYING; 2074b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kastensetplaystate: 2084b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerPlay)->SetPlayState(playerPlay, state); 2094b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 2104b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten SLuint32 newstate; 2114b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten result = (*playerPlay)->GetPlayState(playerPlay, &newstate); 2124b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 2134b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten if (newstate != state) 2144b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten printf("\rSetPlayState(%u) -> GetPlayState(%u)\r\n", (unsigned) state, 2154b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten (unsigned) newstate); 2164b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#if 0 2174b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('\r'); 2184b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('\n'); 2194b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fflush(stdout); 2204b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 2214b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten checkResult(result); 2224b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 2234b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten case 'x': 2244b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten exit(EXIT_SUCCESS); 2254b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 2264b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten default: 2274b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten putchar('?'); 2284b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten fflush(stdout); 2294b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten break; 2304b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 2314b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten in_count = 0; 2324b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 2334b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten } 2344b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 2354b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten} 236