2013-09-30 3 views
1

Android NDK 및 OpenSL ES를 사용하여 기본 레코더 앱을 작성했습니다. 그것은 컴파일과 잘 연결하지만, 나는 다음과 같은 오류를 얻을 갤럭시 넥서스 장치에서 실행하려고하면OpenSL ES 레코더 개체의 인터페이스 SL_IID_ANDROIDSIMPLEBUFFERQUEUE 요청시 SL_RESULT_FEATURE_UNSUPPORTED가 반환됩니다.

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

는이 작업을 수행 :이 라인에서 발생

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

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

을 변경. plzz –

답변

2

, 당신은으로 "0"을 지정 :) 환영 것이 문제에 어떤 도움이의 마지막 세 번째 인수하는 지원되는 비 암시 적 인터페이스의 수입니다. 버퍼 큐는 레코더의 암시 적 인터페이스가 아닙니다.

시도는 getInterface 방법에 대한 몇 가지 적절한 문서를 제공하시기 바랍니다 수

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

감사합니다. 전체적인 문제였습니다. 원래 OpenSL ES 1.0.1 문서 기록 샘플에서이 행을 복사했습니다. 마침내 그 사소한 변화 후에 작동합니다. OpenSL을 배우는 것까지 이것을 요약하십시오. – MayaPosch

+0

@HerrLip getInterface 메소드에 대한 적절한 문서를 제공해 주실 수 있습니까? plzz –

+0

사양 및 기타 링크를 확인하십시오. http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf http://mobilepearls.com/labs/native-android-api/ndk/docs /opensles/index.html http://audioprograming.wordpress.com/ – HerrLip