2017-02-21 67 views
0

我目前在OpenAL中遇到了一些问题。我开始流式传输一个声音,然后调用一个函数,该函数将尝试排列剩余的声音,如果它没有加载到初始播放调用中。在最初播放大声音时,它不会更新信号源上的数据。OpenAL Stream未更新

这里是用来尝试和填充通道缓冲器中的源:

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

加载并排队缓冲区后,您不必调用AL.SourcePlay? –

+0

对AL.SourcePlay的调用不在此函数之内,此函数试图将数据排队到播放频道 – Elliott

回答

0

我发现这个问题是在下面的逻辑:

if (AL.IsBuffer(bufferId)) 

这是简单的检查,以查看是否创建了缓冲区,而不是如果所有的数据都被加载。这意味着当执行检查时,我试图对没有数据的缓冲区进行排队。

为了解决这个问题,我添加了一个额外的检查,看看是否加载了有关缓冲区的数据(我写入我自己的自定义音频数据类的函数)。