Tiny WAV I/O Moduleプロジェクト
Tiny WAV I/O
Moudleプロジェクトとは、小規模組み込みシステムで使用可能なWAVファイルライブラリを作ろうという目的で作られたプロジェクトです。
今回実装したライブラリは、その設計の前段にあたるもので、「どういったインターフェースなら使いやすいかなぁ」というのを検討する為のもの。libcが
使用可能な環境でのみ使用可能です。成果物はTiny WAV I/O Moduleプロジェクトのlibc-basedに追加しました。
まぁ、ざっくり言うとlibc-basedは「パソコンで使えるお手軽WAVライブラリ」ですね。
wavfileモジュールの特徴
以下に今回設計実装したお手軽WAVライブラリ、wavfileモジュールの特徴を示します。
-
省メモリ設計。(ライブラリ側では巨大なメモリを要求しない。)
-
ファイル形式に依らず0.0から1.0で正規化されたデータ入出力インターフェースを採用。
-
複数チャネルデータに対応。
-
ヘッダの実装詳細を把握しなくても使える。
データをどこに配置するのかについてはアプリケーション層が決めたい事の一つです。
巨大なメモリを勝手にアロケーションするようなライブラリは使いづらくて仕方ありません。
よってwavfileモジュールでは、これらに関知しないようにインターフェースを設計しました。
また、WAVファイルの処理を実装する時に意外に面倒なのが、データ形式の違いです。
今回のwavfileモジュールでは、ファイルのデータ形式によらず0.0から1.0で正規化されたデータ入出力インターフェースを採用しました。これに
よって、「8ビット形式のファイルは0から255で1バイトだよね。」とか「16ビット形式のファイルは-32768から32767で2バイトだよね。」
とか考えなくて済みます。とにかくサンプルを1つ得るインターフェースを呼ぶだけで良いのです。
typedef struct {
uint16_t num_channels;
double channel_data[WAVFILE_MAXIMUM_CHANNELS];
} wavfile_data_t;
wavfile_read_dataを呼ぶと上記の構造体にサンプルデータが格納されて返ってきます。
channel_dataの中身は先の規格化された値が入っている事になります。
wavfileモジュールのインターフェース
wavfileモジュールを使うために必要なインターフェースは、リード用、ライト用と合わせてもたったの6つです。
WAVFILE *wavfile_open(const char *filename, WavFileMode mode, WavFileResult *result);
WavFileResult wavfile_read_info(WAVFILE *p, wavfile_info_t *info);
WavFileResult wavfile_read_data(WAVFILE *p, wavfile_data_t *data);
WavFileResult wavfile_write_info(WAVFILE *p, const wavfile_info_t *info);
WavFileResult wavfile_write_data(WAVFILE *p, const wavfile_data_t *data);
WavFileResult wavfile_close(WAVFILE *p);
基本思想
infoとdataの2段階で簡単に実現しちゃうよ!というのが本ライブラリの基本思想です。
読み込み
wavfile_openにファイル名とWavFileModeReadを与えてオープン。
wavfile_read_infoでヘッダ情報を読み込む。
wavfile_read_dataでデータを読み込む。 (必要に応じて繰り返す)
wavfile_closeでクローズ。
書き込み
wavfile_openにファイル名とWavFileModeWriteを与えてオープン。
ヘッダ情報を設定する。
wavfile_write_infoでヘッダ情報を書き込む。
データを設定する。
wavfile_write_dataでデータを書き込む。(必要に応じて繰り返す)
wavfile_closeでクローズ。
どんな風に使えるの?
単にデータを読みたい場合
よくあるやりたい仕事の1つが、とにかくデータを読んでみたい!というものです。
Tiny WAV I/O Moduleのlibc-based実装を使えば簡単に実現できてしまいます。
WavFileResult result;
wavfile_info_t info;
wavfile_data_t data;
WAVFILE *wf = wavfile_open("YourWavFileName.WAV", WavFileModeRead, &result);
if (wf != NULL) {
wavfile_read_info(wf, &info);
while (1) {
wavfile_read_data(wf, &data);
if (data.num_channels == 0) {
// 読むべきデータが無くなったらチャネル数に0を返してくる。
break;
}
// ここでデータを確認すれば良い。
}
wavfile_close(wf);
}
Download
Here is the source code package.
History
Date |
Description |
2012/09/23 |
Added the release version 0.1.0 |
2012/09/08 |
Initial version |
戻る