Filtrar fábricas
Um driver de adaptador de áudio fornece fábricas de filtros para gerenciar a instanciação de filtros. Cada fábrica de filtros pode instanciar um ou mais filtros KS de um tipo específico. Se um tipo de filtro encapsular uma função de hardware específica, o número de filtros desse tipo que a fábrica pode instanciar será limitado pelos recursos de hardware subjacentes.
Como uma fábrica de filtros gerencia um bloco em grande parte autônomo de funcionalidade de hardware, cada fábrica de filtros pode ser considerada um driver de dispositivo por si só. Na verdade, o termo driver de adaptador, como é usado no parágrafo anterior, refere-se a uma coleção de drivers relacionados, filtros de fábrica, que são empacotados juntos para gerenciar as várias funções de hardware em uma placa de adaptador.
Assim como acontece com qualquer outro driver do Microsoft Windows Driver Model (WDM), uma fábrica de filtros lida com a funcionalidade de gerenciamento de energia e configuração. Durante a instalação, o arquivo INF do driver registra um ou mais nomes de dispositivos de filtro (consulte Cadeias de Caracteres de Identificação de Dispositivo). Esse processo carrega os nomes no registro do sistema e associa cada fábrica de filtros a uma ou mais categorias de filtro KS, conforme descrito na seção Instalando interfaces de dispositivo para um adaptador de áudio. Todos os dispositivos de áudio são classificados em KSCATEGORY_AUDIO, mas um dispositivo de áudio também pode ser classificado em categorias adicionais, como KSCATEGORY_RENDER (para um dispositivo de renderização de áudio) ou KSCATEGORY_CAPTURE (para um dispositivo de captura de áudio). O driver anuncia as funcionalidades gerais de um dispositivo por meio das várias categorias sob as quais ele registra o filtro para esse dispositivo. Quando o driver do sistema SysAudio, por exemplo, requer um dispositivo de áudio de um tipo específico, ele procura no registro dispositivos que se enquadram nas categorias apropriadas.
O sistema operacional usa a Setup API, conforme descrito em Componentes de Instalação do Dispositivo, para descobrir e enumerar todas as fábricas de filtros de KSCATEGORY_AUDIO no registro. A entrada do registro para cada fábrica especifica tanto o nome amigável da fábrica de filtros quanto o nome de dispositivo, que é uma longa string que um cliente passa para a chamada da função "create-file" que instancia o filtro. Essa chamada pode ser feita para ZwCreateFile do modo kernel ou para CreateFile do modo de usuário. Um filtro é um objeto no modo kernel e é identificado por um identificador de kernel. A chamada create-file retorna um identificador de instância que os clientes podem usar para se referir ao filtro. Os clientes em modo de usuário ou filtros upstream do grafo de áudio podem usar esse identificador para enviar ou encaminhar solicitações IOCTL para o filtro. Para obter mais informações sobre CreateFile, consulte a documentação do SDK do Microsoft Windows.
Um cartão de adaptador de áudio WDM típico pode residir em um barramento PCI, por exemplo, e conter vários conectores de E/S para renderizar ou capturar dados de onda. Um único dispositivo de áudio nesta placa pode ter conectores de saída analógica de áudio para alimentar um conjunto de alto-falantes e um cabo de saída de linha, e conectores de entrada para receber sinais de um microfone e um cabo de entrada de linha. O sistema de áudio WDM representa o dispositivo como um filtro e representa as tomadas de áudio como pinos nesse filtro.
O filtro para um dispositivo de áudio é implementado como drivers separados de porta e miniporta que são associados para agir em uníssono:
O driver miniport contém o código específico do hardware.
O driver de porta contém o código genérico que é comum a todos os filtros de um tipo específico.
O fornecedor escreve o driver de miniport, que contém todo o código proprietário que o filtro precisa para gerenciar o hardware de áudio. O sistema operacional fornece o driver de porta, que é acessível por meio do driver do sistema PortCls (Portcls.sys; consulte Driver do Adaptador de Classe de Porta e o Driver do Sistema PortCls). Dividir a implementação do filtro em drivers de porta e de miniporto simplifica a tarefa de gravar um driver para um dispositivo proprietário.
Quando uma fábrica de filtros instancia um filtro, ela primeiro cria o objeto de driver de miniporta para o filtro. Em seguida, a fábrica de filtros cria uma instância do objeto de porta apropriado e associa o objeto de driver de miniporto a essa instância para formar um filtro totalmente funcional. O exemplo de código em Criação de Subdispositivo ilustra esse processo. Os drivers de porta e de miniporta se comunicam por meio de interfaces de software bem definidas. Para obter mais informações sobre essas interfaces, consulte Interfaces de miniporta e Suporte a um dispositivo.
Um filtro de áudio expõe a estrutura do dispositivo de áudio subjacente como uma coleção de fábricas de pinos, nós e conexões internas. O driver de miniporto consolida essas informações em um descritor de filtro, que é uma estrutura do tipo PCFILTER_DESCRIPTOR. Essa estrutura, por sua vez, contém descritores individuais para fábricas de pinos, nós e conexões internas do filtro. Esses descritores são estruturas dos seguintes tipos:
Para obter o descritor de filtro do driver de miniporta, o driver de porta chama o método IMiniport::GetDescription.
Para obter um exemplo de como um driver configura sua estrutura de PCFILTER_DESCRIPTOR, consulte o driver de exemplo Sysvad, que é discutido em Drivers de Áudio de Exemplo .