OpenAL Stream 不更新
OpenAL Stream not updating
我目前在使用 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();
}
如有任何帮助,我们将不胜感激。
谢谢
我发现问题在于以下逻辑:
if (AL.IsBuffer(bufferId))
这只是检查缓冲区是否已创建,而不是所有数据是否已加载。这意味着当执行检查时,我试图在没有数据的情况下对缓冲区进行排队。
为了解决这个问题,我添加了一个额外的检查来查看是否加载了与缓冲区相关的数据(我写入自己的自定义音频数据的函数 class)。
我目前在使用 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();
}
如有任何帮助,我们将不胜感激。
谢谢
我发现问题在于以下逻辑:
if (AL.IsBuffer(bufferId))
这只是检查缓冲区是否已创建,而不是所有数据是否已加载。这意味着当执行检查时,我试图在没有数据的情况下对缓冲区进行排队。
为了解决这个问题,我添加了一个额外的检查来查看是否加载了与缓冲区相关的数据(我写入自己的自定义音频数据的函数 class)。