(audiopolicy.h) IAudioSessionEnumerator 介面
IAudioSessionEnumerator介面會列舉音訊裝置上的音訊會話。 若要取得會話列舉值物件的 IAudioSessionEnumerator 介面參考,應用程式必須呼叫 IAudioSessionManager2::GetSessionEnumerator。
繼承
IAudioSessionEnumerator介面繼承自IUnknown介面。 IAudioSessionEnumerator 也有下列類型的成員:
方法
IAudioSessionEnumerator介面具有這些方法。
IAudioSessionEnumerator::GetCount GetCount 方法會取得音訊裝置上開啟的音訊會話總數。 |
IAudioSessionEnumerator::GetSession GetSession 方法會取得音訊會話編號所指定的音訊會話。 |
備註
如果應用程式想要在建立新會話時收到通知,則必須向會話管理員註冊其 IAudioSessionNotification 的實作。 成功註冊時,會話管理員會以回呼的形式,將建立會話通知傳送至應用程式。 這些通知包含新建立會話 之 IAudioSessionControl 指標的參考。
會話列舉值會保存每個會話之 IAudioSessionControl 指標的參考,以維護目前會話的清單。 不過,會話列舉值可能不知道透過 IAudioSessionNotification報告的新會話。 在此情況下,應用程式只能存取部分會話清單。 如果在初始化會話列舉值之前釋放回呼) 中的 IAudioSessionControl 指標 (,就可能會發生這種情況。 因此,如果應用程式想要一組完整的音訊端點會話,應用程式應該維護自己的清單。
應用程式必須執行下列步驟,才能接收會話通知和管理目前會話的清單。
- 在非 UI 執行緒中呼叫
CoInitializeEx(NULL, COINIT_MULTITHREADED)
,使用多執行緒 Apartment (MTA) 模型初始化 COM。 如果未初始化 MTA,應用程式就不會從會話管理員接收會話通知。注意 執行應用程式使用者介面的執行緒應該使用 Apartment 執行緒模型初始化。 - 從音訊端點裝置啟動 IAudioSessionManager2 介面。 呼叫 IMMDevice::Activate ,並將參數 iid 設為 IID_IAudioSessionManager2。 此呼叫會在ppInterface參數中接收會話管理員IAudioSessionManager2介面的參考。
- 實作 IAudioSessionNotification 介面以提供回呼行為。
- 呼叫 IAudioSessionManager2::RegisterSessionNotification 來註冊應用程式的 IAudioSessionNotification實作。
- 呼叫 IAudioSessionManager2::GetSessionEnumerator來建立和初始化會話列舉值物件。 這個方法會產生端點可用的目前會話清單,並在清單中新增每個會話的 IAudioSessionControl 指標,如果它們還不存在。
- 使用上一個步驟中傳回的 IAudioSessionEnumerator 介面來擷取和列舉會話清單。 呼叫 IAudioSessionEnumerator::GetSession,即可擷取每個會話的會話控制項。 請務必為每個會話控制項呼叫 AddRef ,以維護參考計數。
- 當應用程式取得建立會話通知時,將新會話的 IAudioSessionControl 指標新增 (在 IAudioSessionNotification::OnSessionCreated) 到現有會話清單中。
只要應用程式參考清單中的會話控制項,會話控制項就有效。
範例
下列範例程式碼示範如何建立會話列舉值物件,然後列舉會話。
HRESULT EnumSessions(IAudioSessionManager2* pSessionManager)
{
if (!pSessionManager)
{
return E_INVALIDARG;
}
HRESULT hr = S_OK;
int cbSessionCount = 0;
LPWSTR pswSession = NULL;
IAudioSessionEnumerator* pSessionList = NULL;
IAudioSessionControl* pSessionControl = NULL;
// Get the current list of sessions.
CHECK_HR( hr = pSessionManager->GetSessionEnumerator(&pSessionList));
// Get the session count.
CHECK_HR( hr = pSessionList->GetCount(&cbSessionCount));
for (int index = 0 ; index < cbSessionCount ; index++)
{
CoTaskMemFree(pswSession);
SAFE_RELEASE(pSessionControl);
// Get the <n>th session.
CHECK_HR(hr = pSessionList->GetSession(index, &pSessionControl));
CHECK_HR(hr = pSessionControl->GetDisplayName(&pswSession));
wprintf_s(L"Session Name: %s\n", pswSession);
}
done:
CoTaskMemFree(pswSession);
SAFE_RELEASE(pSessionControl);
SAFE_RELEASE(pSessionList);
return hr;
}
規格需求
最低支援的用戶端 | Windows 7 [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2008 R2 [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | audiopolicy.h |