什麼是WASAPI
WASAPI的全稱是Windows Audio Session API(Windows音頻會話API),是從Windows Vista之後引入的UAA(Universal Audio Architecture)音頻架構所屬的API。WASAPI目前在Windows Vista、Windows 7、Windows Server 2008 R2系統中所使用。WASAPI允許傳輸未經修改的比特流到音頻設備,從而避開SRC(Sample Rate Conversion,取樣率轉換器)的干擾。
對於Windows XP來說,與WASAPI類似的通道為ASIO。
WASAPI的來歷
在我們解釋WASAPI的設計與原理之前,我們必須要回顧一下歷史。
大約在Windows 98/ME末期,使用電腦播放DVD時的AC3與DTS數字訊號已經可以從音效卡上的數字同軸/光纖輸出,不會有被SRC(Sample Rate Conversion,取樣率轉換器)干擾的問題,但到了Windows 2000時代卻反而送不出去,直到Windows 2000 SP2後才解決這個問題,至此音效卡更新驅動程式後就可以搭配播放軟體將AC3或DTS數字訊號輸出。不過要注意的是,這個格式是48kHz 16bit,對於音樂CD所使用的44.1kHz 16bit,所以其中必須有一個轉換過程,但只有一些專業音效卡可以做到不經過轉換即可傳輸。近年來,音效卡市場萎縮,集成音效卡大行其道,數字輸出也幾乎都是標準配備,可是要能做到原封不動輸出44.1kHz 16bit的數字訊號,還是有困難,於是有些人想的是將聲音訊號通過良好的算法進行up-sampling後再來送出 (即Foobar2000+PPHS/SSRC的方案),也拉高音效卡的數字輸出標準到24bit 96kHz,這個方法雖然不能原汁原味輸出44.1kHz 16bit的數位訊號,但起碼我們可以選擇更好的up-sampling算法而避開SRC。
WASAPI是微軟從Vista時代提出的新的音頻架構UAA里的API(應用程式接口),它可以使用戶不必去購買昂貴的專業音效卡就能獲得完美的未經SRC干擾過的不同採樣率和精度的數字音頻輸出。事實上我們除了能夠通過WASAPI輸出未經污染的44.1kHz 16bit的CD數位訊號,我們還可以無損輸出其他採樣率和精度的音頻信號,甚至包括藍光碟內帶的LPCM多聲道信號。接下來我們就來看看這個全新的UAA音頻架構以及WASAPI。
UAA,WASAPI與其設計思路和原理
關於新音頻架構UAA在過去,音效卡廠商例如Creative、Realtek等,為了讓使用者透過自家編寫的控制台來進行各方面關於音頻設備的設定,所以編寫驅動程式時,必須在Kernel Mode(核心模式)這個層級撰寫相當多的代碼來提供調用,使得使用者的操作設定能夠直達硬體層。然而這對於系統的穩定度是一個很不好的影響,稍微有一點點意外狀況,會因為這些功能跑在Kernel Mode而導致系統當機,所以這也造成Microsoft決定在Windows Server 2003上是預設關閉音頻功能,想要使用音頻功能必須自行到伺服器設定裡面去啟用。
而這個問題在 Vista 時代有所改善了。Microsoft要求所有音頻設備的廠商必須遵循UAA的架構來開發驅動程式,也為了配合UAA架構,Vista可以說是整個翻新了音訊處理流程,許多原本需要寫在Kernel Mode的音效卡功能,現在需要改寫到User Mode(用戶模式)去,進而增加了系統穩定度。
UAA的架構如詞條圖片所示。
WASAPI採用了以“Session”為概念的思路,當不同的應用程式調用WASAPI,它們的需求會被各自獨立成不同的Session進行音訊處理,處理過程會經過多個不同功能的APO(Audio Processing Objects,音頻處理對象),這些APO主要用來處理音量增益、格式轉換及混音等功能,但並不包括SRC的動作,如上文所述,所以可以保持音頻不因轉換而造成失真。
在WASAPI中,通過2條路徑來訪問Kernal Mode(核心模式):
1. Shared Mode(共享模式)
如上文所述,WASAPI這個新的API是以Session為概念,當不同的套用程式調用WASAPI,它們的需求會被各自獨立成不同的Session進行音訊處理。從詞條圖片中的設計圖李可以發現,每一個套用程式都有一個入口,然後在Audio Engine內,經過Microsoft的APO(Audio Processing Object),再經過第三方廠商編寫的sAPO(System Effects Audio Processing Object),聲音訊號經一連串的處理,再進入Device Pipe階段,這裡要進行混音操作。有軟體混音動作,就可能會經過SRC,也可能產生其他人耳不易發現但數據上確實有變化的操作,再加上聲音訊號還要經過APO與sAPO等的調整 (例如低音增益、環繞音效等功能),所以聲音訊號要經過層層關卡,不但傳遞路徑長,也無法保證資料的原始性。而音頻流程處理的改變,最明顯的當屬每個套用程式有自己的音量控制,這在Windows XP/2003以前的作業系統,是完全沒有見過的操作方式。
也許您已經注意到,從Windows Vista開始,音頻設備中有一個「允許應用程式獨占控制該設備」的設定,這到底是做什麼用的呢?這個「允許應用程式獨占控制該設備」就是上面UAA音頻架構說明圖中的Exclusive Mode(獨占模式)。套用程式在一般情況下都是走Shared Mode(共享模式)那條路徑,這個路徑被稱作通道,根據上面關於共享模式的介紹,所有的聲音訊號都會轉送至Audio Engine(音效引擎)部分,使得或多或少被改變了原始內容。而當應用程式發出使用獨占模式的需求後,系統會切斷共享模式這一條路徑,聲音訊號就會直接送達Kernel Mode最後到達底層的音頻設備後輸出,音頻設備在此時也會完全100%配合獨占模式送來的音頻格式進行處理。
通過以上的設計我們知道,從Vista開始,我們有一個很明確的通道可以來讓音效卡直接處理最原始的數字訊號,不會再經過諸如SRC或其他轉換後造成的訊號失真了,也能保證音效卡不論在數字輸出還是模擬輸出上,都能直接用原始音頻信號來處理,而不是使用作業系統層層加料(即Shared Mode下)後的污染信號,這個也就是音樂愛好者和電影愛好者常掛在嘴邊的bit-exact或者bit-perfect了。
使用WASAPI欣賞音樂
在Windows Vista和Windows 7中,您可以使用WASAPI通道欣賞音樂,從而避開系統音染,避免SRC造成的失真。
您可以使用foobar 2000進行音樂播放,當您在Foobar 2000中安裝好“foo_out_wasapi”外掛程式後,只需在設定中找到“輸出”選項頁面,之後在設備列表中選中“WASAPI:您的設備名稱”即可,例如“WASAPI:揚聲器(Creative X-Fi)”。
在Windows XP中,因為並沒有引入UAA,所以並不存在WASAPI,但您仍然可以通過之前提到的ASIO來欣賞高保真音樂,詳細內容請參見詞條ASIO。
通過WASAPI輸出LPCM
您仍然可以通過WASAPI來輸出藍光電影中的無損LPCM音軌。首先我們需要安裝ReClock這個軟體,然後確認我們的播放器使用ReClock作為音頻渲染器,這樣解碼過後的LPCM會交給ReClock輸出。接下來按詞條圖片中的配置進行設定即可。
當然您也可以使用其他音頻渲染器。
使用WASAPI的注意事項
當使用WASAPI + 獨占模式 輸出時,您會發現其他所有的系統音效都聽不到了。這個自然是因為獨占了輸出設備而導致其他聲音信號無法輸出。
除此之外您也無法從系統音量那邊調整音量大小,這是正常的,請參考上面的UAA架構圖,因為已經跳過右邊的Audio Engine,此處包括了音量控制與合成器,因此跳過此處後,您調整系統音量大小(相當於您在調整Audio Engine)當然是沒有任何作用的。而且,為了您音質的純淨,也不適宜調整播放軟體上的音量控制,應該保持在最大聲處,因為一旦調整音量,就是將數位訊號用某些算法降低音量後再輸出,品質多少會受到影響,對於要外接 DAC/AVR的玩家來說,也等於是因為調整音量而導致輸出的不是原始信號。