alsa总结

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)杂音的现象。

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值