alsa工具集
- aplay,arecord
用于播放和录制音频等, 支持RAW PCM、WAVE、AU、VOC文件类型; 用于操作PCM接口。
查看声卡设备和PCM设备。
aplay -l
arecord -l - alsamixer,amixer
alsamixer是Linux音频框架ALSA工具之一,用于配置音频各个参数;
alsamixer是基于文本图形界面的,可以在终端中显示,通过键盘的上下键,左右键等实现音量设置,开关操作等。
amixer,是alsamixer的文本模式,即命令行模式,以命令行的形式去配置声卡的各个选项,比如选择音频输入通道是Mic输入,还是Line输入。 - alsactl
控制ALSA声卡驱动的高级设置; 用于操作控制器(Control)接口。
查看alsa版本
alsactl -v
设备接口
在ALSA中, 声卡硬件对应于Card, ALSA可支持多达八个声卡.
声卡包含多个设备(Device), 设备从0开始标识; 设备(Device)有不同的类型(Type), 如播放(Playback)、录制(Capture)、控制器(control)、定时器(timer)、序列器(sequencer), 当没有指定设备时, 默认的设备号为0。
设备可能包含多个子设备(SubDevice), 子设备也是从0开始标识; 一个子设备代表了设备的声音通道(???some relevant sound endpoint for the device???), 如果子设备未指定或子设备号指定为-1, 则使用任何可用的子设备。
设备命名
- hw:使用hw插件, 提供对内核设备的直接访问, 但不支持软件混合或流适配, 只支持单声道输入输出.
通常使用hw:x,y 其中x代表声卡号(card number),y代表对应设备号(device number). - default,即使用hw插件作为从属设备的plug插件, 也是默认接口, 通常被定义为hw:0,0, 即默认声卡上默认的设备
查看当前电脑中的声卡和声卡设备信息:
cat /proc/asound/cards
cat /proc/asound/devices
underrun和overrun错误
定义
linux错误码定义:
#define EPIPE 32 /* Broken pipe */
播放pcm时,snd_pcm_lib_write() 返回 -EPIPE,为underrun问题. 上层给下面喂数据的速度慢了, 底层驱动buffer没有数据可以丢给codec , 所以给上层返回一个-EPIPE错误出来。
录制音频时,snd_pcm_lib_read() 返回 -EPIPE, 为overrun问题. ALSA的驱动一块专门用来存储录音数据的buffer,上层从驱动buffer搬运数据到应用层,再存储起来就能得到录音文件。上层读录音buffer数据的速度太慢,导致驱动的buffer满了,就会出现-EPIPE的错误。
underrun/overrun解决对策
- 在播放的时候,如果会出现这种-EPIPE的错误,上层加快一点下发数据的速度,
- 录音的时候出现这种错误,上层应该读得更快一点. 可以提高任务的优先级来处理,也可以把驱动buffer扩大一下,给系统更多一点的缓冲时间.
alsa driver使用了环形缓冲区对dma buffer进行管理
播放时数据流向
CPU配置好DMA后,DMA把App的音频数据从CPU不断写入dma buffer中,DMA不停从该buffer取数据,经DAI送往Codec中。
当写入的数据慢,播放的数据快时声音会出现断断续续,一卡一卡的现象。
录音时数据流向
Codec不断把A/D转换好的音频数据经过DAI送入dma buffer中,app不断地从该buffer中读走音频数据。
当写入的数据快,播放的数据慢时,当数据量较多buffer有可能被冲掉,声音会出现类似“爆破”(Pop-Click)杂音的现象。