Wednesday, October 23, 2019

常見音頻API簡介

在計算機系統中,如果需要輸出音頻,就要用特定的方法去驅動Codec、DAC等音頻芯片。在調動音頻芯片的過程中,需要用到一些特殊的應用程序編程接口,也就是音頻API。使用音頻API,音頻軟件如播放器等就可以直接針對API設計輸出程序,而不必針對不同的芯片使用不同的指令。

常見的音頻API有MME、DS、WDM、KS、WASAPI、ASIO等。

MME(WaveIn/WaveOut)

MME是最常見的Windows音頻API,全稱為MutiMedia Extensions,即多媒體擴展技術。它歷史悠久,兼容性好,市面上基本所有設備都能良好支持。它屬於高級的API,並不直接和硬件交流,需要通過層層接口才能訪問音頻硬件,這也為它帶來了高延遲。雖說這種延遲在回放音頻的時候並不會造成音質的劣化,但對音頻的處理和錄製卻有着較大的負面影響。

MME使用waveIn****/waveOut****系列API來完成對音頻的處理。程序啟動後用waveIn****系列函數打開聲卡輸入功能,同時將緩衝區設定到足夠小的值,然後開始將音頻數據錄製到設定的緩衝區,當緩衝區滿後再將緩衝區(WAVHDR)直接加入到waveOut****系列函數的輸出隊列中即可。此方法實現較簡單,缺點是MME為高級API,因此在整個過程中需要走過很多系統處理階段,導致延遲較大。若緩衝區太小會導致聲音斷斷續續。一般最小延遲可到120毫秒左右。

WaveOut是微軟最早提出的音頻流輸出方式,所以它的兼容性也就好,幾乎所有的微軟操作系統和聲卡都支持;但它無法支持“混和多重音頻流”的功能,沒有使用任何的硬件加速,所有的混音動作都是用軟件來執行的。

DirectSound(DS)

Windows95發布後,微軟發現遊戲商還是樂意用DOS作為遊戲平台,原因是遊戲開發商發現Windows95並不適合執行視頻和音頻任務,因為WinAPI32包含的多媒體函數響應太慢了。微軟於是推出了著名的DirectX,DirectX是一套視頻音頻API以及視頻音頻的DSP(效果器)API。DirectSound是其中的一部分,DirectSound有2D/3D之分,DirectSound有效果器函數,因此在輸出的時候還可以加入回聲等效果,用來仿真真實的聲效環境。 DirectSound主要為遊戲提供服務,在一些播放器以及音頻編輯器上,DirectSound也被作為實時效果API使用。DirectSound 注重輸出,輸入方面並沒有特色。只要硬件支持,DirectSound能夠明顯加速輸出響應。Windows的音頻輸出響應速度提高到了一個新的檔次。除了古老的某些聲卡之外,幾乎所有聲卡都支持DirectSound,至少支持DirectSound 2D。

2006年11月,微軟發布Windows Vista,Vista出人意料的放棄了對DirectSound 3D 硬件層(HAL)的支持,也就是說,那些支持DirectSound 3D硬件加速的聲卡,通通失去了加速能力。最新發布的Windows 7繼承了Vista的這個特性,DirectSound 3D硬件加速退出歷史舞台。

DirectX Sound側重於音頻輸出,能直接訪問硬件,響應速度得到了極大的提升。設置DirectSound的工作模式為最高級別,一般最小延遲可到60毫秒左右。

WDM

WDM是Windows Driver Module的縮寫,擁有低延遲、支持多個音頻流等特性。這是Windows 98 SE/ME/2000的一個新特徵,WDM驅動推出後,人們發現以前不支持多音頻流的聲卡都能播放多個音頻流了。WDM也可以算是一套API,通訊的對象是驅動程序而不是普通的應用程序,只要驅動支持WDM,會增加不少功能,例如通用的軟波表等。在輸入輸出方面,WDM比MultiMedia Extensions和DirectSound都要好點,現在幾乎所有沒有被淘汰的聲卡都支持WDM。WDM可以讓聲卡的延時大大降低,某些時候甚至可以媲美ASIO,在一些專業的音頻編輯創作軟件中,已經對WDM提供了支持。

MME延遲高,而Direct Sound並非為專業音頻設計,WDM的出現很好地彌補了這些缺點。WDM直接和音頻芯片的驅動程序交流,減少了大量中間環節,把延遲降低到一個新的層次,目前不少專業音頻軟件都提供了WDM接口。

所謂WDM技術就是應用程序直接調用底層系統服務。總流程也是先接受一個緩衝區的數據,然後輸出。在WinXP下,音頻WDM也就是常說的Kernel Streaming(內核音頻流)。此方案的優勢在於可將延遲做到極低的狀態,一般最小延遲可以到1毫秒~10毫秒,且在一定情況下可以使用非分頁內存、直接硬件IRP和RT,獨佔聲卡的所有資源。

Kernel Streaming(KS)

Kernel Streaming中文意思就是內核流,這是一種直接訪問底層數據的方式,它可以繞開系統的混音器(Windows kernel mixer),直接與聲卡通訊,這使得輸出效率得到提高,輸出延時降低。Kernel Streaming 不經過Kmixer,直接對音頻數據進行內核模式(kernel-mode)處理,這樣一來,我們就可以聽到原汁原味的聲音。

但Kernel Streaming也有其局限性,首先使用這個API會直接霸佔音頻硬件,你聽歌的時候就沒法聽到QQ響;其次這個API沒有音頻輸入功能,也沒法使用麥克風。

需要注意的是由於Vista和Win7開始棄用了kmixer和依賴dma的audio IO,所以Kernel streaming不適用於Vista和Win7。

UAA(WASAPI)

UAA是最新的Windows音頻架構,在Vista推出之時面世。UAA全稱為Universal Audio Architecture,即通用音頻架構,其中用於管理音頻對話的API為WASAPI(Windows Audio Session API)。WASAPI可以對每組音頻對話單獨處理,這顯得意義重大。

舉個例子,使用WASAPI的時候,如果正在用44.1kHz的採樣率播放音樂,但此時音頻採樣率為48kHz的QQ又響了,就不必以混響解決,不會產生採樣率轉換(SRC)劣化音質的情況。事實上,WASAPI這個音頻API是很多音樂發燒友的標配。

WASAPI (Windows Audio Session API) 是從Windows Vista開始加入的UAA(Universal Audio Architecture)音頻架構所屬的API。WASAPI允許傳輸未經修改的比特流到音頻設備,從而避開SRC(Sample Rate Conversion,取樣率轉換器)的干擾。對於Windows XP來說,與WASAPI類似的通道就是上面所說的Kernel streaming,WASAPI只能使用在Vista和Win7以上的系統。

微軟宣稱,vista/7 已經開始棄用了kmixer 和依賴dma 的audio IO,而開發了他們所說的WaveRT (Wave RealTime),他們的WASAPI、MMCSS 等就是使用WaveRT 做核心,而WaveRT 都有一個屬於自己的mixer,但只要開動獨佔摸式就可以bypass 這個mixer,mute 掉所有其他程序的聲音,MMCSS 是讓你提高audio 出入IO 到最高時脈優先權,微軟想做的其實就是使用實時clock timer控制audio 流,而不經dma,直接和UAA audio devices hareware 溝通,甚至讓sound card or audio interface 的hareware clock 直接來控制audio data,這樣的作用就是想做到和ASIO 很相近,就算是WASAPI 共享模式,都已經沒有SRC 了,而是在控制台中可以自由讓你設定共享混音後的共同目的sampling rate, bit size 及channels,所以的可以保留原來的44100Hz 訊號,不會再被SRC,而且現在所有intel motherboard 或intel chips 都已經有了HPET (High Precision Event Timer),可以令video 和audio 的處理更實時精確處理高sampling rates,低bus latency,讓每秒鐘內可以回應資料流事件的次數大幅增加,但不知AMD 的有沒有。

ASIO

ASIO的全稱是“Audio Stream Input Output”,是由德國Steinberg公司所提出的一種音頻技術規範,為音頻API標準之一。ASIO的主要特點是低延遲和多軌多通道傳輸。ASIO完全擺脫了Windows操作系統對硬件的集中控制,它能實現在音頻處理軟件與硬件之間進行多通道傳輸的同時,將系統對音頻流的響應時間降至最短。

Windows自有的MME驅動程式其延遲時間為200~500毫秒,DirectSound為50~100毫秒,Mac OS的Sound Manager則為20~50毫秒,使用ASIO的情況下,緩衝器依照設定的不同可至10毫秒以下,也有因環境較佳而到1毫秒以下的情況產生。 因此,在錄音作業與音樂製作上,可達到實時處理的效果。

低延遲對聲音錄製和後期製作有着重大的意義,但是在聲音回放上的效果卻有爭議。有的發燒友認為,ASIO的低延遲可以極大程度地減少音頻Jitter(抖動),從而提高音質;但有另一種說法稱ASIO對軟硬件的環境要求都比較苛刻,如果音頻驅動編寫水平一般,很容易產生爆音、聲音生冷等問題。

EAX

EAX 即 Environmental Audio Extensions,環境音效拓展集,它算不上是一套獨立的API,它是以DirectSound 3D為基礎,構築的一套3D API,它的開發者就是大名鼎鼎的Creative。Creative推出EAX是為了和A3D競爭,並最終獲得市場的勝利,創新收購Aureal後,A3D的一些先進算法被導入到EAX當中。

OpenAL

OpenAL是一個免費的跨平台的音頻3D API,由Loki Software開發,但Loki Software沒多久就倒閉了,自由軟件社區接手進一步的開發,現在的實際主導者就是Creative。由於Vista放棄對DirectSound 3D硬件加速的支持,Creative也陷入尷尬境地,要讓EAX繼續發展下去,只能加強對OpenAL的支持。Creative希望在OpenAL的基礎上重構EAX,要實現這一步並不難,但真正要廣泛應用,還需遊戲廠商的大力支持。時至今日,OpenAL的被支持力度仍舊比不上當年的DirectSound 3D,Creative要重現輝煌,尚需時日。但如果努力獲得成功,可能獲得極大的收益,因為OpenAL是唯一一個跨平台的API。

2 comments

  1. 可以輸入中文,但字數不能太少,否則無法提交。

  2. 評論的“Name”如填寫中文,無法提交。不知道是不是只有我這裡存在這個問題呢

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.