asio_source

今日はasio_sourceの実装に取り掛かりました。
asio_sourceを追加すると、昨日の再生/停止問題がさらに複雑になります。
次のような場合を考えます。

// SourceとSinkを1個ずつ作成
asio.create_buffers(1, 1);

// キャプチャしたデータをすぐに再生
io_ex::background_copy bg_copy(
    asio.get_source(0),
    asio.get_sink(0),
    64*4
);

// キー待ち
std::cin.ignore(256, '\n');

background_copyが行うことは、Sourceからバッファサイズだけread()し、Sinkに書き出すことですから、まずasio_sourceからのread()が発生します。
昨日の実装だと、全てのsinkにデータを書き出すまでASIOは開始されない仕様のため、read()がブロックしてしまいます。
今回は、Sourceの数が0以外の場合は、バッファ作成直後に全てのSinkを無音で埋めて、ASIOを開始するようにしました。
Sourceを作らない場合もこの戦略で問題ないかもしれません。このあたりはもう少し弄ってみて使いやすい方式にしたいと思います。

肝心のキャプチャ自体はまだ上手くいっていません、、、。

#うっ、またコントロールパネルの設定間違いでした。難なく動きました、、、。
今日の成果物