簡介FreeBSD聲音子系統清晰地將通用聲音處理問題與設備特定的問題分離開來。這使得更容易加入對新設備的支持。
基本介紹
- 中文名:聲音子系統
- 外文名:無
- 釋義:用聲音處理問題與設備特定的問題
- 特點:多媒體應用程式不加修改地移植
- 定義:數位化聲音和混音器函式的系統
主要組件,不同點,
主要組件
框架是聲音子系統的中心部分。它主要實現下面的組件:
一個到數位化聲音和混音器函式的系統調用接口(read, write, ioctls)。ioctl命令集合兼容老的OSS 或Voxware接口,允許一般多媒體應用程式 不加修改地移植。處理聲音數據的公共代碼(格式轉換,虛擬通道)。一個統一的軟體接口,與硬體特定的音頻接口模組接口對某些通用硬體接口(ac97)或共享的硬體特定代碼 (例如:ISA DMA例程)的額外支持。對特定音效卡的支持是通過硬體特定的驅動程式來實現的,這些驅動程式提供通道和混音器接口,插入到通用pcm代碼中。
本章中,術語pcm將指聲音驅動程式的中心,通用部分,這是對比硬體特定的模組而言的。
預期的驅動程式編寫者當然希望從現有模組開始,並使用那些代碼作為最終參考。但是,由於聲音代碼十分簡潔漂亮,這也基本上免除了注釋。本文檔試圖給出框架接口的一個概覽,並回答改寫現有代碼時可能出現的 一些問題.
不同點
然而,聲音驅動程式在某些方面又有些不同:
他們將自己聲明為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設備: