Partilhar via


Algoritmo do Construtor de Ponto de Extremidade de Áudio

No Windows Vista e versões posteriores do Windows, o AudioEndpointBuilder é um serviço do sistema que enumera, inicializa e ativa os pontos de extremidade de áudio em um sistema. Este tópico fornece uma visão geral do algoritmo usado pelo serviço AudioEndpointBuilder.

O serviço AudioEndpointBuilder usa um algoritmo para descobrir e enumerar pontos de extremidade. O algoritmo foi projetado para simplificar o acesso do sistema a dispositivos de captura multiplexados (MUXed) e para ajudar a trabalhar com topologias que envolvem vários pinos de host e vários pinos de ponte, ou ambos.

No Windows XP, o modelo de áudio usou o termo dispositivo de áudio para se referir a um dispositivo conceitual na árvore de Plug and Play (PnP). No Windows Vista e versões posteriores do Windows, o conceito de um dispositivo de áudio foi reprojetado para representar melhor o dispositivo com o qual o usuário interage fisicamente.

Com duas novas APIs no Windows Vista, API MMDevice e WASAPI, você pode acessar e manipular esses novos dispositivos de áudio. A API MMDevice refere-se aos novos dispositivos de áudio como pontos de extremidade.

O serviço AudioEndpointBuilder monitora a classe KSCATEGORY_AUDIO para chegadas e remoções da interface do dispositivo. Quando um driver de dispositivo de áudio registra uma nova instância do KSCATEGORY_AUDIO classe de interface do dispositivo, o serviço AudioEndpointBuilder detecta a notificação da interface do dispositivo e usa um algoritmo para examinar a topologia dos dispositivos de áudio no sistema e tomar as medidas apropriadas.

A lista a seguir resume como funciona o algoritmo usado pelo AudioEndpointBuilder:

  1. Procura por pinos de ponte não conectados.

  2. Cria um ponto de extremidade para quaisquer pinos de ponte não conectados. Por exemplo, quando o AudioEndpointBuilder encontra um pino de ponte não conectado com um GUID de categoria de pino de KSNODETYPE_SPEAKER, ele cria um ponto de extremidade do alto-falante para esse pino de ponte. Para obter mais informações sobre KSNODETYPE_SPEAKER e outros GUIDS de categoria de pino, consulte Ksmedia.h em WinDDK\<build number>\inc\api.

  3. Define as propriedades padrão para o ponto de extremidade. Por exemplo, AudioEndpointBuilder define o nome, o ícone e o fator forma.

  4. Determina se há um caminho do ponto de extremidade para um pino de host que dá suporte à PCM (modulação de código de pulso), ao codec-3 de áudio (AC3) ou ao WMV (vídeo de mídia do Windows). Um pino de host é uma estrutura KSPIN com seu membro communication definido como KSPIN_COMMUNICATION_SINK ou KSPIN_COMMUNICATION_BOTH. Para obter mais informações sobre a estrutura KSPIN, consulte KSPIN.

  5. Preenche o ponto de extremidade PropertyStore com informações de propriedade das chaves do Registro da interface do dispositivo de áudio.

  6. Define o estado do ponto de extremidade. O estado do ponto de extremidade pode ser um dos três valores a seguir:

    • Ativo. Isso indica que existe um caminho conforme descrito na Etapa 4.

    • Desconectado. Se o dispositivo de áudio der suporte à detecção de tomada, esse estado indicará que existe um caminho para o ponto de extremidade e a tomada será desconectada do conector físico no adaptador de áudio.

    • Não está presente. Esse estado indica que um caminho não foi encontrado na Etapa 4 e a detecção de tomadas não é compatível com esse ponto de extremidade.

  7. Define esse ponto de extremidade como o ponto de extremidade padrão, se é o que é especificado no arquivo INF associado.

Depois que os pontos de extremidade tiverem sido enumerados, os clientes do sistema de áudio poderão manipulá-los diretamente usando as novas APIs do Windows Vista (conforme indicado anteriormente) ou indiretamente usando as APIs mais familiares, como Wave, DirectShow ou DirectSound. Novos métodos de API foram fornecidos para que os clientes de áudio possam começar com a ID de MMDevice de um ponto de extremidade e acessar a ID wave ou DirectSound para o mesmo ponto de extremidade.

Ao usar pontos de extremidade, você pode aproveitar o seguinte:

  • A mesma GUID (ID global exclusiva) está disponível independentemente da frequência com que você reinicia o computador. Ter esse GUID persistente é mais confiável do que salvar uma ID waveOut ou um nome amigável para o ponto de extremidade.

  • O mesmo PropertyStore está disponível independentemente da frequência com que você reinicia o computador. Os metadados relacionados ao dispositivo de áudio são salvos no ponto de extremidade PropertyStore.

  • Os pinos Multiplexed (MUX) e DEMUX (des multiplexados) são gerenciados automaticamente e enumerados pelo serviço AudioEndpointBuilder.

Se você desenvolver seu próprio driver de dispositivo de áudio e arquivo INF para trabalhar com seu dispositivo de áudio e desenvolver um aplicativo de áudio ou ambos, é melhor estar ciente dos problemas e das práticas recomendadas a seguir. Ao desenvolver drivers e aplicativos com essas recomendações em mente, você produz drivers, arquivos INF e clientes de áudio que funcionam com mais eficiência com o AudioEndpointBuilder.

  • Convenção de nomenclatura. A convenção de nomenclatura usada para os pontos de extremidade baseia-se nos nomes amigáveis dos pinos de ponte. No entanto, no caso de pontos de extremidade do locutor, o nome foi codificado para "Alto-falantes" e não pode ser alterado pelo driver ou por um aplicativo de terceiros.

  • Topologias abaixo do ideal. Determinadas topologias são consideradas abaixo do ideal devido ao algoritmo usado pelo AudioEndpointBuilder para enumerar pontos de extremidade. Por exemplo, ao criar uma dessas topologias abaixo do ideal, você cria pinos de host que têm pontos de extremidade ocultos e não podem ser vistos pelo AudioEndpointBuilder ou divisores (pontos de extremidade divididos) que o AudioEndpointBuilder não pode vincular aos seus pinos de host associados.

    • Pontos de extremidade ocultos

      No diagrama a seguir, o filtro KS é mostrado com dois pinos de host conectados a um único pino de ponte (Alto-falante).

      Diagrama mostrando topologia problemática com pino de host AC-3 e ponto de extremidade oculto no lado esquerdo, PCM individual e filtro único de compartilhamento AC-3.

      Quando o AudioEndpointBuilder descobre esse pino de ponte, ele rastreia um caminho de volta para apenas um dos pinos de host, define os valores padrão para o pino de ponte, cria e ativa um ponto de extremidade do Alto-falante e continua a descobrir outros pinos de ponte. Portanto, o outro pino de host permanece oculto do AudioEndpointBuilder.

      Diagrama ilustrando a topologia recomendada com caminhos rastreáveis entre os pinos de host e os pontos de extremidade.

      No diagrama anterior, a topologia problemática foi reprojetada para que o AudioEndpointBuilder possa descobrir os dois pinos de host (PCM e AC-3/PCM) porque agora ele pode ver dois pinos de ponte (Speaker e SPDIF).

    • Divisores

      Outro tipo de topologia abaixo do ideal é criado quando um pino de host se conecta a mais de um pino de ponte. O diagrama a seguir mostra uma topologia na qual um pino de host PCM se conecta a um pino de ponte do alto-falante e um pino de ponte SPDIF.

      Diagrama ilustrando a topologia problemática com dois pontos de extremidade conectados a um pino de host e um pcm único.

      Nesse caso, o AudioEndpointBuilder descobre um pino de ponte e rastreia um caminho de volta para o pino do host PCM, define valores padrão e, em seguida, cria e ativa um ponto de extremidade do Locutor. Quando o AudioEndpointBuilder descobre o próximo pino de ponte, ele rastreia um caminho de volta para o mesmo pino de host PCM, define valores padrão e, em seguida, cria e ativa um ponto de extremidade SPDIF. No entanto, embora ambos os pontos de extremidade tenham sido inicializados e ativados, o streaming para um deles torna impossível transmitir para o outro ao mesmo tempo; em outras palavras, eles são pontos de extremidade mutuamente exclusivos.

      O diagrama a seguir mostra uma reformulação dessa topologia na qual existem conexões separadas. Esse design possibilita que o AudioEndpointBuilder rastreie um caminho de volta para o pino do host PCM para cada um dos dois pinos de ponte.

      Diagrama ilustrando a topologia recomendada com caminhos rastreáveis entre pinos de host e pontos de extremidade, com dois PCMs no lado esquerdo.

  • Formato do ponto de extremidade. Quando o mecanismo de áudio está em execução no modo compartilhado, o formato do ponto de extremidade pressupõe uma configuração específica, conforme indicado pelo arquivo INF no momento da instalação. Por exemplo, o driver de áudio de um dispositivo de áudio usa seu arquivo INF associado para definir o ponto de extremidade padrão como um formato PCM estéreo de 44,1 kHz, 16 bits e estéreo. Após a instalação, você deve usar Painel de Controle ou um aplicativo de terceiros para alterar o formato do ponto de extremidade.

  • Dispositivo padrão. O ponto de extremidade definido como o dispositivo padrão é selecionado no momento da instalação usando informações no arquivo INF. Após a conclusão da instalação, você deve usar Painel de Controle ou um aplicativo de terceiros para selecionar outro ponto de extremidade para ser o ponto de extremidade padrão.

Nota Se o arquivo INF não selecionar um ponto de extremidade a ser definido como padrão durante a instalação, um aplicativo cliente poderá usar a API MMDevice para selecionar um ponto de extremidade. A API baseia sua seleção na classificação do fator forma e se o ponto de extremidade é uma renderização ou um ponto de extremidade de captura. A tabela a seguir mostra a ordem de seleção.

Renderizar classificação Classificação de captura
Speakers Microfone
Line-out Entrada de linha
SPDIF SPDIF

Se você usar a API MMDevice para selecionar um ponto de extremidade padrão e os pontos de extremidade disponíveis forem classificados da mesma forma, a API MMDevice colocará em ordem alfabética as IDs de ponto de extremidade para determinar qual ponto de extremidade selecionar como padrão. Por exemplo, se um adaptador de áudio tiver conectores de linha e de linha e o arquivo INF associado não selecionar um para ser o padrão no momento da instalação, a API MMDevice identificará quais IDs de ponto de extremidade são primeiro alfabéticas e definirá esse conector como padrão. Essa seleção persiste depois que você reinicia o sistema porque as IDs de ponto de extremidade são persistentes. No entanto, a seleção não persistirá se um ponto de extremidade de classificação superior (por exemplo, um segundo adaptador com um conector de microfone) aparecer no sistema.