https://www.cnblogs.com/jason-lu/archive/2013/06/07/3123472.html
ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,我们无论作安卓开发还是linux开发都是基于这个框架来的。
从这张图片我们可以看到大致的框架结构,上层的app调用alsa提供的alsa_lib的接口,来实现我们的播放和录音等很多audio的功能。
kernel空间就是们作为底层开发者修改的地方,driver其实就是我们底层的驱动相关的代码,很多相关厂家都已经提供对应的驱动,同时这些驱动也和alsa-soc的接口对应,很多厂家在soc里面做了一些.so文件。这是为了一些防止商业机密泄漏,我们不用太关系,但是我们需要去了解一些对应的接口调用。
在调试过程中,我们经常要使用对应的底层工具去查看对应的东西。
对应的工具我们需要编译到对应的板子里面去,这样我们才能使用对应的工具。
一般在android/external/tinyalsa目录,编译完成后就会生成一个.so文件和四个对因的工具文件(1、tinycap 2、tinymix 3、 tinypcminfo 4、tinyplay
),对应的工具已经上传:https://download.csdn.net/download/weixin_51178981/33427599
vt_ipc_rk88:/ # tinymix
Mixer name: 'rockchip,es8316-codec'
Number of controls: 38
ctl type num name value
0 INT 2 HP Playback Volume 0 0
1 INT 2 HPMixer Gain 0 0
2 INT 2 DAC Playback Volume 192 192
3 BOOL 1 Enable DAC Soft Ramp Off
4 INT 1 DAC Soft Ramp Rate 4
5 ENUM 1 Playback Polarity L Invert
6 BOOL 1 DAC Notch Filter Off
7 BOOL 1 DAC Double Fs Mode Off
8 INT 1 DAC Volume Control-LeR 0
9 INT 1 DAC Stereo Enhancement 0
10 BOOL 1 MIC Boost On
11 INT 1 Input PGA 6
12 INT 1 ADC Capture Volume 192
13 BOOL 1 ADC Soft Ramp On
14 ENUM 1 Capture Polarity Normal
15 BOOL 1 ADC Double FS Mode Off
16 INT 1 ALC Capture Target Volume 10
17 INT 1 ALC Capture Max PGA 13
18 INT 1 ALC Capture Min PGA 8
.....
调试过音频文件的同事都知道,音频文件有很多通路(开关)去设置,通过tinymix我们可以看到那些开关是开的,那些是关的,我们底层可以去修改寄存器的值去设置开关,在调试的时候也可使用工具直接去打开或者关闭。
同样的也可以去修改声音的大小。
tinymix + (ctl号) 可以看到对应的信息
vt_ipc_rk88:/ # tinymix 7
DAC Double Fs Mode: Off
通过设置 0 or 1可以打开或者关闭对应的接口(因为开关好像都是bool类型的)
vt_ipc_rk88:/ # tinymix 7
DAC Double Fs Mode: Off
vt_ipc_rk88:/ # tinymix 7 1
vt_ipc_rk88:/ #
vt_ipc_rk88:/ # tinymix 7
DAC Double Fs Mode: On
vt_ipc_rk88:/ # tinymix 7 0
vt_ipc_rk88:/ #
vt_ipc_rk88:/ # tinymix 7
DAC Double Fs Mode: Off
修改音量和上面类似
ctl type num name value
0 INT 2 HP Playback Volume 0 0
1 INT 2 HPMixer Gain 5 5
2 INT 2 DAC Playback Volume 192 192
......
vt_ipc_rk88:/ # tinymix 2 100 100
ctl type num name value
0 INT 2 HP Playback Volume 0 0
1 INT 2 HPMixer Gain 5 5
2 INT 2 DAC Playback Volume 100 100
....
只有一个值的就需要输入一个值就可以了
修改模式
ctl type num name value
...
13 BOOL 1 ADC Soft Ramp On
14 ENUM 1 Capture Polarity Normal
......
vt_ipc_rk88:/ # tinymix 14
Capture Polarity: >Normal Invert
会有对应的提示,显示他的模式 小箭头指出的是现在的模式
vt_ipc_rk88:/ # tinymix 14 Invert
ctl type num name value
...
13 BOOL 1 ADC Soft Ramp On
14 ENUM 1 Capture Polarity Invert
tinypcminfo用于查看pcm通道的相关信息
vt_ipc_rk88:/ # tinypcminfo -D /dev/snd
Info for card 0, device 0:
PCM out:
Access: 0x000009
Format[0]: 0x000044
Format[1]: 0x000010
Format Name: S16_LE, S24_LE, S20_3LE
Subformat: 0x000001
Rate: min=8000Hz max=96000Hz
Channels: min=2 max=2
Sample bits: min=16 max=32
Period size: min=4 max=65536
Period count: min=2 max=4096
PCM in:
Access: 0x000009
Format[0]: 0x000044
Format[1]: 0x000010
Format Name: S16_LE, S24_LE, S20_3LE
Subformat: 0x000001
Rate: min=8000Hz max=96000Hz
Channels: min=2 max=2
Sample bits: min=16 max=32
Period size: min=4 max=65536
Period count: min=2 max=4096
用于录音,只能用于录制wav的音频文件
tinycap + 录制音频的名字
vt_ipc_rk88:/sdcard # tinycap 1.wav
Capturing sample: 2 ch, 44100 hz, 16 bit
后面也可以加对应的参数,详情可以去看看对应的资料,不加的花。就是按照默认的参数。
用于播音,只能用于播音wav的音频文件
和tinycap运用方式一样。
vt_ipc_rk88:/sdcard # tinyplay 1.wav
vt_ipc_rk88:/sdcard # tinyplay 1.wav
Playing sample: 2 ch, 44100 hz, 16 bit 1146880 bytes
vt_ipc_rk88:/ # ls /dev/snd/
controlC0 pcmC0D0c pcmC0D0p pcmC0D1p timer
controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克风的控制等
pcmC0D0c --> 用于录音的pcm设备
pcmC0D0p --> 用于播放的pcm设备
timer --> 定时器
C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则。