2006-06-01から1ヶ月間の記事一覧

Exception lib proposal

Boost MLで例外ライブラリが提案されていました。 http://lists.boost.org/Archives/boost/2006/06/106965.php http://lists.boost.org/Archives/boost/2006/06/106607.php面白いのは情報の付加の仕方です。普通に考えると、基本となる新しい例外クラスを作…

boost::iostreams::select

結局、特殊化は使わず、文字型で実装を切り替える方式にしました。 今日の成果物 #include <boost/iostreams/detail/select.hpp> namespace detail { // 汎用実装 template<class CharT, class Device> class wide_adaptor_impl; // 整数型用実装 template<std::size_t Bits, class Device> class wide_adaptor_int; } // namespace detail template</std::size_t></class></boost/iostreams/detail/select.hpp>

整数型での特殊化

id:y-hamigaki:20060626 で書いたように、int_leastN_tでテンプレートを特殊化する場合、環境によってはtypedef先の型が重複しているため特殊化できない場合があります。 なので、型ではなく、ビット数をテンプレート引数にとるようにしてみます。 template<std::size_t Bits, class Device> </std::size_t>…

MWCPPC

今日はエンディアンがらみでMac関連の情報を漁っていました。 Macの本体は持っていないのですが、CodeWarrior8.3 for Winを持っていて、これにMac用のシステムヘッダが含まれていることに気付きました。 ヘッダを眺めていたらコンパイルもしたくなったので、…

float_t

C++

wide_adaptor<boost::int_least32_t>を実装完了。 昨日の例がこう書けるようになりました。 audio::aiff_file_source file("doremi.aiff"); audio::pcm_format fmt = file.format(); if (fmt.type == audio::int8) fmt.type = audio::uint8; else fmt.type = audio::int_le16; // f</boost::int_least32_t>…

aiff_file_source

ビッグエンディアンの検証用にAIFFファイルのデバイスを作ってみました。 仕様は適当にググって見つけたページを参考にしました。 http://nagasm.suac.net/ASL/sound05/#aiff-1 数値がビッグエンディアンで格納されることを除けばフォーマット自体はWAVEファ…

wide_adaptor

wide_adaptor<float>とwide_adaptor<double>で一通りのフォーマットをサポートしました。 今日の成果物 マイナーなフォーマットは全然テストできていませんが、 audio::wave_file_source file("doremi.wav"); io::copy( audio::widen<double>(file), audio::widen<double>(audio::pcm_sink(f</double></double></double></float>…

続 decode_ieee754_float

C++

昨日の方針でとりあえず実装しました。 フォーマット毎にパラメータをtraitsにまとめました。 enum float_format { ieee754_single, ieee754_double }; template <float_format Format> struct float_traits; template <> struct float_traits<ieee754_single> { typedef boost::uint_fast32_t int</ieee754_single></float_format>…

decode_ieee754_float

C++

今日は、floatのエンコード/デコード処理のビッグエンディアン対応とdoubleへの拡張に関して考えていました。 なるべくコードの重複は避けたいので、decode_ieee754_floatを次のフェーズに分けると、 バイト列からエンディアンを考慮して符号なし整数にデコ…

浮動小数点形式WAVE

wave_file_source/wave_file_sinkをfloatとdoubleに対応させました。 この辺りの仕様をまとめた正式なドキュメントが見当たらないのですが、WAVEFORMATEX::wFormatTagをWAVE_FORMAT_IEEE_FLOATにしただけで、SoundPlayerLilithでは再生できました。 これでOg…

square_wave_source

今日はチュートリアルの書き直しとリファレンスの修正・加筆をしました。 今日の成果物ドキュメントだけだとつまらないので、前から作ろうと思っていた「矩形波を生成するSource」も追加しました。

usual arithmetic conversions

C++

今日はドキュメントの修正をしつつ、インタフェースの調整をしていました。 特に、チャンネル数やサンプリング周波数を表現する整数型がバラバラだったので、ある程度統一しました。 自分は、負の値を取らない整数には(0以上の保障ができる)unsignedやstd::s…

簡単な例のはずが、、、

floatストリームに合わせてドキュメントを修正中です。 チュートリアルの最初の例を修正したら、こうなってしまいました。 #include <hamigaki/audio/vorbis_file.hpp> #include <hamigaki/audio/pcm_device.hpp> #include <hamigaki/audio/wide_adaptor.hpp> #include <boost/iostreams/copy.hpp> namespace audio = hamigaki::audio; namespace io = boost::iostreams; int main(…</boost/iostreams/copy.hpp></hamigaki/audio/wide_adaptor.hpp></hamigaki/audio/pcm_device.hpp></hamigaki/audio/vorbis_file.hpp>

sample_format_of

いつものパターンですが、結局operations<T>によるカスタマイズは使いませんでした。 デバイスのカテゴリタグにsample_format_tagとpcm_format_tagを追加して、 sample_format_tagなら hamigaki::audio::sample_format_type sample_format() const;を、pcm_form</t>…

operations

フォーマット取得操作をBoost.Iostreamsのオペレーション関数(readやoptimal_buffer_size等)のように実装中です。 Boost.Iostreamsでは、デバイスTに関するオペレーションをカスタマイズしたい場合は、operations<T>を特殊化するようになっています。 operations<T></t></t>…

続 pcm_formatの分解

実際にpcm_formatのメンバを分割しようとして、いきなり詰まりました。 DirectSoundの場合、フォーマットの取得/設定はPCWAVEFORMATEX単位で行います。 チャネル数やサンプリングレートの取得はPCWAVEFORMATEXから必要なメンバのみ読み出せばよいのですが、…

pcm_formatの分解

floatストリーム対応版で、一通りのサンプルとテストコードが動くようになりました。 意味のなくなったクラスや関数の削除、インタフェースの改善など、細かい調整中をしているところです。 今、悩んでいるのは、pcm_format::typeをpcm_formatから切り離すか…

tiny_restrict

この日記でも何度か触れましたが、boost::iostreams::restrict()はデバイスの限定した区間へのアクセスを仮想のデバイスとして見せるためのViewです。 アクセスする区間は、現在位置からのオフセットと長さで指定します。 オフセット分の移動は、元になるデ…

amplify

floatストリーム化でようやく振幅の調整をsine_waveから分離できました。 audio::pcm_format fmt; fmt.type = audio::pcm_format::int_le16; fmt.rate = 44100; fmt.channels = 1; io::copy( io::restrict( audio::amplify(audio::sine_wave_source(fmt.rate…

続 pcm_formatの修正

ASIOのサンプルフォーマットには次のような種類があります。(リトルエンディアン整数のみ抜粋) ASIOSTInt16LSB 16ビット整数 ASIOSTInt24LSB 24ビット整数 ASIOSTInt32LSB 32ビット整数(下位8ビットは0固定) ASIOSTInt32LSB16 32ビット整数(上位16ビットは0…

Boost Installer

メインマシンは引越し運送中のため、古いノートで作業しています。 せっかくなので、Boostのセットアップに先日公開されたBoost Installerを使ってみました。 http://lists.boost.org/Archives/boost/2006/05/105004.phpインストーラはNSIS(Nullsoft Scripta…

続 条件変数

条件変数をwait()するスレッドがwhileループで何度も条件を判定しているのは不思議に思えるかもしれません。 wait()から復帰しても「条件」を満たしていないパターンとして、 自スレッドが期待している「条件」は満たしていないが、notify_one()/notify_all(…

母にNewマリオをさせてみる

引越しの手伝いで母が来ています。 既にテレビをリサイクルに出してしまったので、手持ち無沙汰な母(ゲームはほとんどやったことない)にDSのマリオをやらせてみました。 まずは、通常のマリオをやってもらいました。 予想通り、最初のクリボーで死亡。少し教…

フロッピーディスク

引越しの準備で作業が進みません。 邪魔なFDを片付けるために、今更ながら手持ちのFDを全てイメージファイルに変換しました。 テレビの下というヤバい環境に5年間も放置していたのですが、意外にもほとんど読み取れました。 中には1.2MBフォーマットのFDも…

条件変数

今日は地味な実装ばかりで書くことないので、id:Cryolite:20060606 さんのところの条件変数(condition variable)について書いておきます。

wide_adaptor

まだフォーマットの指定に難がありますが、昨日の案でアダプタを作成してみました。 namespace audio = hamigaki::audio; namespace io = boost::iostreams; audio::vorbis_file_source vf("doremi.ogg"); const audio::vorbis_info& info = vf.info(); audi…

pcm_formatの修正

float/double対応のため、pcm_formatを変更しました。 struct pcm_format { enum pcm_type { uint_8, int8, int_le16, int_be16, int_le24, int_be24, int_le32, int_be32, float_le32, float_be32, float_le64, float_be64, }; pcm_type type; unsigned rat…

続 floatストリームの設計

う〜ん、フォーマット変換にcodecvtを使うのはダメかも。 // 昨日の抜粋 float_pcm_sink sink(audio::pcm_sink(fmt, fmt.optimal_buffer_size())); std::locale loc(std::locale(), new audio::codecvt_s16_le); sink.imbue(loc);昨日の例では、pcm_sinkのフ…

audio::char_traits

規格(ISO/IEC 14882:2003 17.1.3)を確認したところ、ストリームの文字型はPOD型でなければいけないことが判明しました。 BOOST_STRONG_TYPEDEFを使うと、代入演算子をオーバーロードしてしてしまうため、POD型になりません。 PODにするために、 template<typename T> str</typename>…

Boost.Iostreamsにおけるchar_traitsの扱い

id:y-hamigaki:20060324 あたりのコードを元に修正していました。 使い勝手と効率の観点から、floatをstrong typedefしたくないので、文字型をfloatにできないか試してみました。 codecvtは問題ないのですが、char_traitsが引っかかります。 文字型CharTに対…