一、alsa&tinyalsa介绍
ALSA(Advanced Linux Sound Architecture)是一个开源项目,涵盖了用户空间和内核空间对音频设备的操作接口,通过应用层使用alsalib可以实现对音频设备的控制
TinyAlsa是android推出的一个精简的ALSA库,当然alsa-driver这块没有改动
alsa包含:1、内核 alsa-driver 2.用户空间 alsa-lib(android使用的TinyAlsa)
二、查看声卡和pcm设备
1、查看当前的声卡:
cat /proc/asound/cards
2、查看pcm设备列表:
cat /proc/asound/pcm
3、查看当前有哪些进程占用了pcm设备节点
lsof |grep pcm
4、查看有哪些音频设备节点
ls /dev/snd/
音频设备的命名规则为 [device type]C[card index]D[device index][capture/playback],即名字中含有4部分的信息:
device type
设备类型,通常只有comtrol/pcm这2种。从上图可以看到声卡会管理很多设备,PCM设备只是其中的一种设备。
card index
声卡的id,代表第几块声卡。通常都是0,代表第一块声卡。手机上通常都只有一块声卡。
device index
设备的id,代表这个设备是声卡上的第几个设备。设备的ID只和驱动中配置的DAI link的次序有关。如果驱动没有改变,那么这些ID就是固定的。
capture/playback
只有PCM设备才有这部分,只有c和p两种。c代表capture,说明这是一个提供录音的设备,p代表palyback,说明这是一个提供播放的设备。
系统会在/proc/asound/pcm文件中列出所有的音频设备的信息,如果是肉眼查看,cat /proc/asound/pcm中的信息会更直观一些。
三、tinyalsa的使用
1、编译tinyalsa
aosp/external/tinyalsa$ mma
编译完后就生成tinyplay、tinymix、tinycap等工具。
xxxx/aosp/out/target/product/ecarxICp1_64/system/bin$ ls tiny*
tinycap tinyhostless tinymix tinypcminfo tinyplay
将生成的这些可执行bin文件拷贝到开发板的/system/bin下,并加可执行权限。
xxxx:/system/bin $ ls tiny* -l
-rwxr-xr-x 1 root shell 68488 2021-12-06 22:56 tinycap
-rwxr-xr-x 1 root shell 68408 2021-12-06 22:56 tinyhostless
-rwxr-xr-x 1 root shell 68656 2021-12-06 22:56 tinymix
-rwxr-xr-x 1 root shell 68448 2021-12-06 22:56 tinypcminfo
-rwxr-xr-x 1 root shell 68408 2021-12-06 22:56 tinyplay
2、tinyplay
tinyplay只能播放wav格式的音频文件 :
:/sdcard # tinymix | grep -E "V01|SRC3"
33 ENUM 1 xxxxx Audio Noise Clean Type V01
97 ENUM 1 SRC3 Sync Domain SD3
199 ENUM 1 SRC3 Digital Filter HF
203 ENUM 1 SRC3 Group Delay Matching Disable
207 BOOL 1 SRC3 Soft Mute Off
211 ENUM 1 SRC3 Soft Mute Mode Manual
215 BOOL 1 SRC3 Lock Signal Output Off
219 BOOL 1 SRC3 Lock Status On
223 BOOL 1 SRC3 Overflow Status Off
522 ENUM 1 SRC3 Source Selector SDIN2
3、tinymix
直接输入tinymix可以得到音频通路相关的各项配置参数。也可以通过添加参数修改其中的配置。
:/sdcard # tinymix | grep -E "V01|SRC3"
33 ENUM 1 xxxxx Audio Noise Clean Type V01
97 ENUM 1 SRC3 Sync Domain SD3
199 ENUM 1 SRC3 Digital Filter HF
203 ENUM 1 SRC3 Group Delay Matching Disable
207 BOOL 1 SRC3 Soft Mute Off
211 ENUM 1 SRC3 Soft Mute Mode Manual
215 BOOL 1 SRC3 Lock Signal Output Off
219 BOOL 1 SRC3 Lock Status On
223 BOOL 1 SRC3 Overflow Status Off
522 ENUM 1 SRC3 Source Selector SDIN2
:/ # tinymix 33
Ecarx Audio Noise Clean Type: SW Baidu >V01
设置:
:/ # tinymix 33 SW
再查看:
127|:/ # tinymix | grep 33
33 ENUM 1 xxxxx Audio Noise Clean Type SW
:/ # tinymix 33
xxxxx Audio Noise Clean Type: >SW Baidu V01
:/ # tinymix | grep SRC3
97 ENUM 1 SRC3 Sync Domain SD3
199 ENUM 1 SRC3 Digital Filter HF
203 ENUM 1 SRC3 Group Delay Matching Disable
207 BOOL 1 SRC3 Soft Mute Off
211 ENUM 1 SRC3 Soft Mute Mode Manual
215 BOOL 1 SRC3 Lock Signal Output Off
219 BOOL 1 SRC3 Lock Status On
223 BOOL 1 SRC3 Overflow Status Off
522 ENUM 1 SRC3 Source Selector ADC1
4、tinycap
接上mic就可以录音了:
:/ # tinycap /sdcard/456.wav -d 1
Capturing sample: 2 ch, 44100 hz, 16 bit
^CCaptured 307200 frames
5、tinypcminfo
tinypcminfo用于查看pcm通道的相关信息:
xxxx:/storage/emulated/0/Music # tinypcminfo -D /proc/asound/cards
Info for card 0, device 0:
PCM out:
Access: 0x000009
Format[0]: 0x000ccc
Format[1]: 00000000
Format Name: S16_LE, S16_BE, S24_LE, S24_BE, S32_LE, S32_BE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=2
Sample bits: min=16 max=32
Period size: min=0 max=24576
Period count: min=1 max=16
PCM in:
cannot open device '/dev/snd/pcmC0D0c'
Device does not exist.
也可以直接带上声卡和设备信息来查看:
如:device id:0,表示playback
:/ # tinypcminfo -D 0 -d 0
Info for card 0, device 0:
PCM out:
Access: 0x000009
Format[0]: 0x000ccc
Format[1]: 00000000
Format Name: S16_LE, S16_BE, S24_LE, S24_BE, S32_LE, S32_BE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=2
Sample bits: min=16 max=32
Period size: min=0 max=24576
Period count: min=1 max=16
PCM in:
cannot open device '/dev/snd/pcmC0D0c'
Device does not exist.
如:device id:1,表示capture
:/ # tinypcminfo -D 0 -d 1
Info for card 0, device 1:
PCM out:
cannot open device '/dev/snd/pcmC0D1p'
Device does not exist.
PCM in:
Access: 0x000009
Format[0]: 0x000ccc
Format[1]: 00000000
Format Name: S16_LE, S16_BE, S24_LE, S24_BE, S32_LE, S32_BE
Subformat: 0x000001
Rate: min=8000Hz max=192000Hz
Channels: min=1 max=4
Sample bits: min=16 max=32
Period size: min=0 max=24576
Period count: min=1 max=49152
从上面获得的信息中可以知道PCM的采样率,通道个数,采样点数等信息。
6、tinyhostless
tinyhostless用于回环测试,可以测试PCM音频从输入到输出之间的通路和时间。
测试命令
tinyhostless -P playback_dev -C capture_dev -p period_size -n count -c channels -r Rate loopback
tinyhostless -P 0 -C 0 -p 160 -n 2 -c 8 -r 16000 -l
四、TinyalsaAPI
ALSA API说明:
ALSA project - the C library reference: Modules (alsa-project.org)
五、Tinyalsa流程
Tinyplay流程:
Tinycap流程: