sound card
先看下kernel提供的声卡
/dev/snd $ ls
controlC0
controlC1
controlC2
controlC3
pcmC0D0c
pcmC0D0p
pcmC0D1c
pcmC0D1p
pcmC0D2c
pcmC0D3c
pcmC0D4p
pcmC1D0c
pcmC1D0p
pcmC2D0c
pcmC2D0p
pcmC3D0c
pcmC3D0p
timer
这里有四张声卡
controlC0
controlC1
controlC2
controlC3
最后一个C是card
每一张声卡下面有多个device,如card0
pcmC0D0c
pcmC0D0p
pcmC0D1c
pcmC0D1p
pcmC0D2c
pcmC0D3c
pcmC0D4p
pcmC0D0c C0D0c card device caputre
pcmC0D0p C0D0p card device playback
tinyalsa
android audio hal可以通过tinyalsa和kernel alsa交互。tinyalsa代码在external/tinyalsa
主要关注两个文件pcm.c mixer.c
audio hal向底层读写数据就是通过PCM Interface
pcm.c 操作的文件是pcmC%uD%u%c
主要使用linux提供的open/close/ioctl/mmap
主要函数pcm_open/pcm_close/pcm_is_ready/pcm_read/pcm_write
打开声卡就调用pcm_open
想声卡写数据就调用pcm_write
mixer.c 操作的文件是controlC%
设置mixer control
主要函数mixer_ctl_set_enum_by_string mixer_ctl_set_value
像打开audio patch、设置pga音量都是都通过Control Interface
<ctl name="AD IISMUX" val="0" />
<ctl name="ADCL Mixer AILADCL Switch" val="0" />
<ctl name="ADCR Mixer AIRADCR Switch" val="0" />
<ctl name="ADCL Mixer AuxMICADCL Switch" val="0" />
<ctl name="ADCR Mixer AuxMICADCR Switch" val="0" />
<ctl name="ADCL Mixer HPMICADCL Switch" val="0" />
<ctl name="ADCR Mixer HPMICADCR Switch" val="0" />
<ctl name="ADCL Mixer MainMICADCL Switch" val="0" />
<ctl name="ADCR Mixer MainMICADCR Switch" val="0" />
<ctl name="HPL Mixer ADCRHPL Switch" val="0" />
<ctl name="HPR Mixer ADCLHPR Switch" val="0" />
<ctl name="HPL Mixer DACLHPL Switch" val="0" />
<ctl name="HPR Mixer DACRHPR Switch" val="0" />
<ctl name="SPKL Mixer ADCLSPKL Switch" val="0" />
<ctl name="SPKL Mixer ADCRSPKL Switch" val="0" />
<ctl name="SPKL Mixer DACLSPKL Switch" val="0" />
<ctl name="SPKL Mixer DACRSPKL Switch" val="0" />
<ctl name="HP Mic Function" val="0" />
<ctl name="HeadPhone Function" val="0" />
<ctl name="Line Function" val="0" />
<ctl name="Mic Function" val="0" />
<ctl name="Speaker Function" val="0" />
<ctl name="Digital FM Function" val="0" />
<ctl name="Aux Mic Function" val="0" />
<ctl name="Earpiece Function" val="0" />
<ctl name="SPKL Playback Volume" val="10" />
<ctl name="SPKR Playback Volume" val="10" />
<ctl name="HPL Playback Volume" val="8" />
<ctl name="HPR Playback Volume" val="8" />
<ctl name="DACL Playback Volume" val="7" />
<ctl name="DACR Playback Volume" val="7" />
<ctl name="ADCL Capture Volume" val="12" />
<ctl name="ADCR Capture Volume" val="12" />
<ctl name="EAR Playback Volume" val="10" />
tinyalsa另外一个会涉及到的是pcm_config
可以参考这篇wiki