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