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