您的位置:首页 > 编程语言

[原创]ALSA 音频系统源代码分析: ALSA library 分析 --- 配置系统

2009-04-14 22:09 731 查看
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类型,其他类型不能有下层配置而拥有一个值。

/** Configuration node type. */
typedef enum _snd_config_type {
/** Integer number. */
SND_CONFIG_TYPE_INTEGER,
/** 64 bit Integer number. */
SND_CONFIG_TYPE_INTEGER64,
/** Real number. */
SND_CONFIG_TYPE_REAL,
/** Character string. */
SND_CONFIG_TYPE_STRING,
/** Pointer (runtime only, cannot be saved). */
SND_CONFIG_TYPE_POINTER,
/** Compound node. */
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个特定的配置文件。

另外一点,可以用“<>”, 包含其他配置文件。

如:

<confdir:pcm/surround.conf>

插段广告



Linux文化T恤,淘宝销售,有兴趣的可以购买。

淘宝店面地址:
http://list.taobao.com/browse/search_auction.htm?user=b0ccaa7bfdc57fdec4594501767832b6&commend=all
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: