sound/core/pcm_native.c 对下层的PCM驱动提供包装,为上层提供统一的接口,snd_pcm_f_ops_playback文件操作结构提供播放功能的函数,snd_pcm_f_ops_capture文件操作结构提供录音功能的函数。
sound/core/control.c对下层的Control驱动提供包装,为上层提供统一的接口,snd_ctl_f_ops文件操作结构提供控制功能函数,其中主要是snd_ctl_ioctl函数。
播放的过程大致如下:
Snd_pcm_f_ops_playback.write即snd_pcm_write调用snd_pcm_lib_write
snd_pcm_lib_write调用Snd_pcm_lib_write1
Snd_pcm_lib_write1通过snd_pcm_lib_write_transfer把数据写入DMA buffer中,然后调用snd_pcm_start开始DMA传输数据到WM9713里去。
录音的过程大致如下:
Snd_pcm_f_ops_capture.read即snd_pcm_read调用snd_pcm_lib_read
snd_pcm_lib_read调用snd_pcm_lib_read1
snd_pcm_lib_read1调用snd_pcm_start从WM9713传输数据到DMA内存中,然后调用snd_pcm_lib_read_transfer拷贝数据到用户的buffer.
Control接口主要让用户空间的应用程序(alsa-lib)可以访问和控制音频codec芯片中的多路开关,滑动控件等。对于Mixer(混音)来说,Control接口显得尤为重要,从ALSA 0.9.x版本开始,所有的mixer工作都是通过control接口的API来实现的。
Controls的定义
要自定义一个Control,我们首先要定义3个回调函数:info,get和put。然后,定义一个snd_kcontrol_new结构: