我目前在使用OpenAL时遇到了一些问题。我开始流式传输声音,然后调用一个函数,如果初始播放调用没有加载,它将尝试排队剩余的声音。在最初播放大声音时,它不会更新源上的数据。
以下是用于尝试填充通道缓冲区的源:
private void EnsureBufferFilled(Int32 sourceId, List<Int32> bufferIds)
{
if(!_Registered || bufferIds.Count == 0) return;
Task t = new Task(() =>
{
List<Int32> loadedIds = new List<Int32>();
foreach (Int32 bufferId in bufferIds)
{
if (AL.IsBuffer(bufferId))
{
AL.SourceQueueBuffer(sourceId, bufferId);
loadedIds.Add(bufferId);
}
else break;
}
bufferIds.RemoveRange(0, loadedIds.Count);
if (bufferIds.Count != 0)
{
EnsureBufferFilled(sourceId, bufferIds);
}
});
t.Start();
}
非常感谢任何帮助。
由于
答案 0 :(得分:0)
我发现这个问题出现在以下逻辑中:
if (AL.IsBuffer(bufferId))
这只是检查缓冲区是否已创建,而不是所有数据都已加载。这意味着当执行检查时,我试图在没有数据的情况下对缓冲区进行排队。
为了解决这个问题,我添加了一个额外的检查,看看是否加载了与缓冲区相关的数据(我写入自己的自定义音频数据类的函数)。