ALSA是什么?
ALSA是Advanced sound Architecture的简称,也即高级Linux声音架构,其提供音频和MIDI(Musical Instrument Digital Interface)的支持,ALSA高效支持从消费电子的入门级声卡到专业音频设备所有类型的音频接口,完全模块化设计、支持SMP和线程安全,兼容OSS( opensound system早期版本内核的声音架构),此外ALSA还为用户控件提供了alsa-lib程序库,进一步简化了应用程序的开发。
驱动端主要文件在include/sound/driver.h sound/core/*.c
http://www.alsa-project.org/main/index.php/Main_Page;官方网址
驱动中关键的数据结构:codec、DAI、platform、PCM、G.711
声卡的驱动针对不同的总线方式分为PCI、USB、SPI、I2C以及SOC等,SOC是指嵌入式片上系统。
codec为声音编解码芯片,如24bit有效位的
WM8960CGEFL,32bit有效位的ak4954等,主要功能是模数和数模转换,其内部包括AD、DA、采样时钟,mic、耳机等接口
DAI Digital Auio Interface抽象出来的音频接口,每一个这类接口对应一个音频设备
platform(board)嵌入式平台,常常将音频设备注册为一个平台设备,在平台设备中绑定Codec和DAI
pcm Pulse code modulation,将声音信号编码成数字信号
μ-law(或Mu-law)和A-law
Mu-law由国际电话电报咨询委员会颁布的用于脉冲码调制的标准多媒体数字信号编解码器算法(压缩/解压),mu-law可以改善信噪比而,mu-law被美国和日本采用,欧洲和其它地方则采用了另外一种多媒体数字信号编解码器A-law。
G.711由国际电信联盟制定的音频编码方式,是对数PCM抽样标准,有两种压缩算法,分别是上面的A-law和mu-law
Linux Soc下audio音频架构
该架构基于Soc体系架构,注意区别于PCI、USB总线方式的架构等
用户空间的alsa-lib
alsa-lib交叉编译
./configure --host=arm-linux CC=arm-linux-gcc --prefix=/home/ge/alsa-lib/_install
make &&make install
_install 目录下生成的文件分别拷贝到对应的目录下,lib下的libasound.so.2拷贝到/lib下,将share目录下的内容拷贝到/usr/local/share目录下,该目录包含配置文件alsa.conf;该配置文件在snd_pcm_open()中调用snd_config_unpdate()会使用到,对声音系统进行适当的配置。
用户空间的编程方法,参考aplay工具的实现方法。
内核空间的驱动
在使aplay或者自己编写的工具工作时,需要内核的支持,由于是基于Soc架构的,上图中的Audio CODEC如果是4951,那么加载该模块时会在/pro/asound/下创建声卡的一些信息,该模块用于绑定编解码芯片的DAI和PCM,PCM就是A/D通道,alsa-lib的和内核的接口就是通过PCM实现的。snd_soc_card将codec和dai组成一个对外的整体对象。
Audio Controller用于控制编解码芯片工作的SOC,常用的总线是I2S方式,I2S用来传输编解码音频数据,对于录音来说就是将A/D按采样率要求采样预处理的数据通过I2S总线传递给SOC的I2s控制核,压缩成制定格式数据存放到制定的文件内,录音相反。
Soc段I2S核工作的方式一般由I2C总线读写总线进行控制。
设计注意事项
硬件:涉及A/D和D/A,注意电源和接地,避免50HZ的地噪
软件:pop音注意按手册操作A/D和输入输出运放工作的时间配合,通常就是mute操作