ALSA交叉编译与测试

参考方法一:

内核版本:由menuconfig配置文件TOP6410_3d.config编译所得内核2.6.28.6(使用老版28内核或使用默认menuconfig配置文件编译会出现alsa录音没有声音的问题)

文件系统版本:老版光盘中的ubifs即可

alsa-lib版本:1.0.9

alsa-util版本:1.0.9a

其他版本的alsa-lib和alsa-util不能保证正常工作


在上述版本的内核、ubifs已成功烧录至6410后(调试阶段也可采用tftp下载内核、nfs挂载ubifs),开始下面的工作

首先在Ubuntu上交叉、编译alsa-lib和alsa-util

1.解压alsa-lib-1.0.9.tar,进入解压所得目录

2.使用命令

./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa

Tips:--host参数指定了交叉编译器为“arm-none-linux-gnueabi-gcc",因此必须确保交叉编译器已成功配置,www.linuxidc.com且可以在shell里直接调用;--prefix参数指定了alsa-lib的目标安装目录,之后的alsa-util配置也一样

3.使用命令

make

sudo make install

Tips:make install必须加上sudo,因为在install过程中会创建某些目录

4.解压alsa-util-1.0.9a.tar,进入解压所得目录

5.使用命令

./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa --with-alsa-inc-prefix=/usr/share/arm-alsa/include --with-alsa-prefix=/usr/share/arm-alsa/lib --disable-alsamixer

Tips:--with-alsa-inc-prefix和--with-alsa-prefix分别指定了交叉编译util应用所需要的alsa-lib的头文件和库文件;--disable-alsamixer表示不编译生成alsamixer这个应用程序,因为该程序依赖于ncurses这个图形界面库,目前我们对于该库还不能交叉编译,故放弃

6.使用命令

touch alsaconf/po/t-ja.gmo

避免之后make报错

7.使用命令

make

sudo make install

至此Ubuntu上的工作全部结束


接着要在6410上部署已交叉编译好的alsa-lib和alsa-util

为便于理解,设6410的根目录为$rootfs

1.将Ubuntu中alsa安装目录下的所有文件移至6410的对应目录(绝对路径必须一致),使用命令

sudo cp -r /usr/share/arm-alsa $rootfs/usr/share/

2.将alsa安装目录下已交叉编译好的alsa库移至6410的默认库搜索目录,使用命令

sudo cp -r $rootfs/usr/share/arm-alsa/lib/* $rootfs/lib/

3.将alsa安装目录下已交叉编译好的alsa-util应用程序移至6410默认应用程序搜索目录,使用命令

sudo cp -r $rootfs/usr/share/arm-alsa/bin/* $rootfs/usr/sbin/

sudo cp -r $rootfs/usr/share/arm-alsa/sbin/* $rootfs/usr/sbin/

4.编辑$rootfs/etc/init.d/rcS,添加如下几行

[plain]
  1. #alsa_init  
  2. mkdir /dev/snd  
  3. ln /dev/controlC0 /dev/snd/controlC0  
  4. ln /dev/pcmC0D0c /dev/snd/pcmC0D0c  
  5. ln /dev/pcmC0D0p /dev/snd/pcmC0D0p  
  6. ln /dev/timer /dev/snd/timer  
  7.   
  8. amixer cset numid=86 2  
  9. amixer cset numid=87 2  
Tips:amixer的两句命令,是将amixer的默认设置'Left Capture Source'和'Right Capture Source'的值改为'Line‘,否则会出现alsa录音没有声音的问题

5.编辑$rootfs/etc/profile,添加如下两行

[plain]
  1. #alsa_init  
  2. export ALSA_CONFIG_PATH=/usr/share/arm-alsa/share/alsa/alsa.conf  
Tips:该环境变量的值必须与alsa安装目录保持一致,否则使用aplay和arecord时会报错

至此alsa-lib、alsa-util移植完毕


测试

1.测试能否正常播放,使用命令

aplay test1.wav

test1.wav为已录制好的正常音频文件

2.测试能否正常录音,使用命令

arecord -d 10 -fdat test2.wav

-d表示录制时间为10秒,-fdat表示以dat质量进行录制(决定了采样率、声道等参数)


1. 编译alsa-lib

1) 下载alsa lib。http://www.alsa-project.org/main/index.php/Main_Page

 

2) tar jxvf alsa-lib-1.0.19.tar.bz2

 

3) cd alsa-lib-1.0.19

 

4) CC=$(CROSS_COMPILE) ./configure --target=arm-linux --host=i686-linux --prefix=~/alsalib_arm

 

5) make

 

6) make install

 

在编译app的时候,需要#include <alsa/asoundlib.h>,makefile的写法有两中如下:

 


参考方法二:

第一种:

CFLAGs=-I/home/ben

LDFLAGs=-L/hom/ben

 

all:hfp.c
      $(GCC) -o hfp hfp.c $CFLAGS) $(LSFLAGS) -lasound

 

第二种:

all:hfp.c

       $(CC) -o hfp hfp.c `pkg-config --libs --cflags alsa`

其中环境变量PKG_CONFIG_PATH应该被指定为交叉编译出的alsa库路径,否则的话,系统默认安装的x86版本将会被include.

 

2. 编译alsa-util

CC=arm-none-linux-gnueabi-gcc ./configure --target=arm-linux --host=i686-linux --prefix=/home/ben/Works/Codes/alsa/alsautil_arm --with-alsa-inc-prefix=/home/ben/Works/Codes/alsa/alsalib_arm/include CFLAGS="-I/home/ben/Works/Codes/alsa/alsalib_arm/include" LDFLAGS="-L/home/ben/Works/Codes/alsa/alsalib_arm/lib -lasound"


参考方法三:

下载
http://www.alsa-project.org/main/index.php/Download

交叉编译 alsa-lib
./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa   
make & make install                                                                                        

交叉编译 alsa-utils
./configure --host=arm-none-linux-gnueabi --with-alsa-inc-prefix=/usr/share/arm-alsa/include -- with-alsa-prefix=/usr/share/arm-alsa/lib --without-alsamixer // avoid the ncurses lib

without 要改成disable
make

Copy lib to target board
cp -avr /usr/share/arm-alsa {$rootfs}/usr/share/arm-alsa

环境变量
export ALSA_CONFIG_PATH=/usr/share/arm-alsa/share/alsa/alsa.conf                                         

未添加环境变量前出现的错误:
~ # ./aplay 
ALSA lib conf.c:2827:(snd_config_hook_load) cannot access file /usr/share/arm-alsa/share/alsa/cards/aliases.conf
ALSA lib pcm.c:1959:(snd_pcm_open_conf) Invalid type for PCM default definition (id: default, value: cards.pcm.default)
aplay: main:533: audio open error: Invalid argument
~ # ./aplay 
ALSA lib pcm.c:2090:(snd_pcm_open_noupdate) Unknown PCM default
aplay: main:533: audio open error: No such file or directory

交叉编译其他程序:
Add included file in program: #include <alsa/asoundlib.h>
~# arm-none-linux-gnueabi-gcc -lasound -L/usr/share/arm-alsa/lib/ -I/usr/share/arm-alsa/include/ -o test my_test.c


参考方法四:

1) 下载alsa lib。http://www.alsa-project.org/main/index.php/Main_Page

 

2) tar jxvf alsa-lib-1.0.19.tar.bz2

 

3) cd alsa-lib-1.0.19

 

4) CC=$(CROSS_COMPILE) ./configure --target=arm-linux --host=i686-linux --prefix=~/alsalib_arm

 

5) make

 

6) make install

 

在编译app的时候,需要#include <alsa/asoundlib.h>,makefile的写法有两中如下:

 

第一种:

CFLAGs=-I/home/ben

LDFLAGs=-L/hom/ben

 

all:hfp.c
      $(GCC) -o hfp hfp.c $CFLAGS) $(LSFLAGS) -lasound

 

第二种:

all:hfp.c

       $(CC) -o hfp hfp.c `pkg-config --libs --cflags alsa`

其中环境变量PKG_CONFIG_PATH应该被指定为交叉编译出的alsa库路径,否则的话,系统默认安装的x86版本将会被include.

 

 编译alsa-util

CC=arm-none-linux-gnueabi-gcc ./configure --target=arm-linux --host=i686-linux --prefix=/home/ben/Works/Codes/alsa/alsautil_arm --with-alsa-inc-prefix=/home/ben/Works/Codes/alsa/alsalib_arm/include CFLAGS="-I/home/ben/Works/Codes/alsa/alsalib_arm/include" LDFLAGS="-L/home/ben/Works/Codes/alsa/alsalib_arm/lib -lasound"



参考方法五:

内核版本:由menuconfig配置文件TOP6410_3d.config编译所得内核2.6.28.6(使用老版28内核或使用默认menuconfig配置文件编译会出现alsa录音没有声音的问题)

文件系统版本:老版光盘中的ubifs即可

alsa-lib版本:1.0.9

alsa-util版本:1.0.9a

其他版本的alsa-lib和alsa-util不能保证正常工作


在上述版本的内核、ubifs已成功烧录至6410后(调试阶段也可采用tftp下载内核、nfs挂载ubifs),开始下面的工作

首先在Ubuntu上交叉、编译alsa-lib和alsa-util

1.解压alsa-lib-1.0.9.tar,进入解压所得目录

2.使用命令

./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa

Tips:--host参数指定了交叉编译器为“arm-none-linux-gnueabi-gcc",因此必须确保交叉编译器已成功配置,www.linuxidc.com且可以在shell里直接调用;--prefix参数指定了alsa-lib的目标安装目录,之后的alsa-util配置也一样

3.使用命令

make

sudo make install

Tips:make install必须加上sudo,因为在install过程中会创建某些目录

4.解压alsa-util-1.0.9a.tar,进入解压所得目录

5.使用命令

./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa --with-alsa-inc-prefix=/usr/share/arm-alsa/include --with-alsa-prefix=/usr/share/arm-alsa/lib --disable-alsamixer

Tips:--with-alsa-inc-prefix和--with-alsa-prefix分别指定了交叉编译util应用所需要的alsa-lib的头文件和库文件;--disable-alsamixer表示不编译生成alsamixer这个应用程序,因为该程序依赖于ncurses这个图形界面库,目前我们对于该库还不能交叉编译,故放弃

6.使用命令

touch alsaconf/po/t-ja.gmo

避免之后make报错

7.使用命令

make

sudo make install

至此Ubuntu上的工作全部结束


接着要在6410上部署已交叉编译好的alsa-lib和alsa-util

为便于理解,设6410的根目录为$rootfs

1.将Ubuntu中alsa安装目录下的所有文件移至6410的对应目录(绝对路径必须一致),使用命令

sudo cp -r /usr/share/arm-alsa $rootfs/usr/share/

2.将alsa安装目录下已交叉编译好的alsa库移至6410的默认库搜索目录,使用命令

sudo cp -r $rootfs/usr/share/arm-alsa/lib/* $rootfs/lib/

3.将alsa安装目录下已交叉编译好的alsa-util应用程序移至6410默认应用程序搜索目录,使用命令

sudo cp -r $rootfs/usr/share/arm-alsa/bin/* $rootfs/usr/sbin/

sudo cp -r $rootfs/usr/share/arm-alsa/sbin/* $rootfs/usr/sbin/

4.编辑$rootfs/etc/init.d/rcS,添加如下几行

[plain]
  1. #alsa_init  
  2. mkdir /dev/snd  
  3. ln /dev/controlC0 /dev/snd/controlC0  
  4. ln /dev/pcmC0D0c /dev/snd/pcmC0D0c  
  5. ln /dev/pcmC0D0p /dev/snd/pcmC0D0p  
  6. ln /dev/timer /dev/snd/timer  
  7.   
  8. amixer cset numid=86 2  
  9. amixer cset numid=87 2  
Tips:amixer的两句命令,是将amixer的默认设置'Left Capture Source'和'Right Capture Source'的值改为'Line‘,否则会出现alsa录音没有声音的问题

5.编辑$rootfs/etc/profile,添加如下两行

[plain]
  1. #alsa_init  
  2. export ALSA_CONFIG_PATH=/usr/share/arm-alsa/share/alsa/alsa.conf  
Tips:该环境变量的值必须与alsa安装目录保持一致,否则使用aplay和arecord时会报错

至此alsa-lib、alsa-util移植完毕


测试

1.测试能否正常播放,使用命令

aplay test1.wav

test1.wav为已录制好的正常音频文件

2.测试能否正常录音,使用命令

arecord -d 10 -fdat test2.wav

-d表示录制时间为10秒,-fdat表示以dat质量进行录制(决定了采样率、声道等参数)


参考方法六:

情况简介

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

 

参考方法七:

reference http://blog.csdn.net/lanmanck/article/details/5829143
                http://dev.hqyj.com/column/column3.htm
1.tar -xvf alsa-lib_1.0.23.orig.tar.bz2 
 ./configure --host=arm-linux --prefix=/home/ALSA/alsa_lib 
make
make install
生成的库
alsa_lib$ ls
bin  include  lib  share
在这个文件lib下的库*.so.*是要发布到板子上去的,可以直接copy到开发板的根目录lib下
(这里只是copy,不要剪贴,后面还要用到,注意的是有些软连接不能copy,只能自己到板子上创建。。。)

2.tar -xvf alsa-utils-1.0.23.tar.bz2 
./configure --host=arm-linux --prefix=/home/ALSA/alsa_utils 
--with-alsa-inc-prefix=/home/ALSA/alsa_lib/include 
--with-alsa-prefix=/home/ALSA/alsa_lib/lib 
--disable-alsamixer --disable-xmlto 
error:
mv: cannot stat `t-ja.gmo': No such file or directory
解决方法是下载gettext: apt-get install gettext
make
make install
成功以后,你会在自己的alsa-utils安装路径下的bin目录下见到生成的工具
aconnect  amidi  amixer  aplay  aplaymidi  arecord  arecordmidi  aseqdump  aseqnet  iecset  speaker-test
3.alsa_lib 
cp ALSA/alsa_lib/lib/libasound.* ./nfsdir_linux/lib/
alsa的配置文件拷贝
除了库之外alsa的配置文件也需要拷贝到目标板根文件系统中
这里需要注意的是share目录在目标板的存放位置必须和在主机的存放路径一致,
比如在主机上存放在/home/david/project/S5PC100/alsa/alsa-lib,
那么我们就得把share放在目标板上的这个路径里
cp -rf share /home/nfsdir_linux/home/ALSA/alsa_lib/
alsa_utils

将alsa-utils/bin目录下的内容拷贝到目标板根文件系统中的bin下
cp bin/* /home/nfsdir_linux/bin/

4.测试
#cat /proc/asound/devices 
  0: [ 0]   : control
 16: [ 0- 0]: digital audio playback
 24: [ 0- 0]: digital audio capture
 33:        : timer
# ls -l /dev/snd/
crw-rw---- system   audio    116,  33 1970-01-01 00:00 timer 定时器接口
crw-rw---- system   audio    116,   0 1970-01-01 00:00 controlC0 控制接口
crw-rw---- system   audio    116,  24 1970-01-01 00:00 pcmC0D0c   PCM接口
crw-rw---- system   audio    116,  16 1970-01-01 00:00 pcmC0D0p
如果没有snd目录则创建
播放wav文件
aplay test.wav 
Playing WAVE 'test.wav' : Unsigned 8 bit, Rate 16000 Hz, Mono
录音
 arecord -d 20 -c 2 -t wav -r 8000 -f "Signed 16 bit Little Endian" a.wav
 以20秒的间隔(-d 20),立体声(-c 2),频率是 8000Hz来录制Wave格式音频



注:以上方法只为备注,尚未亲测成功,仅供参考。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值