IAudioSessionEnumerator 接口 (audiopolicy.h)

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) ,使用多线程单元 (MTA) 模型初始化 COM。 如果未初始化 MTA,则应用程序不会从会话管理器接收会话通知。
    注意 运行应用程序用户界面的线程应使用单元线程模型进行初始化。
     
  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. 当应用程序收到创建会话通知时,将 IAudioSessionNotification::OnSessionCreated) 接收的新会话 (IAudioSessionControl 指针添加到现有会话列表中。
由于应用程序维护此会话列表并根据应用程序的要求管理会话的生存期,因此音频系统不会对会话控制对象强制执行过期机制。

只要应用程序具有对列表中的会话控件的引用,会话控件就有效。

示例

以下示例代码演示如何创建会话枚举器对象,然后枚举会话。

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

另请参阅

核心音频接口