2017-02-21 14 views
0

現在、OpenALでいくつかの問題が発生しています。私はサウンドをストリーミングして、最初の再生コールにロードされていない場合、サウンドの残りの部分をキューに入れようとする関数を呼び出します。大きなサウンドが最初に再生される瞬間に、ソース上のデータは更新されません。ここで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

バッファをロードしてキューに入れた後に、AL.SourcePlayを呼び出す必要はありませんか? –

+0

AL.SourcePlayの呼び出しはこの関数の外部にあり、この関数はデータを再生中のチャンネルにキューイングしようとしています – Elliott

答えて

0

私はこれで問題は、以下のロジックにあったが見つかりました:

if (AL.IsBuffer(bufferId)) 

これは、単純にすべてのデータがロードされていた場合、バッファが作成されていなかったかどうかを確認するためにチェックしていました。これは、チェックが実行されているときにデータなしでバッファをキューに入れようとしていることを意味していました。

これを修正するために、バッファに関連するデータがロードされたかどうかを確認するための追加チェックを追加しました(独自のカスタムオーディオデータクラスに書き込んだ関数)。