ALSA的配置主文件默认是:/usr/share/alsa/alsa.conf
ALSA lib源代码中的conf.c负责load,解析这个配置文件。
配置以层次结构组织的,由一个snd_config_t 数据结构对象snd_config保存着总配置根,用list_head的方法将各个层次的配置组织起来。
- struct _snd_config {
- char *id;
- snd_config_type_t type;
- union {
- long integer;
- long long integer64;
- char *string;
- double real;
- const void *ptr;
- struct {
- struct list_head fields;
- int join;
- } compound;
- } u;
- struct list_head list;
- snd_config_t *father;
- int hop;
- };
这个数据结构中的type的成员指定,此配置的属性,可以是一个值,也可以是个拥有下层配置的分支。类型如下,除了SND_CONFIG_TYPE_COMPOUND类型,其他类型不能有下层配置而拥有一个值。
-
- typedef enum _snd_config_type {
-
- SND_CONFIG_TYPE_INTEGER,
-
- SND_CONFIG_TYPE_INTEGER64,
-
- SND_CONFIG_TYPE_REAL,
-
- SND_CONFIG_TYPE_STRING,
-
- SND_CONFIG_TYPE_POINTER,
-
- SND_CONFIG_TYPE_COMPOUND = 1024
- } snd_config_type_t;
配置的层次结构在配置文件中有几种相同效果的方式:
a 1 和 a=1等效
a {
b 1 和 a.b=1等效
}
[ ]是数组方式的配置,在[ ]中的各个代码块赋值一个递增的数字
a [
{
b 1
c 2
}
{
d 3
e 4
}
]
和
a.0.b=1
a.0.c=2
a.1.d=3
a.1.e=4
等效
特殊一点的地方:
a [
b c d e
]
和
a.0=b
a.1=c
a.2=d
a.3=e
等效
下面是本人写的一个将配置dump出来的代码,可以在load完成后调用显示所有的配置信息:
- static void snd_config_dump(snd_config_t *top,char *prefix)
- {
- char str[100];
- snd_config_iterator_t i,next;
- snd_config_for_each(i,next,top) {
- snd_config_t *s=snd_config_iterator_entry(i);
- switch(s->type) {
- case SND_CONFIG_TYPE_COMPOUND:
- if(prefix) {
- sprintf(str,"%s.%s",prefix,s->id);
- }
- else {
- sprintf(str,"%s",s->id);
- }
- snd_config_dump(s,str);
- break;
- case SND_CONFIG_TYPE_STRING:
- printf("%s.%s=%s\n",prefix,s->id,s->u.string);
- break;
- case SND_CONFIG_TYPE_INTEGER:
- printf("%s.%s=%d\n",prefix,s->id,s->u.integer);
- break;
- case SND_CONFIG_TYPE_INTEGER64:
- printf("%s.%s=%d\n",prefix,s->id,s->u.integer64);
- break;
- default:
- break;
- }
- }
- }
可以在调用了snd_config_load函数后调用。我在snd_config_update_r函数中如下调用:
- _skip:
- snd_config_dump(top,NULL);
- err = snd_config_hooks(top, NULL);
"@hook"关键字可以由第三方编写共享库来扩充功能。
而在alsa.conf中开头的部分,则是用于load其他配置文件:
- @hooks [
- {
- func load
- files [
- "/etc/asound.conf"
- "~/.asoundrc"
- ]
- errors false
- }
- ]
这里没有指定第三方共享库,则会调用snd_config_hook_load这个函数,
其中调用snd_config_load装载/etc/asound.conf和~/.asoundrc这2个特定的配置文件。
另外一点,可以用“<>”, 包含其他配置文件。
如:
阅读(1787) | 评论(0) | 转发(0) |