2006-02-01から1ヶ月間の記事一覧
Hamigaki.Iostreamsのユニットテストをcygwinで走らせようと思ったのですが、cygwinパッケージ版のBoostにはBoost.Testのライブラリが入っていないようです。たしか、Boost 1.33.0ではJamfileに問題があってビルドできなかったのが、1.33.1で直ったと思って…
Hamigaki.Iostreamsにユニットテストを追加中です。 テストでconcatenateとloopがDirectDeviceに対応していないことに気が付いたので修正しました。DirectDeviceはストリームの位置情報を持たないので、direct_adapterでラップする必要があるわけですが、高…
いろいろ問題の尽きないboost::iostreams::file_descriptorですが、コンストラクタに危険な罠が潜んでいます。 #include <boost/iostreams/device/file_descriptor.hpp> namespace io = boost::iostreams; int main() { io::file_descriptor file("hoge.txt"); // fileを使った処理 ... }この一見なんでも</boost/iostreams/device/file_descriptor.hpp>…
vorbis_fileとwave_sourceを、それぞれbasic_vorbis_fileとbasic_wave_sourceに変更しました。vorbis_fileとwave_sourceはSourceにfile_sourceを指定した簡易バージョンになっています。これでちょっぴりコードが短くなりました。 #include <hamigaki/audio/pcm_device.hpp> #include <hamigaki/audio/vorbis_file.hpp> #incl</hamigaki/audio/vorbis_file.hpp></hamigaki/audio/pcm_device.hpp>…
予定通りWAVEファイルの読み込みクラスを作成しました。(リニアPCMのみ対応) mmio系のマルチメディアI/O関数は使っていないので、UNIXでも動きます。 実際のところ、フォーマット情報を取得した後は単にread()するだけなので、boost::iostreams::restrictに…
Hamigaki.Audioのチュートリアルを考えていたのですが、どうにも分かりにくい。 #include <hamigaki/audio/pcm_device.hpp> #include <hamigaki/audio/vorbis_file.hpp> #include <boost/iostreams/device/file.hpp> #include <boost/iostreams/copy.hpp> namespace audio = hamigaki::audio; namespace io = boost::iostreams; const std::string filenam…</boost/iostreams/copy.hpp></boost/iostreams/device/file.hpp></hamigaki/audio/vorbis_file.hpp></hamigaki/audio/pcm_device.hpp>
昨日は「BoostBookの書式が間違っていた」としか書きませんでしたが、その舞台裏をご紹介。
BoostBookでPDF作成に挑戦していたんですが、今日ようやく動きました。 ちなみに、動かなかった理由はBoostBookの書式が間違っていただけでした。 今日の成果物 以下、設定メモ。
あ〜、「+」だけできるパターンがありました。 concatenateはSourceならなんでもOKですが、loopはInputSeekableでないと動きません。まぁ、実際に使ったらコンパイルエラーになるから問題ないんですけどね。HAMIGAKI_IOSTREAMS_CATABLEの中で判定すべきか、…
昨日の思いつきですが、ストリームを+で連結する文脈では、*で繰り返すといのも違和感はなさそうです。現在、ストリームを連結可能にするには、 #include <hamigaki/iostreams/concatenate.hpp> template<class T> class some_source { ... }; HAMIGAKI_IOSTREAMS_CATABLE(some_source, 1) // 1 はSourceの</class></hamigaki/iostreams/concatenate.hpp>…
スレッド内で捕捉されなかった例外をどう扱うのか、いろいろ調べてみました。 Boost.Thread 捨てられる C#、D、Java、Python 例外オブジェクトの文字列表現を出力する Ruby 親スレッドがjoin()で待っていれば、join()が子スレッドの例外を送出する 昨日のcop…
loop_sourceのドキュメントを書いていて、ループはSourceの(スカラとの)掛け算だと気が付きました。 using namespace io_ex::cat_operators; // シンタックス・シュガーを導入 using namespace io_ex::loop_operators; // シンタックス・シュガーを導入 mana…
C++でマルチスレッドのプログラムを書く場合、子スレッドで発生した例外を親スレッドにどう伝えるかが問題になります。C++には例外オブジェクトのディープコピーを行う統一したメカニズムはありませんから、単純に親スレッドへコピーすることはできません。
今、帰ったところです。かな〜り不満です。 声がテーマのはずなのに、低音で声量が上がると音が割れて耳が痛いし、アンコールの曲なんか黒魔道士のせいでオーケストラの演奏もコーラスもまるで聞こえませんでした。 まぁ、モーグリーズが面白かったのと、ア…
今日はコンサートのため早めに更新。 コンパイラの動作 C4819問題を考える前に、コンパイラ(プリプロセッサも含む)がどのように動いているのか考えて見ます。コンパイラは次の3つの文字セットを使用します。(説明はいい加減です) ソースファイルの物理的文…
明後日だと思っていたら、明日だった。あぶない、あぶない。 Boost Tシャツでも着ていけば目立つかもしれないけど、シャツ一枚じゃ寒いので却下。
VC8.0に移行してから、C4819警告が出まくって煩い。 C:\Boost\include\boost-1_33_1\boost/type_traits/is_base_and_derived.hpp : warnin g C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます 。データの損失を防ぐために、…
一時はお蔵入りかと思われたhamigaki::iostreams::concatenationですが、hamigaki::iostreams::lazy_restrictionのおかげで復活しました。 ただ、 manager.copy( io_ex::concatenate( io_ex::concatenate( io_ex::lazy_restrict(vf, 0, offset+len), io_ex::…
私はBoost.IostreamsをCVSに登録される前から愛用しています。当初、Boost.IostreamsはブロッキングI/Oしかサポートしていませんでした。writeのインタフェースも namespace boost { namespace io { template<typename T> void write( T& t, const typename char_type<T>::t</t></typename>…
今日はドキュメント書きしかしてないので、引き続きBoostBuildネタを。 BBv1を採用していたHamigakiライブラリですが、ドキュメントにBootBookを採用するにあたり、BBv2を混在させることになりました。Boostパッケージもv1/v2混在の状態なので、まずこれが何…
肝心の中身がまだまだですが、BoostBook形式のドキュメントをつけました。BBv2、BoostBookの情報は少ないので早めに公開してみます。BoostBookの設定に関しては、Cryoliteさんの投稿が参考になります。ここでは、BBv2に用意されている〜-config.jamをなるべ…
昨日の日記に書いた通り、boost::iostreams::restrict はオブジェクトの生成時にseekを行います。そのため、一つの式の中で同じデバイスに対してrestrictすることは未定義の動作を引き起こします。要は実際に読み書きするときにseekしてくれればよいのです。…
結局、位置復元可能ストリームを採用することにしました。 変更点は次の通り。 vorbis_fileのread()、seek()の単位がサンプルサイズの倍数に強制される。違反した場合は例外が発生。 pcm_sinkのwrite()の単位がサンプルサイズの倍数に強制される。違反した場…
C++標準のストリームの単位はcharまたはwchar_tです。それ以外の型のストリームも作成可能ですが、std::char_traitsの特殊化が必要になります。 一方、オーディオデータは通常、8ないし16ビットの整数の組を単位(サンプル)とします。例えば典型的な16ビット…
予定通り、background_copyをcopy_managerに変更。stop()した後で、resume()でコピーを再開できるようになりました。 SubversionだとCVSと違ってリネームができるのがよいですね。 copy_managerのソースが混沌としてきたので、シークを追加するときに少し整…
BorlandがIDE部門を売却するそうですね。 BorlandとはC++Builder1からのお付き合いで、最新版Borland Developer Studio 2006まで全て購入してきましたが、本当に残念です。 テクニカルプレビュー版だったBorland C++ Compiler 6.0が日の目を見る日はくるんで…
障害で、はてなダイアリーにつながらない人がいるみたいですね。 d.hatena.ne.jpをDNSで引くと、3つほど返ってきます。DNSラウンドロビンってやつですな。3つのうちのどれかが落ちているのでしょう。 通常、DNSのレコード情報はOSがキャッシュしているので…
う〜ん。昨日のCPU100%対策は不完全でした。 boost::sleep()の引数、boost::xtimeは次のような構造体です。 struct xtime { xtime_sec_t sec; xtime_nsec_t nsec; };使用する場合は、まずboost::xtime_get()で現在時刻を取得し、secとnsecを弄るわけですが、…
Win32 GUI Generics版の簡易oggプレーヤも完成。だけどパッケージングに問題があって、まだ入れてません。 IDEの生成するプロジェクトファイルやresource.h、Resource Splitterの生成する各種ヘッダファイルには、当然ながらライセンス情報が入っていない。 …
いつの間にかWindows版のhamigaki::audio::pcm_sinkでステレオ再生できなくなってました。(POSIX版は動く) 耳を傷める恐れがあるので、良い子の皆さんは、大きな音で再生しちゃいけませんよー。#バッファが小さすぎるのが原因だった。修正版 #↑リンク修正…