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 plaincopy
  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等控制操作。 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章