OpenAL:即使输入变量* look * OK,alBufferData也会返回AL_INVALID_VALUE?

问题描述 投票:4回答:2

所以,我正在构建一个线程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. 一个值得缓冲区大小的音频被解码,其余的则排队等待进一步解码。
  3. OpenAL被触发以开始播放声音。

解码/流循环

  1. 对于排队等待解码的每种声音,请解码bufferSize值的音频。
  2. 已解码的音频将使用适当的bufferID添加到alBuffer(请参见上面的调用)。
audio audio-streaming openal adpcm
2个回答
3
投票

如果还不算太晚,我将告诉您BufferData遇到的类似问题,这是我修复它的方法。虽然,请记住,我不知道您的线程程序的细节。

返回无效值有多种原因,我知道的原因是...-如果源已经分配了bufferID,则对新缓冲区(到流式源)进行排队(因为如果设置了缓冲区ID,则将其设置为静态)。如果是这样,请删除源属性中的ID。-在播放中更改缓冲区格式。一旦源开始播放,就不能更改缓冲区数据本身以外的任何缓冲区设置(fmt,samplerate),即使该源位于另一个队列中也是如此。

听起来您可能正在另一个线程中更改这些设置之一。

可能引起啪啪声的另一件事是重放声音。再次调用play只会使音源停止播放,然后倒回当前缓冲区并从头开始播放。像那样玩枪声听起来并不像您想要的(我认为是分层的)。 2个选项,将剩余的枪声混合到缓冲区中,然后重播它,但这可能不起作用。另一个简单的证明就是仅使用多个来源并旋转每次枪击时都会调用的来源。

祝您的项目好运。


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);

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

亲切的问候,莫里茨

© www.soinside.com 2019 - 2024. All rights reserved.