任意位置ストリーム→位置復元可能ストリーム

結局、位置復元可能ストリームを採用することにしました。
変更点は次の通り。

  • vorbis_fileのread()、seek()の単位がサンプルサイズの倍数に強制される。違反した場合は例外が発生。
  • pcm_sinkのwrite()の単位がサンプルサイズの倍数に強制される。違反した場合は例外が発生。

今のところ問題なく動いています。

今日の成果物

現在はシーク周りを調整中。例えば某ゲームのoggをループ再生するため、

hamigaki::audio::vorbis_file<io::file> vf(...);
hamigaki::audio::pcm_sink pcm(...);

hamigaki::iostreams::copy_manager manager;
manager.copy(
    hamigaki::iostreams::concatenate(
        io::restrict(vf, 0, offset+len),
        hamigaki::iostreams::loop(io::restrict(vf, offset, len))
    ),
    pcm
);

みたいなことを考えているんですが、これだとrestrictによるシークがcopy開始前に行われてうまくいきません。(評価順も不定)
うむむ。concatenate(2つのソースを連結する)はせっかく作ったけど、今回は役に立たなそう。