如何在 Windows 7 下聆聽最佳品質的音樂?(數位輸出 by WASAPI)





(本文撰寫時環境為 Windows Vista,Windows 7 完全適用)

在 Windows Vista / Windows 7 下到底該怎麼做,才能用最佳品質聆聽音樂呢?這牽扯到如何將原汁原味的數位聲音訊號交給音效卡後數位輸出到 DAC/環繞擴大機,中間不要有其他多餘的關卡一事,我就拿 Vista x64 與 ASUS Xonar HDAV 1.3 音效卡的組合來做說明吧!

在開始之前,不免要扯一下過去的歷史。大約在 Windows 98/ME 末期,使用電腦播放 DVD 時的 AC3 與 DTS 數位訊號已經可以從音效卡上的數位同軸/光纖送出去,不會有被 SRC (Sample Rate Conversion,取樣率轉換器) 干擾的問題,但到了 Windows 2000 時代卻反而送不出去,直到 Windows 2000 SP2 後才解決這個問題,至此音效卡更新驅動程式後就可以搭配播放軟體將 AC3 或 DTS 數位訊號丟出去。不過要注意的是,這個格式是 48kHz 16bit,對於音樂 CD 所使用的 44.1kHz 16bit,似乎沒有一個保證能不經過 SRC 就輸出的方法,僅有一些專業用途的音效卡可以做到。近年來,音效卡市場萎縮,主機板 onboard 音效當道,數位輸出也幾乎都是標準配備,可是要能做到原封不動輸出 44.1kHz 16bit 的數位訊號,還是有困難,於是有些人想的是將聲音訊號透過良好的演算法進行 up-sampling 後再來送出 (即 foobar2000 + PPHS/SSRC 的作法),也拉高音效卡的數位輸出標準到 24bit 96kHz,可以減少 SRC 帶來的衝擊與影響。而我現在想要做的,就是用簡單的方法,直接輸出原封不動的 16bit 44.1kHz 訊號。

回過頭來繼續講,也是因為考慮到,儘管 ASUS 下了功夫在 HDAV 1.3 的類比輸出上,不過以 HDMI 1.3a 輸出為特色的這張音效卡來說,可能大部分的人買來後也是用 HDMI 接到環繞擴大機,而比較少用到類比輸出的部分吧?基於相信音響大廠的 DAC 一定比較好的心態作祟,或者就是想要點亮環繞擴大機的某些燈號才有爽度,如何在聽音樂的前提下讓 HDAV 1.3 輸出原汁原味的數位聲音訊號,就顯得很重要了,這個做得好,HDAV 1.3 這張音效卡就越是成為家庭媒體中心不可或缺的一份子。

看了一些國內外的討論文章,然後自己實做,確認了以下的方式是可以保證輸出 16bit 44.1kHz 的數位訊號,完全原汁原味。

  1. 播放軟體請使用 foobar2000,下載:http://www.foobar2000.org/?page=Download,然後安裝起來。
  2. 除此之外,請在上述同一頁下載 WASAPI output,解開來的 foo_out_wasapi.dll 這個檔案請放到 foobar2000 安裝目錄的 components 資料夾下。例如在本例中因為是安裝在 x64 環境,且一切按照系統預設,所以是放在 C:\Program Files (x86)\foobar2000\components 這個路徑下。
  3. 啟動 foobar2000,然後到 Files → Preferences 下調整 Playback 下的 Output 這個頁面,順利的話應該會看到有兩個 WASAPI 開頭的音效裝置。您如果使用數位輸出/HDMI 輸出,就選數位輸出;如果你沒有外接的解碼設備,想要用 HDAV 1.3 的類比輸出,就選喇叭那一項:(下圖中有三個 WASAPI 裝置,其中一個不是 HDAV 1.3,那是主機板 M3A78-EM 的 HDMI 輸出)

    foobar2000_wasapi_1

    由於不同的音效卡在硬體上的設計因素,此法用在類比輸出上不一定能夠讓您的音樂品質更好,原因是使用此法將資料送達音效卡後,雖然能保證數位訊號的原始性,但接著音效卡在輸出到類比線路上時,可能會經過音效卡本身的 SRC 將 44.1kHz 轉換為 48kHz,造成訊號失真,因此這個作法僅能保證當您用數位輸出外接 DAC/環繞擴大機時會有最原汁原味的體驗效果。

    最後確認 Output Device 是 WASAPI 開頭的 ASUS HDAV 1.3 數位輸出或 HDMI 輸出即可。

    foobar2000_wasapi_2

  4. 做完了。

就這樣子而已。

你會發現這樣已經可以播放音樂,且有幾個特性:

  1. 不能從系統的音量控制台去調整聲音大小了。
  2. 其他所有系統音效都聽不到了。
  3. 如果您的設備夠好,或您有金耳朵,將發現這樣子經由您環繞擴大機解碼出來的聲音品質有更好了一點。

但這樣如何確保是原汁原味的 16bit 44.1kHz 數位訊號?我是這麼驗證的:我手邊有一些 wave 檔,其本質是 DTS 編碼過的訊號,經由此法從 foobar2000 播放出去,環繞擴大機立即亮起 DTS 燈號,就是最好的證明。為什麼?因為如果是一般的音樂檔,亦即最終將是立體聲 16bit 44.1kHz 的數位訊號,如果有經過 SRC 勢必會被改變內容,但人耳並不一定聽得出來;然而我現在播放的是 DTS 編碼後的 wave 檔,如果被 SRC 當成兩聲道的音樂來處理過,將會完全變成雜音後丟出去,但經過這樣的設定後並沒有聽到雜音,而是正確的內容並且讓環繞擴大機亮起 DTS 燈號,足見這樣的設定已經完全擺脫 SRC 及 Windows 混音器的控制,順利輸出原汁原味的數位訊號了。

進一步的測試就是拿出那些 DTS 編碼的音樂 CD,放進光碟機,從 foobar2000 選擇 File → Open Audio CD 選項,然後開始播放,同樣能夠點亮環繞擴大機的 DTS 燈號並且聽到正確的內容。也因此可以確認,不管是無損壓縮的 APE 檔或是已經被失真處理過的 MP3 檔,絕大部分都是要還原成 16bit 44.1kHz 這個格式,就這樣原封不動的從 HDAV 1.3 的數位輸出丟出去吧!不用再考慮東考慮西擔心 SRC 或想要 up-sampling 了。

方法講完了,也該來講一下理論。從剛才到現在,一直出現一個念起來像是哇殺米的 WASAPI 字樣,到底,它是什麼?不過在講 WASAPI 之前,不妨先瞭解一下 Microsoft 於 Windows XP 中期提出,並且在 Vista 時完整實做的 UAA 吧!

UAA:Universal Audio Architecture

音效卡廠商例如 Creative、Realtek 等,為了讓使用者透過自家撰寫的控制台來進行各方面關於音效裝置的設定,所以撰寫驅動程式時,必須在 Kernel Mode 這個層級撰寫相當多的程序來提供呼叫,使得使用者的操作設定能夠直達硬體層。然而這對於系統穩定度是一個很不好的影響,稍微有一點點意外狀況,會因為這些功能跑在 Kernel Mode 而導致系統當機,所以這也造成 Microsoft 決定在 Windows Server 2003 上是預設關閉音效功能 (核心基礎同 Windows XP,反正作為一個企業用的 server,絕大部分情況下根本不需要音效功能),想要使用音效功能必須自行到服務的設定裡面去啟用。

(不過我是覺得很奇怪啦!那以前喊 WHQL 認證是幹什麼的?不就是 Microsoft 認可該驅動程式夠穩定嗎?為什麼 Microsoft 要自己推翻?)

而這個問題在 Vista 是有所改善了。Microsoft 要求所有音效設備的廠商必須遵循 UAA 的架構來開發驅動程式,也為了配合 UAA 架構,Vista 可以說是整個翻新了音訊處理流程,許多原本需要寫在 Kernel Mode 的音效卡功能,現在需要改寫到 User Mode 去,進而增加系統穩定度。而音效流程處理的改變,最外顯的當屬每個應用程式有自己的音量控制,這在 Windows XP/2003 以前的作業系統,是完全沒有見過的操作方式。

vista-mixer

根據 MSDN 網站的這一頁資料,我們來看一張圖:

bb981540sysfxapo_custom-detailsen-usmsdn10

嚴謹的來說,上圖是 Windows 的 User Mode 中,啟用 Shared Mode 的流程圖 (關於 Shared Mode 待會就會提到),再往下就要進入 Kernel Mode。可以發現,每一個應用程式都有一個入口,然後在 Audio Engine 內,經過 Microsoft 的 APO(Audio Processing Object),再經過第三方廠商撰寫的 sAPO(System Effects Audio Processing Object),聲音訊號經一連串的處理,再進入 Device Pipe 階段,這裡要進行混音動作。關於在 Audio Engine 這裡會產生混音動作的輔助說明亦可參考 http://channel9.msdn.com/shows/Going+Deep/Vista-Audio-Stack-and-API/ 的影片。這段影片的預覽圖片剛好顯示了 Audio Engine 最下方有個 mix buffer 區塊,混音動作就是在這裡產生,這段說明在該影片的 18:20 處 (關於 Audio Engine 介紹)

有軟體的混音動作,就可能會經過 SRC,也可能產生其他人耳不易發現但數據上確實有變化的動作,再加上聲音訊號還要經過 APO 與 sAPO 等的調整 (例如低音增益、環繞音效等功能),所以聲音訊號要經過層層關卡,不但傳遞路徑長,也無法保證資料的原始性,好處是系統穩定度的提高,也比以前更有彈性。

不過 UAA 架構帶來的衍生問題就是大家熟知的 DirectSound3D 被取消了,連帶造成架構在 DiectSound3D 上的 EAX 一併失效。因此 Creative 推出了 ALchemy 來轉譯成 OpenAL,C-Media(驊訊) 也推出了自己的 Xear3D 來轉譯成 OpenAL,都是為了讓過去許多的遊戲不會到了 Vista 之後只剩下兩聲道且無任何音訊方面的硬體加速。然而,我不免要懷疑 Microsoft 的作法。是,就算 UAA 造成這個問題,可以用系統穩定度來解釋,但是你官方的解決方案是什麼?表面上好像是請大家都去用 OpenAL,可是你又推 XAudio 2 這個跨越 Windows 與 Xbox360 兩大平台的規格了呀!我個人不禁要懷疑,是不是因為現在 CPU 實在是很快,所以以前需要音效卡做混音加速的事情,現在你覺得只要靠 CPU 蠻幹就好,也可以說是為了降低複雜性,更希望綁遊戲廠商一起開發 Windows 與 Xbox360 的遊戲,因此想要用這個純軟體蠻幹的 XAudio 2 來一統 Gaming Audio 的世界?可不可以留一口飯給人家吃呢?好歹大家也陪你的 DirectSound3D 玩了十年,這樣全部推翻然後改用純軟體硬幹,效果會比人家辛苦多年的硬體成果來得好?

WASAPI : Windows Audio Session API

瞭解了 UAA 的一部份精神,以及 Vista 對於 Shared Mode 音效處理的流程後,我們就可以來看看 WASAPI 了,這時也必須對 Vista 的音效架構做全盤的瞭解。首先還是來看看 MSDN 網站上關於 完整的 Vista 音效架構說明圖

ms679160fig1en-usvs85

可能很多人有注意到,從 Vista 開始,音效裝置中有一個「允許應用程式獨佔這個裝置」的設定畫面,但這到底是做什麼用的?下面這張圖,有用 Vista 的人應該都看過,其實這張圖正是對應了上面方塊圖中的 Shared Mode(共用模式) 與 Exclusive Mode(獨占模式) 那兩條路徑:

exclusivemode

這個「允許應用程式獨佔這個裝置」就是上面方塊圖中的 Exclusive Mode。應用程式在一般情況下都是走上面方塊圖中的 Shared Mode 那條路徑,也就是上圖音效設定畫面中的「共用模式」,所有的聲音訊號都會轉送到右邊區塊中的 Audio Engine 部分,使得或多或少被改變了原始內容 (請回顧剛才 UAA 的說明部分)。當應用程式發出使用 Exclusive Mode 的需求後,系統會切斷 Shared Mode 這一條路徑,聲音訊號就會直接送達下方的 Kernel Mode 最後到達底層的音效裝置後輸出,音效裝置在此時也會完全 100% 配合 Exclusive Mode 送來的音效格式進行處理,這也就是為什麼我們剛才要在 foobar2000 中安裝 WASAPI 外掛,因為回頭看 WASAPI 外掛下載的那一頁,開宗明義的就說這是為了要使用 WASAPI + Exclusive Mode 而撰寫出來的外掛工具。

WASAPI + Exclusive Mode 這一個路徑非常類似過去幾年由德國 Steinberg 公司提出的 ASIO,也就是近年來許多非專業用途音效卡也導入的 ASIO 模式,只不過這次是微軟官方正式在 Vista 中所提供的運作模式。如果順利的話,往後 ASIO 可能會逐漸式微,而由這個 WASAPI + Exclusive Mode 以及另外一個 MMCSS(Multimedia Class Scheduler Service) 來取代 ASIO 在專業領域中的需求。MMCSS 是用來提高音訊應用程式在作業系統中的優先權,因為 WASAPI + Exclusive Mode 已經具備低延遲的特性,MMCSS 則是進一步的確保應用程式的高優先執行權 (即上圖中的『給予獨占模式應用程式優先權』),使得聲音的傳遞能夠達到 low-latency 且持續穩定的目標,不被其他應用程式因瓜分 CPU 運算能力而導致聲音傳遞出現中斷。MMCSS 這個部分我們就不多談,因為要輸出原汁原味的數位聲音訊號倒是與 MMCSS 沒有直接的關係。

所以我們不難發現,Microsoft 提出的 UAA 以及在 Vista 上的音訊處理流程,確實補強了過去專業領域所不足的部分,很多過去音效卡廠商繞來繞去左閃右躲還要偷吃步的事情,到了 Vista 之後似乎都可以得到解脫。至於到底能不能取代 ASIO 呢?我想 Microsoft 的立場當然是希望如此,至於這些生產專業音效卡與專業軟體的廠商買不買帳呢?就留給時間去證明吧!我們只要知道,從 Vista 開始,我們有一個很明確的管道可以來讓音效卡直接處理最原始的數位訊號,不會再經過諸如 SRC 或其他轉換後造成的訊號失真了,也能保證音效卡不論在數位輸出還是類比輸出上,都能直接用原始資料來處理,而不是使用作業系統層層加料 (即 Shared Mode 下的產物) 後的骯髒訊號。

聽起來 Shared Mode(共用模式) 作為 Windows Vista 預設的音訊處理模式,似乎是一件很罪惡的事情?其實也並非完全如此,對於不是要達到吹毛求疵的音樂環境來說,Shared Mode 可以讓使用者輕易的操作電腦,並且確保各個應用程式發出的音效都能正確混音後送出,也能提升系統穩定度。不過今天我們要追求的是最好的音訊處理過程,所以 Shared Mode 就有其不足之處,但幸好 Vista 有準備 Exclusive Mode 來滿足專業與吹毛求疵的玩家,這也是比起之前 Windows XP 要進步之處。

那 ASIO 與 Kernel Streaming(KS Mode) 又是什麼?

剛才已經約略提到 ASIO(Audio Stream Input/Output),其實 ASIO 最大的作用是要來降低音訊延遲輸出的問題。對於一般使用者來說這個問題幾乎可以說是不存在,但是對專業混音環境來說卻是個大問題。過去 Windows 的軟體層層包袱,導致應用程式丟出一個聲音訊號到真的送出來之間有一點點時間落差 (回顧剛才所說,Windows Vista 在使用 Shared Mode 的情況下,依然是如此,而且可能延遲的更嚴重),使得電腦與其他設備的同步混音變得很難用,而 ASIO 的制訂就是為了解決這個問題,這也是為什麼一開始 ASIO 都是出現在專業用途的音效卡上。由於 ASIO 可快速直通底層音效硬體的特性,不但時間延遲小,而且避開了作業系統的混音器甚至 SRC,所以也成為近年來追求電腦高品質音效體驗的玩家的選擇。

而 Kernel Streaming 則是一個 Windows XP 時代的作法,工作路徑就類似上面方塊圖中的 Exclusive Mode,直達 Kernel Mode 再往下到達音效裝置,同樣具備了傳遞原始訊號以及低延遲的特性。不過,KS Mode 在 Vista 下並不是被正式使用的功能,一個純 Vista 的音效卡驅動程式,是可以不提供 KS Mode 的。KS Mode 的規劃也不如 WASAPI + Exclusive Mode 來得完整,更不要說再加上 MMCSS 之後的強大品質保證,這也是 Vista 之後就不重視 KS Mode 的原因。

但是!儘管現在有些音效卡有支援 ASIO,底層卻不見得有遵照 ASIO 的要求去實做,Xonar HDAV 1.3 可能就是一例。我們確實是可以透過 ASIO 來讓 HDAV 1.3 播放音樂,可是,資料還是有被破壞後才送出的跡象,因為不管怎麼樣調整 HDAV 1.3 的控制台去限制數位輸出頻率,都會在播放 DTS wave 檔時變成雜音。

所以回頭來看我最上面那張音效裝置的選單,除了要用的 WASAPI 有出現外,ASIO 與 KS 也都有出現,這表示在 Vista x64 下,Xonar HDAV 1.3 同時提供了這些介面。注意,foobar2000 本身沒有支援 ASIO & KS 的能力,必須下載外掛後放在 components 資料夾下,也就是同我們一開始安裝 WASAPI 外掛的方式一樣,才能獲得 ASIO 與 KS 的播放能力。

總結

不只是 ASUS Xonar HDAV 1.3 音效卡,其他音效卡也是如此,在 Windows Vista 下想要獲得最好的音樂聆聽效果,不管是直接使用音效卡的類比輸出,或是音效卡數位輸出後再接 DAC/環繞擴大機,都應該考慮能夠使用 WASAPI + Exclusive Mode 的播放軟體,例如安裝 WASAPI 外掛後的 foobar2000。如果有其他軟體可以做到的話當然也可以依照個人喜好來選擇使用。

當使用 WASAPI + Exclusive Mode 時,無法從系統音量那邊調整音量大小,這是正常的,請參考上面由 MSDN 網站所抓下來的方塊圖,因為已經跳過右邊的 Audio Engine,此處包括了 volume control 與 mixer,因此跳過此處後,你調整系統音量大小 (意即在調整 Audio Engine) 當然是沒有任何作用的。而且,為了您音質的純淨,也不適宜調整 foobar2000 上的音量控制,應該保持在最大聲處,因為一旦調整音量,就是將數位資料用某些演算法降低音量後再輸出,如果是一般音樂也就算了,還是聽得到音樂,只是品質多少會受到影響,但像是我一開始提到的 DTS wave 訊號就不行啦!一旦調整音量,這 DTS 結構就被徹底破壞,也就聽不到正確內容了;對於要外接 DAC/環繞擴大機的玩家來說,也等於是因為調整 foobar2000 的音量而導致輸出的不是原始訊號。因此在調整音量上,請一律保持 foobar2000(或日後其他支援 WASAPI + Exclusive Mode 的播放軟體) 的最大音量輸出,也就是不改變任何原始訊號,而要從您的 DAC 前級或擴大機上去調整。

重新整理要點如下:

  1. 作業系統:Vista x86 / Vista x64 / Windows 7 x86 / Windows 7 x64。
  2. 播放軟體:foobar2000 + WASAPI 外掛,或其他支援 WASAPI + Exclusive Mode 的播放軟體。
  3. 播放軟體的音量維持在最大聲處。

掌握這些原則,那麼不論是數位輸出還是類比輸出,都會是能夠發揮您手邊器材最大威力的作法,也就是做好了「訊源」的角色,相信也會有最佳的音樂聆聽效果。

相關討論

如何在 Vista 下輸出原封不動的數位聲音訊號?

歷史上的今天...


You may also like...

1 Response

  1. 匿名訪客表示:

    Taipei Chrome Chrome 10.0.648.204 Windows Windows 7

    不好意思想請問
    小弟照您的方法做但是 foobar 會出現以下訊息
    Unrecoverable playback error: Endpoint creation failed (0x8889000F)
    環境是 win7 64bit EMU 1212m 接類比子卡 0202
    一直弄不起來不知道為什麼

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

:D  :)  :(  :|  (H)  :P  :$    *-)  ;)  :-.-:  :!:  :S  :!!:  [B01]  [B02]  [B03]  [B04]  [B05]  [B06]  [B07]  [B08]  [B09]  [B10]  [B11]  [B12]  [B13]  [B14]  [XP]  :XD  (Y)  (N)  :-O  :@  8o|  :-#  (L)  (U)  ^o)  |-)