Fábricas de Filtros
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 amplamente 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 do adaptador como é usado no parágrafo anterior, refere-se a uma coleção de drivers relacionados - fábricas de filtro - que são empacotados juntos para gerenciar as várias funções de hardware em uma placa adaptadora.
Como com qualquer outro driver do Microsoft Windows Driver Model (WDM), uma fábrica de filtros lida com o gerenciamento de energia e a funcionalidade de configuração. Durante a instalação, o arquivo INF para o driver registra um ou mais nomes de dispositivo de filtro (consulte Cadeias 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 filtros KS, conforme descrito em 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 controlador anuncia as capacidades gerais de um dispositivo através das várias categorias pelas quais regista o filtro desse dispositivo. Quando o driver do sistema SysAudio, por exemplo, requer um dispositivo de áudio de um tipo específico, ele procura no registro por dispositivos que se enquadram nas categorias apropriadas.
O Sistema Operacional usa a API de Instalação, conforme descrito nas secções ede Instalação de Dispositivo e Driver, para descobrir e enumerar todas as fábricas de filtros da KSCATEGORY_AUDIO no registo. A entrada do Registro para cada fábrica especifica o nome amigável da fábrica de filtros e o nome do dispositivo, que é uma cadeia de caracteres longa que um cliente passa para a chamada 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 de 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 fazer referência ao filtro. Clientes em modo de utilizador ou filtros a montante no gráfico de áudio podem usar este 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.
Uma placa de adaptador de áudio WDM típica 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 conter tomadas de saída de áudio analógicas para conduzir um conjunto de altifalantes e um cabo de saída de linha, e tomadas de entrada de áudio analógicas para receber sinais de um microfone e de um cabo 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 de um dispositivo de áudio é implementado como drivers de porta e miniporta distintos, mas interligados para funcionarem em conjunto:
- O driver da miniporta 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 miniporta, que contém todo o código proprietário que o filtro precisa para gerir o hardware de áudio. O sistema operacional fornece o driver de porta, que é acessível através do driver de sistema PortCls (Portcls.sys; consulte Port Class Adapter Driver e PortCls System Driver). Dividir a implementação do filtro em drivers de porta e miniporta simplifica a tarefa de escrever 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 vincula o objeto de driver de miniporta a essa instância para formar um filtro totalmente funcional. O exemplo de código no Subdevice Creation ilustra esse processo. Os drivers de porta e miniporta se comunicam entre si através de interfaces de software bem definidas. Para obter mais informações sobre essas interfaces, consulte Miniport Interfaces e Supporting a Device.
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 miniporta 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 as fábricas de pinos, nós e conexões internas do filtro. Estes descritores são estruturas dos seguintes tipos:
Para obter o descritor de filtro do controlador de miniporta, o controlador de porta chama o método IMiniport::GetDescription.
Para obter um exemplo de como um controlador configura a respetiva estrutura PCFILTER_DESCRIPTOR, consulte o exemplo do controlador Sysvad, que é discutido em Drivers de Áudio de Exemplo.