User-Mode音訊元件

在 Windows Vista 中,核心音訊 API 可作為使用者模式音訊子系統的基礎。 核心音訊 API 會實作為精簡層的使用者模式系統元件,將使用者模式用戶端與核心模式音訊驅動程式和音訊硬體分開。 較高層級的音訊 API,例如 DirectSound 和Windows多媒體功能,可透過核心音訊 API 存取音訊裝置。 此外,某些音訊應用程式會直接與核心音訊 API 通訊。

核心音訊 API 支援音訊端點裝置的使用者易記概念。 音訊端點裝置是軟體抽象概念,代表使用者直接操作的實體裝置。 音訊端點裝置的範例包括喇叭、耳機和麥克風。 如需詳細資訊,請參閱 音訊端點裝置

下圖顯示核心音訊 API 及其與 Windows Vista 中其他使用者模式音訊元件的關聯性。

diagram of user-mode audio-rendering components

為了簡單起見,上圖只會顯示端點裝置的音訊轉譯資料路徑,圖表不會顯示音訊擷取資料路徑。 核心音訊 API 包括 MMDevice APIWASAPIDeviceTopology APIEndpointVolume API,這些 API 是在Audioses.dll和Mmdevapi.dll使用者模式系統模組中實作。

如上圖所示,核心音訊 API 提供下列較高層級 API 的基礎:

  • 媒體基礎
  • Windows多媒體waveXxx混合器Xxx函式
  • DirectSound
  • DirectMusic

DirectSound、Windows多媒體音訊功能,以及媒體基礎 (,透過其串流音訊轉譯器或 SAR,元件) 直接與核心音訊 API 通訊。 DirectMusic 會透過 DirectSound 間接與核心音訊 API 通訊。

WASAPI 用戶端會透過 端點緩衝區將資料傳遞至端點裝置。 系統軟體和硬體元件會管理資料從端點緩衝區移至端點裝置的方式,對用戶端而言相當透明。 此外,對於插入音訊配接器且具有插孔狀態偵測的端點裝置,用戶端只能針對實際存在的端點裝置建立端點緩衝區。 如需有關插孔存在偵測的詳細資訊,請參閱 音訊端點裝置

上圖顯示兩種類型的端點緩衝區。 如果 WASAPI 的用戶端以共用模式開啟資料流程,則用戶端會將音訊資料寫入端點緩衝區,而Windows音訊引擎會從緩衝區讀取資料。 在此模式中,用戶端會與其他進程中執行的應用程式共用音訊硬體。 音訊引擎會混合來自這些應用程式的串流,並透過硬體播放產生的混合。 音訊引擎是使用者模式系統元件 (Audiodg.dll) ,會在軟體中執行其所有串流處理作業。 相反地,如果用戶端以 獨佔模式開啟資料流程,則用戶端具有音訊硬體的獨佔存取權。 一般而言,只有少數的「專業音訊」或 RTC 應用程式需要獨佔模式。 雖然圖表顯示共用模式和獨佔模式資料流程,但這兩個數據流中只有一個 (及其對應的端點緩衝區) 存在,視用戶端以共用模式或獨佔模式開啟資料流程而定。

在獨佔模式中,用戶端可以選擇以端點裝置支援的任何音訊格式開啟資料流程。 在共用模式中,用戶端必須以音訊引擎目前使用的混合格式開啟資料流程, (或類似混合格式的格式) 。 音訊引擎的輸入資料流程和引擎的輸出混合全都以此格式顯示。

在 Windows 7 中,已為共用模式中的資料流程新增稱為低延遲模式的新功能。 在此模式中,音訊引擎會以提取模式執行,其中延遲大幅降低。 這非常適用于需要低音訊串流延遲的通訊應用程式,以加快串流速度。

管理低延遲音訊串流的應用程式可以使用多媒體類別排程器服務, (WINDOWS Vista 中的 MMCSS) ,以增加存取端點緩衝區的應用程式執行緒優先順序。 MMCSS 可讓音訊應用程式以高優先順序執行,而不會拒絕 CPU 資源到低優先順序的應用程式。 MMCSS 會根據其工作名稱,將優先順序指派給執行緒。 例如,Windows Vista 支援管理音訊資料流程之執行緒的工作名稱 「Audio」 和 「Pro Audio」。 根據預設,「Pro音訊」執行緒的優先順序高於「音訊」執行緒的優先順序。 如需 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 也支援擷取資料流程。 在共用模式中,數個用戶端可以從音訊硬體裝置共用擷取的資料流程。 在獨佔模式中,一個用戶端具有從裝置擷取資料流程的獨佔存取權。

程式設計指南