Alsa简介

 

官网
https://www.alsa-project.org/wiki/Main_Page

ALSA是Advanced Linux Sound Architecture的缩写,高级linux声音架构的简称,
它在Linux操作系统上提供了音频和MIDI的支持。


ffmpeg使用alsa
https://trac.ffmpeg.org/wiki/Capture/ALSA



参考:介绍了如何将alsa官网下载的源码中交叉编译到自己的目标板上
Alsa 调试上篇:编译篇


alsa系统文章 
https://www.pianshen.com/article/85881155147/

aplay -l

 
    +--------+  +--------+  +--------+
    |tinyplay|  |tinycap |  |tinymix |
    +--------+  +--------+  +--------+
         |           ^           ^ 
         V           |           V
    +--------------------------------+
    |        ALSA Library API        |
    |      (tinyalsa, alsa-lib)      |
    +--------------------------------+
user space                   ^
-------------------------------|---------------------
kernel space                 V
    +--------------------------------+
    |           ALSA CORE            |
    | +-------+ +-------+ +------+   |
    | |  PCM  | |CONTROL| | MIDI |...|
    | +-------+ +-------+ +------+   |
    +--------------------------------+
                     |
    +--------------------------------+
    |           ASoC CORE            |
    +--------------------------------+
                     |
    +--------------------------------+
    |        hardware driver         |
    |  +-------+ +--------+ +-----+  |
    |  |Machine| |Platform| |Codec|  |
    |  +-------+ +--------+ +-----+  |
    +--------------------------------+

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: SPA2100 [Philips SPA2100], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: PCH [HDA Intel PCH], device 0: ALC233 Analog [ALC233 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]


card表示声卡 

-D      表示设备,即aplay -l 列出的设备名。
-f      表示音频文件的格式,常用的有S16_LE ,S24_LE ,S32_LE。
-r      表示音频文件的采样率,常用44.1khz,48khz.
-c     表示音频文件的通道数,常用2
-t      表示音频文件的类型,目前alpay支持的音频类型,(1).voc(2).wav  (3).raw (4) .au

    

 
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: SPA2100 [Philips SPA2100], device 0: USB Audio [USB Audio]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
card 1: BYLM40 [BY-LM40], device 0: USB Audio [USB Audio]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
card 2: PCH [HDA Intel PCH], device 0: ALC233 Analog [ALC233 Analog]
    Subdevices: 1/1
    Subdevice #0: subdevice #0


 
arecord -Dhw:1,0 -f S24_3LE -r 48000 -c 1 arecord.wav

-Dhw:1,0, card 1,device 0
-f S16_LE 
-c 通道数
    

 
$ amixer -h
Usage: amixer  [command]

Available options:
    -h,--help       this help
    -c,--card N     select the card
    -D,--device N   select the device, default 'default'
    -d,--debug      debug mode
    -n,--nocheck    do not perform range checking
    -v,--version    print version of this program
    -q,--quiet      be quiet
    -i,--inactive   show also inactive controls
    -a,--abstract L select abstraction level (none or basic)
    -s,--stdin      Read and execute commands from stdin sequentially
    -R,--raw-volume Use the raw value (default)
    -M,--mapped-volume Use the mapped volume

Available commands:
    scontrols       show all mixer simple controls
    scontents	  show contents of all mixer simple controls (default command)
    sset sID P      set contents for one mixer simple control
    sget sID        get contents for one mixer simple control
    controls        show all controls for given card
    contents        show contents of all controls for given card
    cset cID P      set control contents for one control
    cget cID        get control contents for one control

Available advanced commands:
    sevents	  show the mixer events for simple controls
    events	  show the mixer events for simple controls

  

amixer options [command]

 
几个重要命令介绍:

scontrols :  显示所有的简单控件
scontents:  显示所有的简单控件的描述
sset : 控制简单控件
sget:显示简单控件的内容
controsl: 显示所有的控件
cset:控制控件
cget:显示控件
    

 
$ amixer controls
numid=3,iface=MIXER,name='PCM Playback Switch'
numid=4,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=MIXER,name='Mic Capture Switch'
numid=6,iface=MIXER,name='Mic Capture Volume'
numid=2,iface=PCM,name='Capture Channel Map'
numid=1,iface=PCM,name='Playback Channel Map'

    

 
xt@ai:/tmp/av$ amixer cget numid=4
numid=4,iface=MIXER,name='PCM Playback Volume'
    ; type=INTEGER,access=rw------,values=2,min=0,max=255,step=0
    : values=46,46
xt@ai:/tmp/av$ amixer cget numid=6
numid=6,iface=MIXER,name='Mic Capture Volume'
    ; type=INTEGER,access=rw---R--,values=1,min=0,max=127,step=0
    : values=81
    | dBminmax-min=0.00dB,max=23.81dB
xt@ai:/tmp/av$ 
xt@ai:/tmp/av$ 
xt@ai:/tmp/av$ amixer cset numid=4 50
numid=4,iface=MIXER,name='PCM Playback Volume'
    ; type=INTEGER,access=rw------,values=2,min=0,max=255,step=0
    : values=50,50
xt@ai:/tmp/av$ 
xt@ai:/tmp/av$ 
xt@ai:/tmp/av$ amixer cget numid=4
numid=4,iface=MIXER,name='PCM Playback Volume'
    ; type=INTEGER,access=rw------,values=2,min=0,max=255,step=0
    : values=50,50

    

 

    

Linux ALSA音频系统:soundcard

 
卡驱动中,一般挂载着多个逻辑设备,看看我们计算机的声卡驱动有几个逻辑设备:

$ cat /proc/asound/devices
  1:        : sequencer
  2: [ 1- 0]: digital audio capture
  3: [ 1]   : control
  4: [ 0- 0]: digital audio playback
  5: [ 0- 0]: digital audio capture
  6: [ 0]   : control
  7: [ 3- 3]: digital audio playback
  8: [ 3- 7]: digital audio playback
  9: [ 3- 8]: digital audio playback
 10: [ 3- 9]: digital audio playback
 11: [ 3-10]: digital audio playback
 12: [ 3-11]: digital audio playback
 13: [ 3-12]: digital audio playback
 14: [ 3- 0]: hardware dependent
 15: [ 3]   : control
 16: [ 2- 0]: digital audio playback
 17: [ 2- 0]: digital audio capture
 18: [ 2- 3]: digital audio playback
 19: [ 2- 7]: digital audio playback
 20: [ 2- 8]: digital audio playback
 21: [ 2- 9]: digital audio playback
 22: [ 2-10]: digital audio playback
 23: [ 2- 0]: hardware dependent
 24: [ 2- 2]: hardware dependent
 25: [ 2]   : control
 33:        : timer


 Device	                Description
digital audio playback	用于回放的 PCM 设备
digital audio capture	用于录制的 PCM 设备
control	                用于声卡控制的 CTL 设备,如通路控制、音量调整等
timer	                定时器设备
sequencer	            音序器设备

 
嵌入式系统中,我们更关心PCM和CTL这两种设备。

xt@ai:/tmp/av$ ll /dev/snd/
total 0
drwxr-xr-x   4 root root      600  3月  3 10:17 ./
drwxr-xr-x  20 root root     5720  3月  3 10:12 ../
drwxr-xr-x   2 root root       80  3月  3 10:17 by-id/
drwxr-xr-x   2 root root      120  3月  3 10:17 by-path/
crw-rw----+  1 root audio 116,  6  3月  3 10:17 controlC0
crw-rw----+  1 root audio 116,  3  3月  3 10:03 controlC1
crw-rw----+  1 root audio 116, 25  3月  3 08:35 controlC2
crw-rw----+  1 root audio 116, 15  3月  3 08:35 controlC3
crw-rw----+  1 root audio 116, 23  3月  3 08:35 hwC2D0
crw-rw----+  1 root audio 116, 24  3月  3 08:35 hwC2D2
crw-rw----+  1 root audio 116, 14  3月  3 08:35 hwC3D0
crw-rw----+  1 root audio 116,  5  3月  3 10:17 pcmC0D0c
crw-rw----+  1 root audio 116,  4  3月  3 10:17 pcmC0D0p
crw-rw----+  1 root audio 116,  2  3月  3 10:13 pcmC1D0c
crw-rw----+  1 root audio 116, 17  3月  3 10:12 pcmC2D0c
crw-rw----+  1 root audio 116, 16  3月  3 10:27 pcmC2D0p
crw-rw----+  1 root audio 116, 22  3月  3 08:36 pcmC2D10p
crw-rw----+  1 root audio 116, 18  3月  3 08:36 pcmC2D3p
crw-rw----+  1 root audio 116, 19  3月  3 08:36 pcmC2D7p
crw-rw----+  1 root audio 116, 20  3月  3 08:36 pcmC2D8p
crw-rw----+  1 root audio 116, 21  3月  3 08:36 pcmC2D9p
crw-rw----+  1 root audio 116, 11  3月  3 08:36 pcmC3D10p
crw-rw----+  1 root audio 116, 12  3月  3 08:36 pcmC3D11p
crw-rw----+  1 root audio 116, 13  3月  3 08:36 pcmC3D12p
crw-rw----+  1 root audio 116,  7  3月  3 08:36 pcmC3D3p
crw-rw----+  1 root audio 116,  8  3月  3 08:36 pcmC3D7p
crw-rw----+  1 root audio 116,  9  3月  3 08:36 pcmC3D8p
crw-rw----+  1 root audio 116, 10  3月  3 08:36 pcmC3D9p
cralsa_3301.pngw-rw----+  1 root audio 116,  1  3月  3 08:35 seq
crw-rw----+  1 root audio 116, 33  3月  3 08:35 timer

可以看到这些设备节点的Major=116,Minor则与/proc/asound/devices所列的对应起来,都是字符设备。
上层可以通过open/close/read/write/ioctl等系统调用来操作声卡设备,这和其他字符设备类似,
但一般情况下我们会使用已封装好的用户接口库如alsa-lib。

$ ll /proc/asound/devices
-r--r--r-- 1 root root 0  3月  3 10:34 /proc/asound/devices
xt@ai:/tmp/av$ 
xt@ai:/tmp/av$ cat /proc/asound/devices
  1:        : sequencer
  2: [ 1- 0]: digital audio capture
  3: [ 1]   : control
  4: [ 0- 0]: digital audio playback
  5: [ 0- 0]: digital audio capture
  6: [ 0]   : control
  7: [ 3- 3]: digital audio playback
  8: [ 3- 7]: digital audio playback
  9: [ 3- 8]: digital audio playback
 10: [ 3- 9]: digital audio playback
 11: [ 3-10]: digital audio playback
 12: [ 3-11]: digital audio playback
 13: [ 3-12]: digital audio playback
 14: [ 3- 0]: hardware dependent
 15: [ 3]   : control
 16: [ 2- 0]: digital audio playback
 17: [ 2- 0]: digital audio capture
 18: [ 2- 3]: digital audio playback
 19: [ 2- 7]: digital audio playback
 20: [ 2- 8]: digital audio playback
 21: [ 2- 9]: digital audio playback
 22: [ 2-10]: digital audio playback
 23: [ 2- 0]: hardware dependent
 24: [ 2- 2]: hardware dependent
 25: [ 2]   : control
 33:        : timer

 
Alsa application:aplay,arecord,amixer,是alsa alsa-tools中提供的上层调试工具,用户可以直接将其移植到自己所需要的平台,这些应用可以用来实现playback,capture,controls等。
alsa library API:alsa 用户库接口,常见有alsa-lib.(alsa-tools中的应用程序基于alsa-lib提供的api来实现)
alsa core:alsa 核心层,向上提供逻辑设备(pcm/ctl/midi/timer/..)系统调用,向下驱动硬件设备(Machine/i2s/dma/codec)
asoc core:asoc是建立在标准alsa core基础上,为了更好支持嵌入式系统和应用于移动设备的音频codec的一套软件体系。
hardware driver:音频硬件设备驱动,由三大部分组成,分别是machine,platform,codec.

hardware driver中三者的关系

 
4.1 Platform

指某款soc平台的音频模块,比如qcom,omap,amlogic,atml等等。platform又可细分为二个部分:

cpu dai:在嵌入式系统里面通常指soc的i2s,pcm总线控制器,负责把音频数据从I2S tx FIFO搬运到codec(playback,capture则相反)。cpu_dai通过 snd_soc_register_dai()来注册。注:DAI是Digital Audio Interface的简称,分为cpu_dai和codec_dai,这两者通过i2s/pcm总线连接;AIF是Audio Interface母的简称,嵌入式系统中一般是I2S和PCM接口。
PCM dma:负责把dma buffer中的音频数据搬运到i2s tx fifo。值得留意的是:某些情形下是不需要dma操作的,比如modem和codec直连,因为modem本身已经把数据送到fifo了,这时只需要启动codec_dai接收数据即可;该情形下,machine驱动dai_link中需要设定.platform_name = "snd_soc_dummy",这是虚拟dma驱动,实现见sound/soc/soc-utils.c. 音频dma驱动通过 snd_soc_register_platform()来注册,故也常用platform来指代音频dma驱动(这里的platform需要与soc platfrom区分开)。

4.2Codec:对于回放来说,userspace送过来的音频数据是经过采样量化的数字信号,在codec经过DAC转换成模拟信号然后输出到外放或耳机,这样我么你就可以听到声音了。codec字面意思是编解码器,但芯片(codec)里面的功能部件很多,常见的有AIF,DAC,ADC,Mixer,PGA,line-in,line-out,有些高端的codec芯片还有EQ,DSP,SRC,DRC,AGC,Echo-Canceller,Noise-Suppression等部件。比如本文中的npcp215x,自带Maxx算法。

4.3Machine:指某款机器,通过配置dai_link把cpu_dai,codec_dai,modem_dai各个音频接口给链结成一条条音频链路,然后注册snd_soc_card.和上面两个不一样,platform和codec驱动一般是可以重用的,而machine有它特定的硬件特性,几乎是不可重用的。所谓的硬件特性指:Soc Platform与Codec的差异;DAIs之间的链结方式;通过某个GPIO打开Amplifier;通过某个GPIO检测耳机插拔;使用某个时钟如MCLK/External-OSC作为i2s,CODEC的时钟源等等。
————————————————

    
参考
    Linux ALSA 音频系统:物理链路篇,逻辑设备篇
    Alsa 调试中篇:工具篇
    Linux ALSA音频系统:platform,machine,codec