続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で実装できないか思案中です。