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