Регистрация и отмена динамического подчиненного устройства
Устройства, поддерживающие определенную форму обнаружения присутствия разъема, называются динамическими устройствами, и их разъемы должны поддерживать свойство KSPROPERTY_JACK_DESCRIPTION . Ниже показан алгоритм, используемый драйвером динамического устройства для создания, регистрации или отмены регистрации связанных подустройств для этих динамических устройств. Вложенные компоненты создаются в виде фильтров.
Ниже показано, что происходит при подключении звукового устройства к разъему при загрузке драйвера звукового устройства.
Драйвер использует обнаружение присутствия разъема, чтобы определить, что устройство подключено к разъему. Драйвер вызывает PcRegisterSubdevice для регистрации фильтра топологии с помощью Portcls. Интерфейс KSCATEGORY_AUDIO создается в результате регистрации фильтра топологии.
Звуковой стек получает уведомление при создании интерфейса KSCATEGORY_AUDIO , а AudioEndpoint Builder создает и инициализирует связанную конечную точку, а затем устанавливает ее состояние в активное.
Драйвер регистрирует фильтр волн с помощью Portcls, и звуковой стек получает уведомление.
Драйвер вызывает PcRegisterPhysicalConnection , чтобы подключить фильтр волн к фильтру топологии. Затем это физическое подключение регистрируется с помощью Portcls.
Драйвер устанавливает для элемента IsConnected структуры KSJACK_DESCRIPTIONзначение TRUE , чтобы указать, что устройство подключено к разъему.
Примечание Если звуковое устройство не обнаруживает наличие разъема, элемент IsConnected всегда должен иметь значение TRUE. Чтобы проверить, поддерживает ли устройство обнаружение присутствия разъема, клиентское приложение может вызвать IKsJackDescription2::GetJackDescription2 для чтения флага JackCapabilities структуры KSJACK_DESCRIPTION2 . Если для этого флага задан бит JACKDESC2_PRESENCE_DETECT_CAPABILITY, это означает, что конечная точка поддерживает обнаружение присутствия разъема. В этом случае возвращаемое значение элемента IsConnected можно интерпретировать как точное отражение состояния вставки разъема.
В следующих шагах объясняется, что происходит, если звуковое устройство не подключено к разъему при загрузке драйвера.
Драйвер использует обнаружение присутствия разъема, чтобы определить, что устройство не подключено к разъему. Но он регистрирует фильтр топологии с portcls для разъема, и создается интерфейс KSCATEGORY_AUDIO .
Звуковой стек получает уведомление при создании интерфейса KSCATEGORY_AUDIO . AudioEndpointBuilder запрашивает драйвер мини-порта, чтобы определить из свойства KSJACK_DESCRIPTION , следует ли установить состояние конечной точки как отключенную.
Драйвер устанавливает для элемента IsConnected структуры KSJACK_DESCRIPTIONзначение FALSE , чтобы указать, что устройство не подключено к разъему.
Дополнительные сведения о различных состояниях конечной точки звука см. в разделе Алгоритм построителя аудиоконечных точек.
В соответствии с предыдущим описанием процессов регистрации и отмены регистрации дочерних устройств драйверы устройств, поддерживающие обнаружение присутствия разъема, должны реагировать на вставку и удаление разъема следующим образом:
Ответ драйвера устройства на вставку вилки
Драйвер должен вызвать PcRegisterSubdevice , чтобы зарегистрировать фильтр волн с помощью Portcls. Примечание Драйвер уже называется PcRegisterSubdevice в фильтре топологии, когда драйвер был загружен без устройства, подключенного к разъему.
Драйвер должен вызвать PcRegisterPhysicalConnection , чтобы зарегистрировать подключение "от волны к топологии" с помощью Portcls.
Драйвер должен задать для элемента IsConnected структуры KSJACK_DESCRIPTION значение TRUE.
Реакция драйвера устройства на удаление разъема
Драйвер должен вызвать IUnregisterPhysicalConnection::UnregisterPhysicalConnection , чтобы отменить регистрацию физического соединения между фильтром волн и фильтром топологии.
Драйвер должен вызвать IUnregisterSubdevice::UnregisterSubdevice , чтобы отменить регистрацию фильтра волн.
Драйвер должен задать элемент IsConnectedструктуры KSJACK_DESCRIPTIONFALSE.