10a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten/*
20a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
30a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten *
40a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
50a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * you may not use this file except in compliance with the License.
60a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * You may obtain a copy of the License at
70a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten *
80a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
90a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten *
100a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * Unless required by applicable law or agreed to in writing, software
110a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
120a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * See the License for the specific language governing permissions and
140a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten * limitations under the License.
150a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten */
160a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
170a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten// Test various combinations of data sources and sinks
180a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
190a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#include <assert.h>
200a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#include <stdio.h>
210a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#include <stdlib.h>
22c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <SLES/OpenSLES.h>
230a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
240a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kastenint main(int argc, char **argv)
250a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten{
260a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLresult result;
270a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLObjectItf engineObject;
280a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
290a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // create engine
300a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL);
310a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
320a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLEngineItf engineEngine;
330a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);
340a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
350a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);
360a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
370a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
380a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // configure a typical audio source of 44.1 kHz stereo 16-bit little endian
390a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLDataLocator_BufferQueue loc_bufq;
400a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    loc_bufq.locatorType = SL_DATALOCATOR_BUFFERQUEUE;
410a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    loc_bufq.numBuffers = 1;
420a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLDataFormat_PCM format_pcm;
430a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.formatType = SL_DATAFORMAT_PCM;
440a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.numChannels = 2;
450a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
460a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.bitsPerSample = 16;
470a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.containerSize = 16;
480a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
490a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
500a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLDataSource audioSrc;
510a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    audioSrc.pLocator = &loc_bufq;
520a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    audioSrc.pFormat = &format_pcm;
530a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
540a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // configure audio sink
550a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLDataLocator_OutputMix loc_outmix;
560a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    loc_outmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
570a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    loc_outmix.outputMix = NULL;
580a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLDataSink audioSnk;
590a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    audioSnk.pLocator = &loc_outmix;
600a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    audioSnk.pFormat = NULL;
610a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
620a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // create audio player using a NULL output mix
630a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLInterfaceID ids[1] = {SL_IID_BUFFERQUEUE};
640a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLboolean req[1] = {SL_BOOLEAN_TRUE};
650a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLObjectItf playerObject;
660a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
670a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
680a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
690a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
700a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
710a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // create audio player using an engine as the output mix
720a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    loc_outmix.outputMix = engineObject;
730a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
740a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
750a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
760a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
770a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
780a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // create output mix but don't realize it yet
790a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    SLObjectItf outputMixObject;
800a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL);
810a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
820a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
830a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // create audio player using the unrealized output mix
840a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    loc_outmix.outputMix = outputMixObject;
850a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
860a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
870a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PRECONDITIONS_VIOLATED == result);
880a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
890a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
900a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // now realize the output mix
910a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE);
920a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
930a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
940a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // create audio player using the realized output mix
95e670554ea199eef745740eaccc176ff283b0cd10Glenn Kasten    // and a bogus data format for the sink (ignored per spec)
96e670554ea199eef745740eaccc176ff283b0cd10Glenn Kasten    audioSnk.pFormat = (void *) 0xDEADBEEF;
970a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
980a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
990a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
1000a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL != playerObject);
101e670554ea199eef745740eaccc176ff283b0cd10Glenn Kasten    audioSnk.pFormat = NULL;
1020a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1030a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // destroy player
1040a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    (*playerObject)->Destroy(playerObject);
1050a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1060a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // now try to create audio player using various unusual parameters
1070a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1080a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // number of channels
1090a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.numChannels = 0;
1100a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1110a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1120a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1130a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1140a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.numChannels = 3;
1150a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1160a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1170a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1180a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1190a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.numChannels = 2;
1200a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1210a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // sample rate
1220a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.samplesPerSec = 0;
1230a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1240a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1250a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1260a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1270a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.samplesPerSec = 1000;
1280a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1290a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1300a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1310a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1320a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
1330a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1340a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // bits per sample
1350a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.bitsPerSample = 17;
1360a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1370a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1380a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1390a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1400a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.bitsPerSample = 24;
1410a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1420a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1430a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1440a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1450a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.bitsPerSample = 16;
1460a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1470a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // container size
1480a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.containerSize = 8;
1490a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1500a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1510a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1520a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1530a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.containerSize = 32;
1540a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1550a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1560a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1570a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1580a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.containerSize = 16;
1590a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1600a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // channel mask
1610a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.channelMask = 0;
1620a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1630a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1640a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
1650a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL != playerObject);
1660a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    (*playerObject)->Destroy(playerObject);
1670a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
1680a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1690a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1700a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1710a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1720a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT |
1730a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            SL_SPEAKER_FRONT_CENTER;
1740a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1750a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1760a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1770a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1780a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.numChannels = 1;
1790a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.channelMask = 0;
1800a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1810a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1820a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_SUCCESS == result);
1830a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL != playerObject);
1840a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    (*playerObject)->Destroy(playerObject);
1850a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
1860a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1870a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1880a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
1890a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1900a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.numChannels = 2;
1910a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
1920a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // endianness
1930a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.endianness = SL_BYTEORDER_BIGENDIAN;
1940a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
1950a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
1960a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#ifdef ANDROID // known bug on SDL
1970a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_CONTENT_UNSUPPORTED == result);
1980a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
1990a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#else
2000a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    if (SL_RESULT_CONTENT_UNSUPPORTED != result) {
2010a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten        printf("ERROR: expected SL_RESULT_CONTENT_UNSUPPORTED\n");
2020a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten        if (NULL != playerObject)
2030a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            (*playerObject)->Destroy(playerObject);
2040a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    }
2050a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten#endif
2060a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.endianness = 0;
2070a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    result = (*engineEngine)->CreateAudioPlayer(engineEngine, &playerObject, &audioSrc,
2080a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten            &audioSnk, 1, ids, req);
2090a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(SL_RESULT_PARAMETER_INVALID == result);
2100a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    assert(NULL == playerObject);
2110a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
2120a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
2130a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // destroy output mix
2140a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    (*outputMixObject)->Destroy(outputMixObject);
2150a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
2160a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    // destroy engine
2170a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    (*engineObject)->Destroy(engineObject);
2180a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten
2190a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten    return EXIT_SUCCESS;
2200a058cc3d720cdf3f0f8222472a862258482f34fGlenn Kasten}
221