所以,我正在构建一个线程化的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射击短暂爆发...;)
快速简化的流式解码器模块之旅
如何播放声音:
解码/流媒体循环
答案 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);
我通过反复试验使它起作用,因此,如果遇到此错误,您可能还需要检查一下。
亲切的问候,莫里兹