OpenAL:alBufferData返回AL_INVALID_VALUE,即使输入变量*看起来好吗?

时间:2012-06-12 12:44:10

标签: audio audio-streaming openal adpcm

所以,我正在构建一个线程化的IMA ADPCM解码器,将音频数据流式传输到OpenAL (参见下面的简短说明)但是我遇到了一些麻烦。

我的一个问题是有时我对alBufferData的调用:

alBufferData(*bufferID, format, pcmData, sizeInBytes, bitRate);

返回AL_INVALID_VALUE,即使在检查它们看起来的参数时,例如,如下所示:

bufferID='109770616', format='AL_FORMAT_STEREO16', dataPtr='109754188', sizeInBytes='8164'

任何线索,任何人?当发生这种情况时,实际发出的声音就会变得严厉,并且错误通常会连续发生~10次(在相同的声音上)。它也经常发生在我反复开始相同的声音时(例如用LMG射击短暂爆发...;)

快速简化的流式解码器模块之旅

如何播放声音:

  1. 触发声音播放。
  2. 解码一个bufferSize值的音频,其余的排队等待进一步解码。
  3. 触发OpenAL开始播放声音。
  4. 解码/流媒体循环

    1. 对于排队等待解码的每个声音,解码bufferSize值的音频。
    2. 使用适当的bufferID将解码后的音频添加到alBuffer(请参阅上面的调用)。

2 个答案:

答案 0 :(得分:3)

如果还不晚,我会告诉你我在BufferData上遇到的类似问题,以及我如何修复它。虽然,请记住,我不知道您的线程程序的具体细节。

由于多种原因而返回无效值,我知道的是...
- 如果源已经分配了一个bufferID(因为如果你设置了缓冲区id,它被设置为静态),则会向新的缓冲区(到流式源)进行查询。如果是这样,请删除源属性中的ID - 中间播放缓冲格式。除了缓冲区数据本身一旦开始播放,您就无法更改任何缓冲区设置(fmt,samplerate),即使它位于另一个排队的位置。

听起来你可能正在改变另一个线程中的其中一个设置。

可能导致爆音的另一件事是重放声音。再次调用play只会停止源冷,然后重新启动当前缓冲区并从头开始播放。播放这样的枪声不会听起来像你想要的那样(我假设分层)。 2个选项,将剩余的枪声混合到缓冲区然后重放它,但这可能不起作用。另一个傻瓜证明只是使用多个来源并旋转每个枪支上的哪些来源。

祝你的项目好运。

答案 1 :(得分:0)

由于我偶然发现了相同的错误,并且此问题是搜索引擎中第一个出现的问题,因此我想快速发布我遇到的问题,希望它对其他人有用。 我将stb_vorbis(来自https://github.com/nothings/stb)与OpenAL一起使用,当我尝试将数据馈入OpenAL时,出现了相同的AL_INVALID_VALUE错误。 事实证明,缓冲区必须是4的倍数(至少在soft_al实现上以及AL_FORMAT_STEREO16(对于其他实现/格式可能有所不同))。

bufferSize = stb_vorbis_decode_filename("sound.ogg", &channels, &sampleFrequency, &pcmData);

// Adjust the bufferSize to a multiple of 4
bufferSize = bufferSize - bufferSize%4;

alBufferData(mySoundBuffer, AL_FORMAT_STEREO16, pcmData, bufferSize, sampleFrequency);

我通过反复试验使它起作用,因此,如果遇到此错误,您可能还需要检查一下。

亲切的问候,莫里兹

相关问题