ALSA:PCM情報

PCM
ここから、再生/録音のメインとなる、PCM インターフェイスを扱っていきます。

まずは、PCM を開いて、PCM ハンドル (snd_pcm_t) を取得し、それを元に操作を行っていきます。
PCM を開く
int snd_pcm_open(snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode);

pcmPCM ハンドルが返る
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 情報 をご覧ください。
確保
//サイズ取得
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") の再生用の情報を出力します。

$ 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 は、モニタの製品名です。