Запуск устройства HFP

В этой статье объясняется процесс, когда устройство Bluetooth без рук (HFP) поступает в аудиосистему.

Для каждого спаренного устройства HFP, которое поступает в аудиосистему, драйвер Windows HFP регистрирует интерфейс устройства в классе GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Звуковой драйвер использует уведомления о подключении устройства для получения информации обо всех экземплярах интерфейсов GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Звуковой драйвер вызывает IoRegisterPlugPlayNotification из своей подпрограммы драйвера AVStrMiniDevicePostStart (или из эквивалентной подпрограммы Portcls), чтобы зарегистрировать обратный вызов для обнаружения установленных в настоящее время устройств HFP и получать уведомления о новых устройствах HFP.

Когда звуковой драйвер вызывает IoRegisterPlugPlayNotification, вызов выполняется с помощью следующих параметров:

  • EventCategory установлено в EventCategoryDeviceInterfaceChange.
  • EventCategoryFlags обычно имеет значение PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES для получения немедленных уведомлений о существующих интерфейсах. Однако некоторые альтернативные конструкции звуковых драйверов могут находить существующие интерфейсы с помощью других средств.
  • EventCategoryData имеет значение GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS.
  • DriverObject задается как объект драйвера аудио.
  • CallbackRoutine установлена в подпрограмму в звуковом драйвере, которая будет получать уведомления.

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

Обработка экземпляров интерфейса

Для каждого экземпляра интерфейса, зарегистрированного в классе GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS, звуковой драйвер должен использовать следующий протокол для обмена данными:

  • Когда Windows вызывает подпрограмму обратного вызова, зарегистрированную аудиодрайвером при вызове функции IoRegisterPlugPlayNotification, Windows передает символьную ссылку для интерфейса HFP через DEVICE_INTERFACE_CHANGE_NOTIFICATION. SymbolicLinkName.
  • Когда звуковой драйвер вызывает IoGetDeviceObjectPointer, драйвер использует символьную ссылку, чтобы получить HFP FileObject и DeviceObject для устройства HFP.
  • Когда звуковой драйвер отправляет IOCTLs драйверу HFP, он использует HFP FileObject и DeviceObject для устройства HFP.

Получение статических сведений

Звуковой драйвер может получить статические сведения из драйвера HFP. Например, драйвер HFP может указать ksnodetype, идентификатор контейнера и понятное имя парного устройства HFP. Звуковой драйвер может использовать эти сведения для создания и инициализации фильтра KS или фильтров, представляющих парное устройство HFP. Звуковой драйвер использует IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR для получения этих сведений.

Звуковой драйвер также может получить адрес Bluetooth парного устройства HFP. У каждого парного устройства HFP есть уникальный адрес Bluetooth, который может быть полезен в качестве уникальной строки идентификатора. Дополнительные сведения см. в разделе "Получение bluetooth-адреса устройства HF".

Создание и инициализация контекста фабрики аудиофильтров, специфичного для аудио

Чтобы создать и инициализировать контекст фабрики фильтров, звуковой драйвер должен хранить HFP DeviceObject и HFP FileObject в контексте фабрики фильтров, а затем инициализировать поле IsConnected в значение false.

Создание фабрики фильтров KS

Для каждого экземпляра устройства в классе интерфейса GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS звуковой драйвер создает и включает одну или несколько фабрик фильтров.

Если звуковой драйвер является драйвером AVStream, звуковой драйвер вызывает KsCreateFilterFactory, чтобы добавить новую фабрику фильтров и KsFilterFactorySetDeviceClassesState, чтобы включить фабрику. Если аудиодрайвер является драйвером PortCls, он косвенно создает и инициализирует фабрики фильтров KS путем вызова PcRegisterSubdevice. Для многих конструкций звуковых драйверов PortCls существует два подустройства, зарегистрированных для заданного подключенного устройства HFP.

Каждая фабрика фильтров (или для аудио драйверов PortCls, каждая пара фабрик фильтров) представляет функцию звука одного парного устройства HFP. Звуковой драйвер создает отдельные фабрики фильтров для каждого парного устройства HFP, представленного уникальными экземплярами интерфейсов GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Для каждого парного устройства HFP звуковой драйвер должен использовать уникальные строки для параметра RefString KsCreateFilterFactory или параметра Name pcRegisterSubdevice. Разработчику драйвера может быть полезно в качестве уникальной строки использовать Bluetooth-адрес связанного устройства HFP. См. раздел "Получение Bluetooth-адреса устройства HF" для получения информации о том, как извлечь уникальную строку.

Обратите внимание, что нет определенного максимального количества возможных парных устройств HFP, поэтому звуковой драйвер должен избегать жестких ограничений для написания кода. Вместо этого звуковой драйвер должен правильно обрабатывать динамическое прибытие и удаление нескольких интерфейсов GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS.

Однако с практической точки зрения драйвер PortCls должен указать максимальное количество подустройств при вызове PcAddAdapterDevice. PcAddAdapterDevice предварительно выделяет дополнительную память для каждого потенциального подустройства. Разработчик звукового драйвера должен выбрать достаточно большое число, чтобы разместить множество парных устройств, но в то же время выбрать число, которое не приводит к потере ресурсов. Например, поддержка только двух устройств HFP может быть недостаточной, и поддержка двух тысяч, безусловно, приведет к чрезмерной нехватке ресурсов. Тем не менее, поддержка шестнадцати вариантов, скорее всего, будет оправданной.

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

Отправка IOCTL для получения состояния подключения

Звуковой драйвер отправляет команду IOCTL для получения статуса подключения, чтобы получить сведения о любых изменениях, произошедших в соединении.

Отправка команды IOCTL для получения состояния тома

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