Пример #1
0
int OpenSLPlayer::createSource()
{
    map<int, ContextInfo>::iterator itr = contextInfos.find(contextIndex);
    if( itr == contextInfos.end() )
    {
        g2cerror(
            "Attempt to create source from context that doesn't exist."
            " index=%d\n", contextIndex);
        exit(0);
    }

    ContextInfo& contextInfo(itr->second);

    SourceInfo* sourceInfo = new SourceInfo;

    SLresult result;

    // configure audio source
    SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
    SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_44_1,
        SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
        SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN};
    SLDataSource audioSrc = {&loc_bufq, &format_pcm};

    // configure audio sink
    SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, contextInfo.outputMixObject};
    SLDataSink audioSnk = {&loc_outmix, NULL};

    // create audio player
    const SLInterfaceID ids[3] = {SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND, SL_IID_VOLUME};
    const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};

    result = (*contextInfo.engine)->CreateAudioPlayer(
        contextInfo.engine, &(sourceInfo->bqPlayerObject),
        &audioSrc, &audioSnk, 3, ids, req);

    if( SL_RESULT_SUCCESS != result )
    {
        g2cerror("OpenSL Failed to initialize OpenSL audio player.\n");
        exit(0);
    }

    int index = 1;
    while( sourceInfos.find(index) != sourceInfos.end() )
        index++;

    sourceInfos[index] = sourceInfo;
    sourceInfo->realize();

    return index;
}