ALSA(lib和util)交叉编译与测试

Posted on 2012-02-24 10:26 TINZ 阅读(597) 评论( 0) 编辑 收藏

情况简介

ALSA 是目前 Linux 系统上大量采用的音频设备库,通过 Alsa 架构能分离驱动和应用的开发。 Alsa 为上层提供API 的同时,也为下层提供了接口,在内核配置的时候指定“支持 Alsa” 就能得到内核支持,具体位置为:

Menuconfig -> Device Drivers -> Sound card support -> Advanced Linux Sound Architecture ,驱动层所添加的音频设备应该也会在这里出现。

由于我们的内核已经包含了对应音频设备的驱动,故不做深入。

有了 Alsa 内核驱动,我们还需要 Alsa Lib 和 Alsa Util 的支持,这 3 者的关系如下图所示:

Alsa Util

-------------

Alsa lib

-------------

Alsa Driver

Alsa Util 是纯应用层的软件,相当于 Alsa 设备的测试程序, Alsa Lib 则是支持应用 API 的中间层程序。移植Alsa 程序的顺序就是先后移植 Driver,Lib,Util 。

Alsa Lib 移植

Lib 移植不需要修改一丁点儿的源码,只需要重新编译 lib 以支持自己的平台。其源码可以从官网下载。编译过程如下:

1.Configure

sudo ./configure --host=arm-none-linux-gnueabi --prefix=/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build --with-alsa-devdir=/dev --enable-static --enable-shared  --disable-python  --with-configdir=/usr/local/share/alsa --with-plugindir=/usr/local/lib/alsa_lib

配置会先对此命令中的配置项进行检查,然后实现配置。需要注意的是:配置如果出错,未必一定报错,而是会采用默认的配置选项。几个重要的配置项:

1 ) --host 指定编译器,这里指定为交叉编译器。注意运行本配置命令前务必保证编译器已经可以在 Shell下直接执行了

2 ) --prefix 指定编译后文件的安装路径,后续的安装命令会在该目录中创建 lib 和 include 两个目录

3 ) --with-configdir 指定 conf 文件的安装目录,该目录中对我们最有用的 alsa.conf ,此文件会被直接移植到你的目标系统中。

4) (本人增加) --with-alsa-devdir 指定音频设备的目录。(pcmC0D0c/pcmC0D0p/pcmC0D1p等)alsa_lib 默认到/dev/snd找这些音频设备,但有时候创建音频设备并不在/dev/snd里,而是在/dev/里或者其它目录里,这就需要指定目录,不然会提示找不到pcmCxDx 。

2.make

直接运行:

make 或者 sudo make

3.make install

运行 install 有 2 点需要注意

1) install 可能会在一些非用户目录安装一些文件,因此需要 root 权限

2) install 也会执行一些编译命令,因此记得保证 root 权限下的交叉编译器同样可用。

Alsa Util 移植

Util 会生成用于播放,录制,配置音频的应用文件,对测试很有用处。编译过程如下:

1.Configure

./configure --host=arm-none-linux-gnueabi --prefix=/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build --enable-static --enable-shared CFLAGS="-I/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build/include" LDFLAGS="-L/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build/include

其中几个重要的配置项:

1 ) --host 指定编译器,与 lib 的配置选项相同

2 ) --prefix 指定编译后文件的安装路径,与 lib 的配置选项相同

3 ) CFLAGS 用于编译时指定的编译选项,在这里将利用 lib 编译后生成的头文件,因此指定为该头文件所在目录

4 ) LDFLAGS 用于编译时指定连接库文件,与 CFLAGS 同样状况,将 lib 编译生成的库文件指定出来,

5 ) --with-alsa-inc-prefix 指定头文件目录,这个与 3) 类似,但必须指定,因为 Configure 程序会去该目录检查版本情况。如果不指定的话,则会直接去默认目录 ( 即宿主机对应的 alsalib 目录中寻找,因此可能会有错误 )

2. make

必须编译成功。

网上有种方法教大家 1 ) make clean 2)configure 3)make install 这种方法确实不会报错,但其实是安装了预编译的可执行程序,该程序是基于 x86 体系的,无法用于嵌入式平台。

3.make install


lib 和 util 安装到嵌入式平台

在目标板上,以下文件必须被拷贝至对应位置:

1) lib 库文件,放在 /lib/ 中

2) conf 文件,应放在 /usr/local/share 中,与编译时指定的目录相同

3) 应用文件, util 能产生 aplay,amixer,arecord 可执行程序,这些文件可放在 /usr/sbin 中

4) 必须保证有 /dev/snd/ 目录中,此目录下应包含以下几个设备文件 ( 驱动 ) ,

controlC0, pcmC0D0c, pcmC0D0p, timer

如果这些文件已经在 /dev/ 下,可拷贝到 snd 目录中。

运行测试程序

在我们当前的板子上存在着 4 个音频链路,分别是 :MIC, Line in, Line out, Headphone Out 。这 4 个链路都需要进行测试。

对于播放链路 (Line out, Headphone Out) ,相应的播放命令为:

aplay mysound.wav

对于录制链路 (Mic, Line in) ,相应的录制命令为:

arecord myvoice.wav –fdat –d 5

其中 -fdat 指定以 CD 音质录制, -d 代表录制 5 秒后退出。


命令 amixer 可以用来控制链路的通断以及相应配置。对于每一个系统,会有不一样的链路名称,通过amixer可以了解当前系统上所有链路的名称及状态。

命令amixer scontrols可以查看系统中的simple控制链路,相对应的还有完全版的控制链路(amixer controls),根据笔者的经验,这个simple控制链路足矣。

命令amixer scontent可以查看系统的所有simple链路极其当前状态。

以我目前的系统为例,为了让不同的链路工作,我们必须通过该命令进行设定。

Headphone Out

Amixer –c 0 sset ‘PCM’,0 100%,100% unmute playback

Line out

amixer –c 0 sset ‘Line’,0 100%,100% unmute playback

Line in

Amixer –c 0 sset ‘Right PGA Mixer Line1L’,0 100%,100% unmute cap

MIC

Amixer –c 0 sset ‘Right PGA Mixer Mic3L’,0 100%,100% unmute cap

转自:http://blog.csdn.net/iamgooday/article/details/6323863

PS:我在编译util 1.0.24.2时出现make错误,后来发现是version.h有问题,修改就好了,不知道为什么,version.h里面的内容会变乱了。

你可能感兴趣的:(linux,测试,嵌入式,include,平台,编译器)