alsa 库移植与声音编程
- 格式:docx
- 大小:32.61 KB
- 文档页数:16
在移植alsa-lib和alsa-utils之前首先要移植alsa-device,保证系统支持alsa驱动,移好alsa-device后再dev/snd后出现相应的设备:
controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克风的控制等
midiC0D0 --> 用于播放midi音频
pcmC0D0c --〉 用于录音的pcm设备
pcmC0D0p --〉 用于播放的pcm设备
seq --〉 音序器
timer --〉 定时器
1. tar -xvf alsa-lib_1.0.23.orig.tar.bz2
(1) 配置alsa-lib
./configure --host=arm-fsl-linux-gnueabi
--prefix=/opt/ALSA/alsa_lib
CC=/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-fsl-linux-gnueabi-gcc
error:
configure error required courses helper header not found
安装libncursesw5-dev。apt-get install libncursesw5-dev
configure: error: panelw library not found
./configure加入 --with-curses=ncurses
/bin/bash: xmlto: command not found
安装xmlto
/bin/rm: cannot remove `libtoolt': No such file or directory
强制make!
(2)
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-fsl-linux-gnueabi
--prefix=/opt/ALSA/alsa_utils/
--with-alsa-inc-prefix=/opt/ALSA/alsa_lib/include/
--with-alsa-prefix=/opt/ALSA/alsa_lib/lib/
--disable-alsamixer --disable-xmlto
注:
--with-alsa-inc-prefix:指定头文件为alsa-lib编译出来的头文件路径
--with-alsa-prefix:指定库文件为alsa-lib编译出来的库文件路径
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文件 1、查看声卡设备 Aplay –l
2、打开设备和调节音量
amixer -c 0 sset Master,0 80%,40% unmute cap
amixer -c 0 sset PCM,0 80%,40% unmute cap
设置第1块声卡的"Master"和“PCM”的左声道音量为80%,右声道为40%,取消静音,并设置
3、播放音乐
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格式音频
alsa-utils工具的使用 :
alsa-utils包含的工具有:
alsactl, aconnect, alsamixer, amidi, amixer, aplay, aplaymidi, arecord, arecordmidi,
aseqnet, iecset, speaker-test
amixer controls
查看可以控制的选项,可以通过numid控制
amixer contents
查看声卡内容
amixer cget numid=(amixer controls 显示的)查看具体的选项
amixer cset controls中所输出的某个参数 具体的值(比如,0,1,On,Off等)
1.alsactl
alsactl用来对alsa声卡驱动进行一些高级的设置.系统中装有多个声卡,它也可以支持.
有时在音量控制面板无法调整的选项,可以使用alsactl来实现.
alsactl可以将指定声卡的驱动程序设置信息保存到配置文件.或从配置文件中恢复指定
声卡的驱动程序的设置信息.
alsactl格式:
alsactl [options] [store|restore]
选项:
-h, --help
打印帮助信息
-f, --file
指定使用的配置文件,默认为/etc/asound.state.
Select the configuration file to use. The default is
/etc/asound.state
-F, --force
与恢复命令一起使用.表示最大限度的恢复设置值.
-d, --debug
调试模式,输出更多细节信息.
-v, --version
打印alsactl版本号.
文件:
/etc/asound.state(或使用-f指定的文件)保存有声卡所有混合器的设置信息.
示例:
# rm /etc/asound.state -f
# alsactl store
2.aconnect
aconnect是ALSA音序器的连接管理器.用来连接或断开ALSA音序器上的端口.端口是
可以随意定义的.
如,使用aconnect可以连接到任何由aseqview建立的设备端口. 命令格式:
aconnect [-d] [-options] sender receiver
aconnect -i|-o [-options]
aconnect -x
选项:
连接管理
-d, --disconnect
断开连接.
-e, --exclusive
使用独占模式连接端口.发送和接收端口将不能再与其他端口相连.
-r, --real queue
将时间包的时间戳,转换为真实时间队列的当前值.
显示端口
-i, --input
显示存在的输入端口.
-o, --output
显示存在的输出端口.
-l, --list
显示当前的连接状态.
删除连接
-x, --removeall
删除所有连接.
示例:
连接端口64:0到65:0:
% aconnect 64:0 65:0
这个连接是单向的,所有到发送端口64:0的数据,将被重定向到接收65:0端口.如果有另一个端口65:1,
也使用64:0作为发送端口,则数据会同时发送到2个接收端口.
端口连接时,使用:
% aconnect -d 64:0 65:0
地址也可以使用客户端的名字来代替:
% aconnect External:0 Emu8000:1
使用-i打印出输入端口信息.-o打印出输出端口信息.
% aconnect -i
client 0: ’System’ [type=kernel]
0 ’Timer ’