使用者模式音訊元件

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

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

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

diagram of user-mode audio-rendering components

為了簡單起見,上圖只會顯示端點裝置的音訊轉譯數據路徑,此圖表不會顯示音訊擷取數據路徑。 核心音訊 API 包括 MMDevice API、WASAPIDeviceTopology API 和 EndpointVolume 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 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 也支援擷取數據流。 在共用模式中,數個用戶端可以從音訊硬體裝置共用擷取的數據流。 在獨佔模式中,一個用戶端具有從裝置擷取數據流的獨佔存取權。

程式設計指南