slesTestPlayStreamType.cpp revision 91bfd060b992810ca092f640f77f795bc3d008be
105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi/*
205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi *
405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * you may not use this file except in compliance with the License.
605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * You may obtain a copy of the License at
705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi *
805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi *
1005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
1105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
1205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * See the License for the specific language governing permissions and
1405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi * limitations under the License.
1505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi */
1605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
1791bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
1805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define LOG_NDEBUG 0
1905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define LOG_TAG "slesTest_playStreamType"
2005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
2105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <utils/Log.h>
2291bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#else
2391bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#define LOGV printf
2491bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
2505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <getopt.h>
2605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <stdlib.h>
2705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <stdio.h>
2805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <string.h>
2905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <unistd.h>
3005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#include <sys/time.h>
3105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
32ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES.h"
3391bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
34ee21d26b4b66d0f19b826685b3070497523994d5Glenn Kasten#include "SLES/OpenSLES_Android.h"
3591bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
3605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
3705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
3805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define MAX_NUMBER_INTERFACES 3
3905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define MAX_NUMBER_OUTPUT_DEVICES 6
4005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
4105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define TEST_MUTE 0
4205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define TEST_SOLO 1
4305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
4405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi//-----------------------------------------------------------------
4505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi/* Exits the application if an error is encountered */
4605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__)
4705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
4805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivivoid ExitOnErrorFunc( SLresult result , int line)
4905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi{
5005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    if (SL_RESULT_SUCCESS != result) {
5105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        fprintf(stdout, "%lu error code encountered at line %d, exiting\n", result, line);
5205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        exit(1);
5305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    }
5405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi}
5505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
5605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
5705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi//-----------------------------------------------------------------
5805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
5905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi/* Play an audio URIs, mute and solo channels  */
6005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivivoid TestPlayUri( SLObjectItf sl, const char* path, const SLuint32 type)
6105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi{
6205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLresult  result;
6305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLEngineItf EngineItf;
6405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
6505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Objects this application uses: one player and an ouput mix */
6605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLObjectItf  player, outputMix;
6705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
6805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Source of audio data to play */
6905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLDataSource      audioSource;
7005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLDataLocator_URI uri;
7105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLDataFormat_MIME mime;
7205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
7305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Data sinks for the audio player */
7405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLDataSink               audioSink;
7505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLDataLocator_OutputMix  locator_outputmix;
7605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
7705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Play, Volume and AndroidStreamType interfaces for the audio player */
7805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLPlayItf              playItf;
7905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLPrefetchStatusItf    prefetchItf;
8091bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
8105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLAndroidStreamTypeItf streamTypeItf;
8291bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
8305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
8405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLboolean required[MAX_NUMBER_INTERFACES];
8505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLInterfaceID iidArray[MAX_NUMBER_INTERFACES];
8605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
8705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Get the SL Engine Interface which is implicit */
8805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf);
8905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
9005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
9105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Initialize arrays required[] and iidArray[] */
9205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    for (int i=0 ; i < MAX_NUMBER_INTERFACES ; i++) {
9305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        required[i] = SL_BOOLEAN_FALSE;
9405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        iidArray[i] = SL_IID_NULL;
9505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    }
9605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
9705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* ------------------------------------------------------ */
9805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Configuration of the output mix  */
9905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
10005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Create Output Mix object to be used by the player */
10105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi     result = (*EngineItf)->CreateOutputMix(EngineItf, &outputMix, 1, iidArray, required);
10205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi     ExitOnError(result);
10305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
10405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Realize the Output Mix object in synchronous mode */
10505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*outputMix)->Realize(outputMix, SL_BOOLEAN_FALSE);
10605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
10705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
10805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Setup the data sink structure */
10905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX;
11005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    locator_outputmix.outputMix   = outputMix;
11105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    audioSink.pLocator            = (void*)&locator_outputmix;
11205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    audioSink.pFormat             = NULL;
11305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
11405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* ------------------------------------------------------ */
11505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Configuration of the player  */
11605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
11705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Set arrays required[] and iidArray[] for SLMuteSoloItf and SLPrefetchStatusItf interfaces */
11805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /*  (SLPlayItf is implicit) */
11905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    required[0] = SL_BOOLEAN_TRUE;
12005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    iidArray[0] = SL_IID_PREFETCHSTATUS;
12105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
12205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Setup the data source structure for the URI */
12305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    uri.locatorType = SL_DATALOCATOR_URI;
12405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    uri.URI         =  (SLchar*) path;
12505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    mime.formatType = SL_DATAFORMAT_MIME;
12605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /*     this is how ignored mime information is specified, according to OpenSL ES spec
12705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi     *     in 9.1.6 SLDataFormat_MIME and 8.23 SLMetadataTraversalItf GetChildInfo */
12805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    mime.mimeType      = (SLchar*)NULL;
12905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    mime.containerType = SL_CONTAINERTYPE_UNSPECIFIED;
13005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
13105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    audioSource.pFormat  = (void*)&mime;
13205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    audioSource.pLocator = (void*)&uri;
13305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
13405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Create the audio player */
13505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1,
13605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi            iidArray, required);
13705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
13805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
13905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Realize the player in synchronous mode. */
14005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*player)->Realize(player, SL_BOOLEAN_FALSE); ExitOnError(result);
14105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    fprintf(stdout, "URI example: after Realize\n");
14205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
14305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Get the SLPlayItf, SLPrefetchStatusItf and SLAndroidStreamTypeItf interfaces for the player*/
14405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf);
14505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
14605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
14705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_PREFETCHSTATUS, (void*)&prefetchItf);
14805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
14905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
15091bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
15105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*player)->GetInterface(player, SL_IID_ANDROIDSTREAMTYPE, (void*)&streamTypeItf);
15205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
15391bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
15405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
15505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    fprintf(stdout, "Player configured\n");
15605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
15705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* ------------------------------------------------------ */
15805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Test setting the Android audio stream type on the player */
15905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
16091bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
16105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*streamTypeItf)->SetStreamType(streamTypeItf, type);
16205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
16391bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
16405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
16505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* ------------------------------------------------------ */
16605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Playback and test */
16705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
16805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Start the data prefetching by setting the player to the paused state */
16905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PAUSED );
17005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
17105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
17205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Wait until there's data to play */
17305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLuint32 prefetchStatus = SL_PREFETCHSTATUS_UNDERFLOW;
17405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    while (prefetchStatus != SL_PREFETCHSTATUS_SUFFICIENTDATA) {
17505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        usleep(100 * 1000);
17605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        (*prefetchItf)->GetPrefetchStatus(prefetchItf, &prefetchStatus);
17705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        ExitOnError(result);
17805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    }
17905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
18005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Get duration */
18105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLmillisecond durationInMsec = SL_TIME_UNKNOWN;
18205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*playItf)->GetDuration(playItf, &durationInMsec);
18305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
18405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    if (durationInMsec == SL_TIME_UNKNOWN) {
18505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        durationInMsec = 5000;
18605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    }
18705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
18805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Start playback */
18905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*playItf)->SetPlayState( playItf, SL_PLAYSTATE_PLAYING );
19005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
19105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
192b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    usleep((durationInMsec/2) * 1000);
193b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi
19491bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
195b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    /* Get the stream type during playback  */
196b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    SLuint32 currentType = 0;
197b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    result = (*streamTypeItf)->GetStreamType(streamTypeItf, &currentType);
198b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    ExitOnError(result);
199b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    if (currentType != type) {
200b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi        fprintf(stderr, "ERROR: current stream type is %lu, should be %lu\n", currentType, type);
201b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    }
20291bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
203b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi
204b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    usleep((durationInMsec/2) * 1000);
20505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
20605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Make sure player is stopped */
20705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    fprintf(stdout, "Stopping playback\n");
20805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
20905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
21005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
21191bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#ifdef ANDROID
212b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    /* Try again to get the stream type, just in case it changed behind our back */
213b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    result = (*streamTypeItf)->GetStreamType(streamTypeItf, &currentType);
214b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    ExitOnError(result);
215b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    if (currentType != type) {
216b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi        fprintf(stderr, "ERROR: current stream type is %lu, should be %lu after stop.\n",
217b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi                currentType, type);
218b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi    }
21991bfd060b992810ca092f640f77f795bc3d008beGlenn Kasten#endif
220b98e6b7b1cc2a130a29904e52ae7a71e15332a49Jean-Michel Trivi
22105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Destroy the player */
22205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    (*player)->Destroy(player);
22305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
22405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Destroy Output Mix object */
22505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    (*outputMix)->Destroy(outputMix);
22605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi}
22705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
22805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi//-----------------------------------------------------------------
22905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Triviint main(int argc, char* const argv[])
23005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi{
23105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    LOGV("Starting %s\n", argv[0]);
23205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
23305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLresult    result;
23405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLObjectItf sl;
23505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
23605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    fprintf(stdout, "OpenSL ES test %s: exercises SLPlayItf, SLAndroidStreamTypeItf\n",
23705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi            argv[0]);
23805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    fprintf(stdout, "and AudioPlayer with SLDataLocator_URI source / OutputMix sink\n");
23905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    fprintf(stdout, "Plays a sound on the specified android stream type\n");
24005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
24105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    if (argc < 3) {
24205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        fprintf(stdout, "Usage: \t%s url stream_type\n", argv[0]);
24305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        fprintf(stdout, " where stream_type is one of the SL_ANDROID_STREAM_ constants.\n");
24405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        fprintf(stdout, "Example: \"%s /sdcard/my.mp3 3\" \n", argv[0]);
24505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi        exit(1);
24605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    }
24705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
24805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    SLEngineOption EngineOption[] = {
24905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi            {(SLuint32) SL_ENGINEOPTION_THREADSAFE, (SLuint32) SL_BOOLEAN_TRUE}
25005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    };
25105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
25205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL);
25305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
25405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
25505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Realizing the SL Engine in synchronous mode. */
25605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    result = (*sl)->Realize(sl, SL_BOOLEAN_FALSE);
25705ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    ExitOnError(result);
25805ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
25905ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    TestPlayUri(sl, argv[1], (SLuint32)atoi(argv[2]));
26005ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
26105ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    /* Shutdown OpenSL ES */
26205ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    (*sl)->Destroy(sl);
26305ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    exit(0);
26405ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi
26505ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi    return 0;
26605ccff2aaa3e1507cdc7ab3b244c973c6708e009Jean-Michel Trivi}
267