Introduction to Sound Programming with ALSA その6

下記URLの記事を自分に必要な所だけ訳しているので、メモ書きしてました。

http://www.linuxjournal.com/article/6735

今日の日記でメモ書き終わりです。

ピリオドのデータ量を調査

「Introduction to Sound Programming with ALSA その3」で書いた通り、PCM デバイスに出力するデータはピリオド単位で行わなければいけません。

つまり、wavファイルを再生するにはピリオドのデータ量を調べてそのデータ量分をALSAAPIでPCMデバイスに転送するのです。

ピリオドの具体的なデータ量は直接には調べられないので、まずALSAAPIを使ってピリオドにどれぐらいのフレームが入っているかを調べます。

次のようにsnd_pcm_uframes_t 型のデータと関数snd_pcm_hw_params_get_period_sizeを使って取得します。

snd_pcm_uframes_t frames;
snd_pcm_hw_params_get_period_size(params, &frames, &dir);

framesにピリオドのフレーム数が格納されています。

このframesをもとに自分が設定したチャンネル数のサンプルのビット数からデータのサイズ
を計算します。

例えば、チャンネル数が2 で、ビット数8 の場合、データサイズ(datasizeとします)は
datasize = frames \times 2 \times 1
となります。

波形データをPCMデバイスに転送

上記の方法で、ピリオドのサイズ、datasizeがわかりました。
これを使ってメモリを確保しそのメモリにwavの波形データを書き込んでから転送のAPIに渡します。

unsigned char* memory_per_period = new unsigned char[datasize]
.....
while(再生したいデータが終わるまで){
  memset( memory_per_period, 0, datasize);
  memcpy( memory_per_period, 波形データのポインタ, datasize);
  snd_pcm_writei(handle, memory_per_period, ピリオドのフレーム数);
  ....
}

これでwavファイル等をALSAを使って再生できると思います。