Compartilhar via


Considerações sobre implementação de roteamento de fluxo

No Windows 7, AS APIs de plataforma de alto nível que usam APIs de Áudio Principais, como As APIs de Media Foundation, DirectSound e Wave, implementam o recurso de roteamento de fluxo manipulando a alternância 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 de Áudio Principal e implementar o recurso de roteamento de fluxo.

Clientes WASAPI diretos (aplicativos de mídia que usam WASAPI diretamente) recebem novas notificações de sessão de áudio e dispositivo enviadas por componentes de Áudio Principal. O comportamento do recurso de roteamento de fluxo é definido pela forma como o aplicativo lida com essas notificações.

A API do MMDevice e a sessão de áudio enviam notificações sobre alterações de estado do dispositivo e alterações de sessão para clientes WASAPI na forma de retornos de chamada. Para obter essas notificações, o cliente deve registrar sua implementação de IMMNotificationClient e IAudioSessionEvents. Para obter mais informações, consulte Notificações Relevantes parade Roteamento de Fluxo.

No cenário de headset USB descrito em de Roteamento de Fluxo, um aplicativo está reproduzindo um fluxo de áudio e usa MMDeviceAPI e WASAPI para renderizar o fluxo no dispositivo de renderização padrão, Alto-falante. Quando o dispositivo padrão é alterado, o aplicativo recebe uma notificação IMMNotificationClient. O aplicativo também recebe IAudioSessionEvents notificações indicando que o usuário removeu o dispositivo de ponto de extremidade de áudio ou que o formato de fluxo foi alterado para o dispositivo ao qual a sessão de áudio está conectada. Ao receber as notificações, o aplicativo interrompe o streaming para o ponto de extremidade do alto-falante e reabre o fluxo para renderização no ponto de extremidade padrão atual, o headset.

diagrama do fluxo de dados para notificações do dispositivo.

Em resposta a essas notificações, o cliente pode reabrir o fluxo no novo dispositivo padrão no novo formato selecionado pelo usuário.

Gerenciamento de fluxo

A lista a seguir resume as etapas que um cliente WASAPI deve executar para fornecer a funcionalidade de alternância de fluxo.

  1. Aguarde a notificaçãorelevante do IMMNotificationClient. Se o dispositivo for o dispositivo padrão, a notificação IMMNotificationClient::OnDefaultDeviceChanged será recebida.

  2. Se um novo dispositivo estiver disponível, obtenha uma referência ao ponto de extremidade do novo dispositivo. Chame IMMDeviceEnumerator::GetDefaultAudioEndpoint para o novo dispositivo padrão. Se o novo dispositivo não for o dispositivo padrão, você poderá recuperar o dispositivo chamando IMMDeviceEnumerator::GetDevice. Para obter mais informações, consulte Obtendo o ponto de extremidade do dispositivo parade roteamento de fluxo.

  3. Aguarde oIAudioSessionEvents::OnSessionDisconnected com o valor do motivo.

    Nota

    Como todas essas operações são assíncronas, a ordem na qual o aplicativo recebe notificações de alteração de dispositivo e desconexão de sessão não pode ser prevista. O aplicativo deve implementar o tratamento de notificação para receber essas notificações em qualquer ordem. No entanto, normalmente, o aplicativo recebe valor de audioSessionDisconnect antes da notificação de alteração de dispositivo padrão.

     

  4. Avalie o valor do motivo e determine se o fluxo precisa ser transferido para outro ponto de extremidade de áudio ou se o fluxo precisa ser reinicializado com um novo formato.

  5. Pare o streaming para o dispositivo padrão antigo se o motivo indicar que o fluxo deve ser redirecionado para o novo dispositivo padrão.

  6. Execute cálculos de mapeamento de posição.

  7. Abra o fluxo no novo dispositivo e transfira todas as informações de estado.

  8. Retome o streaming no novo dispositivo padrão.

  9. Manipule a saída do dispositivo padrão antigo.

Para que a operação de alternância de fluxo pareça perfeita, ela deve ser feita o mais rápido possível. Isso depende do desempenho dos componentes envolvidos na re-iniciação do fluxo no novo dispositivo.

Considerações sobre mapeamento de posição

Quando o aplicativo é IMMNotificationClient e IAudioSessionEvents notificações, ele pode rotear os fluxos existentes para o novo dispositivo padrão. Quando um fluxo de áudio existente é interrompido e aberto no novo dispositivo, a renderização no novo dispositivo deve iniciar na posição em que o fluxo foi interrompido no dispositivo antigo. Para fazer isso, o aplicativo deve ter a última posição conhecida do dispositivo para calcular a posição inicial no novo dispositivo. Por exemplo, essa posição pode ser usada como o deslocamento delta para o mapeamento de posição subsequente. Quando o fluxo inicia a renderização, a nova posição do dispositivo pode ser remapeada para a posição do dispositivo em cache.

As etapas a seguir resumem o processo de fazer uma transição de fluxo contínuo.

  1. Armazene em cache a última posição do dispositivo do fluxo no dispositivo antigo.
  2. Interrompa o fluxo no dispositivo antigo.
  3. Execute cálculos de remapeamento para obter a nova posição.
  4. Comece a renderizar o fluxo no novo dispositivo.
  5. Libere o fluxo antigo.

Durante a transição, o aplicativo deve garantir que o relógio não saia da sincronização, resultando em fluxos de áudio e vídeo fora de sincronização. Isso pode ocorrer se os exemplos de vídeo continuarem a ser renderizados enquanto o fluxo de áudio é roteado para o novo dispositivo. O aplicativo deve armazenar em cache a posição do relógio para o cálculo de remapeamento e garantir que os exemplos de vídeo não sejam renderizados até que o fluxo de áudio seja reaberto no novo dispositivo, de modo que, quando o clipe retomar a renderização, o áudio e os fluxos de vídeo sejam sincronizados. Em alguns casos, em que o tempo de apresentação para renderizar os quadros de vídeo é baseado no relógio de áudio, é suficiente interromper o fluxo de áudio até que a alternância de fluxo seja concluída e nenhuma outra implementação de mapeamento de posição para o fluxo de vídeo seja necessária para sincronização de vídeo de áudio.

Se durante a renderização, IAudioRenderClient::GetBuffer retornará um erro porque o dispositivo antigo foi perdido, o aplicativo não precisará parar o fluxo antigo porque a operação de streaming já foi encerrada. Para obter informações sobre como lidar com esse erro, consulte Recuperando de umade erro de Invalid-Device.

sobre o da API do MMDevice

sobre WASAPI

de Roteamento de Fluxo