wide_adaptor

まだフォーマットの指定に難がありますが、昨日の案でアダプタを作成してみました。

namespace audio = hamigaki::audio;
namespace io = boost::iostreams;

audio::vorbis_file_source vf("doremi.ogg");

const audio::vorbis_info& info = vf.info();
audio::pcm_format fmt;
fmt.type = audio::pcm_format::int_le16;
fmt.rate = info.rate;
fmt.channels = info.channels;

// wide_adaptor<float,pcm_sink>を作成して再生
io::copy(vf, audio::widen<float>(audio::pcm_sink(fmt)));

wide_adaptorの文字型はテンプレート引数で変更可能になっています。
より高い精度が必要な場合はdoubleを、浮動小数を使用したくない場合は適当な整数型(int32_t等)を使用できます。(まだ、実装はfloatのみ)

OggVorbisをdoubleストリームで扱う場合を考えると、float→doubleの変換も必要です。
変換コードの数が膨大になるので、

  • 各種バイト列とint32_tの変換
  • int32_tとfloatの変換
  • floatとdoubleの変換

を基本に組み立てることにします。