Audio OpenAL:alBufferData返回AL_无效值,即使输入变量*look*OK?

Audio OpenAL:alBufferData返回AL_无效值,即使输入变量*look*OK?,audio,audio-streaming,openal,adpcm,Audio,Audio Streaming,Openal,Adpcm,所以,我正在构建一个线程化的IMA ADPCM解码器,将音频数据流传输到OpenAL(见下面的简短描述),但我遇到了一些麻烦 我的问题之一是,有时我调用alBufferData时: alBufferData(*bufferID、格式、pcmData、大小字节、比特率) 返回AL_INVALID_值,即使在检查参数时,它们看起来像这样: bufferID='109770616',format='AL_format'u STEREO16',dataPtr='109754188',sizeInByte

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

我的问题之一是,有时我调用alBufferData时:

alBufferData(*bufferID、格式、pcmData、大小字节、比特率)

返回
AL_INVALID_值
,即使在检查参数时,它们看起来像这样:

bufferID='109770616',format='AL_format'u STEREO16',dataPtr='109754188',sizeInBytes='8164'

有什么线索吗?当这种情况发生时,实际播放的声音会有点口吃,错误通常会连续发生10次(在同一个声音上)。当我反复发出相同的声音时(例如,用LMG…;)拍摄短脉冲时,通常也会发生这种情况。)

快速简化的流媒体解码模块之旅

如何播放声音:

  • 触发声音播放
  • 一个缓冲大小的音频被解码,其余的等待进一步解码
  • OpenAL被触发,开始播放声音
  • 解码/流式循环

  • 对于排队等待解码的每个声音,解码缓冲区大小值的音频
  • 解码后的音频将被添加到具有适当bufferID的alBuffer(请参阅上面的调用)

  • 如果还不算太晚,我会告诉你BufferData遇到的类似问题,下面是我如何解决的。不过,请记住,我不知道线程程序的细节

    返回无效值的原因有很多,据我所知是…
    -如果源已经分配了bufferID(因为如果设置了buffer id,则会将其设置为静态),则将新缓冲区排队(到流媒体源)。如果是,请删除源属性中的ID。
    -在播放中更改缓冲区格式。一旦一个源开始播放,您不能更改任何缓冲区设置(fmt、samplerate),除非缓冲区数据本身,即使它在另一个排队的源上。

    听起来您可能正在另一个线程中更改其中一个设置

    另一个可能引起pops的原因是重放声音。再次调用play只会停止源冷,然后倒带当前缓冲区并从头开始播放。用这样的声音演奏枪声听起来并不是你想要的(我想是吧)。2个选项,将剩余的枪声混入缓冲区,然后重放,但这可能不起作用。另一个简单的方法是使用多个震源,并旋转每次开火时调用的震源


    祝你的项目好运。

    由于我遇到了同样的错误,而且这个问题是搜索引擎中出现的第一个问题,我想快速发布我遇到的问题,希望它对其他人有用。 我将stb_vorbis(from)与OpenAL一起使用,当我尝试将数据输入OpenAL时,我得到了相同的AL_无效值错误。 结果表明,缓冲区必须是4的倍数(至少在软硬件实现和al格式上是4的倍数)(对于其他实现/格式可能不同)

    我通过反复试验让它工作,所以如果你遇到这个错误,你可能也想检查一下


    您好,Moritz

    bufferID点指向的整数是否有有效的bufferID?它是用alGenBuffers创建的吗?bufferID值似乎与dataPtr值非常相似。所以更可能是指针。您是打印bufferID还是*bufferID?我对*bufferID更感兴趣。忽略上面的注释,我编辑它太慢了:Hiya@mārtiņš!bufferID的值是上面显示的值(
    '109770616'
    )。bufferID是这样生成和使用的:
    alGenBuffers
    ->
    alBufferData
    ->
    alSourceQueueBuffers
    。我不断地用
    AlgentSourceI(sID,Alu buffers\u processed,&processed buffers)检查处理过的缓冲区
    并重新使用处理过的bufferID,方法是使用
    alSourceUnqueueBuffers
    将其取消排队,然后再次使用
    alBufferData
    重新填充。啊,你说得对,我正在打印指针-我的错!我会在再次测试后给你回复。
    alBufferData:bufferID='8581768',format='Alu format\u STEREO16',dataPtr='111853112',sizeInBytes='8164',bitRate='44100'
    。错误消息:无效值非常好的回复,谢谢@extracrispy!虽然我还没有时间继续这个项目(但我会在一段时间内完成)你指出的理由听起来很有道理!一旦我回到这个项目上,我会进一步调查这个问题,并给出答复。在那之前,我不能直接投票给你的答案(需要15次代表…),我会将其标记为接受!
    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);