Мьютекс устройства в AVStream

Используйте мьютекс устройства для синхронизации объектов в иерархии с устройства до фильтров. Каждое устройство AVStream имеет единственный, связанный с ним, мьютекс. Создание и уничтожение как фабрик фильтров, так и самих фильтров синхронизированы с этим мьютексом. Некоторые операции Plug and Play и управления питанием также синхронизированы с этим мьютексом. Мини-драйвер фокусируется на двух основных проблемах, связанных с мьютексом устройства.

Иерархия объектов гарантированно стабильна только от устройства до отдельных фильтров, если мьютекс устройства удерживается. В результате миникодрайвер должен получить мьютекс устройства перед тем, как вручную создать фабрики фильтров, вызывая KsCreateFilterFactory. Минидрайвер должен получить мьютекс устройства перед обходом иерархии объектов, вызовом функций KsXxxGetFirstChildXxx и KsXxxGetNextSiblingXxx.

AVStream удерживает мьютекс устройства от имени минидрайвера, когда получает следующие запросы:

Важно отметить, что мьютекс устройства не может быть получен рекурсивно. Рассмотрим следующий пример. AVStream получает уведомление о спящем режиме. Как описано выше, он захватывает мьютекс устройства от имени минидрайвера. Если AVStream вызывает предоставленную минидрайвером подпрограмму обратного вызова в контексте потока A, минидрайвер не должен впоследствии пытаться получить мьютекс устройства в потоке А. Это приводит к блокировке потока A.

AVStream часто получает мьютексы управляющих фильтров, в то время как мьютекс устройства уже удерживается. Следовательно, в качестве общего правила поток, который принял мьютекс элемента управления фильтра, не должен впоследствии принимать мьютекс устройства.

Для управления мьютексом устройства используйте следующие функции:

KsAcquireDevice, KsReleaseDevice