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

vorbis_encoder

まだ実装が適当ですが、意外とすんなり出来てしまいました。 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>…

Filterの選定

basic_vorbis_fileのテスト用にエンコーダも必要になりました。 Zlib FiltersやBzip2 Filtersがsymmetric_filterを使って実装されているため、同じようにsymmetric_filterで試していました。 symmetric_filterには、 Source/Sinkの種類に依存しない。 filter…

Hamigaki.Audioテストの改良

祝Turkanis氏復帰。 一週間ぶりにソースをアップしました。細かい修正が主です。 これまでHamigaki.Audioのテストはひたすら「ド」を再生していましたが、これだとうまく鳴っているのか分かりにくいので、音程を変えながら演奏するように変更しました。 MML…

code_converter on MinGW

せっかくここまでfloatストリームについて調べてきましたが、MinGWでコンパイルすると、 code_converter.hpp:20:3: #error code conversion not supported on this platformとなってコンパイルできませんでした。そもそもテストコード簡略化が目的だったはず…

続code_converter for float

今回は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

C++

char_traitsとcodecvtの関係がよく分からなくなってきました。 これらは共にstate_typeという型を持ちます。規格によると、codecvtのstate_typeはエンコーディングの種類ごとに別々の型を用いるはずですが、ストリームは特定のchar_traitsを持っているのでst…

code_converter for float

codecvtができたので、code_converterに組み込んでテストしてみました。 そのままではコンパイルが通らなかったので、code_converter.hppをコピーして修正することにしました。

codecvt for float

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,>…

std::char_traits?

sine_wave_sourceのアダプタを考えると、ストリームの文字型がcharなのは不便です。 計算はfloatやdoubleでやって、最後に量子化したほうが処理の無駄も少なく、簡潔に記述できるはずです。 (事実、内部的にはOgg Vorbisはfloatストリームです。他の音声圧縮…

stereo

予定通り、sine_wave_sourceのステレオ化を行いました。 sine_wave_sourceのレベルでステレオ化するのも変なので、アダプタで実装しました。 昨日の例をステレオにすると、こうなります。(3/25: 余分な括弧を削除) audio::pcm_format fmt; fmt.rate = 44100;…

sine_wave_source

Hamigki.Audioのテストで正弦波を使うのでデバイス化してみました。 こんな感じで正弦波の再生ができます。(3/25: 余分な括弧を削除) audio::pcm_format fmt; fmt.rate = 44100; fmt.bits = 16; fmt.channels = 1; io::copy( // sine_wave_sourceは無限長な…

続 一時ファイル

C++

よく考えてみると、tmpnam()が一時ファイル用ディレクトリを規定していないということは、既定の動作がそのプラットフォームの標準的な作法に従うような気がしてきた。 ただし、VC++のtmpnam()はカレントディレクトリを使用するので、Win32APIのGetTempPath(…

やりすぎ

飯食いながら、レベル上げでスケルトン250匹ほどチェインして帰ったら、闇の石と骨くずがカンストしてました。もったいない。

一時ファイル(標準関数編)

C++

一時ファイル用の標準関数として、tmpnam()とtmpfile()があります。 tmpnam()は一時ファイルの名前を生成する関数で、tmpfile()は一時ファイルを作成してFILE構造体のポインタを返します。なぜtmpfile()という関数があるかというと、 #include <cstdio> using namesp</cstdio>…

dont_close

昨日の一時ファイルの件ですが、布団に入ったとたん、動かない原因に気が付きました。 問題はまたもやclose()にありました。

一時ファイル

wave_sourceのテストで途中結果を吐くためにファイルを使っていますが、これがテスト後に残るのが気になります。 もちろん、テストコードの中で使用後に削除すればよいのですが、その方法ではプログラムがクラッシュした場合に残ってしまいます。 プログラム…

close

wave_sourceとwave_sinkのデストラクタでclose()を呼んでいなかったので修正しました。 boost::iostreams::copy()は最後にclose()を呼ぶので気が付きませんでした。 copy_managerもclose()を呼ぶように修正。 現状、多重close()を可能(2回目以降は何もしな…

wave_sourceのテスト

wave_sourceのテストをするためにwave_sinkを作りました。かなりいい加減な実装です。 本当は、PCMデータ→WAVファイル(オンメモリ)→PCMデータと変換して、入力と出力を比較したいところですが、適当なデバイスが見当たらなかったので一旦ファイルに吐いてい…

_GLIBCXX_USE_WCHAR_T

id:Cryolite:20060312 さんのwchar_tネタについて調べてみました。 _GLIBCXX_USE_WCHAR_Tは<bits/c++config.h>で定義される(べき)マクロです。このファイルはconfigureスクリプトが吐き出します。 試しにソースをダウンロードして、configureしてみたところ、_GLIBCXX_USE_WCHA</bits/c++config.h>…

file_source改

basic_fileの問題を解決するため、独自にbasic_fileもどきを作ってみました。 まだ実装はナロー文字のSourceだけです。Boost.Iostreamsではbasic_filebufを使っていますが、自分の実装は<cstdio>の関数を使っています。 これでfalcom_playがファイルを開けなかった場</cstdio>…

basic_fileとcopy

falcom_playは個人的にも毎日使っているんですが、ファイル名を間違えた場合に、 Error: ogg errorと表示されるのが気になります。 原因はファイル読み込みに使用しているfile_sourceがオープンに失敗しても例外を投げないので、oggのヘッダ処理でエラーが検…

falcom_play(空の軌跡SC対応BGMプレーヤ)

結局、よくありがちな適当ライセンスで配布します。ページ作るのも面倒なので日記に書いちゃいます。zipファイルへの直リンクもOKです。 日本Falcom製の以下のゲームで使用されているBGMをループ付きで再生できるプログラムです。 英雄伝説VI 空の軌跡 英雄…

バイナリ配布

キーワード「空の軌跡」で飛んでくる人もいるみたいなので、コンパイル済みのfalcom_playをアップしようかと思ったんですが、ライセンスがややこしい。 ogg/vorbis(修正済みBSDライセンス) → ラインセンス条項をドキュメントにコピー Boost → (ソースをコン…

容量が足りません

空の軌跡SCをインストールしようとしたら、ディスク容量が足りませんでした。 先週末にディスクを整理したはずだが、なぜ?と思いましたが、MinGW用にBoostをビルドしたせいでした。libのサイズを見たら1.6GBもありました。.oも残したままなので単純に2倍す…

英雄伝説VI SC

いよいよ明日発売です。しばらく更新が滞るかも。

Regression Test

Boost.Testとbjamを使い出すと、どうしてもやってみたくなるもの、それはRegression TestのCompiler Statusページの作成です。 で、例のごとく挑戦してみました。

8.3 hack

Boost.Filesystemで見つけた面白いテクニックをご紹介。 C++標準のfstreamはコンストラクタやopen()メンバ関数の引数として、ナロー文字列を受け取ります。通常、この方法で扱うことのできるファイル名に使える文字はASCIIの英数字、記号、そして環境依存の…

MinGW対応

MinGWで\+CR/LFが通ることに今更ながら気付き、HamigakiライブラリをMinGWに対応させました。 実質、UNIXでliboggとlibvorbisをソースからビルドさせた場合のバグ修正です。 cygwinではバイナリパッケージを使用していたため、気が付きませんでした。テスト…

MDR-DS8000

SONYのMDR-DS8000というワイヤレスのヘッドホンシステムを愛用しています。 これを購入したのは「夜中にヘッドフォンして剣神ドラゴンクエストをやりたい」というアホな理由からなのですが、どうせなら5.1chが欲しいというのと電池式なので充電待ちしなくて…

失敗時のパラメータ

pcm_sinkのテストを追加しました。サンプリング周波数(11,22,44kHz)、量子化ビット数(8,16)、チャンネル数(1,2)の全組み合わせで中央のド(MIDIノート番号60)を鳴らします。 こういうパラメータを変えてテストする場合、どういうやり方がいいんでしょう。現状…