demultiplexer

asio_sinkの再構成中です。
これまで扱ってきたオーディオデバイスと違い、ASIOの入出力はチャンネル毎に別バッファとなっています。これはデータの加工を考慮すると便利なインタフェースですが、単に再生するだけでよい場合は不便です。
そこで、ASIOのマルチストリームの構造はそのまま実装し、分配アダプタを通して出力することにします。
このアダプタの実装は単純なので、例だけ書いておきます。

#include <hamigaki/iostreams/demultiplexer.hpp> // これ
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/copy.hpp>
#include <iostream>
#include <string>

namespace io_ex = hamigaki::iostreams;
namespace io = boost::iostreams;

int main()
{
    std::string a;
    std::string b;

    // 要素サイズ=2、変換バッファサイズ=16
    io_ex::demultiplexer demuxer(2, 16);
    // 分配先を設定
    demuxer.push(io::back_inserter(a));
    demuxer.push(io::back_inserter(b));

    char s[] = "aabbAABB";
    io::copy(io::array_source(s, 8), demuxer);

    std::cout << a << std::endl; // aaAA
    std::cout << b << std::endl; // bbBB
}

要素の型やサイズをテンプレートパラメータにしないのは、一般にオーディオフォーマットは実行時まで判明しないからです。
分配先も実行時に動的に追加します。分配先の数が入力に合っていないと出力がずれるので注意が必要です。