std::char_traits?
sine_wave_sourceのアダプタを考えると、ストリームの文字型がcharなのは不便です。
計算はfloatやdoubleでやって、最後に量子化したほうが処理の無駄も少なく、簡潔に記述できるはずです。
(事実、内部的にはOgg Vorbisはfloatストリームです。他の音声圧縮もほとんど同じだと思います。)
そこでfloatを文字型とするストリームを作成するため、std::char_traits<float>を考えてみました。
実際には、基本型であるfloatではchar_traitsを特殊化することができないので、strong typedefしたfloat_typeを用います。
int_typeはoptional<float_type>にしてあります。
#include <boost/optional.hpp> #include <boost/strong_typedef.hpp> #include <string> namespace hamigaki { namespace audio { BOOST_STRONG_TYPEDEF(float, float_type); } } // End namespaces audio, iostreams. namespace std { template<> struct char_traits<hamigaki::audio::float_type> { typedef hamigaki::audio::float_type char_type; typedef boost::optional<char_type> int_type; typedef streamoff off_type; typedef streampos pos_type; typedef mbstate_t state_type; static void assign(char_type& c1, const char_type& c2) { c1 = c2; } // 以下略 }; } // namespace std
とりあえず、これでsine_wave_sourceを実装し直して、いろいろ試してみます。