複数ストリームの再生と停止

asio_sinkのstart()とstop()周りを修正しました。

今日の成果物

asio_sinkはチャンネル毎に別のストリームになるように設計しています。そして、個々のストリームはシングルスレッドで順に書き込んでも、マルチスレッドで並行して書き込んでも動くようになっています。
一方、ASIO側は全チャンネルのストリームを同時に再生します。このため、ASIOの再生と停止のタイミングに注意する必要があります。

再生の場合

再生を開始するタイミングは全てのチャンネルで再生の準備が出来たタイミングになります。ここでは、最初のバッファが埋まるとカウンタ(初期値=チャンネル数)を減らしていき、0になったときに開始させています。

停止の場合

各チャンネルは個別に停止できます。ですから全てのチャンネルを閉じるまでASIOを停止することは出来ません。各チャンネルのバッファはリングバッファなので、ASIO自体を停止するまで無音を再生し続ける必要があります。ここでもカウンタで停止のタイミングを調整します。
サンプルでは停止後にキー入力待ちをして、再生が止まったことを確認しています。(昨日までは、停止後はasio_deviceを閉じるまでノイズでした)