Запрос интерфейса SL_IID_ANDROIDSIMPLEBUFFERQUEUE на объекте записывающего устройства OpenSL ES возвращает SL_RESULT_FEATURE_UNSUPPORTED

Я написал базовое приложение для записи, используя Android NDK и OpenSL ES. Он компилируется и связывается нормально, но когда я пытаюсь запустить его на устройстве Galaxy Nexus, я получаю следующую ошибку:

W/libOpenSLES(10708): Leaving Object::GetInterface (SL_RESULT_FEATURE_UNSUPPORTED)

Это происходит на линии:

res = (*recorderObj)->GetInterface(recorderObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &recorderBufferQueueItf);

Означает ли это, что запись с использованием OpenSL ES на устройстве Galaxy Nexus не поддерживается, или я просто ошибся? Ниже приведен соответствующий код:

    static SLObjectItf recorderObj;
    static SLEngineItf EngineItf;
    static SLRecordItf recordItf;
    static SLAndroidSimpleBufferQueueItf recorderBufferQueueItf;
    static SLDataSink recDest;
    static SLDataLocator_AndroidSimpleBufferQueue recBuffQueue;
    static SLDataFormat_PCM pcm;

    /* Setup the data source structure */
    locator_mic.locatorType = SL_DATALOCATOR_IODEVICE;
    locator_mic.deviceType = SL_IODEVICE_AUDIOINPUT;
    locator_mic.deviceID   = SL_DEFAULTDEVICEID_AUDIOINPUT;
    locator_mic.device = NULL;
    audioSource.pLocator = (void *) &locator_mic;
    audioSource.pFormat = NULL;

    /* Setup the data sink structure */
    recBuffQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;
    recBuffQueue.numBuffers = NB_BUFFERS_IN_QUEUE;

    /* set up the format of the data in the buffer queue */
    pcm.formatType = SL_DATAFORMAT_PCM;
    pcm.numChannels = 1;
    pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
    pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
    pcm.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;
    pcm.channelMask = SL_SPEAKER_FRONT_CENTER;
    pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;

    recDest.pLocator = (void *) &recBuffQueue;
    recDest.pFormat = (void * ) &pcm;

    /* Create audio recorder */
    res = (*EngineItf)->CreateAudioRecorder(EngineItf, &recorderObj, &audioSource, &recDest, 0, iidArray, required);
    CheckErr(res);

    /* Realizing the recorder in synchronous mode. */
    res = (*recorderObj)->Realize(recorderObj, SL_BOOLEAN_FALSE);
    CheckErr(res);

    /* Get the RECORD interface - it is an implicit interface */
    LOGI("GetInterface: Recorder");
    res = (*recorderObj)->GetInterface(recorderObj, SL_IID_RECORD, &recordItf);
    CheckErr(res);

    /* Get the buffer queue interface which was explicitly requested */
    LOGI("GetInterface: Buffer Queue");
    res = (*recorderObj)->GetInterface(recorderObj, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &recorderBufferQueueItf);
    CheckErr(res);

Любая помощь в этом вопросе приветствуется :)


person MayaPosch    schedule 30.09.2013    source источник
comment
не могли бы вы предоставить подходящую документацию для методов getInterface. пожалуйста   -  person Akshay Mukadam    schedule 02.09.2014


Ответы (1)


Когда вы создаете Audio Recorder, вы указываете «0» в качестве предпоследнего аргумента, который представляет собой количество поддерживаемых неявных интерфейсов. Буферная очередь не является неявным интерфейсом для записывающего устройства.

Попробуйте изменить

res = (*EngineItf)->CreateAudioRecorder(EngineItf, &recorderObj, &audioSource, &recDest, 0, iidArray, required);

to

res = (*EngineItf)->CreateAudioRecorder(EngineItf, &recorderObj, &audioSource, &recDest, 1, iidArray, required);
person HerrLip    schedule 30.09.2013
comment
Спасибо, очевидно, в этом вся проблема :) Я изначально скопировал эту строку из образца записи документации OpenSL ES 1.0.1. Наконец, после этого незначительного изменения он заработал. Отнесите это к тому, что вы все еще изучаете OpenSL. - person MayaPosch; 01.10.2013
comment
@HerrLip, не могли бы вы предоставить подходящую документацию для методов getInterface. пожалуйста - person Akshay Mukadam; 02.09.2014
comment
Проверьте спецификацию и другие ссылки: khronos.org/registry/sles/ specs / mobilepearls.com/labs/ native-android-api / ndk / docs / opensles / audioprograming.wordpress.com - person HerrLip; 21.09.2014