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.
- 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. - 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 .
- Implemente a interface IAudioSessionNotification para fornecer o comportamento de retorno de chamada.
- Chame IAudioSessionManager2::RegisterSessionNotification para registrar a implementação do aplicativo de IAudioSessionNotification.
- 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.
- 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.
- 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.
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 |