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