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

首先你需要查看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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武溪嵌人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值