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を混ぜて使う場合に都合が良いからです。