2006-03-01から1ヶ月間の記事一覧
まだ実装が適当ですが、意外とすんなり出来てしまいました。 OutputFilterにしても大差はないのですが、とりあえずはSinkアダプタでの実装です。 #include <hamigaki/audio/vorbis_encoder.hpp> #include <hamigaki/audio/wave_file.hpp> #include <boost/iostreams/copy.hpp> namespace audio = hamigaki::audio; namespace io = boost::iostreams; int m</boost/iostreams/copy.hpp></hamigaki/audio/wave_file.hpp></hamigaki/audio/vorbis_encoder.hpp>…
basic_vorbis_fileのテスト用にエンコーダも必要になりました。 Zlib FiltersやBzip2 Filtersがsymmetric_filterを使って実装されているため、同じようにsymmetric_filterで試していました。 symmetric_filterには、 Source/Sinkの種類に依存しない。 filter…
祝Turkanis氏復帰。 一週間ぶりにソースをアップしました。細かい修正が主です。 これまでHamigaki.Audioのテストはひたすら「ド」を再生していましたが、これだとうまく鳴っているのか分かりにくいので、音程を変えながら演奏するように変更しました。 MML…
せっかくここまでfloatストリームについて調べてきましたが、MinGWでコンパイルすると、 code_converter.hpp:20:3: #error code conversion not supported on this platformとなってコンパイルできませんでした。そもそもテストコード簡略化が目的だったはず…
今回はstate_typeを使う必要がなさそうなので、state_typeをmbstate_tに戻しました。 codecvt<float_type,char,mbstate_t>の派生クラスとして、codecvt_u8とcodecvt_s16_leを作ることにします。</float_type,char,mbstate_t>
char_traitsとcodecvtの関係がよく分からなくなってきました。 これらは共にstate_typeという型を持ちます。規格によると、codecvtのstate_typeはエンコーディングの種類ごとに別々の型を用いるはずですが、ストリームは特定のchar_traitsを持っているのでst…
codecvtができたので、code_converterに組み込んでテストしてみました。 そのままではコンパイルが通らなかったので、code_converter.hppをコピーして修正することにしました。
floatストリームをcharストリームに書き出すためには量子化が必要です。これはIostreamsのコード変換に似ています。 試しにcodecvtを作ってみました。 namespace std { template<> class codecvt<char, hamigaki::audio::float_type, hamigaki::audio::float_state> : public locale::facet, public codecvt_base { public: typ</char,>…
sine_wave_sourceのアダプタを考えると、ストリームの文字型がcharなのは不便です。 計算はfloatやdoubleでやって、最後に量子化したほうが処理の無駄も少なく、簡潔に記述できるはずです。 (事実、内部的にはOgg Vorbisはfloatストリームです。他の音声圧縮…
予定通り、sine_wave_sourceのステレオ化を行いました。 sine_wave_sourceのレベルでステレオ化するのも変なので、アダプタで実装しました。 昨日の例をステレオにすると、こうなります。(3/25: 余分な括弧を削除) audio::pcm_format fmt; fmt.rate = 44100;…
Hamigki.Audioのテストで正弦波を使うのでデバイス化してみました。 こんな感じで正弦波の再生ができます。(3/25: 余分な括弧を削除) audio::pcm_format fmt; fmt.rate = 44100; fmt.bits = 16; fmt.channels = 1; io::copy( // sine_wave_sourceは無限長な…
よく考えてみると、tmpnam()が一時ファイル用ディレクトリを規定していないということは、既定の動作がそのプラットフォームの標準的な作法に従うような気がしてきた。 ただし、VC++のtmpnam()はカレントディレクトリを使用するので、Win32APIのGetTempPath(…
飯食いながら、レベル上げでスケルトン250匹ほどチェインして帰ったら、闇の石と骨くずがカンストしてました。もったいない。
一時ファイル用の標準関数として、tmpnam()とtmpfile()があります。 tmpnam()は一時ファイルの名前を生成する関数で、tmpfile()は一時ファイルを作成してFILE構造体のポインタを返します。なぜtmpfile()という関数があるかというと、 #include <cstdio> using namesp</cstdio>…
昨日の一時ファイルの件ですが、布団に入ったとたん、動かない原因に気が付きました。 問題はまたもやclose()にありました。
wave_sourceのテストで途中結果を吐くためにファイルを使っていますが、これがテスト後に残るのが気になります。 もちろん、テストコードの中で使用後に削除すればよいのですが、その方法ではプログラムがクラッシュした場合に残ってしまいます。 プログラム…
wave_sourceとwave_sinkのデストラクタでclose()を呼んでいなかったので修正しました。 boost::iostreams::copy()は最後にclose()を呼ぶので気が付きませんでした。 copy_managerもclose()を呼ぶように修正。 現状、多重close()を可能(2回目以降は何もしな…
wave_sourceのテストをするためにwave_sinkを作りました。かなりいい加減な実装です。 本当は、PCMデータ→WAVファイル(オンメモリ)→PCMデータと変換して、入力と出力を比較したいところですが、適当なデバイスが見当たらなかったので一旦ファイルに吐いてい…
id:Cryolite:20060312 さんのwchar_tネタについて調べてみました。 _GLIBCXX_USE_WCHAR_Tは<bits/c++config.h>で定義される(べき)マクロです。このファイルはconfigureスクリプトが吐き出します。 試しにソースをダウンロードして、configureしてみたところ、_GLIBCXX_USE_WCHA</bits/c++config.h>…
basic_fileの問題を解決するため、独自にbasic_fileもどきを作ってみました。 まだ実装はナロー文字のSourceだけです。Boost.Iostreamsではbasic_filebufを使っていますが、自分の実装は<cstdio>の関数を使っています。 これでfalcom_playがファイルを開けなかった場</cstdio>…
falcom_playは個人的にも毎日使っているんですが、ファイル名を間違えた場合に、 Error: ogg errorと表示されるのが気になります。 原因はファイル読み込みに使用しているfile_sourceがオープンに失敗しても例外を投げないので、oggのヘッダ処理でエラーが検…
結局、よくありがちな適当ライセンスで配布します。ページ作るのも面倒なので日記に書いちゃいます。zipファイルへの直リンクもOKです。 日本Falcom製の以下のゲームで使用されているBGMをループ付きで再生できるプログラムです。 英雄伝説VI 空の軌跡 英雄…
キーワード「空の軌跡」で飛んでくる人もいるみたいなので、コンパイル済みのfalcom_playをアップしようかと思ったんですが、ライセンスがややこしい。 ogg/vorbis(修正済みBSDライセンス) → ラインセンス条項をドキュメントにコピー Boost → (ソースをコン…
空の軌跡SCをインストールしようとしたら、ディスク容量が足りませんでした。 先週末にディスクを整理したはずだが、なぜ?と思いましたが、MinGW用にBoostをビルドしたせいでした。libのサイズを見たら1.6GBもありました。.oも残したままなので単純に2倍す…
いよいよ明日発売です。しばらく更新が滞るかも。
Boost.Testとbjamを使い出すと、どうしてもやってみたくなるもの、それはRegression TestのCompiler Statusページの作成です。 で、例のごとく挑戦してみました。
Boost.Filesystemで見つけた面白いテクニックをご紹介。 C++標準のfstreamはコンストラクタやopen()メンバ関数の引数として、ナロー文字列を受け取ります。通常、この方法で扱うことのできるファイル名に使える文字はASCIIの英数字、記号、そして環境依存の…
MinGWで\+CR/LFが通ることに今更ながら気付き、HamigakiライブラリをMinGWに対応させました。 実質、UNIXでliboggとlibvorbisをソースからビルドさせた場合のバグ修正です。 cygwinではバイナリパッケージを使用していたため、気が付きませんでした。テスト…
SONYのMDR-DS8000というワイヤレスのヘッドホンシステムを愛用しています。 これを購入したのは「夜中にヘッドフォンして剣神ドラゴンクエストをやりたい」というアホな理由からなのですが、どうせなら5.1chが欲しいというのと電池式なので充電待ちしなくて…
pcm_sinkのテストを追加しました。サンプリング周波数(11,22,44kHz)、量子化ビット数(8,16)、チャンネル数(1,2)の全組み合わせで中央のド(MIDIノート番号60)を鳴らします。 こういうパラメータを変えてテストする場合、どういうやり方がいいんでしょう。現状…