2017-02-21 69 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)) 

這是簡單的檢查,以查看是否創建了緩衝區,而不是如果所有的數據都被加載。這意味着當執行檢查時,我試圖對沒有數據的緩衝區進行排隊。

爲了解決這個問題,我添加了一個額外的檢查,看看是否加載了有關緩衝區的數據(我寫入我自己的自定義音頻數據類的函數)。