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

cygwinでBoost.Test

Hamigaki.Iostreamsのユニットテストをcygwinで走らせようと思ったのですが、cygwinパッケージ版のBoostにはBoost.Testのライブラリが入っていないようです。たしか、Boost 1.33.0ではJamfileに問題があってビルドできなかったのが、1.33.1で直ったと思って…

DirectDevice

Hamigaki.Iostreamsにユニットテストを追加中です。 テストでconcatenateとloopがDirectDeviceに対応していないことに気が付いたので修正しました。DirectDeviceはストリームの位置情報を持たないので、direct_adapterでラップする必要があるわけですが、高…

file_descripterのコンストラクタ

いろいろ問題の尽きない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_source

予定通り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>

PDFが出来るまで

昨日は「BoostBookの書式が間違っていた」としか書きませんでしたが、その舞台裏をご紹介。

BoostBook with FOP

BoostBookでPDF作成に挑戦していたんですが、今日ようやく動きました。 ちなみに、動かなかった理由はBoostBookの書式が間違っていただけでした。 今日の成果物 以下、設定メモ。

続concatenateとloop

あ〜、「+」だけできるパターンがありました。 concatenateはSourceならなんでもOKですが、loopはInputSeekableでないと動きません。まぁ、実際に使ったらコンパイルエラーになるから問題ないんですけどね。HAMIGAKI_IOSTREAMS_CATABLEの中で判定すべきか、…

concatenateとloop

昨日の思いつきですが、ストリームを+で連結する文脈では、*で繰り返すといのも違和感はなさそうです。現在、ストリームを連結可能にするには、 #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++には例外オブジェクトのディープコピーを行う統一したメカニズムはありませんから、単純に親スレッドへコピーすることはできません。

FFコンサート行ってきましたが、、、

今、帰ったところです。かな〜り不満です。 声がテーマのはずなのに、低音で声量が上がると音が割れて耳が痛いし、アンコールの曲なんか黒魔道士のせいでオーケストラの演奏もコーラスもまるで聞こえませんでした。 まぁ、モーグリーズが面白かったのと、ア…

続C4819問題

C++

今日はコンサートのため早めに更新。 コンパイラの動作 C4819問題を考える前に、コンパイラ(プリプロセッサも含む)がどのように動いているのか考えて見ます。コンパイラは次の3つの文字セットを使用します。(説明はいい加減です) ソースファイルの物理的文…

FFコンサート行きます

明後日だと思っていたら、明日だった。あぶない、あぶない。 Boost Tシャツでも着ていけば目立つかもしれないけど、シャツ一枚じゃ寒いので却下。

ISO-8859-1と警告C4819

VC8.0に移行してから、C4819警告が出まくって煩い。 C:\Boost\include\boost-1_33_1\boost/type_traits/is_base_and_derived.hpp : warnin g C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます 。データの損失を防ぐために、…

concatenation

一時はお蔵入りかと思われた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::…

Non-Blocking

私は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>…

BBv1とBBv2

今日はドキュメント書きしかしてないので、引き続きBoostBuildネタを。 BBv1を採用していたHamigakiライブラリですが、ドキュメントにBootBookを採用するにあたり、BBv2を混在させることになりました。Boostパッケージもv1/v2混在の状態なので、まずこれが何…

BoostBook始めました

肝心の中身がまだまだですが、BoostBook形式のドキュメントをつけました。BBv2、BoostBookの情報は少ないので早めに公開してみます。BoostBookの設定に関しては、Cryoliteさんの投稿が参考になります。ここでは、BBv2に用意されている〜-config.jamをなるべ…

lazy_restrict

昨日の日記に書いた通り、boost::iostreams::restrict はオブジェクトの生成時にseekを行います。そのため、一つの式の中で同じデバイスに対してrestrictすることは未定義の動作を引き起こします。要は実際に読み書きするときにseekしてくれればよいのです。…

任意位置ストリーム→位置復元可能ストリーム

結局、位置復元可能ストリームを採用することにしました。 変更点は次の通り。 vorbis_fileのread()、seek()の単位がサンプルサイズの倍数に強制される。違反した場合は例外が発生。 pcm_sinkのwrite()の単位がサンプルサイズの倍数に強制される。違反した場…

charとwchar_t以外のストリーム

C++標準のストリームの単位はcharまたはwchar_tです。それ以外の型のストリームも作成可能ですが、std::char_traitsの特殊化が必要になります。 一方、オーディオデータは通常、8ないし16ビットの整数の組を単位(サンプル)とします。例えば典型的な16ビット…

copy_manger::resume()

予定通り、background_copyをcopy_managerに変更。stop()した後で、resume()でコピーを再開できるようになりました。 SubversionだとCVSと違ってリネームができるのがよいですね。 copy_managerのソースが混沌としてきたので、シークを追加するときに少し整…

さよならBorland

C++

BorlandがIDE部門を売却するそうですね。 BorlandとはC++Builder1からのお付き合いで、最新版Borland Developer Studio 2006まで全て購入してきましたが、本当に残念です。 テクニカルプレビュー版だったBorland C++ Compiler 6.0が日の目を見る日はくるんで…

障害で、はてなダイアリーにつながらない人がいるみたいですね。 d.hatena.ne.jpをDNSで引くと、3つほど返ってきます。DNSラウンドロビンってやつですな。3つのうちのどれかが落ちているのでしょう。 通常、DNSのレコード情報はOSがキャッシュしているので…

boost::xtime

う〜ん。昨日の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版は動く) 耳を傷める恐れがあるので、良い子の皆さんは、大きな音で再生しちゃいけませんよー。#バッファが小さすぎるのが原因だった。修正版 #↑リンク修正…