Generadores de filtros
Un controlador de adaptador de audio proporciona generadores de filtros para administrar la creación de instancias de filtros. Cada generador de filtros puede crear una instancia de uno o varios filtros KS de un tipo determinado. Si un tipo de filtro encapsula una función de hardware determinada, el número de filtros de ese tipo al que puede crear una instancia el generador está limitado por los recursos de hardware subyacentes.
Dado que un generador de filtros administra un bloque de funcionalidad de hardware en gran medida autónomo, cada fábrica de filtros se puede considerar un controlador de dispositivo en su propio derecho. De hecho, el término controlador del adaptador tal y como se usa en el párrafo anterior, hace referencia a una colección de factorías de filtros de controladores relacionadas, que se empaquetan conjuntamente para administrar las distintas funciones de hardware en una tarjeta de adaptador.
Al igual que con cualquier otro controlador de Microsoft Windows Driver Model (WDM), un generador de filtros controla la funcionalidad de configuración y administración de energía. Durante la instalación, el archivo INF del controlador registra uno o varios nombres de dispositivo de filtro (consulte Cadenas de identificación de dispositivos). Este proceso carga los nombres en el registro del sistema y asocia cada generador de filtros con una o varias categorías de filtro KS, tal y como se describe en Instalación de interfaces de dispositivo para un adaptador de audio. Todos los dispositivos de audio se clasifican en KSCATEGORY_AUDIO, pero un dispositivo de audio también se puede clasificar en categorías adicionales, como KSCATEGORY_RENDER (para un dispositivo de representación de audio) o KSCATEGORY_CAPTURE (para un dispositivo de captura de audio). El controlador anuncia las funcionalidades generales de un dispositivo mediante las distintas categorías en las que registra el filtro para ese dispositivo. Cuando el controlador del sistema SysAudio, por ejemplo, requiere un dispositivo de audio de un tipo determinado, busca en el Registro los dispositivos que se dividen en las categorías adecuadas.
El sistema operativo usa la API de instalación, como se describe en Componentes de instalación de dispositivos, para detectar y enumerar todos los generadores de filtros de KSCATEGORY_AUDIO del registro. La entrada del Registro de cada generador especifica el nombre descriptivo de la factoría de filtro y su nombre de dispositivo, que es una cadena larga que un cliente pasa a la llamada a create-file que crea instancias del filtro. Esta llamada se puede realizar a ZwCreateFile desde el modo kernel o a CreateFile desde el modo de usuario. Un filtro es un objeto en modo kernel y se identifica mediante un identificador de kernel. La llamada a create-file devuelve un identificador de instancia que los clientes pueden usar para hacer referencia al filtro. Los clientes en modo de usuario o los filtros ascendentes del gráfico de audio pueden usar este identificador para enviar o reenviar solicitudes IOCTL al filtro. Para obtener más información sobre CreateFile, consulte la documentación de Microsoft Windows SDK.
Una tarjeta de adaptador de audio WDM típica podría residir en un bus PCI, por ejemplo, y contener varios conectores de E/S para representar o capturar datos de onda. Un único dispositivo de audio en esta tarjeta puede contener conectores analógicos de salida para conducir un conjunto de altavoces y un cable de salida, y conectores analógicos de audio-in para recibir señales de un micrófono y un cable de línea. El sistema de audio WDM representa el dispositivo como filtro y representa los conectores de audio como patillas en ese filtro.
El filtro de un dispositivo de audio se implementa como controladores de puerto y miniport independientes que están enlazados para actuar al unísono:
El controlador de minipuerto contiene el código específico del hardware.
El controlador de puerto contiene el código genérico que es común a todos los filtros de un tipo determinado.
El proveedor escribe el controlador de minipuerto, que contiene todo el código propietario que el filtro necesita para administrar el hardware de audio. El sistema operativo proporciona el controlador de puerto, al que se puede acceder a través del controlador del sistema PortCls (Portcls.sys; consulte Port Class Adapter Driver y PortCls System Driver). Dividir la implementación del filtro en los controladores de puerto y minipuerto simplifica la tarea de escribir un controlador para un dispositivo propietario.
Cuando un generador de filtros crea una instancia de un filtro, primero crea el objeto de controlador de minipuerto para el filtro. A continuación, el generador de filtros crea una instancia del objeto de puerto adecuado y enlaza el objeto de controlador de miniporte a esa instancia para formar un filtro totalmente funcional. El ejemplo de código de Creación de subdispositivos ilustra este proceso. Los controladores de puerto y minipuerto se comunican entre sí a través de interfaces de software bien definidas. Para obtener más información sobre estas interfaces, consulte Miniport Interfaces y Compatibilidad con un dispositivo.
Un filtro de audio expone la estructura del dispositivo de audio subyacente como una colección de generadores de patillas, nodos y conexiones internas. El controlador de minipuerto consolida esta información en un descriptor de filtro, que es una estructura de tipo PCFILTER_DESCRIPTOR. Esta estructura, a su vez, contiene descriptores individuales para las factorías de patillas, los nodos y las conexiones internas del filtro. Estos descriptores son estructuras de los siguientes tipos:
Para obtener el descriptor de filtro del controlador de minipuerto, el controlador de puerto llama al método IMiniport::GetDescription .
Para obtener un ejemplo de cómo un controlador configura su estructura de PCFILTER_DESCRIPTOR, consulte el controlador de ejemplo sysvad, que se describe en Controladores de audio de ejemplo.