Интерфейс IAudioSessionEnumerator (audiopolicy.h)

Интерфейс IAudioSessionEnumerator перечисляет звуковые сеансы на звуковом устройстве. Чтобы получить ссылку на интерфейс IAudioSessionEnumerator объекта перечислителя сеансов, приложение должно вызвать IAudioSessionManager2::GetSessionEnumerator.

Наследование

Интерфейс IAudioSessionEnumerator наследуется от интерфейса IUnknown . IAudioSessionEnumerator также имеет следующие типы элементов:

Методы

Интерфейс IAudioSessionEnumerator содержит следующие методы.

 
IAudioSessionEnumerator::GetCount

Метод GetCount получает общее количество аудиосеансов, открытых на звуковом устройстве.
IAudioSessionEnumerator::GetSession

Метод GetSession получает звуковой сеанс, указанный номером звукового сеанса.

Комментарии

Если приложение хочет получать уведомления о создании новых сеансов, оно должно зарегистрировать свою реализацию IAudioSessionNotification в диспетчере сеансов. После успешной регистрации диспетчер сеансов отправляет приложению уведомления о создании сеанса в виде обратных вызовов. Эти уведомления содержат ссылку на указатель IAudioSessionControl созданного сеанса.

Перечислитель сеансов поддерживает список текущих сеансов, удерживая ссылки на указатель IAudioSessionControl каждого сеанса. Однако перечислитель сеансов может не знать о новых сеансах, о которых сообщается через IAudioSessionNotification. В этом случае приложение будет иметь доступ только к частичному списку сеансов. Это может произойти, если указатель IAudioSessionControl (в обратном вызове) освобождается до инициализации перечислителя сеансов. Таким образом, если приложению требуется полный набор сеансов для конечной точки звука, приложение должно поддерживать собственный список.

Приложение должно выполнить следующие действия, чтобы получать уведомления о сеансах и управлять списком текущих сеансов.

  1. Инициализация COM с помощью модели многопоточных квартир (MTA) путем вызова CoInitializeEx(NULL, COINIT_MULTITHREADED) в потоке, отличном от пользовательского интерфейса. Если MTA не инициализировано, приложение не получает уведомления о сеансе от диспетчера сеансов.
    Примечание Потоки, запускающие пользовательский интерфейс приложения, должны быть инициализированы с помощью модели потоков квартиры.
     
  2. Активируйте интерфейс IAudioSessionManager2 с конечной точки звука. Вызовите IMMDevice::Activate с параметромiid, для IID_IAudioSessionManager2. Этот вызов получает ссылку на интерфейс IAudioSessionManager2 диспетчера сеансов в параметре ppInterface .
  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
Header audiopolicy.h

См. также раздел

Основные звуковые интерфейсы