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

pcm_source

pcm_sinkとの対称性のため、PCM録音用デバイスpcm_sourceを作りました。 pcm_sourceはサイズが無限のSourceなので、そのままboost::iostreams::copy()で扱うことはできません。

OutputIteratorの要件

OutputIteratorを書いていると、要件が曖昧で不安になってきました。 Library Active Issuesを確認したところ、それを指摘した報告が見つかりました。 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#485SGIの定義ではより明確になっています…

アルゴリズムの出力要素を数える

counting_iteratorで思い出した小ネタ。 unique_copy()の出力の要素数を知りたい場合(出力自体には興味がない)、どうするか。 vectorにback_inserterで追加してsize()を調べるのは、明らかに無駄が多いです。 名前からしてcounting_iteratorでできそうな気が…

続line_iterator

line_iterator、Boost.Testの中にありました。Boost.Testにはユーティリティが多すぎです。 <boost/test/utils/iterator/ifstream_line_iterator.hpp> <boost/test/utils/iterator/istream_line_iterator.hpp> 実装は、昨日のコードとほぼ同じです。自分のがデリミタの指定を忘れていたぐらいですね。 しかも、Googleデスクトップ検索したら作業フォルダにifstream_line_it</boost/test/utils/iterator/istream_line_iterator.hpp></boost/test/utils/iterator/ifstream_line_iterator.hpp>…

line_iterator

今日は時間がなくて、こんなのしかできませんでした。 誰もが一度は作りそうなistream_iteratorのgetline版です。

富豪的ostream_iterator

id:yotto-k:20060424 さんのindexed_rangeじゃなくて、その出力結果について。 0.3, 0.7, 0.6, 0.2, 0.9, 0.2, 0.7, 0, 0.3, 0.4, 最後の", "が気になりませんか? yotto-kさんの例だとlambdaを使っていますが、ostream_iteratorでも結果は同じです。 この仕…

auto_link.hpp

Hamigaki.Audioにライブラリの自動選択(auto-link)を組み込み中です。 Boost内のライブラリであれば、 #define BOOST_LIB_NAME boost_my_library #include <boost/config/auto_link.hpp>のようにすれば、Boost標準名でライブラリをリンクしてくれます。(#pragma comment(lib, name)をサポ</boost/config/auto_link.hpp>…

sound_player

background_playerを使ったGUIのサンプルを追加しました。 フレームワークにはWin32 GUI Genericsを使用しています。実行ファイルが巨大になってしまうのが難点ですが、C++でRAII、例外安全なGUIライブラリはこれしか知りません。Direct3Dを弄るときもこれを…

background_player

background_playerとりあえず版ができました。 サウンドプレーヤっぽく、メソッド名も統一しています。 class background_player { public: // 生成のみ background_player(); // 生成と同時にopen template<typename Source, typename Sink> background_player(Source src, Sink sink, std::</typename>…

background_copyとseek

タイトルをbackground_copy::seekとしなかったのがミソです。結局background_copyにはseekを実装しないことにしました。 background_copyにはコピーしたバイト数を返すtell()メソッドがあるのですが、SourceもSinkもseek可能にすると、「コピーしたバイト数…

続々seek

今度こそ本題のbackground_copyの場合を考えます。 template<typename ExceptionStorage = hamigaki::thread::exception_storage> class basic_background_copy { public: template<typename Source, typename Sink> void copy(Source src, Sink sink); // 以下略 }; typedef basic_background_copy<> background_copy;background_copyはSink/So…</typename></typename>

続seek

今日も会社にお泊りの可能性大なので、朝更新。 似たインタフェースとして、basic_streambuf::seekoff()を調べてみました。 pos_type seekoff( off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out);実際にはbas…

seek

id:y-hamigaki:20060206 や id:y-hamigaki:20060209 辺りで書いていたbackground_copyのseek操作を考えています。 インタフェースはBoost.Iostreamsのseek()をモデルにするつもりですが、これがまた混沌としています。 namespace boost { namespace iostream…

Regressionツール

今日は仕事でお泊りなので、早めの更新。(全然日記じゃないですが) regressionツールもパッケージにいれてみました。 Boostと同じく、tools/regression/buildディレクトリで、bjam runを実行すればHamigakiライブラリ用に修正したprocess_jam_logとcompiler_…

続exposition only

id:y-hamigaki:20060402 でBoostBookは「exposition only」記法をサポートしていないと書きましたが、private継承に関してはサポートされていました。 boost::threadのドキュメントソースを見ると、 <class name="thread"> <inherit access="private"> <type><classname>boost::noncopyable</classname></type> <purpose>Exposition only</purpose> </inherit> </class>となって…

free-function-group

BoostBookには、クラスに関連するフリー関数用のタグとして、<free-function-group>が用意されています。ちょっと変な感じですが、<class>の子要素として使います。Boost.Arrayの場合だと、こんな感じです。 <class name="array"> <free-function-group name="specialized algorithms"> <function name="swap"> </function> </free-function-group> </class>この</class></free-function-group>

続boost::xtime

Threadで思い出した小ネタ。 id:y-hamigaki:20060208 でxtimeを操作する関数を紹介したのですが、実はそういう関数群は、libs/thread/src/timeconv.inlに書いてあります。なんでこれをヘッダで公開していないのかずっと疑問だったのですが、ちゃんとドキュメ…

続Enum系関数と富豪的プログラミング

C++

もう一度、Enum系関数の性質を考えてみましょう。 HRESULT WINAPI DirectSoundEnumerate( LPDSENUMCALLBACK lpDSEnumCallback, LPVOID lpContext );列挙はDirectSoundEnumerate内部で行われ、デバイスの数だけlpDSEnumCallbackがコールバックされます。呼び…

名前変更

http://thread.gmane.org/gmane.comp.lib.boost.devel/140535 を見て、loopをrepeatに、loop_sourceをrepetitionに変更しました。http://www.radiumsoftware.com/0603.html#060330 を見て、copy_managerをbackground_copyに戻しました。人に影響されすぎでし…

Enum系関数と富豪的プログラミング

C++

Boost.AsioのライバルらしいTR2提案を読んでいました。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1925.pdf その中で名前解決のインタフェースを見てみると、 // Container of addresses. typedef vector<stream_address> stream_address_list; typedef vec</stream_address>…

代替字句を避けるには

C++

id:uskz:20060411 さんのところの、hoge<::piyo>問題に関して、小ネタをひとつ。 三つ組表示(trigraph sequence)はともかく、代替字句(alternative tokens)に引っかかることは、ままあります。自分は秀丸エディタを愛用しているのですが、エディタの強調表示キーワー</::piyo>…

Linuxでも動きました

Hamigaki.AudioのPOSIX版実装をLinuxで動作確認しようと、VMwareにFedora Core 5をインストールしました。 インストール時に開発ツールを選択すると、Boostもインストールされていました。bjamは入っていなかったのでビルドしました。インストールされている…

無理やりiteratorにするとこうなります

試しにスレッドを使ってiteratorも作ってみました。

DirectX on MinGW/cygwin

MinGWとcygwinでdirect_sound_testに失敗していたので修正しました。 DLLのインポートライブラリはSDLサイトで配布されているものを使用しています。 http://www.libsdl.org/extras/win32/cygwin/directx-devel.tar.gz http://www.libsdl.org/extras/win32/c…

direct_sound_enumerate

id:mb2sync さんのアイデアで、direct_sound_enumerate()を実装してみました。 // ↓direct_sound.hppヘッダ内 namespace hamigaki { namespace audio { namespace direct_sound { struct device_info { std::string driver_guid; std::string description; s…

direct_sound_buffer

DirectSoundのSinkができました。動かなかった原因は、通知用イベントオブジェクトのインデックスを間違えていただけでした。 こんな感じになりました。 #include <hamigaki/audio/direct_sound.hpp> #include <hamigaki/audio/vorbis_file.hpp> #include <boost/iostreams/copy.hpp> namespace audio = hamigaki::audio; namespace ds = audio::direct_so</boost/iostreams/copy.hpp></hamigaki/audio/vorbis_file.hpp></hamigaki/audio/direct_sound.hpp>…

Enum系関数とiterator

iteratorの作り方を覚えると、列挙できるものは何でもiteratorにしたくなります。特に、Boost.Iteratorを使うとiteratorの作成が劇的に簡単になるため、なおさらです。しかし、DirectXで採用されているEnum系の関数(Enum〜、〜Enumerate)はiteratorモデルに…

direct_sound_buffer作成中

リンク元を見ていたら、id:yotto-k さんがDirectSoundに挑戦していたので、張り合ってDirectSoundのSinkを作成中です。 いつもの例を書き直すと、こんな感じになります。 // DirectSoundデバイス(Boost.Iostreamsのデバイスではない) audio::direct_sound_de…

続オートネゴシエーション

昨日の方針をさらに進めて、完全なオートネゴシエーションを考えていました。 namespace hamigaki { namespace audio { template<class Source, class Sink> std::streamsize copy(const Source& src, const Sink& sink) { sink.format(src.format()); return boost::iostreams::copy(s</class>…

続簡易バージョン

id:y-hamigaki:20060226 の続きです。 vorbis_file_source(旧称:vorbis_file)にformat()メンバを追加、pcm_sinkのバッファサイズはフォーマットから自動計算できるようにしました。 結果、oggファイルの再生はこうなりました。 #include <hamigaki/audio/pcm_device.hpp> #include <hamigaki/audio/vorbis_file.hpp> #include <boost/iostreams/copy.hpp></boost/iostreams/copy.hpp></hamigaki/audio/vorbis_file.hpp></hamigaki/audio/pcm_device.hpp>…