サウンドを生成する複数のスレッドと、サウンドをミキシングしてサウンドカードに送信する1つのスレッドを持つオーディオアプリケーションを作成しています。シグナルやスレッドセーフキューなど、スレッドを「正しい」方法で同期するいくつかの方法を試しましたが、すべて遅すぎました。そこで、各プロデューサーにブール値を使用して、キューがいっぱいかどうかを示します。非常にうまく機能しているようですが(32スレッドで5ミリ秒の遅延)、この方法で安全に実行できますか?
class PlayThreadParameters
{
public Queue<Samples> queue;
public bool isOutputQueueFull;
}
プロデューサーは次のようになります。
public void PolyPlayThread(object o)
{
var playThreadParameters = (PlayThreadParameters)o;
while (isPlaying)
{
while (playThreadParameters.isOutputQueueFull)
{
if (!isPlaying)
return;
Thread.Sleep(1);
}
... //fill output queue
playThreadParameters.isOutputQueueFull = true;
}
}
コンシューマーは次のようになります(Naudioによって別のスレッドから呼び出されます)。
public override int Read(byte[] array, int offset, int count)
{
for (int v = 0; v < playThreadParameters.Length; v++)
while (!playThreadParameters[v].isOutputQueueFull)
{
if (!isPlaying)
return 0;
Thread.Sleep(1);
}
... //mix the samples from the outputqueues
for (int v = 0; v < playThreadParameters.Length; v++)
playThreadParameters[v].isOutputQueueFull =false;
return count;
}