Поделиться через


Регистрация и отмена динамического подчиненного устройства

Устройства, поддерживающие определенную форму обнаружения присутствия разъема, называются динамическими устройствами, и их разъемы должны поддерживать свойство KSPROPERTY_JACK_DESCRIPTION . Ниже показан алгоритм, используемый драйвером динамического устройства для создания, регистрации или отмены регистрации связанных подустройств для этих динамических устройств. Вложенные компоненты создаются в виде фильтров.

Ниже показано, что происходит при подключении звукового устройства к разъему при загрузке драйвера звукового устройства.

  1. Драйвер использует обнаружение присутствия разъема, чтобы определить, что устройство подключено к разъему. Драйвер вызывает PcRegisterSubdevice для регистрации фильтра топологии с помощью Portcls. Интерфейс KSCATEGORY_AUDIO создается в результате регистрации фильтра топологии.

  2. Звуковой стек получает уведомление при создании интерфейса KSCATEGORY_AUDIO , а AudioEndpoint Builder создает и инициализирует связанную конечную точку, а затем устанавливает ее состояние в активное.

  3. Драйвер регистрирует фильтр волн с помощью Portcls, и звуковой стек получает уведомление.

  4. Драйвер вызывает PcRegisterPhysicalConnection , чтобы подключить фильтр волн к фильтру топологии. Затем это физическое подключение регистрируется с помощью Portcls.

  5. Драйвер устанавливает для элемента IsConnected структуры KSJACK_DESCRIPTIONзначение TRUE , чтобы указать, что устройство подключено к разъему.

Примечание Если звуковое устройство не обнаруживает наличие разъема, элемент IsConnected всегда должен иметь значение TRUE. Чтобы проверить, поддерживает ли устройство обнаружение присутствия разъема, клиентское приложение может вызвать IKsJackDescription2::GetJackDescription2 для чтения флага JackCapabilities структуры KSJACK_DESCRIPTION2 . Если для этого флага задан бит JACKDESC2_PRESENCE_DETECT_CAPABILITY, это означает, что конечная точка поддерживает обнаружение присутствия разъема. В этом случае возвращаемое значение элемента IsConnected можно интерпретировать как точное отражение состояния вставки разъема.

В следующих шагах объясняется, что происходит, если звуковое устройство не подключено к разъему при загрузке драйвера.

  1. Драйвер использует обнаружение присутствия разъема, чтобы определить, что устройство не подключено к разъему. Но он регистрирует фильтр топологии с portcls для разъема, и создается интерфейс KSCATEGORY_AUDIO .

  2. Звуковой стек получает уведомление при создании интерфейса KSCATEGORY_AUDIO . AudioEndpointBuilder запрашивает драйвер мини-порта, чтобы определить из свойства KSJACK_DESCRIPTION , следует ли установить состояние конечной точки как отключенную.

  3. Драйвер устанавливает для элемента IsConnected структуры KSJACK_DESCRIPTIONзначение FALSE , чтобы указать, что устройство не подключено к разъему.

Дополнительные сведения о различных состояниях конечной точки звука см. в разделе Алгоритм построителя аудиоконечных точек.

В соответствии с предыдущим описанием процессов регистрации и отмены регистрации дочерних устройств драйверы устройств, поддерживающие обнаружение присутствия разъема, должны реагировать на вставку и удаление разъема следующим образом:

Ответ драйвера устройства на вставку вилки

  1. Драйвер должен вызвать PcRegisterSubdevice , чтобы зарегистрировать фильтр волн с помощью Portcls. Примечание Драйвер уже называется PcRegisterSubdevice в фильтре топологии, когда драйвер был загружен без устройства, подключенного к разъему.

  2. Драйвер должен вызвать PcRegisterPhysicalConnection , чтобы зарегистрировать подключение "от волны к топологии" с помощью Portcls.

  3. Драйвер должен задать для элемента IsConnected структуры KSJACK_DESCRIPTION значение TRUE.

Реакция драйвера устройства на удаление разъема

  1. Драйвер должен вызвать IUnregisterPhysicalConnection::UnregisterPhysicalConnection , чтобы отменить регистрацию физического соединения между фильтром волн и фильтром топологии.

  2. Драйвер должен вызвать IUnregisterSubdevice::UnregisterSubdevice , чтобы отменить регистрацию фильтра волн.

  3. Драйвер должен задать элемент IsConnectedструктуры KSJACK_DESCRIPTIONFALSE.