Compartilhar via


Interface IAudioSessionEnumerator (audiopolicy.h)

A interface IAudioSessionEnumerator enumera sessões de áudio em um dispositivo de áudio. Para obter uma referência à interface IAudioSessionEnumerator do objeto enumerador de sessão, o aplicativo deve chamar IAudioSessionManager2::GetSessionEnumerator.

Herança

A interface IAudioSessionEnumerator herda da interface IUnknown . IAudioSessionEnumerator também tem esses tipos de membros:

Métodos

A interface IAudioSessionEnumerator tem esses métodos.

 
IAudioSessionEnumerator::GetCount

O método GetCount obtém o número total de sessões de áudio abertas no dispositivo de áudio.
IAudioSessionEnumerator::GetSession

O método GetSession obtém a sessão de áudio especificada por um número de sessão de áudio.

Comentários

Se um aplicativo quiser ser notificado quando novas sessões forem criadas, ele deverá registrar sua implementação de IAudioSessionNotification com o gerenciador de sessão. Após o registro bem-sucedido, o gerenciador de sessão envia notificações de criação de sessão para o aplicativo na forma de retornos de chamada. Essas notificações contêm uma referência ao ponteiro IAudioSessionControl da sessão recém-criada.

O enumerador de sessão mantém uma lista de sessões atuais mantendo referências ao ponteiro IAudioSessionControl de cada sessão. No entanto, o enumerador de sessão pode não estar ciente das novas sessões que são relatadas por meio de IAudioSessionNotification. Nesse caso, o aplicativo teria acesso apenas a uma lista parcial de sessões. Isso poderá ocorrer se o ponteiro IAudioSessionControl (no retorno de chamada) for liberado antes que o enumerador de sessão seja inicializado. Portanto, se um aplicativo quiser um conjunto completo de sessões para o ponto de extremidade de áudio, o aplicativo deverá manter sua própria lista.

O aplicativo deve executar as etapas a seguir para receber notificações de sessão e gerenciar uma lista de sessões atuais.

  1. Inicialize COM com o modelo MTA (Multithreaded Apartment) chamando CoInitializeEx(NULL, COINIT_MULTITHREADED) em um thread que não seja de interface do usuário. Se o MTA não for inicializado, o aplicativo não receberá notificações de sessão do gerenciador de sessão.
    Nota Os threads que executam a interface do usuário de um aplicativo devem ser inicializados com o modelo de threading apartment.
     
  2. Ative uma interface IAudioSessionManager2 do dispositivo de ponto de extremidade de áudio. Chame IMMDevice::Activate com o parâmetro iid definido como IID_IAudioSessionManager2. Essa chamada recebe uma referência à interface IAudioSessionManager2 do gerenciador de sessão no parâmetro ppInterface .
  3. Implemente a interface IAudioSessionNotification para fornecer o comportamento de retorno de chamada.
  4. Chame IAudioSessionManager2::RegisterSessionNotification para registrar a implementação do aplicativo de IAudioSessionNotification.
  5. Crie e inicialize o objeto enumerador de sessão chamando IAudioSessionManager2::GetSessionEnumerator. Esse método gera uma lista de sessões atuais disponíveis para o ponto de extremidade e adiciona os ponteiros IAudioSessionControl para cada sessão na lista, se elas ainda não estiverem presentes.
  6. Use a interface IAudioSessionEnumerator retornada na etapa anterior para recuperar e enumerar a lista de sessões. O controle de sessão para cada sessão pode ser recuperado chamando IAudioSessionEnumerator::GetSession. Certifique-se de chamar AddRef para cada controle de sessão para manter a contagem de referência.
  7. Quando o aplicativo receber uma notificação de criação de sessão, adicione o ponteiro IAudioSessionControl da nova sessão (recebido em IAudioSessionNotification::OnSessionCreated) à lista de sessões existentes.
Como o aplicativo mantém essa lista de sessões e gerencia o tempo de vida da sessão com base nos requisitos do aplicativo, não há mecanismo de expiração imposto pelo sistema de áudio nos objetos de controle de sessão.

Um controle de sessão é válido desde que o aplicativo tenha uma referência ao controle de sessão na lista.

Exemplos

O código de exemplo a seguir mostra como criar o objeto enumerador de sessão e enumerar sessões.

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;

}

Requisitos

   
Cliente mínimo com suporte Windows 7 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 R2 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho audiopolicy.h

Confira também

Principais interfaces de áudio