核心音訊 API 是使用者模式音訊子系統的基礎。 核心音訊 API 會實作為精簡層的使用者模式系統元件,將使用者模式用戶端與內核模式音訊驅動程式和音訊硬體分開。 較高層級的音訊 API,如 Media Foundation,透過核心音訊 API 存取音訊裝置。 此外,某些音訊應用程式會直接與核心音訊 API 通訊。
核心音訊 API 支援使用者易記的音訊端點裝置概念。 音訊端點裝置是一種軟體抽象概念,代表使用者直接作的實體裝置。 音訊端點裝置的範例包括喇叭、耳機和麥克風。 如需詳細資訊,請參閱 音訊端點裝置。
下圖展示了核心音訊 API 及其與其他使用者模式音訊元件的關係。
為了簡單起見,上圖只會顯示端點裝置的音訊轉譯數據路徑,此圖表不會顯示音訊擷取數據路徑。 核心音訊 API 包括 MMDevice API、WASAPI、DeviceTopology API,以及 EndpointVolume API,這些 API 會在 Audioses.dll 和 Mmdevapi.dll 使用者模式系統模組中實作。
核心音訊 API 為更高層次的 API 如 Media Foundation 提供基礎,Media Foundation 透過其串流音訊渲染器(SAR)元件與核心音訊 API 溝通。
WASAPI 用戶端會透過 端點緩衝區將資料傳遞至端點裝置,。 系統軟體和硬體元件會管理數據從端點緩衝區移至端點裝置的方式,對用戶端而言基本上是透明的。 此外,對於插入音訊適配卡且具有插孔存在偵測的端點裝置,用戶端只能針對實際存在的端點裝置建立端點緩衝區。 如需插孔存在偵測的詳細資訊,請參閱 音訊端點裝置。
上圖顯示兩種類型的端點緩衝區。 如果 WASAPI 的用戶端以 shared mode 開啟串流,則用戶端會將音訊資料寫入端點緩衝區,Windows音訊引擎則從緩衝區讀取資料。 在此模式中,用戶端會與其他進程中執行的應用程式共用音訊硬體。 音訊引擎會混合來自這些應用程式的串流,並透過硬體播放產生的混合。 音訊引擎是使用者模式系統元件(Audiodg.dll),會在軟體中執行其所有串流處理作業。 相反地,如果用戶端 獨佔模式開啟數據流,則用戶端具有音訊硬體的獨佔存取權。 一般而言,只有少數「專業音訊」或 RTC 應用程式需要獨佔模式。 雖然圖表同時顯示共用模式和獨佔模式數據流,但根據用戶端是以共用模式或獨佔模式開啟數據流而定,這兩個數據流中只有一個 (及其對應的端點緩衝區) 存在。
在獨佔模式中,用戶端可以選擇以端點裝置支援的任何音訊格式開啟數據流。 在共用模式中,客戶端必須以音訊引擎目前使用的混合格式開啟數據流(或類似混合格式的格式)。 音訊引擎的輸入數據流和引擎的輸出混合都是以此格式表示。
在 低延遲模式下(共享模式下可用於串流),音訊引擎以拉取模式運行,延遲大幅降低。 這對於需要低音訊串流延遲以加快串流速度的通訊應用非常有用。
管理低延遲音訊串流的應用程式可以使用多媒體類別排程服務(Multimedia Class Scheduler Service,MMCSS)來提高存取端點緩衝區的應用程式執行緒的優先權。 MMCSS 可讓音訊應用程式以高優先順序執行,而不需要將 CPU 資源拒絕為較低優先順序的應用程式。 MMCSS 會根據其工作名稱,將優先順序指派給線程。 例如,管理音訊串流的執行緒支援「Audio」和「Pro Audio」這兩個任務名稱。 根據預設,「Pro Audio」線程的優先順序高於「音訊」線程的優先順序。 欲了解更多 MMCSS 相關資訊,請參閱 Windows SDK 文件。
核心音訊 API 同時支援 PCM 和非 PCM 資料流格式。 不過,音訊引擎只能混合 PCM 數據流。 因此,只有獨佔模式數據流可以有非 PCM 格式。 如需詳細資訊,請參閱 裝置格式。
音訊引擎會在它自己的受保護進程中執行,這與應用程式執行所在的進程不同。 為了支援共享模式串流,Windows 音訊服務(前圖中標示為「音訊服務」的方塊)會分配一個跨程序端點緩衝區,該應用程式與音訊引擎皆可存取。 針對獨佔模式,端點緩衝區位於應用程式和音訊硬體可存取的記憶體中。
Windows 音訊服務是實作 Windows 音訊政策的模組。 音訊原則是一組內部規則,系統會套用至來自多個共享和競爭使用相同音訊硬體之應用程式之音訊串流之間的互動。 Windows 音訊服務透過設定音訊引擎的控制參數來實作音訊政策。 音訊服務的職責包括:
- 追蹤使用者新增或移除系統的音訊裝置。
- 監視指派給系統中音訊裝置的角色。
- 從產生類似音訊內容類別的工作群組管理音訊串流(主控台、多媒體和通訊)。
- 控制每種不同類型的音訊內容之合併輸出數據流 (“submix”) 的音量層級。
- 通知音訊引擎音訊數據流之數據路徑中的處理元素。
在某些 Windows 版本中,Windows 音訊服務預設是被停用的,必須明確開啟後系統才能播放音訊。
在上圖所示的範例中,端點裝置是一組插入音頻適配卡的喇叭。 用戶端應用程式會將音訊數據寫入端點緩衝區,而音訊引擎會處理將數據從緩衝區傳輸至端點裝置的詳細數據。
上圖中標示為「音訊驅動程式」的方塊可能是系統提供和廠商提供的驅動程式元件的組合。 在PCI或PCI Express總線上的音訊適配卡案例中,系統會提供埠類別系統驅動程式 (Portcls.sys),它會針對適配卡中的各種音訊功能實作一組埠驅動程式,而硬體廠商會提供適配卡驅動程式,以實作一組迷你埠驅動程式來處理埠驅動程式的裝置特定作業。 在PCI或PCI Express總線上的高畫質音訊控制器和編解碼器的情況下,系統會提供適配卡驅動程式(Hdaudio.sys),而且不需要廠商提供的驅動程式。 在 USB 總線上的音訊適配卡案例中,系統會提供 AVStream 類別系統驅動程式 (Ks.sys),再加上 USB 音訊驅動程式 (Usbaudio.sys):同樣地,不需要廠商提供的驅動程式。
為了簡單起見,上圖只會顯示轉譯數據流。 不過,核心音訊 API 也支援擷取數據流。 在共用模式中,數個用戶端可以從音訊硬體裝置共用擷取的數據流。 在獨佔模式中,一個用戶端具有從裝置擷取數據流的獨佔存取權。
相關主題