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

WASAPI

鎖定
WASAPI的全稱是Windows Audio Session API(Windows音頻會話API),是從Windows Vista之後引入的UAA(Universal Audio Architecture)音頻架構所屬的API
中文名
WASAPI
外文名
Windows Audio Session API
適用領域
計算機
引    入
UAA
來    歷
Windows 98/ME末期
設計原理
新音頻架構UAA

WASAPI定義

WASAPI在Windows Vista、Windows 7Windows Server 2008 R2系統中所使用。WASAPI允許傳輸未經修改的比特流到音頻設備,從而避開SRC(Sample Rate Conversion,取樣率轉換器)的干擾。
對於Windows XP來説,與WASAPI類似的通道為ASIO

WASAPI來歷

大約在Windows 98/ME末期,使用電腦播放DVD時的AC3與DTS數字訊號已經可以從聲卡上的數字同軸/光纖輸出,不會有被SRC(Sample Rate Conversion,取樣率轉換器)干擾的問題,但到了Windows 2000時代卻反而送不出去,直到Windows 2000 SP2後才解決這個問題,至此聲卡更新驅動程序後就可以搭配播放軟體將AC3DTS數字訊號輸出。不過要注意的是,這個格式是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
在過去,聲卡廠商例如Creative、Realtek等,為了讓使用者透過自家編寫的控制枱來進行各方面關於音頻設備的設定,所以編寫驅動程序時,必須在Kernel Mode(內核模式)這個層級撰寫相當多的代碼來提供調用,使得使用者的操作設定能夠直達硬件層。然而這對於系統的穩定度是一個很不好的影響,稍微有一點點意外狀況,會因為這些功能跑在Kernel Mode而導致系統死機,所以這也造成Microsoft決定在Windows Server 2003上是預設關閉音頻功能,想要使用音頻功能必須自行到服務器設定裏面去啓用。
而這個問題在 Vista 時代有所改善了。Microsoft要求所有音頻設備的廠商必須遵循UAA的架構來開發驅動程式,也為了配合UAA架構,Vista可以説是整個翻新了音訊處理流程,許多原本需要寫在Kernel Mode的聲卡功能,需要改寫到User Mode(用户模式)去,進而增加了系統穩定度。
圖1 UAA架構框架圖 圖1 UAA架構框架圖
UAA的架構如詞條圖片所示。從圖1中我們可以看出,Windows Vista的音效架構起了大幅度的變化,主要的Kernel Mode只剩下音效驅動的部分,而過去微軟所制定出來的MME以及DirectSound API便不再直接起作用,取而代之是以WASAPI(Windows Audio Session API)來模擬這些舊有的API。

WASAPI設計思路與原理

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以前的操作系統,是完全沒有見過的操作方式。
共享模式架構圖 共享模式架構圖
2. Exclusive Mode(獨佔模式)
也許您已經注意到,從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造成的失真。
Foobar2000中的WASAPI輸出設置 Foobar2000中的WASAPI輸出設置
在Windows XP中,因為並沒有引入UAA,所以並不存在WASAPI,但您仍然可以通過之前提到的ASIO來欣賞高保真音樂,詳細內容請參見詞條ASIO。

WASAPI注意事項

當使用WASAPI + 獨佔模式 輸出時,您會發現其他所有的系統音效都聽不到了。這個自然是因為獨佔了輸出設備而導致其他聲音信號無法輸出。
除此之外您也無法從系統音量那邊調整音量大小,這是正常的,請參考上面的UAA架構圖,因為已經跳過右邊的Audio Engine,此處包括了音量控制與合成器,因此跳過此處後,您調整系統音量大小(相當於您在調整Audio Engine)當然是沒有任何作用的。而且,為了您音質的純淨,也不適宜調整播放軟件上的音量控制,應該保持在最大聲處,因為一旦調整音量,就是將數字信號用某些算法降低音量後再輸出,品質多少會受到影響,對於要外接 DAC/AVR的玩家來説,也等於是因為調整音量而導致輸出的不是原始信號。