Share via


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 인터페이스를 활성화합니다. 매개 변수 iidIID_IAudioSessionManager2 설정된 상태에서 IMMDevice::Activate를 호출합니다. 이 호출은 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

추가 정보

핵심 오디오 인터페이스