Compartir a través de


Eventos de hardware

Algunos dispositivos de audio proporcionan mandos de control de volumen de hardware, conmutadores silenciados u otros tipos de controles manuales. Las aplicaciones pueden responder a los cambios en estos controles ajustando el volumen o cambiando la forma en que se reproduce la secuencia de audio. Cuando el usuario ajusta un control de hardware, el controlador de minipuerto usa la interfaz IPortEvents para informar al controlador de puerto de que se ha producido un evento de hardware. El controlador de puerto, a su vez, notifica a la aplicación del evento para que pueda leer la nueva configuración de control del dispositivo.

El controlador de minipuerto puede consultar el controlador de puerto para la interfaz IPortEvents en el momento en que atiende la llamada init (consulte IMiniportWavePci::Init, por ejemplo) desde el controlador de puerto. En Microsoft Windows 98 SE, Windows Me y Windows 2000 y versiones posteriores, esa consulta se realiza correctamente. Para obtener un ejemplo de código, consulta el adaptador de audio de ejemplo Sb16 en versiones anteriores del Kit de controladores de Windows (WDK).

Cuando el controlador de puerto llama al método IMiniport::GetDescription del controlador, el método genera una estructura de PCFILTER_DESCRIPTOR que especifica, entre otras cosas, los eventos que admite el dispositivo. Los eventos se pueden especificar en las tablas de automatización para los miembros Pins y Nodes de PCFILTER_DESCRIPTOR, y en el miembro AutomationTable , que apunta a la tabla de automatización para el propio filtro. Cada evento se especifica mediante una estructura de PCEVENT_ITEM . El controlador debe establecer los miembros Set e Id de la estructura de PCEVENT_ITEM en KSEVENTSETID_AudioControlChange y KSEVENT_CONTROL_CHANGE, y debe cargar un puntero a la rutina EventHandler del controlador en el miembro handler . El controlador también debe establecer el bit de PCEVENT_ITEM_FLAG_BASICSUPPORT en el miembro Flags para indicar la compatibilidad básica con eventos de cambio de control, y debe establecer los bits de PCEVENT_ITEM_FLAG_ONESHOT o PCEVENT_ITEM_FLAG_ENABLE para indicar que admite una sola captura o notificación periódica.

Cuando una aplicación llama posteriormente a la función mixerOpen (descrita en la documentación de Microsoft Windows SDK) para solicitar una notificación de un evento determinado, el controlador de puerto llama a la rutina EventHandler del controlador con un puntero a una estructura de PCEVENT_REQUEST. El miembro Verb de esta estructura se establece en PCEVENT_VERB_ADD y su miembro EventItem especifica el evento que se va a habilitar. La estructura PCEVENT_REQUEST también contiene un puntero a una estructura KSEVENT_ENTRY que el controlador debe tratar como datos opacos del sistema. Después de habilitar el evento, el controlador debe llamar a IPortEvents::AddEventToEventList con el mismo puntero KSEVENT_ENTRY. Con esta llamada, el controlador reconoce que el evento está habilitado.

Cuando se produce el evento de hardware y la rutina de servicio de interrupción del controlador detecta una silenciación o un cambio de volumen, el controlador señala el evento al controlador de puerto llamando a IPortEvents::GenerateEventList con un conjunto de parámetros que describen el evento. Por ejemplo, la siguiente llamada describe un cambio de control en un nodo lineout-volume:

    pPE->GenerateEventList(NULL, KSEVENT_CONTROL_CHANGE,
                           FALSE, ULONG(-1), TRUE, LINEOUT_VOL);

Durante esta llamada, el controlador de puerto busca en su lista de eventos todos los eventos que coinciden con los parámetros de llamada y envía notificaciones a los clientes que supervisan estos eventos. En este ejemplo, pPE es un puntero al objeto IPortEvents y LINEOUT_VOL es el identificador de nodo que el controlador de miniporte asigna al nodo lineout-volume. Los parámetros no especificados (como el GUID del conjunto de eventos y el identificador de pin en el ejemplo anterior) se tratan como caracteres comodín y siempre coinciden con los parámetros correspondientes de la lista.