PCM
ここから、再生/録音のメインとなる、PCM インターフェイスを扱っていきます。
まずは、PCM を開いて、PCM ハンドル (snd_pcm_t) を取得し、それを元に操作を行っていきます。
まずは、PCM を開いて、PCM ハンドル (snd_pcm_t) を取得し、それを元に操作を行っていきます。
PCM を開く
int snd_pcm_open(snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode);
pcm | PCM ハンドルが返る |
---|---|
name | 開く PCM の定義名。 デフォルトの PCM を指定するなら、"default"。 |
stream | ストリームの方向。 SND_PCM_STREAM_PLAYBACK: 再生 SND_PCM_STREAM_CAPTURE: 録音 |
mode | 開くモード。 0 でブロックモード。 SND_PCM_NONBLOCK: 非ブロッキングモード SND_PCM_ASYNC: 非同期通知 |
PCM を閉じる
int snd_pcm_close(snd_pcm_t *pcm);
PCM 情報
まずは、PCM の情報を取得してみます。
情報は snd_pcm_info_t に格納されるので、まずは snd_pcm_info_t を確保した後、情報を取得します。
snd_pcm_info_t から各値を取得する関数は、PCM 情報 をご覧ください。
情報は snd_pcm_info_t に格納されるので、まずは snd_pcm_info_t を確保した後、情報を取得します。
snd_pcm_info_t から各値を取得する関数は、PCM 情報 をご覧ください。
確保
//サイズ取得 size_t snd_pcm_info_sizeof(void); //確保 int snd_pcm_info_malloc(snd_pcm_info_t **ptr); //解放 void snd_pcm_info_free(snd_pcm_info_t *obj);
PCM 情報の取得
int snd_pcm_info(snd_pcm_t *pcm, snd_pcm_info_t *info);
プログラム
引数で指定された PCM (省略で "default") の再生用の情報を出力します。
card は、コントロールインターフェイスで取得した時と同じ、サウンドカードのインデックス番号です。
PCM の場合、カードごとに、複数のデバイス番号とサブデバイス番号があります。
デバイス 0 は、アナログの入出力です。
"hdmi" を開いた場合は、デフォルトのカードの、HDMI 出力となります。
同じカードで、デバイス番号が3になっています。
name は、モニタの製品名です。
$ cc -o 08-pcminfo 08-pcminfo.c -lasound
#include <stdio.h> #include <alsa/asoundlib.h> int main(int argc,char **argv) { snd_pcm_t *pcm; snd_pcm_info_t *info; if(snd_pcm_open(&pcm, (argc >= 2)? argv[1]: "default", SND_PCM_STREAM_PLAYBACK, 0)) { printf("open error\n"); return 1; } //情報 snd_pcm_info_malloc(&info); snd_pcm_info(pcm, info); printf("device: %u\n", snd_pcm_info_get_device(info)); printf("subdevice: %u\n", snd_pcm_info_get_subdevice(info)); printf("stream: %u\n", snd_pcm_info_get_stream(info)); printf("card: %d\n", snd_pcm_info_get_card(info)); printf("id: '%s'\n", snd_pcm_info_get_id(info)); printf("name: '%s'\n", snd_pcm_info_get_name(info)); printf("class: %d\n", snd_pcm_info_get_class(info)); printf("subclass: %d\n", snd_pcm_info_get_subclass(info)); printf("subdevices_count: %u\n", snd_pcm_info_get_subdevices_count(info)); printf("subdevices_avail: %u\n", snd_pcm_info_get_subdevices_avail(info)); // snd_pcm_info_free(info); snd_pcm_close(pcm); return 0; }
出力結果
device: 0 subdevice: 0 stream: 0 card: 0 id: 'ALC892 Analog' name: 'ALC892 Analog' class: 0 subclass: 0 subdevices_count: 1 subdevices_avail: 0
card は、コントロールインターフェイスで取得した時と同じ、サウンドカードのインデックス番号です。
PCM の場合、カードごとに、複数のデバイス番号とサブデバイス番号があります。
デバイス 0 は、アナログの入出力です。
HDMI
$ ./08-pcminfo hdmi device: 3 subdevice: 0 stream: 0 card: 0 id: 'HDMI 0' name: 'PHL 224E5' class: 0 subclass: 0 subdevices_count: 1 subdevices_avail: 0
"hdmi" を開いた場合は、デフォルトのカードの、HDMI 出力となります。
同じカードで、デバイス番号が3になっています。
name は、モニタの製品名です。