请求OpenSL ES记录器对象上的接口SL_IID_ANDROIDSIMPLEBUFFERQUEUE返回不支持的SL_结果_功能

请求OpenSL ES记录器对象上的接口SL_IID_ANDROIDSIMPLEBUFFERQUEUE返回不支持的SL_结果_功能,android,android-ndk,opensl,Android,Android Ndk,Opensl,我已经使用Android NDK和OpenSL ES编写了一个基本的记录器应用程序。它可以很好地编译和链接,但是当我尝试在Galaxy Nexus设备上运行它时,我会遇到以下错误: W/libOpenSLES(10708):保留对象::GetInterface(SL\u结果\u功能\u不受支持) 这发生在线路上: res=(*recorderObj)->GetInterface(recorderObj、SL_IID_ANDROIDSIMPLEBUFFERQUEUE和recorderBufferQ

我已经使用Android NDK和OpenSL ES编写了一个基本的记录器应用程序。它可以很好地编译和链接,但是当我尝试在Galaxy Nexus设备上运行它时,我会遇到以下错误:

W/libOpenSLES(10708):保留对象::GetInterface(SL\u结果\u功能\u不受支持)

这发生在线路上:

res=(*recorderObj)->GetInterface(recorderObj、SL_IID_ANDROIDSIMPLEBUFFERQUEUE和recorderBufferQueueItf)

这是否意味着不支持在Galaxy Nexus设备上使用OpenSL ES进行录制,或者我只是犯了一个错误?以下是相关代码:

    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);

非常欢迎对此问题提供任何帮助:)

创建录音机时,请指定“0”作为倒数第三个参数,这是要支持的非隐式接口的数量。缓冲区队列不是记录器的隐式接口

试着改变

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


谢谢,这就是问题的症结所在:)我最初是从OpenSL ES 1.0.1文档记录样本中复制这一行的。在这一微小的变化之后,它终于起作用了。这算是还在学习OpenSL。@HerrLip你能为getInterface方法提供一些合适的文档吗。请检查规范和其他链接:你能为getInterface方法提供一些合适的文档吗。plzz
res = (*EngineItf)->CreateAudioRecorder(EngineItf, &recorderObj, &audioSource, &recDest, 1, iidArray, required);