参考方法一:
内核版本:由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,添加如下几行
- #alsa_init
- mkdir /dev/snd
- ln /dev/controlC0 /dev/snd/controlC0
- ln /dev/pcmC0D0c /dev/snd/pcmC0D0c
- ln /dev/pcmC0D0p /dev/snd/pcmC0D0p
- ln /dev/timer /dev/snd/timer
- amixer cset numid=86 2
- amixer cset numid=87 2
5.编辑$rootfs/etc/profile,添加如下两行
- #alsa_init
- export ALSA_CONFIG_PATH=/usr/share/arm-alsa/share/alsa/alsa.conf
至此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,添加如下几行
- #alsa_init
- mkdir /dev/snd
- ln /dev/controlC0 /dev/snd/controlC0
- ln /dev/pcmC0D0c /dev/snd/pcmC0D0c
- ln /dev/pcmC0D0p /dev/snd/pcmC0D0p
- ln /dev/timer /dev/snd/timer
- amixer cset numid=86 2
- amixer cset numid=87 2
5.编辑$rootfs/etc/profile,添加如下两行
- #alsa_init
- export ALSA_CONFIG_PATH=/usr/share/arm-alsa/share/alsa/alsa.conf
至此alsa-lib、alsa-util移植完毕
测试
1.测试能否正常播放,使用命令
aplay test1.wav
test1.wav为已录制好的正常音频文件
2.测试能否正常录音,使用命令
-d表示录制时间为10秒,-fdat表示以dat质量进行录制(决定了采样率、声道等参数)arecord -d 10 -fdat test2.wav
参考方法六:
情况简介
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格式音频
注:以上方法只为备注,尚未亲测成功,仅供参考。