我在Mac OS X上使用OpenAL处理流式传输源时遇到了一些困难(使用系统框架)。我仍然不确定是什么触发它,但有时,在停止流式传输源并再次播放之后,排队缓冲区会增加AL_BUFFERS_PROCESSED
值。我使用像下面这样的while循环来处理源的缓冲区:
alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed);
while (processed--)
{
ALuint buffer;
// Get a free buffer.
alSourceUnqueueBuffers(source, 1, &buffer);
streamAtomic(buffer, decoder); // streamAtomic decodes compressed audio data and calls alBufferData.
alSourceQueueBuffers(source, 1, &buffer);
}
可以找到Source类的完整源代码here。
通常这个更新循环工作正常,但每当触发此错误时,调用alSourceQueueBuffers
似乎会增加AL_BUFFERS_PROCESSED
,这意味着每个更新周期,此循环需要更长更长时间,直到达到总数排队的缓冲区,句点(在这种情况下为32),它一直停留直到暂停或停止源,此时AL_BUFFERS_PROCESSED
重置 - 并立即再次开始增加。我检查过,调用alSourceUnqueueBuffers
后计数减少了1。只有在我打电话给alSourceQueueBuffers
后,计数才会再次增加。
我一直在研究我的代码,OpenAL规范,Stack Overflow,OpenAL邮件列表和Google,我找不到任何关于这种情况的文档,也没有任何迹象表明我是否正在做某事错误或者如果它是OpenAL实现中的错误。对于它的价值,在Windows和Linux上的OpenAL Soft下使用完全相同的代码,这个错误 not 发生。不过,我无法让我的Mac上的OpenAL Soft正常工作进行测试。
有什么想法吗?