Exclusión mutua de dispositivos en AVStream

Use la exclusión mutua del dispositivo para sincronizar los objetos de la jerarquía desde el dispositivo hasta los filtros. Cada dispositivo AVStream tiene una única exclusión mutua de dispositivo asociada. La creación y destrucción de fábricas de filtros y filtros se sincronizan con esta exclusión mutua. Algunas operaciones de administración de energía y Plug and Play también se sincronizan con esta exclusión mutua. El minidriver se centra en dos problemas principales con respecto a la exclusión mutua del dispositivo.

Se garantiza que la jerarquía de objetos es estable solo desde el dispositivo hasta filtros individuales si se mantiene la exclusión mutua del dispositivo. Como resultado, el minidriver debe obtener la exclusión mutua del dispositivo antes de crear manualmente generadores de filtros mediante una llamada a KsCreateFilterFactory. El minidriver también debe obtener la exclusión mutua del dispositivo antes de atravesar la jerarquía de objetos llamando a las funciones KsXxxGetFirstChildXxx y KsXxxGetNextSiblingXxx .

AVStream contiene la exclusión mutua del dispositivo en nombre del minidriver cuando recibe las siguientes solicitudes:

Es importante tener en cuenta que la exclusión mutua del dispositivo no se puede obtener de forma recursiva. Considere el ejemplo siguiente. AVStream recibe una notificación de suspensión. Como se ha descrito anteriormente, toma la exclusión mutua del dispositivo en nombre del minidriver. Si AVStream llama a una rutina de devolución de llamada proporcionada por el minidriver en el contexto del subproceso A, el minidriver no debe intentar obtener posteriormente la exclusión mutua del dispositivo en el subproceso A. Si lo hace, el subproceso A se interbloquea con sí mismo.

AVStream a menudo obtiene exclusiones mutuas de control de filtro mientras la exclusión mutua del dispositivo ya está sujeta. Por lo tanto, como regla general, un subproceso que ha tomado una exclusión mutua de control de filtro no debe tomar posteriormente la exclusión mutua del dispositivo.

Para manipular la exclusión mutua del dispositivo, use las siguientes funciones:

KsAcquireDevice, KsReleaseDevice