Oggのマルチストリーム その3

libogg、libvorbis、ogg123のソースを追った結果、

  • Oggのグループ化(同時多重化)はライブラリユーザーが手動で行うものらしい
  • eosページが壊れていると、以降のチェインされたストリームが全て無視される
  • シーク不能なデバイスを考慮すると、チェインされたストリームの切れ目を判定するのは難しい
  • ogg123はサンプルを読み出す毎にフォーマットが変わっていないか確認していて、変わっていたら再生デバイスをオープンし直している

といったことが分かりました。
ストリームの切れ目に関してですが、vorbisfile APIはライブラリユーザーへeosページの検出を報告してくれないので、試しにov_read()してみてbitstream引数が変化するかでbosページを検出することしかできません。
このため、論理ビットストリームの終端を検出するのに試し読み用のバッファが必要になります。
ストリームの切れ目以外では全く意味がないバッファを用意するのは、時間と空間両点でよろしくありません。
そもそも、パフォーマンスを落とし、インタフェースを複雑にしても、得られるのは途中でフォーマットの変わる変なOggが再生できるというだけなので、vorbis_file_sourceは単一ストリームか、同一フォーマットのチェイン化ストリームのみ対応の簡易実装ということにします。


XMLでループ情報を持たせる件も、やり方は分かったものの、

  • vorbisfile APIでは扱えないので、libvorbisを直接呼ぶ必要がある
  • vorbis_file_sourceのインタフェースでは別ストリームを扱えない
  • そもそもXMLのパースが面倒(別にXMLである必要はありませんが)

といった問題から、今回はあきらめることにしました。
マルチストリームはOgg Theoraを扱うときにでもまた考えることにします。


Vorbisコメントにメタデータを埋める行為も、Replay Gainというデファクトスタンダードがあるようで、仕方ないのかもしれません。
今回はFALCOMのループ仕様を採用することにします。