複製鏈接
請複製以下鏈接發送給好友

聲音子系統

鎖定
簡介FreeBSD聲音子系統清晰地將通用聲音處理問題與設備特定的問題分離開來。這使得更容易加入對新設備的支持。
中文名
聲音子系統
釋    義
用聲音處理問題與設備特定的問題
特    點
多媒體應用程序不加修改地移植
定    義
數字化聲音和混音器函數的系統

目錄

聲音子系統主要組件

框架是聲音子系統的中心部分。它主要實現下面的組件:
一個到數字化聲音和混音器函數的系統調用接口(read, write, ioctls)。ioctl命令集合兼容老的OSS 或Voxware接口,允許一般多媒體應用程序 不加修改地移植。處理聲音數據的公共代碼(格式轉換,虛擬通道)。一個統一的軟件接口,與硬件特定的音頻接口模塊接口對某些通用硬件接口(ac97)或共享的硬件特定代碼 (例如:ISA DMA例程)的額外支持。對特定聲卡的支持是通過硬件特定的驅動程序來實現的,這些驅動程序提供通道和混音器接口,插入到通用pcm代碼中。
本章中,術語pcm將指聲音驅動程序的中心,通用部分,這是對比硬件特定的模塊而言的。
預期的驅動程序編寫者當然希望從現有模塊開始,並使用那些代碼作為最終參考。但是,由於聲音代碼十分簡潔漂亮,這也基本上免除了註釋。本文檔試圖給出框架接口的一個概覽,並回答改寫現有代碼時可能出現的 一些問題.
聲音驅動程序使用與任何硬件驅動程序模塊相同的方法探測和連接(設備)。你可能希望瀏覽一下手冊中ISA或PCI章節的內容來獲取更多信息。

聲音子系統不同點

然而,聲音驅動程序在某些方面又有些不同:
他們將自己聲明為pcm類設備,帶有一個 設備私有結構struct snddev_info: static driver_t xxx_driver = { "pcm", xxx_methods, sizeof(struct snddev_info) }; DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0); MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);大多數聲音驅動程序需要存儲關於其設備的附加私有信息。私有數據結構通常在連接例程中分配。其地址通過調用 pcm_register和 mixer_init傳遞給 pcm。後面pcm 將此地址作為調用聲音驅動程序接口時的參數傳遞回來。聲音驅動程序的連接例程應當通過調用mixer_init 向pcm聲明它的MIXER或AC97 接口。對於MIXER接口,這會接着引起調用 xxxmixer_init。聲音驅動程序的連接例程通過調用 pcm_register(dev, sc, nplay, nrec) 向pcm聲明其通用CHANNEL配置,其中 sc是設備數據結構的地址, 在pcm以後的調用中將會用到它, nplay和nrec是播放和錄音通道的數目。聲音驅動程序的連接例程通過調用 pcm_addchan聲明它的每個通道對象。這會在 pcm中建立起通道合成,並接着會引起調用 xxxchannel_init (譯註:請參考原文)。聲音驅動程序的分離例程在釋放其資源之前應當調用 pcm_unregister。有兩種可能的方法來處理非PnP設備:
使用device_identify方法 (範例:sound/isa/es1888.c)。 device_identify方法在已知地址探測硬件,如果發現支持的設備就會創建一個新的pcm設備,這個pcm設備接着 會被傳遞到probe/attach。使用定製內核配置的方法,為pcm設備設置適當的hints(範例: sound/isa/mss.c)。pcm驅動程序應當實現 device_suspend, device_resume和 device_shutdown例程,這樣電源管理和模塊卸載就能正確地發揮作用。