1  alsa-lib的移植

1.1  软件包下载

alsa-lib库:进入网站http://www.alsa-project.org/选择下载,在这里下载的是alsa-lib-1.0.22.tar.bz2假设该软件包存放在目录/home/alsa中

1.2 安装alsa-lib

安装路径在本例中,安装路径为/usr/local/custom_install_arm/alsa_lib,因此如果没有该路径中的某些目录,需要创建这些目录。

编译安装alsa-lib执行如下操作

#cd  /home/alsa/

#tar -jxv -f alsa-lib-1.0.22.tar.bz2

#cd  /home/alsa/alsa-lib-1.0.22

#./configure  --host=arm-linux  CC=arm-linux-gcc  --enable-static  --enable-shared  --disable-Python

--prefix=/usr/local/custom_install_arm/alsa_lib

//=========================================================

//---------------------------------------------------------------------------------------------------

说明:

(1)  如果需要自定义include/config.h中ALSA_CONFIG_DIR的值,可通过参数--with-configdir指定,即alsa.conf文件安装路径,默认值是--prefix指定的路径值/share/alsa/

(1)  如果需要自定义include/config.h中ALSA_PLUGIN_DIR的值,可通过参数--with-plugindir指定,即smixer的安装路径,默认值是--prefix指定的路径值/lib/alsa-lib/

//---------------------------------------------------------------------------------------------------

//=========================================================

#make

#make install

该步骤执行完成之后,alsa-lib的相关文件就会安装到pc机中configure步骤先关参数指定的路径中。

1.3  移植alsa-lib

alsa-lib编译安装完成之后,进行如下操作

(1)  将参数--prefix指定的路径值/lib下的动态库文件移植到arm linux系统的文件系统的/usr/lib/目录中

(2)  将--with-configdir指定的目录的所有内容(主要是alsa.conf)移植到arm linux系统的文件系统中的相同的目录路径中

(3)  其它内容可以移植,也快以不移植,但是如果移植,那么它们在arm linux系统中的目录路径必须和其在pc机上的安装路径相同

2  alsa-utils的移植

2.1  软件包下载

alsa-utils工具包:进入网站http://www.alsa-project.org/选择下载,在这里下载的是alsa-utils-1.0.22.tar.bz2

2.2  安装alsa-utils

安装路径

编译安装执行如下操作:

#cd  /home/alsa/

#tar -jxv -f alsa-utils-1.0.22.tar.bz2

#cd  /home/alsa/alsa-utils-1.0.22/

如果pkgconfig不是默认路径(alsa-lib安装路径/lib/),则可执行如下操作重新指定:

#PKG_CONFIG_PATH="/usr/local/custom_install_arm/alsa_lib/lib/pkgconfig"

继续执行如下操作

#./configure --host=arm-linux  CC=arm-linux-gcc  --disable-alsamixer  --disable-xmlto  CPPFLAGS=-I/usr/local/custom_install_arm/alsa_lib/include  LDFLAGS=-L/usr/local/custom_install_arm/alsa_lib/lib  --with-alsa-prefix=/usr/local/custom_install_arm/alsa_lib/lib

--with-alsa-inc-prefix=/usr/local/custom_install_arm/alsa_lib/include  --prefix=/usr/local/custom_install_arm/alsa_utils

#make

#make install

该步骤完成之后,alsa-utils的相关文件就会安装到pc机中configure步骤先关参数指定的路径中。

2.3  移植alsa-utils

alsa-utils编译安装完成之后,进行如下操作

(1)  将参数--prefix指定的路径值/bin/目录中的文件移植到arm linux系统中的/usr/bin或其它目录中,如果移植到其它目录中,则需要将该目录添加到环境变量PATH指的执行路径中

(2)  将参数--prefix指定的路径值/sbin/目录中的文件移植到arm linux系统中的/usr/bin或其它目录中,如果移植到其它目录中,则需要将该目录添加到环境变量PATH指的执行路径中

(3)  参数--prefix指定的路径值/share/目录中的内容可以移植也可以不移植,如果移植,则移植到arm linux系统中的目录路径和其在pc中的安装路径相同

alsa 是在LINUX出现比较晚的音频处理库,主要是针对原有的OSS的库进行改进.性能更好,支持多个播放源等.但相应的,增加的编程的复杂性.

旧的oss是采用标准文件IO接口,设备打开采用open,声音播录是采用数据IO接口(read/write),设备的参数采用ioctl来控制.都是系统调用因此无需额外库和配置文件来操作设备.但alsa也是最终采用open/read/write/ioctl,但操作结点更多.更复杂.因此在编程中是采用额外的库来操作的.

ALSA的体系结构

官方主页 http://www.alsa-project.org/

主要跟编程相关是

libasound.

Linux ALSA 驱动测试

以下是我在RHEL 5上测试ALSA的结果,在ARM或MIPS开发板上类似

如果安装ALSA,在/proc会看到相应设备:

用cat /proc/asound/devices

[root@hxy alsa-lib-1.0.22]# cat /proc/asound/devices

2:        : timer

3:        : sequencer

4: [ 0- 0]: raw midi

5: [ 0- 1]: digital audio playback

6: [ 0- 0]: digital audio playback

7: [ 0- 0]: digital audio capture

8: [ 0]   : control

正常情况下,在你的/dev/snd会看到如下设备结点(有例外,就是内核驱动调整了结点位置)

用ls -l /dev/snd

[root@hxy alsa-lib-1.0.22]# ls -l /dev/sndtotal 0

crw------- 1 root root 116, 8 Mar  2 02:41 controlC0

crw------- 1 root root 116, 4 Mar  2 02:41 midiC0D0

crw------- 1 root root 116, 7 Mar  2 02:41 pcmC0D0c

crw------- 1 root root 116, 6 Mar  2 02:41 pcmC0D0p

crw------- 1 root root 116, 5 Mar  2 02:41 pcmC0D1p

crw------- 1 root root 116, 3 Mar  2 02:41 seq

crw------- 1 root root 116, 2 Mar  2 02:41 timer

通常桌面版已经安装了alsa-utils.可以执行一下aplay -h,测试是否输出.如果可以来播入一下wav文件来测试整个环境是否正常工作.

以下是一些用alsa-utils测试样例

播放wave文件

aplay /mnt/nfs/test.wav

变频播放,(以是以 44 KHz来播放音频)

aplay -D rate_44k /mnt/nfs/test.wav

录音,以20秒的间隔(-d 20),立体声(-c 2),频率是 8000Hz来录制Wave格式音频

arecord -d 20 -c 2 -t wav -r 8000 -f "Signed 16 bit Little Endian" /mnt/nfs/test.wav

测试混音播放(先是播放test1.wav,然后再同时播放test2.wav)

aplay -D plug:dmix_44k /mnt/nfs/test1.wav &

aplay -D plug:dmix_44k /mnt/nfs/test2.wav

设置放音增益(0 to 3)

amixer set Master 1

设置录音音量(0-31)

amixer set Line 10

嵌入式LINUX下 alsa库移植.

在ARM-LINUX/MIPS LINUX下移植ALSA库,首先保存设备驱动结点正确无误.

然后主要移植 alsa-lib

alsa-lib的移植.

解压 tar xvjf alsa-lib-1.0.22.tar.bz2

cd alsa-lib-1.0.22

生成Makefile

./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-static --enable-shared  --disable-python  --with-configdir=/usr/local/share --with-plugindir=/usr/local/lib/alsa_lib

在这里要注意 --with--configdir的选项.它将影响 include/config.h中的 ALSA_CONFIG_DIR 目录.

它默认是你的--prefix目录.这样在嵌入式交叉编译将是一个桌面机的路径,在libasoud.so运行.会提示,如果出来这个提示,一般都是ALSA_CONFIG_DIR路径错误造成的.

ALSA lib pcm.c:2145:(snd_pcm_open_noupdate) Unknown PCM default

aplay: main:546: audio open error: No such file or directory

--with-plugindir也是同样道理了.它是设为 ALSA_PLUGIN_DIR 宏.

编译 make

安装 make install

开发板发布注意:

在开发板上发布alsa库.除了libasound.so库以外,必须还要把 alsa.conf发布到板上--with-configdir所指向目录下的alsa目录,否则还是会报"audio open error: No such file or directory".

这个文件可以在make install后在你安装目录下的share找到alsa目录,把这个目录整个拷贝到开发板即可.

alsa-utils移植

解压:tar xvjf alsa-utils-1.0.22.tar.bz2

cd alsa-utils-1.0.22

生成Makefile

./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-static --enable-shared    --with-configdir=/usr/local/share --with-libiconv-prefix=$PWD/../../output/arm-linux CFLAGS="-I$PWD/../../output/arm-linux/include" LDFLAGS="-L$PWD/../../output/arm-linux/lib

-lasound -liconv"  --disable-alsamixer --disable-xmlto

注意这里LDFLAGS是必须,否则会找不到libasound.另外 alsamixer 是一个ncurses程序,基本上在嵌入式终端上很难移植.所以这里取消掉.--disable-xmlto也是因为找不到库.

编译 make

安装 make install

下载

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

MIPS:

alsa-lib-1.0.24.1配置编译

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --prefix=/opt/mips/alsa_lib/  --enable-shared --disable-Python

alsa-utils-1.0.24.2配置编译

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --prefix=/opt/mips/alsa_utils/ --host=mips --with-alsa-prefix=/opt/mips/alsa_lib/lib_1.0.24.1/lib/ --with-alsa-inc-prefix=/opt/mips/alsa_lib/lib_1.0.24.1/include/

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --prefix=/home/armmlinux/zdfwork/project/audio/alsa/output/mips-linux/  --enable-shared --disable-python  --with--configdir=/lib/

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

一、PC端使用alsa

1)PC上使用alsa时,正常的安装alsa-lib和alsa-util即可,alsa-lib提供alsa音频程序运行所需要的库,alsa-util主要生成可执行程序,在程序运行时,在link里添加-lasound即可使用

2)PC端使用alsa编程,具体过程可以参考网上的链接,基本都是一样的

二、将alsa移植到arm时的步骤

1.alsa交叉编译

>下载alsa-lib和alsa-util

>切换到alsa-lib目录下,执行

./configure --host=arm-linux-gnueabihf --prefix=/usr/local/share/arm-alsa --enable-shared --disable-python --with-configdir=/usr/local/share/alsa --with-plugindir=/usr/local/lib/alsa_lib CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld

解释:1)一般在makefile时,部分程序会首先执行配置文件进行配置,然后再生成makefile文件,注意不同工程的配置方案并不相同,这些命令不一定在其他配置文件中也能使用

2)--host:为使用的交叉编译工具名,直接使用arm-linux也可以,根据PC上安装的交叉编译工具来决定;

3)--prefix:即make install时程序安装的目录,可以根据自己的情况进行修改,不用拘泥

4)--enable:开启功能  --disable:关闭功能

5)--with-configdir:alsa配置文件所在目录,本目录要定好位置,交叉编译过后,移植到板子上时要和PC上路径一致。默认alsa配置文件会在安装目录里,不过根据经验,最好提出来,因为没有提出来的时候会报错

6)--with-plugindir:alsa_lib所在目录,目前意义不明,可以自由定位,也可以默认安装

7)CC,CXX,LD:我多带带加的,即配置生成的makefile文件中的编译工具为这几项

>切换到alsa-util目录下,执行

./configure --host=arm-linux-gnueabihf --prefix=/usr/local/share/arm-alsa CFLAGS="-I/usr/local/share/arm-alsa/include" LDFLAGS="-L/usr/local/share/arm-alsa/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/usr/local/share/arm-alsa/include

--with-alsa-prefix=/usr/local/share/arm-alsa/lib CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld

解释:1)注意其中几个特殊的命令就行,不过不能少

> 1)移植,将/usr/local/share目录下的alsa,arm-alsa拷贝到开发板的/usr/local/share目录下,将/usr/local/lib目录下的alsa_lib拷贝到开发板上/usr/local/lib目录下

2)将arm-alsa/lib目录下的文件拷贝到/lib目录下,sudo cp -rfa /usr/local/share/arm-alsa/lib /lib

3)将arm-alsa/bin目录下的文件拷贝到/sbin目录下,sudo cp -rfa /usr/local/share/arm-alsa/bin /sbin

4)将arm-alsa/sbin目录下的文件拷贝到/sbin目录下,sudo cp -rfa /usr/local/share/arm-alsa/bin /sbin

5)添加环境变量,执行 sudo vi /etc/profile,在结尾添加export ALSA_CONFIG_PATH=/usr/local/share/alsa/alsa.conf,然后执行source /etc/profile

解释:  1)移植时一定要和PC上目录对应

2)只需要库的话,alsa-util理论上不需要安装,也不用拷贝bin和sbin

3)PC上使用eclipse的远程登录直接拷贝到板子上可能存在可执行文件不能执行的问题,所以要对bin,sbin目录下的可执行文件赋权限,执行sudo chomd 777

4)cp命令中的-rfa是组合命令,r是可以循环层次拷贝文件夹,f是强制覆盖

5)环境变量的添加方法有多种,这里使用的是一种,还可以在/etc/bash.bash.rc等目录中添加,具体的运行机制略有不同,但都可以成功,具体可以网上查阅

>如果开发板上有正常的声卡配置,有3.5mm声音输入,以上步骤完成后就可以了,程序应该能正常运行,可以执行aplay和arecord等命令来测试

2.使用USB麦克风时

>USB麦克接入后

1)执行cat /proc/asound/cards,会输出接入声卡的信息,有默认系统的设备和自己的USB设备,对应有设备号

2)执行ls /dev/snd,会输出当前的设备,其中USB设备对应的为controlC1,pcmC1D0p(与之类似),其中C1b表示card 1,D0表示driver 1

>执行sudo ~/.asoundrc,在其中添加

pcm.!default {

type hw

card 1

device 0

}

ctl.!default {

type hw

card 1

device 0

}

解释: 1).asoundrc这个文件可能不存在,创建一个即可,因为程序在调用alsa时,会进入alsa.conf这个配置文件,这个配置文件会默认搜索到~/.asoundrc

2)card 1和driver 0要根据具体的编号来定

3)ls /dev/snd目录下可能会没有设备,这个时候需要参考网上的建议,使用链接命令或者直接将设备拷贝到这个目录下

>重启操作系统,然后即可运行,可能程序在运行时需要使用管理员权限,不然会报错

3.待解决问题

到上述步骤为止,已经能够录音,不过还是有点问题,声音比较嘈杂,还有是单声道录音,这些可以通过amixer命令来解决,具体的可以网上查找,非常多参考资料

三、出错记录

1)情况1

ALSA lib confmisc.c:768:(parse_card) cannot find card '0'

ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory

ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings

ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory

ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name

ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory

ALSA lib conf.c:4720:(snd_config_expand) Evaluate error: No such file or directory

ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default

error opening PCM device: No such file or directory

出错原因:①交叉编译后拷贝配置文件时没有按照对应目录

②没有添加环境变量,或者添加环境变量后没有执行更新命令,/etc/profile对应的更新命令为source /etc/profile

③没有找到声卡,如果使用USB声卡时,默认没有加载成功

2)情况2

ALSA lib conf.c:3501:(snd_config_hook_load) cannot stat file/directory /usr/local/share/alsa/cards/aliases.confALSA lib conf.c:3501:(snd_config_hook_load) cannot stat file/directory /usr/local/share/alsa/cards/aliases.conf

ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.default

error opening PCM device: No such file or directory

出错原因:①重新交叉编译,将alsa的配置文件多带带放到一个位置,不要使用默认位置

3)情况3

ALSA lib pcm_hw_c(_snd_pcm_hw_open)invalid value for card

error opening PCM device: No such file or directory

出错原因:①.asoundrc中声卡的修改绑定有错误,需要重新按照正确的方式配置

4)情况4

error opening PCM device: No such file or directory

出错原因:程序可能需要管理员权限才能执行,将系统改为管理员权限运行或者执行sudo命令运行

5)情况5

PC下出错的原因一般只有两种,一种是没有安装好alsa,一种是在编译的时候没有添加链接库-lasound

四、参考链接:

1.alsa交叉编译

http://blog.sina.com.cn/s/blog_7d7e9d0f0101lqlp.html

http://www.cnblogs.com/tinz/archive/2012/02/24/2366151.html

http://blog.csdn.net/linweig/article/details/5459069

2.alsa编程

从底层来说明:http://www.ibm.com/developerworks/cn/linux/l-audio/

有详细解释的范例:http://blog.csdn.net/tianshuai1111/article/details/8191711

存为wav格式参考(有点小错误,仅供参考):http://blog.csdn.net/sea918/article/details/7249216

WAVE文件格式解析(当存储文件为wav格式时参考):http://www.cnblogs.com/liyiwen/archive/2010/04/19/1715715.html

一个简短的范例(有点小错误,仅供参考):http://blog.sina.com.cn/s/blog_705094cc010151pl.html

3.alsa配置相关(细节掌握)

.asoundrc说明:http://www.alsa-project.org/main/index.php/Asoundrc

有很多相关的查看声卡信息的命令(和系统有关,不一定都好使,选择使用)http://wiki.audacityteam.org/index.php?title=USB_mic_on_Linux

linux 混音处理 arm,alsa移植到arm linux嵌入式系统中相关推荐

  1. 混音 文件 生成 linux,linux 混音

    linux 混音 发布时间:2007-07-16 01:12:56来源:红联作者:Vegetable 翻译:firehare,大多数Linux初学者都遇到这样一个问题:"为什么我在同时打开两 ...

  2. linux 混音设备,一个linux 混音播放的 /etc/asound.conf 配置

    一个linux 混音播放的 /etc/asound.conf 配置 备用. 只有相同用户才能实现设备的同时打开. pcm.!dmix { type dmix ipc_key 5678293 ipc_k ...

  3. openssh arm linux 编译,openssh编译安装到ARM嵌入式系统中

    目录 一.SSHD编译(此步骤在虚拟机上执行) 1.1 在/root/目录下创建ssh目录 1.2 交叉编译zlib 1.3交叉编译openssl 1.4交叉编译openssh 二.移植(此步骤在开发 ...

  4. 嵌入式系统中打印机驱动的移植

    一.开发环境 硬件环境:DM365  打印机型号:HP P1007 虚拟机系统:Red Hat Enterprise Linux 5 交叉编译环境:Ti交叉编译环境安装包 二.详细步骤 1.下载Gho ...

  5. linux双显卡开机界面,使用双显卡导致在Deepin系统中关机或者重启卡死问题的解决方法...

    如果你在Deepin系统中使用双显卡,而从导致关机或者重启卡死问题,请参考以下方法解决. 问题细述 以本人的电脑为例,有集成显卡和NVIDIA独立显卡,刚开始安装Deepin的时候,关机或者重启总是卡 ...

  6. Linux嵌入式系统简答题复习

    1. 嵌入式系统的定义是什么? IEEE给出的嵌入式系统定义是:控制.监视或者辅助装置.机器和设备运行的装置. 目前国内的被普遍认同的定义是:以应用为中心,以计算机技术为基础.软件硬件可裁剪.适应应用 ...

  7. 嵌入式linux开发环境 cpu,嵌入式Linux开发环境的搭建之:U-Boot移植-嵌入式系统-与非网...

    5.2  U-Boot移植 5.2.1  Bootloader介绍 1.概念 简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序.通过这段程序,可以 ...

  8. android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...

    摘要:本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统.为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相 ...

  9. 实时音频混音技术在视频直播中的实践应用

    作者:冼牛 转自:前端之巅 最近半年,视频直播领域中产生不少创新玩法,其中包括 K 歌直播和合唱直播.这些创新玩法都用到实时音频混音技术.今天我们来聊一下混音技术的实现,及其在创新玩法中的应用. 混音 ...

最新文章

  1. CVPR 2022|重新思考对齐Prototype的域自适应:基于Graph Matching的新范式
  2. 当全家人一起看电影,播到羞羞镜头时......
  3. 冯长根教授:博士生其实不是学生
  4. 《万物互联》——2.3 理解智能设备
  5. mysql 安装部署
  6. 《数据库系统概念》19-并发控制
  7. 浅谈SQL Server中的快照
  8. 【车间调度】基于matlab遗传算法求解车间调度问题【含Matlab源码 1396期】
  9. 日志分隔工具Cronolog
  10. matlab生成低通滤波,用matlab设计低通滤波器
  11. DSP eQEP正交编码
  12. 【软考信息系统项目管理师】必背重点之信息化和信息系统
  13. python生成泊松分布随机数_Python-Numpy-Poisson分布
  14. python求斜率_如何计算numpy中的斜率
  15. 机器学习的方法排名靠前的十种方法介绍
  16. linux + colmap 错误汇总
  17. 怎么区分静态网页和动态网页
  18. 十七、网上商城项目(6)
  19. 第二章:Swagger2
  20. MyBatis打印日志查询0条数据库却可以查到

热门文章

  1. 石头剪子布蜥蜴史波克python_生活大爆炸版剪刀石头布[算法竞赛]
  2. sublime text 3 安装 Emmet 插件
  3. 听力阈值计算_听力损失到什么程度,一张图就看懂了
  4. 便利贴--33{uniapp中提示音的处理,动态输出}
  5. 实验五 显示进程的虚拟内存地址空间分布信息
  6. Nero9到底想干什么啊?
  7. 读书的心情总是那么好,心情愉悦
  8. Python数据类型有哪些
  9. 记·Windows挖矿病毒应急响应
  10. C++11新特性之nullptr