mips架构下alsa结构声音移植笔记

来源:互联网 发布:电视如何解除网络禁用 编辑:程序博客网 时间:2024/06/05 05:05

首先你需要查看linux内核的ALSA版本,方法:cat /proc/asound/version

下载alsa-utils, alsa-lib(注:版本要一致)

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

或:ftp://ftp.alsa-project.org/pub/


编译alsa-lib

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --disable-python --prefix=/usr/share/mips-alsa

 

如果出现下列错误信息,--disable-pyhont

collect2: ld returned 1 exit status

make[3]: *** [smixer-python.la] 错误 1

make[3]: Leaving directory `/home/enzo/work/tq2440/alsa/alsa-lib-1.0.26/

modules/mixer/simple'

make[2]: *** [all-recursive] 错误 1

make[2]: Leaving directory `/home/enzo/work/tq2440/alsa/alsa-lib-1.0.26/

modules/mixer'

make[1]: *** [all-recursive] 错误 1

make[1]: Leaving directory `/home/enzo/work/tq2440/alsa/alsa-lib-1.0.26/

modules'

 

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

 

 

变换到root身份

# sudo su

alsa-libmake install时还需要交叉编译,因此需要将交叉编译器的路径加入到PATH环境变量中

#export PATH=$PATH:/usr/local/arm/4.3.2/bin && make install

 

l  编译alsa-utils

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --prefix=/usr/share/mips-alsa --with-alsa-inc-prefix=/usr/share/mips-alsa/include --with-alsa-prefix=/usr/share/mips-alsa/lib --disable-xmlto --disable-alsamixer

 

l  复制alsa-lib, alsa-utils 到开发板

开发板的复制路径不是随便设置,必须和主机编译时相同的路径,否则动态库无法找到某些文件

 

所以要把/usr/share/arm-alsa文件夹得内容复制到开发板/usr/share/arm-alsa

 

复制alsa lib到开发板/lib文件夹下


 

 

/dev 目录下已经包含一下设备

/dev/controlC0 ,/dev/pcmC0D0p , /dev/pcmC0D0c, /dev/mixer, /dev/timer

[root@EmbedSky /]# ls /dev/pcm*

/dev/pcmC0D0c  /dev/pcmC0D0p

[root@EmbedSky /]# ls /dev/con*

/dev/console    /dev/controlC0

[root@EmbedSky /]# ls /dev/mix*

/dev/mice   /dev/mixer

[root@EmbedSky /]# ls /dev/tim*

/dev/timer

 

测试aplay程序

[root@EmbedSky bin]# ./aplay  test1.wav

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

ALSA lib conf.c:4246:(_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:4246:(_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:4246:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory

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

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

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

 

此时需要创建声卡节点到/dev/snd/

需要手动创建节点

我的alsa_conf.sh脚本


#!/bin/sh 
#Add by armmlinux for alsa auto  conf 2014-09-02
echo "make lib."
cp /media/sda1/bin_mips_alsa/mips-alsa/lib/libasound.so.2.0.0  /lib/
ln -s /lib/libasound.so.2.0.0 /lib/libasound.so.2

cp /media/sda1/bin_mips_alsa/mips-alsa/bin/aplay /bin/
cp /media/sda1/bin_mips_alsa/mips-alsa/bin/arecord /bin/

echo "set env."
mkdir -p /usr/share/mips-alsa/share
cp /media/sda1/bin_mips_alsa/mips-alsa/share/alsa/ /usr/share/mips-alsa/share/ -ar
export ALSA_CONFIG_PATH=/usr/share/mips-alsa/share/alsa/alsa.conf

echo "make snd node."
mkdir /dev/snd
ln -s /dev/controlC0 /dev/snd/controlC0 //有的可能是pcmC3D0c,以下同理,可以自己查看:ls /dev/pcm*(插入usb声卡与不查对比即可确认你的USB声卡是那个)
ln -s /dev/pcmC0D0c /dev/snd/pcmC0D0c
ln -s /dev/pcmC0D0p /dev/snd/pcmC0D0p
ln -s /dev/timer /dev/snd/timer
ln -s /dev/mixer /dev/snd/mixer

export ALSA_CONFIG_PATH=/usr/share/mips-alsa/share/alsa/alsa.conf

echo "Add group."

echo "audio:x:63:" >> /etc/group

#end

# volumn设置声音大小

amixer cset numid=1 45   

成功配置后


./aplay /media/sda1/testZdf.wav 报错(如下):

ALSA lib pcm_direct.c:1591:(snd_pcm_direct_parse_open_conf) The field ipc_gid must be a valid group (create group audio)

aplay: main:545: audio open error: Invalid argument

这样的错误是由于没有组用户,我们做如下操作即可:

cat /etc/group 
admin:x:0:admin
anonymous:x:500:anonymous

看看,没有audio的组,那我们自己添加audio的组,如下

vi /etc/group 
admin:x:0:admin
audio:x:0:audio          
anonymous:x:500:anonymous

保存退出即可。

l  Alsa声卡配置


** alsa声卡可以正常工作,amixer 设置

 

*** amixer 用法

#amixer cset numid=N  value        //设置变量,numid对应contentsid

#amixer cget numid=N               //获取amixer的某个设置

 

[root@EmbedSky /mnt]# amixer contents

numid=1,iface=MIXER,name='Master Playback Volume'

  ; type=INTEGER,access=rw------,values=1,min=0,max=63,step=0

  : values=50

numid=7,iface=MIXER,name='Tone Control - Bass'

  ; type=INTEGER,access=rw------,values=1,min=0,max=15,step=0

  : values=0

numid=8,iface=MIXER,name='Tone Control - Treble'

  ; type=INTEGER,access=rw------,values=1,min=0,max=3,step=0

  : values=0

numid=10,iface=MIXER,name='PCM Playback De-emphasis'

  ; type=ENUMERATED,access=rw------,values=1,items=4

  ; Item #0 'None'

  ; Item #1 '32Khz'

  ; Item #2 '44.1Khz'

  ; Item #3 '48Khz'

  : values=0

numid=5,iface=MIXER,name='Mic Sensitivity'

  ; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0

  : values=1

numid=6,iface=MIXER,name='Mic Volume'

  ; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0

  : values=0

numid=16,iface=MIXER,name='ADC +6dB Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=17,iface=MIXER,name='ADC Polarity Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=2,iface=MIXER,name='Capture Volume'

  ; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0

  : values=1

numid=12,iface=MIXER,name='AGC Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=13,iface=MIXER,name='AGC Target Volume'

  ; type=INTEGER,access=rw------,values=1,min=0,max=3,step=0

  : values=3

numid=14,iface=MIXER,name='AGC Timing'

  ; type=INTEGER,access=rw------,values=1,min=0,max=7,step=0

  : values=0

numid=3,iface=MIXER,name='Analog1 Volume'

  ; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0

  : values=27

numid=4,iface=MIXER,name='Analog2 Volume'

  ; type=INTEGER,access=rw------,values=1,min=0,max=31,step=0

  : values=27

numid=15,iface=MIXER,name='DAC +6dB Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=18,iface=MIXER,name='DAC Polarity Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=20,iface=MIXER,name='DC Filter Enable Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=19,iface=MIXER,name='Double Speed Playback Switch'

  ; type=BOOLEAN,access=rw------,values=1

  : values=off

numid=11,iface=MIXER,name='Input Mux'

  ; type=ENUMERATED,access=rw------,values=1,items=4

  ; Item #0 'Differential'

  ; Item #1 'Analog1'

  ; Item #2 'Analog2'

  ; Item #3 'Both'

  : values=0

numid=9,iface=MIXER,name='Sound Processing Filter'

  ; type=ENUMERATED,access=rw------,values=1,items=4

  ; Item #0 'Flat'

  ; Item #1 'Minimum1'

  ; Item #2 'Minimum2'

  ; Item #3 'Maximum'

  : values=0

 

l  声卡测试

** 播放

[root@EmbedSky /mnt]# aplay sound_check.wav

Playing WAVE 'sound_check.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

** 录音

播放命令

arecord -d 1 -t wav -c2 -r 8000 -f  S16_LE test1.wav

arecord -d 60 -t wav -c2 -r 8000 -f S16_LE test1.wav

 

-d  录音时间,单位秒

-c 声道数

-r 采样频率

-f  采样格式, 16bit  小端

 

 

** 播放的同时录音


 

1.       分别开两个终端,其中一个播放, 播放的声音无断断续续等异常

aplay sound_check.wav

另一个随机录音

arecord -d 3 -t wav -c2 -r 8000 -f S16_LE test1.wav

 

2 录音1分钟, 另一个终端随机播放, 然后听录音后的文件,没有任何噪声,中断和异常

arecord -d 60 -t wav -c2 -r 8000 -f S16_LE test1.wav

 

aplay test1.wav

 

** 双声道录音后播放是否正常(未测试)

 

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 股东迟迟不交齐股本金怎么办 wps转pdf就乱了怎么办 被有用分期骗了怎么办 找不到以前有用分期的账号怎么办 打工去韩国不懂韩语怎么办? 想去韩国整容没钱怎么办 专接本没接上怎么办 抄写经文写错了怎么办 在外地修车被宰怎么办 国外汇款公司名称写错了怎么办 增值税专票没有机器编码怎么办 发票右上角的编码打不全怎么办 税票名称开错了怎么办 开票名称开错了怎么办 退休党员不交党费怎么办 cad打不出来字怎么办 用cad打不出来字怎么办 打字总打错字母怎么办 mac做ppt卡住了怎么办 mac的ppt卡住了怎么办 淘宝店铺被屏蔽了怎么办 淘宝申请售后卖家拒绝怎么办 淘宝投诉卖家入口关闭怎么办 遇见最喜欢孩子的父母怎么办 房屋备案表丢了怎么办 淘宝发布商品没有品牌怎么办 电子发票名称写错了怎么办 合同写错了划掉怎么办 进京证日期错了怎么办 买车时谈的协议与合同不一致怎么办 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办