2012-07-04 57 views
3

我将amrnb解码为PCM,然后将右侧pcm缓冲区放入Enqueue缓冲区(我确信PCM数据是正确的),但听不到任何声音。和喂养缓冲区时,日志输出:OpenSL ES无法在Android模拟器上播放音频

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

我的代码如下,我的问题是:

  1. 有什么不对,当我使用OpenSL ES?
  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界面。

相关问题