"Windows音頻驅動"翻譯系列總目錄: https://blog.csdn.net/danteLiujie/article/details/102530417
目錄
本節介紹系統提供的Microsoft Windows驅動程序模型(WDM)音頻組件。這些是操作系統隨附的軟件組件。這些組件支持ISA,PCI和USB音頻設備,並提供軟件接口,應用程序可通過這些接口控制和監視這些設備。
譯註:建議結合典型的WDM音頻配置一文看
1. 用戶模式WDM音頻組件
用戶模式Microsoft Windows驅動程序模型(WDM)音頻組件是:
WinMM系統組件
WinMM系統組件(Winmm.dll及其16位對應的Mmsystem.dll)實現Microsoft Windows多媒體API wave Xxx,midi Xxx,混合器Xxx和aux Xxx(請參閱Microsoft Windows SDK文檔)。WinMM組件使用WDMAud系統驅動程序將WinMM API調用轉換爲內核流I / O請求。
WDMAud系統驅動程序
用戶模式WDMAud系統驅動程序(Wdmaud.drv)與內核模式WDMAud系統驅動程序(Wdmaud.sys)配對。WDMAud系統驅動程序一起在WinMM API調用和內核流I / O請求之間進行轉換。內核模式WDMAud驅動程序是SysAudio系統驅動程序的客戶端。
DirectSound系統組件
DirectSound系統組件(Dsound.dll)支持DirectSound API(請參閱Microsoft Windows SDK文檔)。DirectSound組件是SysAudio驅動程序的客戶端。如果硬件混合可用,則SysAudio驅動程序將DirectSound硬件緩衝區直接連接到渲染設備。否則,SysAudio驅動程序會將DirectSound軟件緩衝區連接到KMixer系統驅動程序。有關更多信息,請參見使用DirectSound軟件和硬件緩衝區渲染Wave內容。
DirectMusic系統組件
DirectMusic系統組件(DMusic.dll)支持DirectMusic API(請參閱Microsoft Windows SDK文檔)。該組件將對DirectMusic API的調用轉換爲對WDM音頻設備的I / O請求。DirectMusic組件是SysAudio系統驅動程序的客戶端。
Windows音頻服務
在Windows XP和更高版本中,Windows音頻服務組件(Audiosrv.dll)管理基於Windows的程序的音頻設備。停止Windows音頻服務會阻止音頻設備和效果正常運行。如果禁用了音頻服務,則任何明顯依賴它們的其他服務(包括WDM音頻驅動程序)將無法啓動。在Windows XP的家庭版,專業版和服務器版以及更高版本中,音頻服務默認情況下配置爲自動啓動。但是,在Windows Server 2003及更高版本的Advanced Server,Data Center和Web Server版本中,默認情況下禁用音頻服務。禁用音頻服務後,安裝音頻設備不會啓用它們-僅當管理員明確配置音頻服務後,音頻服務才能自動運行。服務對話框(在Windows控制面板中的“ 管理工具”下查找)。
2. 內核模式WDM音頻組件
內核模式Microsoft Windows驅動程序模型(WDM)音頻組件是
WDMAud系統驅動程序
內核模式WDMAud系統驅動程序(Wdmaud.sys)與用戶模式WDMAud系統驅動程序(Wdmaud.drv)配對。這對WDMAud驅動程序在用戶模式Microsoft Windows多媒體系統調用和內核流I / O請求之間進行轉換。WDMAud爲以下API執行I / O:waveIn,waveOut,midiIn,midiOut,Mixer和aux(在Microsoft Windows SDK文檔中進行了描述)。內核模式WDMAud驅動程序是內核流(KS)filter,也是SysAudio系統驅動程序的客戶端。
SysAudio系統驅動程序
SysAudio系統驅動程序(Sysaudio.sys)構建用於渲染和捕獲音頻內容的filter圖。SysAudio驅動程序將音頻filter圖表示爲虛擬音頻設備 (參考後續章節), 並將每個虛擬音頻設備註冊爲KSCATEGORY_AUDIO_DEVICE設備接口的實例。(適配器驅動程序不應在SysAudio專用的此類別中進行註冊。)例如,虛擬MIDI設備可能表示通過連接SWMidi驅動程序,KMixer驅動程序和端口/微型端口驅動程序創建的filter圖。客戶端僅與虛擬音頻設備通信,而不與構成虛擬音頻設備的單個設備通信。SysAudio驅動程序對客戶端透明,它配置了filter圖中的所有KS filter,這些filter連接在一起以形成虛擬音頻設備。以下音頻流源使用SysAudio構建的圖形:
- DirectSound(請參閱Microsoft Windows SDK文檔。)
- Windows多媒體API waveIn,waveOut,midiIn,midiOut,Mixer和aux(請參閱Windows SDK文檔。)
- 紅皮書(Redbook)CD數字音頻(請參閱後續章節:紅皮書系統驅動程序。)
- Sound Blaster仿真器(請參閱後續章節:SBEmul系統驅動程序。)
- 內核模式軟件合成器(請參閱後續章節:SWMidi系統驅動程序和DMusic系統驅動程序。)
- DRMK系統驅動程序
KMixer系統驅動程序
KMixer系統驅動程序(Kmixer.sys)是執行以下操作的KS filter:
- 混合多個PCM音頻流
- 高質量格式轉換
- 位深度轉換
- 揚聲器配置和聲道映射
除了簡單的8位和16位,單聲道和立體聲數據格式外,KMixer驅動程序還支持:
- PCM和IEEE浮點數據
- 位深度大於16位,並且具有兩個以上通道的多通道格式
- 頭部相關傳遞函數(HRTF)3-D處理
有關Windows各個版本中的音量範圍和默認音量級別的信息,請參閱“ 默認音頻音量設置”。
紅皮書(Redbook)系統驅動程序
Redbook系統驅動程序(Redbook.sys)是KS filter,用於管理CD數字音頻的渲染。Redbook驅動程序是SysAudio系統驅動程序的客戶端。系統通過文件系統將CD數字音頻路由到Redbook驅動程序,然後再路由到SysAudio驅動程序。CD數字音頻在首選的WAVE輸出設備(在“控制面板”的“多媒體”屬性頁中設置)上渲染。
SBEmul系統驅動程序
SBEmul系統驅動程序(Sbemul.sys)爲MS-DOS應用程序提供了Sound Blaster模擬。SBEmul驅動程序是SysAudio系統驅動程序的客戶端。爲了渲染和捕獲內容,SysAudio驅動程序使用合適的wave和MIDI設備(在“控制面板”的“多媒體”屬性頁中進行設置)。
僅Windows 98 / Me支持Sound Blaster模擬。
SWMidi系統驅動程序
SWMidi系統驅動程序(Swmidi.sys)是KS filter,可提供軟件模擬的通用MIDI(General MIDI, GM)和高質量的Roland GS(Gerneral Standard/Sound)波表合成器。當硬件合成器不可用, midiOutXxx應用程序使用SWMidi。SWMidi filter從WDMAud系統驅動器接收帶有時間戳的MIDI流作爲輸入,並將PCM波流輸出到KMixer系統驅動器。SWMidi在內部將所有聲音混合在一起,以形成具有PCM WAVE格式的單個兩通道輸出流。
DMusic系統驅動程序
DMusic系統驅動程序(Dmusic.sys)是KS filter,它支持軟件仿真的高質量DLS(downloadable sound, 譯註: 一種數字樂器聲音文件格式/合成規範)合成器。DMusic驅動程序是系統提供的端口類微型端口驅動程序。它公開了一個DirectMusic引腳,該引腳支持DirectMusic流數據範圍。DMusic filter從DirectMusic系統組件接收帶有時間戳的MIDI流作爲輸入,並將PCM波流輸出到KMixer系統驅動器。DMusic驅動程序在內部混合所有聲音,以形成具有PCM WAVE格式的單個兩通道輸出流。DirectMusic應用程序必須顯式選擇內核模式軟件合成器Dmusic.sys,以使用它代替DirectMusic的默認用戶模式合成器。
AEC系統驅動程序
AEC系統驅動程序(Aec.sys)通過在軟件中實現AEC(回聲消除)和噪聲抑制算法來支持全雙工DirectSound應用程序。有關更多信息,請參見DirectSound Capture Effects。
DRMK系統驅動程序
DRMK系統驅動程序(Drmk.sys)是KS filter,用於解密包含受DRM保護的內容的音頻流。有關更多信息,請參見數字版權管理。
分離器系統驅動程序
Splitter系統驅動程序(Splitter.sys)是KS filter,可從單個輸入捕獲流創建兩個或更多輸出流。分離器驅動程序透明地將輸入流複製到另外兩個輸出流,而與輸入流的格式無關。
Windows Me和Microsoft Windows XP及更高版本支持Splitter驅動程序。有關更多信息,請參見AVStream Splitters。
端口類適配器驅動程序和PortCls系統驅動程序
端口類適配器驅動(Port Class Audio Adapter)程序使用端口/微型端口驅動程序架構來支持音頻設備。PortCls驅動程序包括對ISA和PCI音頻設備的內置驅動程序支持。儘管PortCls系統驅動程序(Portcls.sys)還提供了供應商提供的端口類適配器驅動程序的框架,但是Microsoft建議供應商使用系統提供的端口類適配器驅動程序來支持ISA和PCI音頻設備。PortCls框架還可用於爲其他硬件總線上的音頻設備或僅軟件設備構造驅動程序。有關更多信息,請參見端口類簡介。
USB音頻類系統驅動程序(Usbaudio.sys)
USB音頻類系統驅動程序(Usbaudio.sys)是AVStream微型驅動程序,可爲符合音頻設備通用串行總線(USB)設備類定義的音頻設備提供驅動程序支持。
USB實施者論壇網站上提供了“音頻設備的USB設備類定義”規範(1.0版)。Usbaudio.sys支持USB音頻規範中描述的功能的子集。。
在Windows 98中,Usbaudio.sys引入了對USB設備(如揚聲器和麥克風)的支持。Windows Me中增加了對MIDI設備的支持。
在即插即用設備枚舉過程中,如果音頻設備將自身標識爲兼容USB音頻,則系統會自動加載USBAudio驅動程序以驅動該設備。USBAudio無需專用適配器驅動程序即可直接驅動設備。這意味着符合USB音頻規範的設備不需要專有的適配器驅動程序。
Microsoft建議硬件供應商爲其USB音頻設備使用USBAudio驅動程序,而不是編寫專有的適配器驅動程序。
在Windows 98中,USBAudio驅動程序支持以下功能:
- 所有I型格式(8位帶符號PCM除外)
- AC-3 II型格式
- 同步類型: 同步和自適應
- 多通道設備
但是,Windows 98中的USBAudio不支持:
- 8位帶符號PCM格式
- MPEG II型格式
- III型格式
- USB MIDI
- WAVEFORMATEXTENSIBLE WAVE格式(USBAudio使用打包的WAVE_FORMAT_PCM代替24位數據。)
在Windows 98 Second Edition(SE),Windows Me和Windows 2000及更高版本中,USBAudio支持與Windows 98相同的所有功能,但有一個例外:USBAudio支持WAVEFORMATEXTENSIBLE,但不支持打包的24位數據WAVE_FORMAT_PCM。
在Windows Me和Windows XP及更高版本中,USBAudio支持Windows 98 SE和Windows 2000支持的所有功能。此外,Windows Me和Windows XP支持USB MIDI,但不支持USB MIDI Elements。
下圖顯示了USB音頻設備的驅動程序層次結構。圖中顯示的所有驅動程序組件均由Microsoft隨操作系統提供。
有關圖中驅動程序組件的更多信息,請參見以下部分:
AVCAudio類系統驅動程序
AVCAudio類系統驅動程序(Avcaudio.sys)是AVStream微型驅動程序,可爲位於IEEE 1394總線上的音頻設備提供驅動程序支持。Windows XP和更高版本中提供了AVCAudio驅動程序以及對IEEE 1394音頻設備的相關支持。
要使用系統提供的驅動程序,硬件供應商應設計其音頻設備,使其符合以下規格的相應部分:
- IEC 61883-1和IEC 61883-6(IEC 60958)
- AV / C數字接口命令集通用規範版本 3.0
- AV / C音頻子單元規範1.0
- 連接和兼容性管理規範1.0
- AV / C媒體流格式信息和協商
- 支持最新的AV / C音頻子單元規格
這些規格可從1394行業協會網站上獲得。AVCAudio驅動程序支持這些規範中描述的功能的子集。
當在即插即用設備枚舉過程中音頻設備將自身標識爲符合IEEE 1394的音頻設備時,系統會自動加載AVCAudio驅動程序以驅動該設備。AVCAudio無需專用適配器驅動程序即可直接驅動設備。這意味着符合適當的IEEE 1394規範的設備不需要專有的適配器驅動程序。
Microsoft建議硬件供應商爲其IEEE 1394音頻設備使用AVCAudio驅動程序,而不是編寫專有的適配器驅動程序。
下圖顯示了Windows XP中IEEE 1394音頻設備的驅動程序層次結構。在Windows XP和更高版本中,該圖所示的所有驅動程序組件均由Microsoft隨操作系統提供。
有關圖中驅動程序組件的更多信息,請參見以下部分:
3. Wave和DirectSound組件
應用程序依賴於用戶模式和內核模式組件的組合來捕獲(輸入)和渲染(輸出)WAVE流。WAVE流是一種數字音頻流,其數據格式由WAVEFORMATEX或WAVEFORMATEXTENSIBLE結構描述。
應用程序可以使用以下兩個軟件接口之一進行WAVE渲染和捕獲:
Microsoft Windows多媒體waveOutXxx和waveInXxx函數
DirectSound和DirectSoundCapture API
waveOutXxx和waveInXxx函數的行爲基於舊版WAVE驅動器和設備的功能。從Windows 98開始,WDMAud系統驅動程序將對這些功能的調用轉換爲對WDM音頻驅動程序的命令。但是,通過模擬較舊的軟件和硬件的行爲,waveOutXxx函數犧牲了3D聲音效果和硬件加速,現在可以通過DirectSound API獲得這些功能。有關DirectSound和Windows Multimedia wave函數的更多信息,請參見Microsoft Windows SDK文檔。
DirectSound和Windows Multimedia wave函數是SysAudio系統驅動程序的客戶端,該驅動程序將構建用於處理wave和DirectSound流的音頻filter圖。圖形構建對於使用這些軟件接口的應用程序是透明的。
Wave組件
下圖顯示了wave應用程序用來渲染或捕獲由wave PCM數據組成的數字音頻流的用戶模式和內核模式組件。
渲染組件顯示在上圖的左側,捕獲組件顯示在右側。表示wave微型端口驅動程序的框被塗黑,以表示它們是供應商提供的組件。圖中的其他組件是系統提供的。
在該圖的左上方,wave渲染(或“ wave-out”)應用程序通過waveOutXxx函數與WDM音頻驅動程序接口,該函數在用戶模式WinMM系統組件 Winmm.dll中實現。該應用程序從文件中讀取WAVE音頻樣本的塊,然後調用waveOutWrite函數來渲染它們。
由用戶模式和內核模式組件(Wdmaud.drv和Wdmaud.sys)組成的WDMAud緩衝來自waveOutWrite調用的WAVE數據,並將WAVE流輸出到KMixer系統驅動程序,該驅動程序顯示在圖中的WDMAud下方。
KMixer是一個系統組件,它從一個或多個源接收wave PCM流,並將它們混合在一起以形成單個輸出流,該輸出流也採用wave PCM格式。
KMixer將波流輸出到WaveCyclic或WavePci設備,其端口和微型端口驅動程序顯示在上圖左側的KMixer下方。微型端口驅動程序將自身綁定到端口驅動程序,以形成代表基礎音頻渲染設備的wave filter。典型的渲染設備輸出模擬信號,該信號驅動一組揚聲器或一個外部音頻單元。渲染設備還可以通過S / PDIF連接器輸出數字音頻。有關WaveCyclic和WavePci的更多信息,請參閱Wave Filters。
另外,KMixer可以將其輸出流傳遞到USB音頻設備,該設備由USBAudio類系統驅動程序(未顯示)控制,而不是WaveCyclic或WavePci設備。
適配器驅動程序通過分別使用GUID值CLSID_PortWaveCyclic或CLSID_PortWavePci調用PcNewPort來創建WaveCyclic或WavePci端口驅動程序的實例。
上圖的右側顯示了支持將WAVE數據捕獲到文件的應用程序所需的組件。Wave-capture(或“ wave-in”)應用程序通過waveIn Xxx函數與WDM音頻驅動程序進行通信,該函數在WinMM系統組件中實現。
在該圖的右下角,WAVE捕獲裝置由微型端口和端口驅動程序控制。端口驅動器和微型端口驅動程序(可以是WaveCyclic或WavePci類型)綁定在一起以形成代表捕獲設備的filter。該設備通常從麥克風或其他音頻源捕獲模擬信號,並將其轉換爲Wave PCM流。設備可能還會通過S / PDIF連接器輸入數字音頻流。
WAVE端口驅動程序將其WAVE流直接輸出到KMixer或WDMAud。如果需要在WDMAud接收之前進行採樣率轉換,則該流必須通過KMixer。如圖所示,執行音頻流的同時渲染和捕獲的系統可能需要KMixer的兩個實例。請注意,SysAudio會根據需要自動創建這些實例。
或者,捕獲的WAVE源可以是USB音頻設備,而不是WaveCyclic或WavePci設備。在這種情況下,USBAudio驅動程序(未顯示)將流傳遞到KMixer。
不管波流是被USB設備捕獲,還是被WaveCyclic或WavePci設備捕獲,KMixer都會在需要時對流執行採樣率轉換,但不會與其他流混合。KMixer將結果流輸出到Wdmaud.sys(WDMAud系統驅動程序的內核模式一半)。用戶模式的一半Wdmaud.drv通過waveInXxx函數將WAVE流輸出到應用程序,該函數在Winmm.dll中實現。最後,在該圖的頂部,wave-capture應用程序將wave數據寫入文件。
在wave-capture應用程序調用waveInOpen函數打開捕獲流時,它將傳入指向其回調例程的指針。當發生WAVE捕獲事件時,操作系統將使用包含捕獲設備的下一個WAVE樣本塊的緩衝區調用回調例程。作爲對回調的響應,應用程序將下一個wave數據塊寫入文件。
DirectSound組件
下圖顯示了DirectSound應用程序用來渲染或捕獲wave數據的用戶模式和內核模式組件。
渲染組件顯示在上圖的左半部分,捕獲組件顯示在右側。Wave微型端口驅動程序顯示爲黑色方框,表明它們是供應商提供的組件。圖中的其他組件是系統提供的。
在圖的左上方,DirectSound應用程序將WAVE數據從文件加載到用戶模式DirectSound系統組件(Dsound.dll)管理的聲音緩衝區。該組件將波流發送到WaveCyclic或WavePci設備,其端口和微型端口驅動程序顯示在該圖的左下方。如果設備上有硬件混音器引腳,則流將繞過KMixer直接傳遞到Wave端口驅動器。否則,流首先通過KMixer,後者將其與其他同時播放的流混合。KMixer將混合流輸出到端口驅動程序。
和以前一樣,微型端口驅動程序將自身綁定到端口驅動程序,以形成代表基礎音頻渲染設備的wave filter。例如,此設備可能通過一組揚聲器播放流。
或者,可以通過USB音頻設備而不是WaveCyclic或WavePci設備來渲染波流。在這種情況下,流無法繞過KMixer。USBAudio類系統驅動程序(未顯示)始終將流傳遞給KMixer。
上圖的右側顯示了支持DirectSoundCapture應用程序的組件。該應用程序記錄從WaveCyclic或WavePci捕獲設備接收到的wave數據。該設備將來自麥克風的模擬信號轉換爲例如波流。該設備的wave端口和微型端口驅動程序出現在該圖的右下角。如圖所示,端口驅動程序從微型端口驅動程序接收流作爲輸入,並將其直接輸出到用戶模式DirectSound組件Dsound.dll,或通過KMixer間接輸出。這取決於捕獲設備是否提供了硬件捕獲引腳。
或者,捕獲WAVE的源可以是USB音頻設備。在這種情況下,流無法繞過KMixer。USBAudio驅動程序(未顯示)始終將流傳遞到KMixer。
如果將KMixer插入捕獲流的路徑,則會在需要時對流執行採樣率轉換,但不會與其他流混合。
在上圖的右上角,應用程序從DirectSoundCapture緩衝區讀取wave數據並將其寫入文件。
4. MIDI和DirectMusic組件
應用程序依賴於用戶和內核模式組件的組合來捕獲和播放MIDI和DirectMusic流。
應用程序可以使用以下兩個軟件接口之一來進行MIDI回放和捕獲:
- Microsoft Windows多媒體midiOutXxx和midiInXxx功能
- DirectMusic API
midiOutXxx和midiInXxx函數的行爲基於舊版MIDI驅動程序和設備的功能。從Windows 98開始,WDMAud系統驅動程序將對這些功能的調用轉換爲對WDM音頻驅動程序的命令。但是,通過模擬較舊的軟件和硬件的行爲,midiOutXxx和midiInXxx函數犧牲了精確定時和增強功能,這些功能現在可通過DirectMusic API獲得。有關DirectMusic和Windows Multimedia MIDI功能的更多信息,請參見Microsoft Windows SDK文檔。
DirectMusic和Windows Multimedia MIDI功能是SysAudio系統驅動程序的客戶端,該驅動程序將構建用於處理MIDI和DirectMusic流的音頻filter圖。對於使用這些軟件接口的應用程序, 圖形構建是透明的。
MIDI組件
下圖顯示了MIDI應用程序用來播放 MIDI數據的用戶模式和內核模式組件。該應用程序通過midiOutXxx函數與WDM音頻驅動程序接口,該函數在WinMM系統組件 Winmm.dll中實現。
上圖中的MIDI應用程序從MIDI文件中讀取帶時間戳的MIDI事件並進行播放。MIDI和DMus微型端口驅動程序顯示爲黑色方框,表示它們可以是供應商提供的組件。如果合適,供應商可能會選擇使用系統提供的微型端口驅動程序之一-FMSynth,UART或DMusUART,而不是編寫自定義微型端口驅動程序。圖中的所有其他組件都是系統提供的。
典型的MIDI播放應用程序的主循環調用timeSetEvent安排下一個音符開啓或音符關閉事件。該調用將指向應用程序回調例程的函數指針作爲其參數之一。當事件發生並且操作系統調用回調例程時,此例程將調用midiOutShortMsg來打開或關閉一個或多個調度任務。該midiOutShortMsg功能存儲在頁面鎖定的數據緩衝區的MIDI信息,以避免在通話過程中載入頁面(譯註:爲了保證實時性)。有關timeSetEvent和midiOutShortMsg調用的更多信息,請參見Microsoft Windows SDK文檔。
WDMAud由用戶和內核模式組件(Wdmaud.drv和Wdmaud.sys)組成,它記錄來自midiOutShortMsg調用的原始MIDI消息到達的時間。WDMAud將這些時間戳與MIDI消息結合在一起,以生成MIDI流,並將其發送到圖中WDMAud下方的內核模式組件之一。
爲MIDI應用程序構建音頻filter圖時,SysAudio僅選擇上圖中出現的三個可能的連接(到SWMidi,MIDI端口或DMus端口驅動程序)之一。如果應用程序選擇默認的MIDI設備,則SysAudio首先會尋找其MIDI或DMus微型端口驅動程序具有MIDI引腳的合成器設備。如果在註冊表中找不到此類設備,則SysAudio會改用SWMidi系統驅動程序(Swmidi.sys)。SWMidi是一種KS filter,可在軟件中實現波表合成器,並且僅需要可以渲染WAVE音頻流的設備。
SWMidi將所有聲音混合在一起以產生單WAVE PCM流,然後將其輸出到KMixer系統驅動器。KMixer依次將PCM格式的波流傳遞到WaveCyclic或WavePci設備,其端口和微型端口驅動程序出現在該圖的左下角。另外,KMixer可以將其輸出流傳遞到由USBAudio類系統驅動程序(未顯示)控制的USB音頻設備。
在上圖中,MIDI端口驅動程序從WDMAud獲取帶時間戳的MIDI流,並將其轉換爲原始MIDI消息,MIDI微型端口驅動程序通過合成器設備播放這些消息。MIDI端口驅動程序包含一個音序器,該音序器通過軟件實現,並能夠以1毫秒的計時器分辨率安排原始MIDI消息。
如果合成器設備包含硬件定序器(sequencer),則DMus端口驅動程序可以獲得比MIDI端口驅動程序高得多的定時精度。在這種情況下,DMus微型端口驅動程序應指定一個足夠大的硬件緩衝區,以吸收由於與ISR(中斷服務程序)和其他高優先級操作爭奪CPU時間而導致的抖動。DMus端口驅動程序輸出到微型端口驅動程序的MIDI流中的時間戳是具有100納秒分辨率的64位值。(譯註: Dmusic端口驅動程序可以支持硬件定序器, 而MIDI端口驅動程序不支持).
如果DMusic合成器沒有硬件定序器,則它必須依賴DMus端口驅動程序的軟件定序器,與MIDI端口驅動程序的軟件定序器一樣,計時器分辨率爲一毫秒。
適配器驅動程序通過分別使用GUID值CLSID_PortMidi或CLSID_PortDMus調用PcNewPort來創建MIDI或DMus端口驅動程序。在Windows XP和更高版本中,MIDI和DMus端口驅動程序共享相同的軟件實現。
在上圖的底部顯示的是系統提供的微型端口驅動程序FMSynth,UART和DMusUART的名稱,這些名稱包含在Portcls.sys中。適配器驅動程序通過調用PcNewMiniport創建這些微型端口驅動程序之一。FMSynth和UART提供IMiniportMidi接口,而DMusUART提供IMiniportDMus接口。請注意,UART現在已過時(在Windows 98 Gold之後),並且僅受現有驅動程序支持。相反,新的適配器驅動程序應使用DMusUART(在Windows 98 SE和更高版本以及Windows 2000和更高版本中),該實現了UART功能的超集。DMusUART是不支持DLS下載或硬件定序器的DMus微型端口驅動程序的示例。Windows驅動程序工具包(WDK)中的示例音頻驅動程序中提供了FMSynth和DMusUART微型端口驅動程序的源代碼。
下圖顯示了MIDI應用程序用來捕獲 MIDI數據的用戶模式和內核模式組件。該應用程序通過midiInXxx功能連接到WDM音頻驅動程序。
在上圖中,MIDI和DMus微型端口驅動程序顯示爲黑色方框,表示它們可以是供應商提供的組件。如果合適,供應商可能會選擇使用系統提供的微型端口驅動程序之一UART或DMusUARTCapture。圖中的所有其他組件都是系統提供的。
MIDI數據的來源通常是MPU-401設備。通過調用PcNewMiniport,適配器驅動程序可以創建系統提供的微型端口驅動程序之一UART或DMusUARTCapture,以從MPU-401設備捕獲MIDI數據。同樣,UART已過時,新的驅動程序應該使用DMusUARTCapture(在Windows 98 SE和更高版本以及Windows 2000和更高版本中)。
每次發生MIDI音符打開或關閉事件時,MIDI或DMusic捕獲微型端口驅動程序(在上圖的底部)會在MIDI消息上添加時間戳,然後再將其添加到流到MIDI的MIDI流中或DMus端口驅動程序。
MIDI或DMusic捕獲端口驅動程序將帶時間戳的MIDI流輸出到Wdmaud.sys(WDMAud系統驅動程序的內核模式一半)。用戶模式下的一半Wdmaud.drv通過midiInXxx函數將帶時間戳的MIDI流輸出到應用程序,該函數在Winmm.dll中實現。
圖頂部的MIDI應用程序將帶有時間戳的MIDI事件寫入MIDI文件。在應用程序調用midiInOpen打開MIDI輸入流時,它會將函數指針傳遞給其回調例程。發生音符打開或音符關閉事件時,操作系統將使用包含一個或多個帶時間戳的MIDI消息的數據塊調用回調例程。這些消息上的時間戳基本上與MIDI或DMus微型端口驅動程序最初生成的時間戳相同。
DirectMusic組件
下圖顯示了DirectMusic應用程序用來回放或捕獲 MIDI數據的用戶和內核模式組件。
播放組件顯示在上圖的左半部分,捕獲組件顯示在右側。DMus微型端口驅動程序顯示爲黑色方框,表示它們可以是供應商提供的組件。如果合適,供應商可以改用系統提供的微型端口驅動程序之一DMusUART或DMusUARTCapture。圖中的其他組件是系統提供的。
在該圖的左上角,DirectMusic應用程序將帶有時間戳的MIDI流從文件定向到用戶模式DirectMusic系統組件(DMusic.dll),後者又將流定向到DMus端口驅動程序。如果有此驅動程序,可以將其綁定到DirectMusic合成器或MPU-401設備的微型端口驅動程序。或者,可以將端口驅動程序綁定到DMusic系統驅動程序(Dmusic.sys),後者是系統提供的DMus微型端口驅動程序,可以在軟件中實現支持DLS的波表合成器,並且只需要可以渲染WAVE的設備即可。音頻流。
像SWMidi一樣,DMusic驅動程序Dmusic.sys將其所有聲音混合在一起以生成單個PCM格式的波流,然後將其輸出到KMixer。反過來,KMixer可以將波流傳遞到WAVE設備,該設備的端口和微型端口驅動程序顯示在該圖的左下角,或傳遞到由USBAudio系統驅動程序控制的USB音頻設備,該設備不會出現在圖中。
DirectMusic捕獲組件出現在上圖的右半部分。該圖右下角的DMusic捕獲微型端口驅動程序控制捕獲硬件併爲其記錄的每個MIDI消息加時間戳。DMus端口驅動程序將帶時間戳的MIDI流定向到用戶模式DirectMusic組件DMusic.dll。應用程序通過DirectMusic API訪問此流,並將帶有時間戳的MIDI數據寫入文件。
適配器驅動程序可以使用系統提供的DMusUARTCapture微型端口驅動程序來控制MPU-401捕獲設備。適配器驅動程序通過使用GUID值CLSID_DMusUARTCapture調用PcNewMiniport來創建此微型端口驅動程序。生成的微型端口驅動程序對象支持IMiniportDMus接口。Windows驅動程序工具包(WDK)中的示例音頻驅動程序中提供了DMusUARTCapture微型端口驅動程序的源代碼。
如果願意, DirectMusic應用程序也可以通過諸如SWMidi(Swmidi.sys)之類的midiOut Xxx設備運行。爲簡單起見,上圖中省略了此路徑。DMusic驅動程序(Dmusic.sys)需要初始DLS下載才能正確運行。使用SWMidi可以避免此要求。
5. 虛擬音頻設備
虛擬音頻設備代表渲染和捕獲音頻內容的filter圖。系統音頻驅動程序(SysAudio)使用可用的硬件和軟件組件來確定要構建的filter圖。
有關係統音頻驅動程序的更多信息,請參見SysAudio系統驅動程序。
SysAudio的客戶端包括DirectSound和WDMAud系統驅動程序,它們充當WDM音頻驅動程序與特定音頻的Microsoft Windows多媒體API waveIn,waveOut,midiIn,midiOut,混合器和aux之間的接口(在Microsoft Windows SDK文檔中進行了介紹)。
Windows驅動程序工具包(WDK)中的KsStudioStudio實用工具是繞過SysAudio並允許用戶手動構造filter圖的應用程序示例。
在PnP設備枚舉之後,SysAudio會評估已註冊的音頻硬件和軟件組件,以確定如何構造其客戶端可能需要的各種音頻filter圖。
在確定可以從可用的硬件和軟件組件構建的filter圖表列表之後,SysAudio將這些圖表註冊爲虛擬音頻設備,以進行播放,錄製,MIDI輸入/輸出和混合。SysAudio爲其虛擬音頻設備專門保留註冊表類別KSCATEGORY_AUDIO_DEVICE。適配器驅動程序不應在此類別中註冊自己。
SysAudio客戶端可以像對待硬件或軟件組件的filter工廠一樣對待虛擬音頻設備的filter工廠。當客戶端要求實例化虛擬設備上的特定引腳時,SysAudio會自動構造圖形,並透明地管理圖形的內部引腳對客戶端的連接。這允許客戶端將filter圖視爲單個filter,從而避免了圖管理(如filter通信)的複雜性。