続asio_sink
ステレオ再生が出来ない原因が分かりました。問題はasio_sinkではなく、demultiplexerにありました。
demultiplexerを使わず、次のようにスレッドを使って再生するとうまくいきました。
asio.create_buffers(0, 2); // ド io_ex::background_copy copy0( io::restrict( audio::sine_wave_source(44100, 32, 261.6), 0, 4*44100 * 5 ), asio.get_sink(0) ); // ラ io::copy( io::restrict( audio::sine_wave_source(44100, 32, 440), 0, 4*44100 * 5 ), asio.get_sink(1) );
asio_sinkはASIOの提供するバッファとは別にリングバッファを持っています。このリングバッファが一杯の場合、write()メソッドはバッファに空きができるまでブロックします。
一方、demultiplexerのwrite()は設定されている個々のSinkに対し、順にwrite()を呼ぶだけです。この作りでは、1個のSinkでwrite()がブロックしている間、他のSinkへの書き込みは止まってしまいます。このため、左右のチャンネルの再生がずれてしまっているようです。
解決策は、上記のようにスレッドを使うか、ノンブロッキングI/Oを使うかです。write()の度にスレッドを起こすのは現実的ではないですし、そもそもdemultiplexerはスレッドを使わずにマルチストリームを扱う手段として考えたものなので、ノンブロッキングI/Oで実装できないか思案中です。