alsa用户态tinyalsa
2014-09-16 14:04
281 查看
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 pcmC0D4ppcmC0D0c 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
http://blog.csdn.net/azloong/article/details/17614859
相关文章推荐
- alsa-lib、tinyalsa以及基于alsa的用户空间编程
- ALSA 用户空间之 TinyAlsa
- ALSA 用户空间之 TinyAlsa
- ALSA 用户空间之 TinyAlsa
- 用ALSA驱动声卡流程详解
- bluetooth-alsa合并入bluez
- ubuntu8.10关机时ALSA无法终止!
- alsa软件结构
- alsa驱动分析之一
- 我与alsa的斗争
- Android中使用ALSA声卡
- 播放歌曲到蓝牙耳机--ALSA
- android audio (针对 alsa) 架构图
- ALSA PCM发声程序
- 基于ALSA的WAV播放和录音程序
- alsa驱动分析之一
- Android中使用ALSA声卡
- Linux内核入门(二)——用户态向内核态切换
- Audio codec linux driver 之 ALSA 架构的 DAPM 学习
- Linux(内核和用户态的)动态内存管理