Recuperación de eventos
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Filter Graph Manager expone tres interfaces que admiten notificaciones de eventos.
- IMediaEventSink contiene el método para que los filtros publiquen eventos.
- IMediaEvent contiene métodos para que las aplicaciones recuperen eventos.
- IMediaEventEx hereda de y extiende la interfaz IMediaEvent .
Filtra las notificaciones de eventos después de llamar al método IMediaEventSink::Notify en el Administrador de gráficos de filtros. Una notificación de eventos consta de un código de evento, que define el tipo de evento y dos parámetros que proporcionan información adicional. Según el código de evento, los parámetros pueden contener punteros, códigos de retorno, tiempos de referencia u otra información. Para obtener una lista completa de los códigos de evento y los parámetros, consulte Códigos de notificación de eventos.
Para recuperar un evento de la cola, la aplicación llama al método IMediaEvent::GetEvent en el Administrador de gráficos de filtros. Este método se bloquea hasta que se devuelve un evento o hasta que transcurre un tiempo especificado. Suponiendo que hay un evento en cola, el método devuelve con el código de evento y los dos parámetros de evento. Después de llamar a GetEvent, una aplicación siempre debe llamar al método IMediaEvent::FreeEventParams para liberar los recursos asociados a los parámetros del evento. Por ejemplo, un parámetro podría ser un valor BSTR asignado por el gráfico de filtro.
En el ejemplo de código siguiente se proporciona un esquema de cómo recuperar eventos de la cola.
long evCode;
LONG_PTR param1, param2;
HRESULT hr;
while (hr = pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0), SUCCEEDED(hr))
{
switch(evCode)
{
// Call application-defined functions for each
// type of event that you want to handle.
}
hr = pEvent->FreeEventParams(evCode, param1, param2);
}
Para invalidar el control predeterminado de Filter Graph Manager para un evento, llame al método IMediaEvent::CancelDefaultHandling con el código de evento como parámetro. Puede restablecer el control predeterminado llamando al método IMediaEvent::RestoreDefaultHandling . Si el gráfico de filtros no realiza ningún control predeterminado para el código de evento especificado, llamar a estos métodos no tiene ningún efecto.
Temas relacionados