任意位置ストリーム→位置復元可能ストリーム
結局、位置復元可能ストリームを採用することにしました。
変更点は次の通り。
- 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つのソースを連結する)はせっかく作ったけど、今回は役に立たなそう。