ALSA交叉编译与测试

    技术2022-05-20  63

    情况简介

    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

    ./configure --host=arm-none-linux-gnueabi --prefix=/home/jeff/Downloads/alsa-lib/out/arm-linux/ --enable-static --enable-shared –-with-configdir=/usr/local/share

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

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

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

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

     

    2.       make

    直接运行:

    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/jeff/Downloads/alsa-lib/out/arm-linux/ --enable-static --enable-shared CFLAGS="-I$PWD/../out/arm-linux/include" LDFLAGS="-L$PWD/../out/arm-linux/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/home/jeff/Downloads/alsa-lib/out/arm-linux/include

    其中几个重要的配置项:

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

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

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

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

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

     

    2.       make

    直接运行:

    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

    注意线路录音时应确定输入设备本身为有源设备,无源的 Microphone 是不能用来接线路输入的。

     

    MIC

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

     

     


    最新回复(0)