2017-07-06 83 views
0

我初始化的AndroidSimpleBufferQueue如价值观:无法播放PCM> 60KB与AndroidSimpleBufferQueue

SLDataLocator_AndroidSimpleBufferQueue bufferLocator = { 
    SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; 
SLDataFormat_PCM pcmFormat = { 
    SL_DATAFORMAT_PCM,   1, 
    SL_SAMPLINGRATE_44_1,  SL_PCMSAMPLEFORMAT_FIXED_16, 
    SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER, 
    SL_BYTEORDER_LITTLEENDIAN}; 

SLDataSource   audioSource  = {&bufferLocator, &pcmFormat}; 
SLDataLocator_OutputMix locatorOutputMix = {SL_DATALOCATOR_OUTPUTMIX, 
              outputMixObj.getObject()}; 
SLDataSink audioSink = {&locatorOutputMix, nullptr}; 
[...] 

然后,当我需要播放声音我排队,如:

bufferQueue->Enqueue(bufferQueue, (uint8_t*)buffer.data(), 
      buffer.size()) 

它的工作原理以及对于小于60k的缓冲区,但是当缓冲区较大时没有声音被播放或有时只是一个神器。

回答

0

从规格:

进行排队代替被使用并且不要求 由设备被拷贝的缓冲剂,尽管这可能是 实现相关的。应用程序开发人员应该知道 ,修改已排队后,缓冲区的内容是 不确定的,并可能导致音频腐败

所以内存必须保持有效直到声音充分发挥。

阅读文档,并注意意外结构副本:)