Share via


音訊會話

音訊會話是 WASAPI 用戶端可以共同管理的相關音訊串流群組。 用戶端可以控制每個個別會話的磁碟區層級和靜音狀態。 系統會將用戶端指定的磁碟區及靜音設定統一套用至會話中的所有數據流。

當用戶端初始化音訊數據流時,它會將音訊數據流指派給音訊會話。 如需詳細資訊,請參閱 IAudioClient::Initialize

音訊會話包含轉譯數據流或擷取數據流,但不包含兩者。 根據預設,轉譯會話的磁碟區和靜音設定會在系統重新啟動時持續運作。 擷取會話的磁碟區和靜音設定並非持續性。 (包含以回送模式運作的數據流的會話會被視為與擷取會話相同。也就是說,會話設定不是持續性的。如需回送模式的詳細資訊,請參閱 回送錄製。)

每個音訊數據流都只屬於一個會話。 用戶端會在初始化數據流物件時,將音訊數據流指派給特定會話。 數據流會在數據流的存留期中保留其成員資格。 建立數據流物件之後,物件就會存在,直到客戶端釋放對象的最後一個計數參考為止,然後刪除物件。

雖然客戶端無法變更已指派現有數據流的會話,但它可以藉由刪除數據流來達成類似的效果(藉由釋放其所有參考)、建立新的數據流來取代已刪除的數據流,並將新數據流指派給另一個會話。

每個轉譯會話都代表形成透過特定 音訊端點裝置播放之全域混合的數據流子集。 全域混合會結合所有共用裝置之應用程式的所有會話。

通常,具有數個數據流的應用程式會將其所有數據流指派給相同的會話。 不過,應用程式可以選擇將不同的數據流指派給不同的會話。 應用程式未明確指派給會話的任何數據流都屬於預設會話。

一般音訊應用程式應該避免修改會話的音量和靜音設定。 相反地,用戶會透過控制程式的使用者介面來控制這些設定。 例如,在 Windows Vista 中,系統提供的程式Sndvol.exe會顯示音量控件,並針對系統中每個作用中或最近作用中的轉譯會話顯示音量控件和靜音控件。 透過這些控制件,使用者可以調整系統中所有會話的音量和靜音設定。

Sndvol 程式目前只會顯示音訊轉譯端點裝置的音量控件。 它不會顯示音訊擷取裝置的音量控件。

如果會話包含一或多個使用中的數據流,則會話為作用中。 作用中的 數據流處於執行中狀態。 非作用中的 數據流處於已停止狀態。 當會話的第一個數據流變成作用中時,會話就會變成作用中。 當會話的最後一個作用中數據流變成非使用中時,會話就會變成非作用中。 會話在一段時間內處於非作用中狀態之後,系統會將會話的狀態從非作用中變更為過期。

Sndvol 會顯示所有作用中和非使用中轉譯會話的音量和靜音控件。 當會話的狀態從非使用中變更為過期,或會話終止時,Sndvol 會移除會話的磁碟區和靜音控件。 (工作階段會在刪除其最後一個數據流時終止;也就是說,當客戶端釋放工作階段中最後剩餘資料流物件的最終參考計數時。此規則的其中一個例外是系統通知音效。 無論這些音效的會話狀態為何,Sndvol 一律會顯示系統通知音效的音量和靜音控件。

一般而言,數據流屬於只跨越包含建立數據流之應用程式之進程的會話。 不過,應用程式可以選擇定義結合來自兩個或多個進程的數據流的跨進程會話。

WASAPI 主要支援跨進程工作階段,以便:

  • Sndvol 程式可以向使用者呈現單一音量控制項,以管理所有應用程式的系統通知音效。
  • 在一個進程中執行的媒體播放機可以將受保護的內容串流至在另一個進程中執行的解密程式。

與進程特定轉譯會話的控件設定類似,跨進程轉譯會話的控件設定預設會持續於系統重新啟動。 WASAPI 主要針對系統通知音效的優點提供此行為,這必須保留使用者的音量和靜音設定,因為應用程式混合會隨著時間而有所不同。

Sndvol 程式會將每個工作階段的音量控制項加上顯示名稱和圖示的標籤。 用戶端可以選擇將顯示名稱和圖示明確指派給會話。 如果用戶端未提供這些專案,則 Sndvol 會改為顯示預設名稱和預設圖示。 默認名稱會納入資訊,例如應用程式視窗的標題。 預設圖示是應用程式視窗的圖示。 只有在進程特定會話的情況下,這些預設值才會為使用者提供有意義的資訊。 請注意,跨進程會話可以與多個應用程式相關聯。 在此情況下,只有用戶端提供的顯示名稱和圖示才有意義。

雖然轉譯會話的磁碟區和靜音設定預設會持續於系統重新啟動,但用戶端提供的顯示名稱和圖示則不是。 為了確保 Sndvol 顯示用戶端提供的名稱和圖示,客戶端必須在用戶端將第一個數據流指派給會話時,明確地將名稱和圖示指派給會話。 系統只會保留會話的顯示名稱和圖示,直到會話終止為止。

每個會話都是由會話 GUID 來識別。 當客戶端開啟數據流時,用戶端會將該數據流指派給特定會話。 用戶端會提供下列兩項資訊,以識別該會話:

  • 會話 GUID。
  • 會話是跨進程或進程特定的工作階段—進程特定工作階段只包含來自客戶端進程的數據流。

這項資訊足以區分同一部計算機中所有其他會話的特定會話。 進程特定會話的會話 GUID 只會在擁有會話的進程範圍內唯一識別會話。 相反地,跨進程會話的會話 GUID 在計算機上執行的所有進程範圍內是唯一的。

在進程特定會話的情況下,系統會使用會話 GUID 和進程標識碼的組合,以唯一識別計算機範圍內的會話。 因此,如果兩個不同進程中的用戶端將各自的數據流指派給具有相同會話 GUID 的兩個進程特定會話,則系統會將會話視為個別的,因為它們的進程標識碼不同。 此外,如果跨進程會話使用與一或多個進程特定會話相同的會話 GUID,系統會將跨進程會話視為與進程特定會話不同,即使它們共用相同的會話 GUID 也一樣。

例如,在 Windows Vista 中,Windows 多媒體 waveOutXxx 函式和 DirectSound 等較高層級 API 通常會將它們建立的音頻數據流指派給會話 GUID 值所識別的默認進程特定會話,GUID_NULL。 對於這些 API 的用戶端,每個用戶端進程的預設會話會與其他客戶端進程的預設會話分開,即使會話具有相同的會話 GUID 也一樣。 此外,如果一或多個應用程式將數據流指派給會話 GUID 值所識別的跨進程會話GUID_NULL,則系統會將此跨進程會話視為與共用相同會話 GUID 的默認進程特定會話不同。 因此,Sndvol 程式會針對每個用戶端的預設、進程特定會話顯示個別的磁碟區控件,如果會話存在,則會針對會話 GUID 值GUID_NULL識別的跨進程會話顯示額外的磁碟區控件。

每個會話只會與一個音訊端點裝置相關聯。 如果兩個會話具有相同的會話 GUID 和進程標識符,但與不同的裝置相關聯,則系統會將這兩個會話視為個別的。 會話永遠不能同時包含擷取和轉譯數據流,因為擷取數據流只能與擷取裝置相關聯,而且轉譯數據流只能與轉譯裝置相關聯。

如先前所述,會話的磁碟區和靜音設定會在系統重新啟動時持續運作。 應用程式的兩個或多個實例可以建立具有相同會話 GUID 的進程特定會話。 透過 Sndvol 程式,用戶可以為每個工作階段選取不同的磁碟區及靜音設定。 在這些會話終止之後,系統只會保留其中一個會話的控制設定,也就是最後一個要終止的會話。 稍後,如果應用程式的新實例建立進程特定會話,且與之前相同的會話 GUID,該會話會繼承先前儲存的磁碟區和靜音設定。

應用程式不應該嘗試將數據流新增至或控制另一個不相關的應用程式所擁有的會話磁碟區層級。 此外,應用程式不應該嘗試控制系統管理會話的音量層級,以取得通知音效。 不過,應用程式可以藉由呼叫 PlaySound 函式,透過系統會話播放通知音效。 如需詳細資訊,請參閱 舊版音訊應用程式的通知音效。

當工作階段的狀態變更時,應用程式可以註冊以接收通知。 如需詳細資訊,請參閱 音訊會話事件

在罕見的情況下,建立進程特定會話的應用程式可能需要合併 Sndvol 中單一磁碟區控制下兩個或多個應用程式實例的進程特定會話。 如需詳細資訊,請參閱 群組參數

程式設計指南