共用方式為


(audiopolicy.h) IAudioSessionEnumerator 介面

IAudioSessionEnumerator介面會列舉音訊裝置上的音訊會話。 若要取得會話列舉值物件的 IAudioSessionEnumerator 介面參考,應用程式必須呼叫 IAudioSessionManager2::GetSessionEnumerator

繼承

IAudioSessionEnumerator介面繼承自IUnknown介面。 IAudioSessionEnumerator 也有下列類型的成員:

方法

IAudioSessionEnumerator介面具有這些方法。

 
IAudioSessionEnumerator::GetCount

GetCount 方法會取得音訊裝置上開啟的音訊會話總數。
IAudioSessionEnumerator::GetSession

GetSession 方法會取得音訊會話編號所指定的音訊會話。

備註

如果應用程式想要在建立新會話時收到通知,則必須向會話管理員註冊其 IAudioSessionNotification 的實作。 成功註冊時,會話管理員會以回呼的形式,將建立會話通知傳送至應用程式。 這些通知包含新建立會話 之 IAudioSessionControl 指標的參考。

會話列舉值會保存每個會話之 IAudioSessionControl 指標的參考,以維護目前會話的清單。 不過,會話列舉值可能不知道透過 IAudioSessionNotification報告的新會話。 在此情況下,應用程式只能存取部分會話清單。 如果在初始化會話列舉值之前釋放回呼) 中的 IAudioSessionControl 指標 (,就可能會發生這種情況。 因此,如果應用程式想要一組完整的音訊端點會話,應用程式應該維護自己的清單。

應用程式必須執行下列步驟,才能接收會話通知和管理目前會話的清單。

  1. 在非 UI 執行緒中呼叫 CoInitializeEx(NULL, COINIT_MULTITHREADED) ,使用多執行緒 Apartment (MTA) 模型初始化 COM。 如果未初始化 MTA,應用程式就不會從會話管理員接收會話通知。
    注意 執行應用程式使用者介面的執行緒應該使用 Apartment 執行緒模型初始化。
     
  2. 從音訊端點裝置啟動 IAudioSessionManager2 介面。 呼叫 IMMDevice::Activate ,並將參數 iid 設為 IID_IAudioSessionManager2。 此呼叫會在ppInterface參數中接收會話管理員IAudioSessionManager2介面的參考。
  3. 實作 IAudioSessionNotification 介面以提供回呼行為。
  4. 呼叫 IAudioSessionManager2::RegisterSessionNotification 來註冊應用程式的 IAudioSessionNotification實作。
  5. 呼叫 IAudioSessionManager2::GetSessionEnumerator來建立和初始化會話列舉值物件。 這個方法會產生端點可用的目前會話清單,並在清單中新增每個會話的 IAudioSessionControl 指標,如果它們還不存在。
  6. 使用上一個步驟中傳回的 IAudioSessionEnumerator 介面來擷取和列舉會話清單。 呼叫 IAudioSessionEnumerator::GetSession,即可擷取每個會話的會話控制項。 請務必為每個會話控制項呼叫 AddRef ,以維護參考計數。
  7. 當應用程式取得建立會話通知時,將新會話的 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

另請參閱

核心音訊介面