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結構:
- static struct snd_kcontrol_new my_control __devinitdata = {
- .iface = SNDRV_CTL_ELEM_IFACE_MIXER, //control的類型
- .name = "PCM Playback Switch", //control的名字。因爲control的作用是按名字來歸類的。ALSA已經預定義了一些control的名字。
- .index = 0, //保存該control的在該卡中的編號
- .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, //該control的訪問類型
- .private_value = 0xffff, //包含了一個任意的長整數類型值。該值可以通過info,get,put這幾個回調函數訪問。
- .info = my_control_info, //用於獲取control的詳細信息,alsa已經爲我們實現了一些通用的info回調函數
- .get = my_control_get,
- .put = my_control_put
-
};