Notificações relevantes para roteamento de fluxo
No Windows 7, APIs de plataforma de alto nível que usam APIs de áudio principais, como APIs Media Foundation, DirectSound e Wave, implementam o recurso de roteamento de fluxo manipulando a comutação de fluxo de um dispositivo existente para um novo ponto de extremidade de áudio padrão. Os aplicativos de mídia que usam essas APIs usam o comportamento de roteamento de fluxo sem modificações na origem. Os clientes WASAPI diretos podem usar as notificações enviadas pelos componentes Core Audio e implementar o recurso de roteamento de fluxo.
Para implementar o recurso de roteamento de fluxo, um cliente deve escutar dois tipos de eventos: notificações de alteração de dispositivo e notificações de desconexão de sessão. Na implementação fornecida pelas APIs de alto nível, esses eventos são enviados para pontos de extremidade de dispositivo padrão criados chamando IMMDeviceEnumerator::GetDefaultAudioEndpoint. Para obter mais informações, consulte Obtendo o ponto de extremidade do dispositivo para roteamento de fluxo.
O componente Core Audio MMDeviceAPI fornece retornos de chamada de notificação quando dispositivos de áudio são adicionados, removidos ou modificados. As alterações de formato e sessão de áudio são relatadas como eventos por meio do WASAPI.
Notificações de alteração de dispositivo
MMDeviceAPI gera eventos quando dispositivos de áudio são adicionados, removidos ou modificados. Se o cliente deve fornecer funcionalidade de roteamento de fluxo, ele deve implementar a interface IMMNotificationClient e registrar sua implementação com MMDeviceAPI.
Para obter notificações de alteração de dispositivo, o cliente deve executar as seguintes tarefas:
- Implemente a interface IMMNotificationClient para manipular notificações de alteração de dispositivo enviadas pela MMDeviceAPI.
- Registre a implementação IMMNotificationClient com MMDeviceAPI chamando o método IMMDeviceEnumerator::RegisterEndpointNotificationCallback.
Após o registro da implementação dessas interfaces pelo cliente, o cliente recebe notificações na forma de retornos de chamada através dos métodos dessas interfaces. Os métodos IMMNotificationClient são chamados pela MMDeviceAPI quando ela gera eventos no nível do ponto de extremidade (alterações no estado do ponto de extremidade, novas chegadas de ponto de extremidade, exclusões de ponto de extremidade, alterações de ponto de extremidade padrão e alterações de propriedade de ponto de extremidade).
Se o cliente deseja fornecer roteamento de fluxo para o dispositivo padrão, o cliente deve implementar o comportamento de alteração de dispositivo quando receber a notificação por meio do retorno de chamada IMMNotificationClient::OnDefaultDeviceChanged.
Notificações de alteração de sessão de áudio
As alterações de sessão de áudio e as alterações de formato são relatadas como eventos de sessão de áudio por meio do WASAPI. Um cliente WASAPI implementa a interface IAudioSessionEvents e registra a implementação com WASAPI.
Para obter notificações de alteração de sessão de áudio, o cliente deve executar as seguintes tarefas:
- Implemente a interface IAudioSessionEvents para manipular notificações de alteração de formato enviadas pelo WASAPI.
- Registre a implementação IAudioSessionEvents com WASAPI chamando o método IAudioSessionControl::RegisterAudioSessionNotification.
Os métodos IAudioSessionEvents são chamados por WASAPI quando ocorrem alterações na sessão de áudio. Esses eventos são gerados quando o nome para exibição, o caminho do ícone, o volume, o parâmetro de agrupamento ou o estado da sessão são alterados.
Para implementar o recurso de roteamento de fluxo, o cliente deve aguardar a notificação de desconexão da sessão. Quando uma sessão de áudio é desconectada ou o formato de um dispositivo é alterado, o WASAPI envia notificações ao cliente na forma de retornos de chamada por meio de IAudioSessionEvents::OnSessionDisconnected. Com a notificação de desconexão, o WASAPI também envia um valor que indica por que a sessão foi desconectada. Isso pode ocorrer por vários motivos, como o dispositivo foi removido, o servidor parado e assim por diante. Para obter a lista completa de motivos, consulte a enumeração AudioSessionDisconnectReason definida em AudioPolicy.h. Se o dispositivo padrão for alterado, o cliente deverá aguardar as notificações (se ainda não tiverem sido recebidas) acompanhadas com um valor DisconnectReasonDeviceRemoval . Em resposta a essas notificações, o cliente pode reabrir o fluxo no novo dispositivo padrão.
Como todas essas operações são assicronas, a ordem em que o aplicativo recebe notificações não pode ser prevista. No entanto, normalmente, o aplicativo recebe o valor AudioSessionDisconnect antes da notificação de alteração de dispositivo padrão.
Notificações de alteração de formato
As alterações de formato de áudio ocorrem quando o formato do fluxo é alterado. Isso pode ocorrer quando o usuário seleciona um novo formato no painel de controle Som ou o novo dispositivo padrão oferece suporte a um novo formato (por exemplo, HDMI ou certas interfaces de áudio profissionais com um ajuste manual da taxa de amostragem). Para notificar o cliente sobre esses tipos de alterações de formato, o WASAPI envia uma notificação de sessão pela implementação registrada de IAudioSessionEvents::OnSessionDisconnected com um motivo de desconexão de DisconnectReasonFormatChanged. O cliente pode manipular a notificação reabrindo o fluxo no novo formato.
Tópicos relacionados