alsa lib源码分析
2012-11-04 13:30
232 查看
使用ALSA lib进行音频播放器开发的朋友都知道,ALSA的配置文件alsa.conf定义了一些简单的语法,通过这些语法记录了alsa环境变量。该文件在 /usr/share/alsa/alsa.conf.该文件开头处包含了用户可以配置的hook.用户自定义的配置信息可以保存在/etc /asound.conf或~/.asoundrc里,当然也可以自己定义的位置。
我们感兴趣的是,alsa lib是如何解析这些配置的。首先我们可以从使用alsa lib时,最先的入口函数snd_pcm_open处开始说起:
int snd_pcm_open(snd_pcm_t **pcmp, const char *name,
snd_pcm_stream_t stream, int mode)
{
int err;
assert(pcmp && name);
err = snd_config_update();
if (err < 0)
return err;
return snd_pcm_open_noupdate(pcmp, snd_config, name, stream, mode, 0);
}
其中调用了函数snd_config_update(),这个函数就是加载alsa的配置文件中配置信息的。这个函数直接调用了 snd_config_update_r,并以snd_config,snd_config_global_update为参数。这两个参数都是全局变量(snd_config_global_update 为静态),定义在conf.c中。初始值为0:
2616: snd_config_t *snd_config = NULL;
2632:static snd_config_update_t *snd_config_global_update = NULL;
snd_config_update_r还有第三个参数cfgs,是包含配置文件名的字符串,snd_config_update调用它时没有传递该参数,所以为空。
snd_config_udpate_r首先分析第三个参数cfgs,如果为空,就获取系统环境变量ALSA_CONFIG_PATH_VAR值,如果还是为空,就取ALSA_CONFIG_PATH_DEFAULT.
然后提取cfgs里的文件名。注意cfgs可以包含多个文件名,以:或空格分开。并把每个文件的文件信息保存在
snd_config_update_t变量local中,其成员count记录了有多少个文件,finfo则是对应的文件信息链表。
接下来分析第二个参数update,如果该参数值为空(前面提到过,最开始是为空),就重新去读配置文件,否则与local变量比较,如果发现不一样(配置文件被修改过),也会跳转到重读配置文件的代码。
重新读取配置文件的代码主要做三件事,第一,以第一个参数snd_config_t * top为参数调用snd_config_top(top);第二,打开local中保存的每一个配置文件,并调用 snd_config_load(top,in),其中in是snd_input_t类型,是alsa内部定义的结构,代表输入流; 第三,snd_config_hooks(top,NULL);
下一篇中我们将分别对这三个函数进行分析。
我们感兴趣的是,alsa lib是如何解析这些配置的。首先我们可以从使用alsa lib时,最先的入口函数snd_pcm_open处开始说起:
int snd_pcm_open(snd_pcm_t **pcmp, const char *name,
snd_pcm_stream_t stream, int mode)
{
int err;
assert(pcmp && name);
err = snd_config_update();
if (err < 0)
return err;
return snd_pcm_open_noupdate(pcmp, snd_config, name, stream, mode, 0);
}
其中调用了函数snd_config_update(),这个函数就是加载alsa的配置文件中配置信息的。这个函数直接调用了 snd_config_update_r,并以snd_config,snd_config_global_update为参数。这两个参数都是全局变量(snd_config_global_update 为静态),定义在conf.c中。初始值为0:
2616: snd_config_t *snd_config = NULL;
2632:static snd_config_update_t *snd_config_global_update = NULL;
snd_config_update_r还有第三个参数cfgs,是包含配置文件名的字符串,snd_config_update调用它时没有传递该参数,所以为空。
snd_config_udpate_r首先分析第三个参数cfgs,如果为空,就获取系统环境变量ALSA_CONFIG_PATH_VAR值,如果还是为空,就取ALSA_CONFIG_PATH_DEFAULT.
然后提取cfgs里的文件名。注意cfgs可以包含多个文件名,以:或空格分开。并把每个文件的文件信息保存在
snd_config_update_t变量local中,其成员count记录了有多少个文件,finfo则是对应的文件信息链表。
接下来分析第二个参数update,如果该参数值为空(前面提到过,最开始是为空),就重新去读配置文件,否则与local变量比较,如果发现不一样(配置文件被修改过),也会跳转到重读配置文件的代码。
重新读取配置文件的代码主要做三件事,第一,以第一个参数snd_config_t * top为参数调用snd_config_top(top);第二,打开local中保存的每一个配置文件,并调用 snd_config_load(top,in),其中in是snd_input_t类型,是alsa内部定义的结构,代表输入流; 第三,snd_config_hooks(top,NULL);
下一篇中我们将分别对这三个函数进行分析。
相关文章推荐
- spark源码分析[Spark-Vectors]---Mllib.linalg.Vectors
- 变态的libDispatch源码分析-全局队列异步延时任务处理过程-设置计时器与插入ds
- WhatWeb源码分析之lib/plugins.rb
- proc_lib:spawn相关源码分析
- librtmp源码分析---url解析
- libumem使用和源码分析系列文章(二)
- FFmpeg源码简单分析:libswscale的sws_scale()
- libdvbpsi源码分析(三)PSI decocder详细分析
- Hadoop源码分析(mapreduce.lib.partition/reduce/output)
- libpcap+PF_RING源码分析---前言(一)
- alsa驱动源码分析(一)
- jrtplib 源码分析 (二) 数据包
- WhatWeb源码分析之lib/target.rb
- libdvbpsi源码分析(前言)
- Python之美[从菜鸟到高手]--httplib源码分析及IncompleteRead异常解决方案
- Python+pandas+matplotlib数据分析与可视化案例(附源码)
- libpcap+PF_RING源码分析一、二
- lib文件格式分析,以及从lib文件提取obj的思路和源码
- <5>Android HAL hardware.h 源码文件分析 路径:/hardware/libhardware/include/hardware/hardware.h
- libevent sample--分析及其源码阅读