Introduction to Sound Programming with ALSA その5

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

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

再生目的でPCMデバイスを開く

デフォルトのデバイス名でPCMデバイスを開くには次のようにします

int rc;
snd_pcm_t *handle;
rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0);

第一引数のハンドルにPCMデバイスを操作するのに必要なポインタ(以下このデータをhandleとします)があたえられます。
この関数も含め、ALSAAPIは戻り値が負だった場合エラーを表します。

snd_pcm_hw_param_t

PCMデバイスにサンプリングレートやチャンネル数等を設定するには上記のPCMポインタ以外に、snd_pcm_hw_param_t型のデータ(以下このデータをparamsとします)が必要です。

具体的にはparamsに値を設定し、paramsをPCMデバイスに渡す事でPCMデバイスを操作していくことになります。

paramsは、ALSA側でメモリを確保してもらう必要があるので、次のようにプログラムします。

snd_pcm_hw_param_t* params;
snd_pcm_hw_params_alloca(¶ms);

それから、snd_pcm_hw_params_anyを使ってparamsに開いているPCMデバイスのフォルト値で初期化します。

snd_pcm_hw_params_any( handle, params);

paramsへの設定

次にデバイスに設定していきます。具体的にはPCMデバイスへのアクセス方法、sampleのフォーマット、チャンネル数とサンプリングを設定します。

PCMデバイスへのアクセスを読み込みと書き込み両方を有効にする。

snd_pcm_hw_params_set_access( handle, params, SND_PCM_ACCESS_RW_INTERLEAVED );

sampleのビット数を16ビットでリトルエンディアンにする

snd_pcm_hw_params_set_format( handle, params, SND_PCM_FORMAT_S16_LE );

チャンネルを2にする(ステレオにする)

snd_pcm_hw_params_set_channels( handle, params, 2 );

サンプリングレートを44100Hzにする(CDが44.1kHzなので同等)

unsigned int val = 44100;
int dir;
snd_pcm_hw_params_set_rate_near( handle, params, &val, &dir );

関数名の末尾がnearであるのは、「指定したサンプリングレートになるべく近くする」という機能であることになる。サウンドカードの種類にもよるので、なるべくnearにした方がいい。

また、dirには再生や録音等の方向が代入されることになるらしいが未調査。dirは特に使うことはないので今後は省略します。

PCMデバイスにparamsを設定する

設定というより書き込むという表現の方が近いです。

コードは

rc = snd_pcm_hw_params(handle, params);
if( rc < 0 ){
  // エラー
}

となります。