17e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten/*
27e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
37e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten *
47e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
57e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * you may not use this file except in compliance with the License.
67e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * You may obtain a copy of the License at
77e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten *
87e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
97e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten *
107e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * Unless required by applicable law or agreed to in writing, software
117e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
127e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * See the License for the specific language governing permissions and
147e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten * limitations under the License.
157e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten */
167e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
177e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten// Test various combinations of data sources and sinks
187e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
197e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten#include <assert.h>
207e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten#include <stdio.h>
217e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten#include <stdlib.h>
22a6c5e52ded343b557152156c33d33a10d29bf6f1Glenn Kasten#include <SLES/OpenSLES.h>
237e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
247e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kastenint main(int argc, char **argv)
257e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten{
267e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLresult result;
277e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLObjectItf engineObject;
287e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
297e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // create engine
307e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
317e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
327e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLEngineItf engineEngine;
337e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
347e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
357e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
367e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
377e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
387e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // configure a typical audio source of 44.1 kHz stereo 16-bit little endian
397e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLDataLocator_BufferQueue loc_bufq;
407e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    loc_bufq.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
417e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    loc_bufq.numBuffers = 1;
427e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLDataFormat_PCM format_pcm;
437e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.formatType = SL_DATAFORMAT_PCM;
447e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.numChannels = 2;
457e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
467e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.bitsPerSample = 16;
477e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.containerSize = 16;
487e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
497e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
507e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLDataSource audioSrc;
517e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    audioSrc.pLocator = &loc_bufq;
527e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    audioSrc.pFormat = &format_pcm;
537e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
547e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // configure audio sink
557e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLDataLocator_OutputMix loc_outmix;
567e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
577e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    loc_outmix.outputMix = NULL;
587e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLDataSink audioSnk;
597e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    audioSnk.pLocator = &loc_outmix;
607e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    audioSnk.pFormat = NULL;
617e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
627e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // create audio player using a NULL output mix
637e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLInterfaceID ids[1] = {SL_IID_BUFFERQUEUE};
647e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLboolean req[1] = {SL_BOOLEAN_TRUE};
657e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLObjectItf playerObject;
667e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
677e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
687e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
697e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
707e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
717e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // create audio player using an engine as the output mix
727e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    loc_outmix.outputMix = engineObject;
737e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
747e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
757e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
767e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
777e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
787e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // create output mix but don't realize it yet
797e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    SLObjectItf outputMixObject;
807e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
817e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
827e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
837e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // create audio player using the unrealized output mix
847e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    loc_outmix.outputMix = outputMixObject;
857e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
867e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
877e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
887e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
897e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
907e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // now realize the output mix
917e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
927e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
937e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
947e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // create audio player using the realized output mix
95914cb8c5a686d9316af46797fb7b55a115fe9b29Glenn Kasten    // and a bogus data format for the sink (ignored per spec)
96914cb8c5a686d9316af46797fb7b55a115fe9b29Glenn Kasten    audioSnk.pFormat = (void *) 0xDEADBEEF;
977e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
987e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
997e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
1007e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL != playerObject);
101914cb8c5a686d9316af46797fb7b55a115fe9b29Glenn Kasten    audioSnk.pFormat = NULL;
1027e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1037e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // destroy player
1047e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    (*playerObject)->Destroy(playerObject);
1057e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1067e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // now try to create audio player using various unusual parameters
1077e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1087e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // number of channels
1097e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.numChannels = 0;
1107e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1117e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1127e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1137e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1147e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.numChannels = 3;
1157e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1167e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1177e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1187e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1197e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.numChannels = 2;
1207e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1217e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // sample rate
1227e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.samplesPerSec = 0;
1237e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1247e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1257e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1267e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1277e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.samplesPerSec = 1000;
1287e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1297e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1307e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1317e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1327e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
1337e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1347e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // bits per sample
1357e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.bitsPerSample = 17;
1367e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1377e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1387e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1397e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1407e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.bitsPerSample = 24;
1417e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1427e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1437e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1447e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1457e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.bitsPerSample = 16;
1467e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1477e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // container size
1487e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.containerSize = 8;
1497e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1507e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1517e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1527e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1537e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.containerSize = 32;
1547e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1557e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1567e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1577e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1587e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.containerSize = 16;
1597e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1607e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // channel mask
1617e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.channelMask = 0;
1627e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1637e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1647e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
1657e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL != playerObject);
1667e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    (*playerObject)->Destroy(playerObject);
1677e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
1687e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1697e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1707e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1717e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1727e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT |
1737e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            SL_SPEAKER_FRONT_CENTER;
1747e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1757e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1767e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1777e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1787e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.numChannels = 1;
1797e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.channelMask = 0;
1807e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1817e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1827e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_SUCCESS == result);
1837e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL != playerObject);
1847e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    (*playerObject)->Destroy(playerObject);
1857e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
1867e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1877e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1887e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1897e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1907e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.numChannels = 2;
1917e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
1927e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // endianness
1937e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.endianness = SL_BYTEORDER_BIGENDIAN;
1947e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1957e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
1967e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten#ifdef ANDROID // known bug on SDL
1977e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1987e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
1997e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten#else
2007e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    if (SL_RESULT_CONTENT_UNSUPPORTED != result) {
2017e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten        printf("ERROR: expected SL_RESULT_CONTENT_UNSUPPORTED\n");
2027e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten        if (NULL != playerObject)
2037e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            (*playerObject)->Destroy(playerObject);
2047e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    }
2057e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten#endif
2067e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.endianness = 0;
2077e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
2087e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten            &audioSnk, 1, ids, req);
2097e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
2107e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    assert(NULL == playerObject);
2117e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
2127e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
2137e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // destroy output mix
2147e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    (*outputMixObject)->Destroy(outputMixObject);
2157e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
2167e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    // destroy engine
2177e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    (*engineObject)->Destroy(engineObject);
2187e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten
2197e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten    return EXIT_SUCCESS;
2207e34a3c054d9b81b68007a1e94b661d5e209b897Glenn Kasten}
221