不能播放pcm>使用AndroidSimpleBufferQueue 60kb

时间:2017-07-06 13:12:34

标签: android opensl

我初始化了一个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的缓冲区,但当缓冲区较大时,不会播放声音,或者有时只是一个神器。

1 个答案:

答案 0 :(得分:0)

来自规格:

  

排队的缓冲区已在适当位置使用,不是必需的   被设备复制,虽然这可能是   实现有关。应用程序开发人员应该知道   在排队后修改缓冲区的内容是   未定义并可能导致音频损坏

所以内存必须保持有效,直到声音完全播放。

阅读文档并了解意外的结构副本:)