官网 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 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