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とします)があたえられます。
この関数も含め、ALSAのAPIは戻り値が負だった場合エラーを表します。
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 ){ // エラー }
となります。