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