ALSA各文件作用

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结构:

[c-sharp]  view plain copy
  1. static struct snd_kcontrol_new my_control __devinitdata = {  
  2.     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,  //control的类型
  3.     .name = "PCM Playback Switch",  //control的名字。因为control的作用是按名字来归类的。ALSA已经预定义了一些control的名字。
  4.     .index = 0,  //保存该control的在该卡中的编号
  5.     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,  //该control的访问类型
  6.     .private_value = 0xffff,  //包含了一个任意的长整数类型值。该值可以通过info,get,put这几个回调函数访问。
  7.     .info = my_control_info,  //用于获取control的详细信息,alsa已经为我们实现了一些通用的info回调函数
  8.     .get = my_control_get,  
  9.     .put = my_control_put  
  10. };  
Control设备和PCM设备一样,都属于声卡下的逻辑设备。用户空间的应用程序通过alsa-lib访问该Control设备,读取或控制control的控制状态,从而达到控制音频Codec进行各种Mixer等控制操作。 





你可能感兴趣的:(Linux)