群組參數
群組參數會識別音訊會話的 集合,這些會話 全都由系統音量控制程式 Sndvol 中的單一音量控制所控制。 群組參數是 GUID,可唯一識別計算機範圍內的集合。
群組參數的目的類似於跨進程會話的會話 GUID。 也就是說,群組參數可讓使用者以單一單位的形式控制來自任意數目進程的數據流集合。 不過,在跨進程會話無法提供解決方案的情況下,群組參數會提供此目的。
如果數個用戶端將各自的數據流指派給個別會話,但將相同的群組參數指派給所有會話,則 Sndvol 會顯示這些會話的單一磁碟區控件。 若要提供群組參數的支援,Sndvol 或任何類似的磁碟區控制應用程式必須執行下列動作:
- 顯示磁碟區控件之前,請先檢查所有使用中會話的群組參數。 在單一磁碟區控制下,將具有相同群組參數的所有會話分組在一起。
- 當使用者變更特定群組參數之磁碟區控件上的設定時,請更新共用該群組參數之所有會話的磁碟區層級。
群組參數有助於減少 Sndvol 所顯示的磁碟區控件數目。 如果 Sndvol 將顯示與太多控件雜亂,則使用者可能會感到困惑。 若不支援群組參數,Sndvol 一律會針對每個會話顯示個別的磁碟區控件,而這在所有情況下可能都不適用。 此外,群組參數提供方便的方式,以確保包含類似音訊內容的會話可以輕鬆地設定為相同的音量層級。
如先前所述,較高層級的音訊 API 通常會將其串流指派給預設的進程特定會話(由會話 GUID 值GUID_NULL識別)。 此預設值可讓 Sndvol 針對每個用戶端應用程式進程顯示個別的磁碟區控件,這通常是所需的行為。 此外,如果相同客戶端的數個實例在不同的進程中執行,但需要單一共用的磁碟區控制,則用戶端可以直接將串流指派給相同的跨進程會話。 這兩個案例都不需要使用群組參數。 不過,如 Microsoft Internet Explorer 所示範的一個重要案例,確實需要使用群組參數來達到所需的行為。
Internet Explorer 可讓用戶開啟多個瀏覽器視窗,而且這些視窗可能不會全部在相同的進程中執行。 如果 Sndvol 針對每個應用程式實例顯示個別的磁碟區控件,則使用者可能會感到困惑,而所有實例都有相同的標籤「Internet Explorer」。在此情況下,跨進程會話不是可行的解決方案,如果 Internet Explorer 的數個實例在不同的進程中執行,他們可能無法將其所有音訊串流指派給單一跨進程會話。 原因是 Internet Explorer 視窗可能會執行 Windows 媒體播放器 實例,或是使用較高層級音訊 API 播放其音訊串流的其他多媒體外掛程式。 這些 API 通常會將進程中的數據流指派給預設的進程特定會話。 Internet Explorer 無法控制將這些數據流指派給會話。
WASAPI 可藉由讓 Internet Explorer 的每個實例存取其預設進程特定會話的會話控件,以及將群組參數指派給該會話,藉以解決此問題。 如果 Internet Explorer 的所有實例將相同的群組參數指派給其所有音訊會話,則 Sndvol 會顯示這些工作階段的單一音量控件。
根據預設,會話不屬於任何群組。 如果用戶端未明確將會話指派給群組,則 Sndvol 會顯示該工作階段的專用磁碟區控制件。 群組參數值GUID_NULL表示會話不屬於任何群組。 如果沒有客戶端明確將群組參數指派給會話,則該會話的群組參數值預設為GUID_NULL。
用戶端可以動態變更指派會話的群組。
群組可以包含音訊端點裝置上跨進程會話和進程特定會話的任何組合。
Sndvol 使用者介面可讓使用者一次只顯示一個音訊端點裝置的音量控制件。 當用戶調整特定裝置的磁碟區控件時,連線到其他裝置的會話音量層級不會受到影響。 特別是,特定群組參數的磁碟區控件只會影響共用群組參數且連線到目前選取裝置的會話。 發生相同群組參數但連線至另一個裝置的會話不會受到影響。
如先前所述,Sndvol 會以顯示名稱和圖示來標記它所顯示的每個磁碟區控件。 如果是群組的磁碟區控件,Sndvol 會任意選取群組中的其中一個會話做為顯示名稱的來源,以及它與磁碟區控件一起顯示的圖示。 因此,為了確保 Sndvol 一律為群組顯示相同的顯示名稱和圖示,指派會話給該群組的所有應用程式實例都應該確保其各自的會話具有相同的顯示名稱和圖示。 如需顯示名稱和圖示的詳細資訊,請參閱 音訊會話。
Sndvol 之類的應用程式可以在會話的群組參數變更時註冊自己以接收通知。 如果應用程式快取將會話指派給群組參數的相關信息,這類通知可能會很有用。 通知會通知應用程式快取的資訊可能不再有效。
若要將群組參數指派給會話,請呼叫 IAudioSessionControl::SetGroupingParam 方法。 若要取得指派給會話的群組參數,請呼叫 IAudioSessionControl::GetGroupingParam 方法。