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 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 };
Control裝置和PCM裝置一樣,都屬於音效卡下的邏輯裝置。使用者空間的應用程式通過alsa-lib訪問該Control裝置,讀取或控制control的控制狀態,從而達到控制音頻Codec進行各種Mixer等控制操作。