multiplexer

demultiplexerの反対の動きをするmultiplexerを作りました。
multiplexerは複数のストリームを1つにまとめます。
これを使って昨日の例をステレオにすると、次のようになります。

// 入力、出力ともに2つずつ
asio.create_buffers(2, 2);

// 32bit決め打ち
io_ex::multiplexer muxer(4);
muxer.push(asio.get_source(0));
muxer.push(asio.get_source(1));

// 同じく32bit決め打ち
io_ex::demultiplexer demuxer(4);
demuxer.push(asio.get_sink(0));
demuxer.push(asio.get_sink(1));

// バッファサイズも決め打ち
io_ex::background_copy bg_copy(muxer, demuxer, 2*64*4);

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

multiplexerの仕組みも単純で、各Sourceから順に1サンプルずつread()していくだけです。
少し困るのはmultiplexerの終端です。一般には任意長のSourceを設定できるため、個々のSourceの長さはバラバラになります。
一つのSourceが終端に達した場合に考えられる対処は、

  • 他のSourceが残っていても終わりにする
  • 全部終端に達するまでは0で埋める

がありますが、ここでは前者を採用することにします。
この方法なら、無限長と有限長のSourceを混ぜて使う場合に都合が良いからです。