移植ALSA库及工具

485 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情 

1、ALSA架构

ALSALinux系统中为声卡提供驱动的内核组件。它提供了专门的库函数来简化相应应用程序的编写。 在这里插入图片描述 从上图可以看出ALSA系统包括7个子项目:

  • 驱动包alsa-driver
  • 开发包alsa-libs
  • 开发包插件alsa-libplugins
  • 设置管理工具包alsa-utils
  • OSS接口兼容模拟层工具alsa-oss
  • 特殊音频固件支持包alsa-finnware
  • 其他声音相关处理小程序包alsa-tools

2、移植ALSA库及工具

移植ALSA主要是移植alsa-Ubalsa-utils

  • alsa-lib:用户空间函数库, 封装驱动提供的抽象接口, 通过文件libasound.so提供API给应用程序使用。
  • alsa-utils:实用工具包,通过调用alsa-lib实现播放音频(aplay)、录音(arecord) 等工具。 在这里插入图片描述 ALSA Util是纯应用层的软件,相当于ALSA设备的测试程序,ALSA-Lib则是支持应用API的中间层程序,ALSA-Util中的应用程序中会调用到ALSA-Lib中的接口来操作到我们的音频编解码芯片的寄存器,而lib中接口就是依赖于最底层驱动代码,因此移植ALSA程序的顺序就是先后移植Driver,Lib,Util

ALSA库下载

ALSA首先需要在ALSA的官网上下载官网www.alsa-project.org下载alsa-lib和alsa-utils。 在这里插入图片描述 如上图所示我们下载的版本为:

  • alsa-lib-1.2.2.tar.bz2
  • alsa-utils-1.2.2.tar.bz2

2.1、ALSA Lib编译

ALSA Lib移植不需要修改源码,只需要重新编译库代码以支持自己的平台。

tar -xvf alsa-lib-1.0.27.2.tar.bz2   
cd alsa-lib-1.0.27.2  
CC=arm-none-linux-gnueabi-gcc
./configure --host=arm-linux  --prefix=/home/m/3rd/alsa/install/  
make  
make install 

在上述命令中./configure配置的几个重要的配置选项解释如下:

  • host指定编译器,这里指定为交叉编译器,运行本配置命令前务必保证编译器已经可以在Shell下可以直接执行了。
  • prefix指定编译后文件的安装路径,这样安装命令就还会指定的这个目录中创建lib和include两个目录。

2.2、ALSA Util编译

tar -xvf alsa-utils-1.0.27.2.tar.bz2  
cd alsa-utils-1.0.27.2  
CC=arm-none-linux-gnueabi-gcc 
./configure --prefix=/home/m/3rd/alsa/install/ --host=arm-linux --with-alsa-inc-prefix=/home/m/3rd/alsa/install/include --with-alsa-prefix=/home/m/3rd/alsa/install/lib --disable-alsamixer --disable-xmlto --disable-nls  
make  

2.3、ALSA库和工具移植入嵌入式平台

ALSA库和测试工具的移植就是将相应库文件和可执行文件放在目标板上,以下文件 必须被拷贝至对应位置 :

  1. ALSA Lib文件,放在/lib/中。
  2. 配置文件放在/usr/local/share中,与编译时指定的目录相同。
  3. 测试应用文件,ALSA Util能产生aplayamixerarecord,我们可以把这些可执行文件放在/usr/sbin中。
  4. 内核目录中保证有/dev/snd/目录,这个目录下存放controlC0pcmC0D0/usr/sbintimertimer这些设备文件,如果这些设备文件已经在/dev目录下,可手动拷贝到/snd目录中。

LINUX系统中,每个设备文件都是文件。音频设备也是一样,它的设备文件被放在/dev/snd目录下,我们来看下这些设备文件:

ls /dev/snd -l
crw-rw----+ 1 root audio 116,  2 5月  19 21:24 controlC0     用于声卡的
crw-rw----+ 1 root audio 116,  4 6月   6 19:31 pcmC0D0c
crw-rw----+ 1 root audio 116,  3 6月  11 11:53 pcmC0D0p
crw-rw----+ 1 root audio 116, 33 5月  19 21:24 timer
  1. controlC0:音频控制设备文件,例如通道选择,混音,麦克风的控制等
  2. pcmC0D0c:声卡0设备0的录音设备,c表示capter
  3. pcmC0D0p:声卡0设备0的播音设备,p表示play
  4. timer:定时器设置。