snd_mixer_groups関数は*groups構造体にMixerインターフェースのグループに関する情報を記入する。
グループに関する情報を取得するには以下の方法をとる。
まず*groups構造体は使用前にクリアしておく。この状態でsnd_mixer_groupsを呼ぶとgroups->groups_overにグループの数が返される。この数をgroups->groups_sizeに渡し、groups->groupsとgroups->groups_overを再びクリアし、groups->pgroupsに取得するグループに必要な量のmallocで確保した領域を渡す。
そしてもう一度snd_mixer_groupsを呼ぶとgroups->groupsに取得したグループの数を、groups->groups_overに取得に失敗したグループ数を、groups->pgroupsグループに関する情報が順番に書き込まれる。
#include <malloc.h> #include <stdlib.h> #include <stdio.h> #include <sys/asoundlib.h> int view_groups(snd_mixer_t *handle) { int err,i; snd_mixer_groups_t groups; snd_mixer_gid_t *gid; /* groups構造体をクリアする */ groups.groups_size = groups.groups = groups.groups_over = 0; groups.pgroups = NULL; /* 一回目の関数の呼出 */ if((err = snd_mixer_groups(handle, &groups)) < 0) return err; /* 取得したいグループ情報の数と必要な量のメモリを確保する */ groups.groups_size = groups.groups_over; groups.groups_over = groups.groups = 0; groups.pgroups = (snd_mixer_gid_t *)malloc(groups.groups_size *sizeof(snd_mixer_gid_t)); if (!groups.pgroups) { printf("Not enough memory\n"); return -1; } /* 二回目の関数の呼出 */ if((err = snd_mixer_groups(handle, &groups)) < 0) return err; /* 取得したグループ数、失敗したグループ数を表示 */ printf("groups:%d\n",groups.groups); printf("groups_over:%d\n",groups.groups_over); /* それぞれのグループ情報を表示 */ for (i = 0; i < groups.groups; i++) { gid = &groups.pgroups[i]; printf("name:%s\n",(*gid).name); printf("index:%d\n",(*gid).index); printf("type:%d\n",(*gid).type); } free(groups.pgroups); return 0; }SEE ALSO