Мьютекс устройства в AVStream
Используйте мьютекс устройства для синхронизации объектов в иерархии с устройства до фильтров. Каждое устройство AVStream имеет один связанный мьютекс устройства. Создание и уничтожение фабрик фильтров и фильтров синхронизируются с этим мьютексом. Некоторые операции Plug and Play и управления питанием также синхронизируются с этим мьютексом. Мини-накопитель фокусируется на двух main проблемах, связанных с мьютексом устройства.
Иерархия объектов гарантированно будет стабильной только от устройства до отдельных фильтров, если мьютекс устройства удерживается. В результате мини-driver должен получить мьютекс устройства перед созданием фабрик фильтров вручную путем вызова KsCreateFilterFactory. Мини-диск также должен получить мьютекс устройства перед обходом иерархии объектов путем вызова функций KsXxxGetFirstChildXxx и KsXxxGetNextSiblingXxx .
AVStream хранит мьютекс устройства от имени мини-накопителя, когда он получает следующие запросы:
Уведомления о спящем режиме и пробуждении фильтров и закреплений. См . раздел KsFilterRegisterPowerCallbacks и KsPinRegisterPowerCallbacks.
Важно отметить, что мьютекс устройства не может быть получен рекурсивно. Рассмотрим следующий пример. AVStream получает уведомление о спящем режиме. Как описано выше, он принимает мьютекс устройства от имени мини-драйвера. Если AVStream затем вызывает подпрограмму обратного вызова, предоставляемую мини-driver, в контексте потока A, мини-driver не должен впоследствии пытаться получить мьютекс устройства в потоке A. Это приводит к взаимоблокировке потока A с самим собой.
AVStream часто получает мьютексы управления фильтрами, пока мьютекс устройства уже удерживается. Следовательно, как правило, поток, который принял мьютекс управления фильтром, не должен впоследствии принимать мьютекс устройства.
Для управления мьютексом устройства используйте следующие функции: