2012-07-04 5 views
3

amrnb를 PCM으로 디코딩 한 다음 올바른 pcm 버퍼를 대기열 버퍼에 넣겠습니다 (PCM 데이터가 맞음). 소리는 들리지 않습니다. 버퍼를 먹이 때, 출력을 로그 :OpenSL ES가 Android 에뮬레이터에서 오디오를 재생할 수 없습니다.

/AudioTrack(14857): obtainBuffer timed out (is the CPU pegged?) 

내 코드는 다음과 같습니다, 내 질문은 : 나는 OpenSL ES를 사용할 때 뭔가 잘못

  1. 있습니까?
  2. OpenSL ES가 실제 장치에서만 작동한다는 것은 사실입니까?

샘플 코드 :

void AudioTest() 
{  

    StartAudioPlay(); 

    while(1) 
    { 
      //decode AMR to PCM 

     /* Convert to little endian and write to wav */ 

      //write buffer to buffer queue  
     AudioBufferWrite(littleendian, 320); 

    } 
} 

void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context) 
{ 

//do nothing 

} 

void AudioBufferWrite(const void* buffer, int size) 
{ 

    (*gBQBufferQueue)->Enqueue(gBQBufferQueue, buffer, size); 

} 

// create buffer queue audio player 
void SlesCreateBQPlayer(/*AudioCallBackSL funCallback, void *soundMix,*/ int rate, int nChannel, int bitsPerSample) 
{ 

    SLresult result; 

    // configure audio source 
    SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; 

    SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_8, 
     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, gOutputMixObject}; 
    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 = (*gEngineEngine)->CreateAudioPlayer(gEngineEngine, &gBQObject, &audioSrc, &audioSnk, 
      3, ids, req); 

    // realize the player 
    result = (*gBQObject)->Realize(gBQObject, SL_BOOLEAN_FALSE); 

    // get the play interface 
    result = (*gBQObject)->GetInterface(gBQObject, SL_IID_PLAY, &gBQPlay); 

    // get the buffer queue interface 
    result = (*gBQObject)->GetInterface(gBQObject, SL_IID_BUFFERQUEUE, 
      &gBQBufferQueue); 

    // register callback on the buffer queue 
    result = (*gBQBufferQueue)->RegisterCallback(gBQBufferQueue, bqPlayerCallback, NULL/*soundMix*/); 

    // get the effect send interface 
    result = (*gBQObject)->GetInterface(gBQObject, SL_IID_EFFECTSEND, 
      &gBQEffectSend); 

    // set the player's state to playing 
    result = (*gBQPlay)->SetPlayState(gBQPlay, SL_PLAYSTATE_PLAYING); 
} 

답변

0

나는 완전히 확실하지 않다,하지만 난 당신이 에뮬레이터의 OpenSL ES 지원이 실제로 작동하지 않는다는 점에서 올바른 것 같아요. 나는 그것을 시도한 어떤 장치에서나 작동하는 동안 실제로 작동하지 않았다.

내 응용 프로그램에서는 Android 2.2도 지원해야하므로 JNI를 사용하여 Java AudioTrack API에 액세스 할 수 있습니다. 에뮬레이터가 감지되었을 때 항상 AudioTrack 인터페이스를 사용하기 위해 앱에 특별한 경우를 추가했습니다.