Filterの選定

basic_vorbis_fileのテスト用にエンコーダも必要になりました。
Zlib FiltersやBzip2 Filtersがsymmetric_filterを使って実装されているため、同じようにsymmetric_filterで試していました。
symmetric_filterには、

  • Source/Sinkの種類に依存しない。
  • filter()関数の定義だけで、DualUseFilterを実装できる。

といった利点もあるのですが、filter()関数の実装が複雑になりがちで、libvorbisとの相性も悪い感じです。問題点としては、

  • 状態遷移を自前で管理する必要がある。
  • 入出力の両方でバッファリングが必要になる。
  • libvorbisがエンコード結果をrealloc()で確保したバッファに出力する。symmetric_filter()を使う場合は、この結果をfilter()に渡されたバッファに分割してコピーすることになる。

が挙げられます。
InputFilterやOutputFilterなら、入力か出力の一方をブロック操作で行えるので、状態遷移とバッファリング手間が半分で済みます。
また、Vorbisエンコーディングは可変長方式なので、出力バッファのサイズをread()の引数で指定されたサイズと一致させることはできません。
今回は、OutputFilterモデルを採用するのがよさそうです。
うーん、結局Sinkのアダプタとして作っても大差ないのかなぁ。