WASAPI:Windows音頻會(huì)話API
WASAPI的全稱是Windows Audio Session API(Windows音頻會(huì)話API),是從Windows Vista之后引入的UAA(Universal Audio Architecture)音頻架構(gòu)所屬的API。WASAPI在Windows Vista、Windows 7、Windows Server 2008 R2系統(tǒng)中所使用。WASAPI允許傳輸未經(jīng)修改的比特流到音頻設(shè)備,從而避開SRC(Sample Rate Conversion,取樣率轉(zhuǎn)換器)的干擾。
對(duì)于Windows XP來說,與WASAPI類似的通道為ASIO。
來歷
大約在Windows 98/ME末期,使用電腦播放DVD時(shí)的AC3與DTS數(shù)字訊號(hào)已經(jīng)可以從聲卡上的數(shù)字同軸/光纖輸出,不會(huì)有被SRC(Sample Rate Conversion,取樣率轉(zhuǎn)換器)干擾的問題,但到了Windows 2000時(shí)代卻反而送不出去,直到Windows 2000 SP2后才解決這個(gè)問題,至此聲卡更新驅(qū)動(dòng)程序后就可以搭配播放軟體將AC3或DTS數(shù)字訊號(hào)輸出。不過要注意的是,這個(gè)格式是48kHz 16bit,對(duì)于音樂CD所使用的44.1kHz 16bit,所以其中必須有一個(gè)轉(zhuǎn)換過程,但只有一些專業(yè)聲卡可以做到不經(jīng)過轉(zhuǎn)換即可傳輸。聲卡市場萎縮,集成聲卡大行其道,數(shù)字輸出也幾乎都是標(biāo)準(zhǔn)配備,可是要能做到原封不動(dòng)輸出44.1kHz 16bit的數(shù)字訊號(hào),還是有困難,于是有些人想的是將聲音訊號(hào)通過良好的算法進(jìn)行up-sampling后再來送出 (即Foobar2000+PPHS/SSRC的方案),也拉高聲卡的數(shù)字輸出標(biāo)準(zhǔn)到24bit 96kHz,這個(gè)方法雖然不能原汁原味輸出44.1kHz 16bit的數(shù)字信號(hào),但起碼我們可以選擇更好的up-sampling算法而避開SRC。
WASAPI是微軟從Vista時(shí)代提出的新的音頻架構(gòu)UAA里的API(應(yīng)用程序接口),它可以使用戶不必去購買昂貴的專業(yè)聲卡就能獲得完美的未經(jīng)SRC干擾過的不同采樣率和精度的數(shù)字音頻輸出。事實(shí)上我們除了能夠通過WASAPI輸出未經(jīng)污染的44.1kHz 16bit的CD數(shù)字信號(hào),我們還可以無損輸出其他采樣率和精度的音頻信號(hào),甚至包括藍(lán)光碟內(nèi)帶的LPCM多聲道信號(hào)。接下來我們就來看看這個(gè)全新的UAA音頻架構(gòu)以及WASAPI。
關(guān)于新音頻架構(gòu)UAA
在過去,聲卡廠商例如Creative、Realtek等,為了讓使用者透過自家編寫的控制臺(tái)來進(jìn)行各方面關(guān)于音頻設(shè)備的設(shè)定,所以編寫驅(qū)動(dòng)程序時(shí),必須在Kernel Mode(內(nèi)核模式)這個(gè)層級(jí)撰寫相當(dāng)多的代碼來提供調(diào)用,使得使用者的操作設(shè)定能夠直達(dá)硬件層。然而這對(duì)于系統(tǒng)的穩(wěn)定度是一個(gè)很不好的影響,稍微有一點(diǎn)點(diǎn)意外狀況,會(huì)因?yàn)檫@些功能跑在Kernel Mode而導(dǎo)致系統(tǒng)死機(jī),所以這也造成Microsoft決定在Windows Server 2003上是預(yù)設(shè)關(guān)閉音頻功能,想要使用音頻功能必須自行到服務(wù)器設(shè)定里面去啟用。
而這個(gè)問題在 Vista 時(shí)代有所改善了。Microsoft要求所有音頻設(shè)備的廠商必須遵循UAA的架構(gòu)來開發(fā)驅(qū)動(dòng)程式,也為了配合UAA架構(gòu),Vista可以說是整個(gè)翻新了音訊處理流程,許多原本需要寫在Kernel Mode的聲卡功能,需要改寫到User Mode(用戶模式)去,進(jìn)而增加了系統(tǒng)穩(wěn)定度。
圖1 UAA架構(gòu)框架圖
從圖1中我們可以看出,Windows Vista的音效架構(gòu)起了大幅度的變化,主要的Kernel Mode只剩下音效驅(qū)動(dòng)的部分,而過去微軟所制定出來的MME以及DirectSound API便不再直接起作用,取而代之是以WASAPI(Windows Audio Session API)來模擬這些舊有的API。
設(shè)計(jì)思路與原理編輯
WASAPI采用了以“Session”為概念的思路,當(dāng)不同的應(yīng)用程序調(diào)用WASAPI,它們的需求會(huì)被各自獨(dú)立成不同的Session進(jìn)行音訊處理,處理過程會(huì)經(jīng)過多個(gè)不同功能的APO(Audio Processing Objects,音頻處理對(duì)象),這些APO主要用來處理音量增益、格式轉(zhuǎn)換及混音等功能,但并不包括SRC的動(dòng)作,如上文所述,所以可以保持音頻不因轉(zhuǎn)換而造成失真。
在WASAPI中,通過2條路徑來訪問Kernal Mode(內(nèi)核模式):
1. Shared Mode(共享模式)
如上文所述,WASAPI這個(gè)新的API是以Session為概念,當(dāng)不同的應(yīng)用程式調(diào)用WASAPI,它們的需求會(huì)被各自獨(dú)立成不同的Session進(jìn)行音訊處理。從詞條圖片中的設(shè)計(jì)圖里可以發(fā)現(xiàn),每一個(gè)應(yīng)用程式都有一個(gè)入口,然后在Audio Engine內(nèi),經(jīng)過Microsoft的APO(Audio Processing Object),再經(jīng)過第三方廠商編寫的sAPO(System Effects Audio Processing Object),聲音訊號(hào)經(jīng)一連串的處理,再進(jìn)入Device Pipe階段,這里要進(jìn)行混音操作。有軟件混音動(dòng)作,就可能會(huì)經(jīng)過SRC,也可能產(chǎn)生其他人耳不易發(fā)現(xiàn)但數(shù)據(jù)上確實(shí)有變化的操作,再加上聲音訊號(hào)還要經(jīng)過APO與sAPO等的調(diào)整 (例如低音增益、環(huán)繞音效等功能),所以聲音訊號(hào)要經(jīng)過層層關(guān)卡,不但傳遞路徑長,也無法保證資料的原始性。而音頻流程處理的改變,最明顯的當(dāng)屬每個(gè)應(yīng)用程式有自己的音量控制,這在Windows XP/2003以前的操作系統(tǒng),是完全沒有見過的操作方式。
共享模式架構(gòu)圖
2. Exclusive Mode(獨(dú)占模式)
也許您已經(jīng)注意到,從Windows Vista開始,音頻設(shè)備中有一個(gè)「允許應(yīng)用程序獨(dú)占控制該設(shè)備」的設(shè)置,這到底是做什么用的呢?這個(gè)「允許應(yīng)用程序獨(dú)占控制該設(shè)備」就是上面UAA音頻架構(gòu)說明圖中的Exclusive Mode(獨(dú)占模式)。應(yīng)用程式在一般情況下都是走Shared Mode(共享模式)那條路徑,這個(gè)路徑被稱作通道,根據(jù)上面關(guān)于共享模式的介紹,所有的聲音訊號(hào)都會(huì)轉(zhuǎn)送至Audio Engine(音效引擎)部分,使得或多或少被改變了原始內(nèi)容。而當(dāng)應(yīng)用程序發(fā)出使用獨(dú)占模式的需求后,系統(tǒng)會(huì)切斷共享模式這一條路徑,聲音訊號(hào)就會(huì)直接送達(dá)Kernel Mode最后到達(dá)底層的音頻設(shè)備后輸出,音頻設(shè)備在此時(shí)也會(huì)完全100%配合獨(dú)占模式送來的音頻格式進(jìn)行處理。
獨(dú)占模式設(shè)置選項(xiàng)
通過以上的設(shè)計(jì)我們知道,從Vista開始,我們有一個(gè)很明確的通道可以來讓聲卡直接處理最原始的數(shù)字訊號(hào),不會(huì)再經(jīng)過諸如SRC或其他轉(zhuǎn)換后造成的訊號(hào)失真了,也能保證聲卡不論在數(shù)字輸出還是模擬輸出上,都能直接用原始音頻信號(hào)來處理,而不是使用操作系統(tǒng)層層加料(即Shared Mode下)后的污染信號(hào),這個(gè)也就是音樂愛好者和電影愛好者常掛在嘴邊的bit-exact或者bit-perfect了。
功能
在Windows Vista和Windows 7中,您可以使用WASAPI通道欣賞音樂,從而避開系統(tǒng)音染,避免SRC造成的失真。
Foobar2000中的WASAPI輸出設(shè)置
在Windows XP中,因?yàn)椴]有引入U(xiǎn)AA,所以并不存在WASAPI,但您仍然可以通過之前提到的ASIO來欣賞高保真音樂。
注意事項(xiàng)
當(dāng)使用WASAPI + 獨(dú)占模式 輸出時(shí),您會(huì)發(fā)現(xiàn)其他所有的系統(tǒng)音效都聽不到了。這個(gè)自然是因?yàn)楠?dú)占了輸出設(shè)備而導(dǎo)致其他聲音信號(hào)無法輸出。
除此之外您也無法從系統(tǒng)音量那邊調(diào)整音量大小,這是正常的,請(qǐng)參考上面的UAA架構(gòu)圖,因?yàn)橐呀?jīng)跳過右邊的Audio Engine,此處包括了音量控制與合成器,因此跳過此處后,您調(diào)整系統(tǒng)音量大?。ㄏ喈?dāng)于您在調(diào)整Audio Engine)當(dāng)然是沒有任何作用的。而且,為了您音質(zhì)的純凈,也不適宜調(diào)整播放軟件上的音量控制,應(yīng)該保持在最大聲處,因?yàn)橐坏┱{(diào)整音量,就是將數(shù)字信號(hào)用某些算法降低音量后再輸出,品質(zhì)多少會(huì)受到影響,對(duì)于要外接 DAC/AVR的玩家來說,也等于是因?yàn)檎{(diào)整音量而導(dǎo)致輸出的不是原始信號(hào)。