Подключение устройства HFP

В этой статье рассматривается, как звуковая система определяет и обрабатывает информацию о состоянии подключения для устройства с профилем Hands-Free (HFP) Bluetooth.

Звуковой драйвер должен поддерживать KSPROPERTY_JACK_DESCRIPTION и иметь поле IsConnected в контексте фабрики фильтров. Драйвер использует это значение при обработке свойства KSPROPERTY_JACK_DESCRIPTION .

После успешного завершения IOCTL_BTHHFP_DEVICE_GET_CONNECTION_STATUS_UPDATE драйвер звука обновляет IsConnected с новым состоянием подключения. Если состояние изменилось, звуковой драйвер вызывает событие KSEVENT_PINCAPS_JACKINFOCHANGE , что приводит к повторному вычислению состояния подключения звуковой системы. Затем звуковой драйвер вызывает другой экземпляр IOCTL_BTHHFP_DEVICE_GET_CONNECTION_STATUS_UPDATE , чтобы получить следующее изменение состояния. Если предыдущий запрос на изменение состояния все еще ожидается, вторая попытка завершается неудачей, и звуковой драйвер не обновляет состояние подключения и не делает другой запрос на изменение информации о состоянии.

Как описано в рекомендациях по потоковой передаче ядра, звуковой драйвер должен поддерживать KSPROPERTY_ONESHOT_RECONNECT и KSPROPERTY_ONESHOT_DISCONNECT. Обработчики этих свойств должны отправлять IOCTLs REQUESTCONNECT и REQUESTDISCONNECT драйверу HFP соответственно. Эти IOCTL выполняются быстро, и звуковой драйвер должен быть готов к обработке возвращённых результатов.

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

Канал потоковой передачи

Канал потоковой передачи представляет собой распределение эфирной пропускной способности аудиодрайвера. В большинстве случаев это канал SCO. Однако некоторые сведения об управлении состоянием канала SCO полностью обрабатываются в драйвере HFP. Это включает в себя, например, удаленные отключения, которые могут быть вызваны сценариями вызова, когда HF инициирует передачу звука к AG (с компьютером, выполняющим роль AG в этом случае).

Состояния контактов аудиофильтра

Звуковой драйвер реализует обработчики состояния контактов KS для двух контактов KS. Канал потока SCO необходим для передачи данных по беспроводной сети с помощью любого из этих контактов. Когда любой из этих контактов переходит в KSSTATE_ACQUIRE, аудиодрайвер открывает канал, отправляя команду IOCTL_BTHHFP_STREAM_OPEN драйверу HFP. Для завершения этого асинхронного вызова может потребоваться несколько секунд. Звуковому драйверу не нужно реализовывать собственный механизм таймаута, и он должен дождаться завершения IOCTL, прежде чем завершить переход к состоянию KSSTATE_ACQUIRE.

Когда оба контакта KS переходят в состояние KSSTATE_STOP, звуковой драйвер отправляет IOCTL_BTHHFP_STREAM_CLOSE драйверу HFP, чтобы быстро закончить выполнение.

Чтобы определить, когда отправлять IOCTL_BTHHFP_STREAM_OPEN и IOCTL_BTHHFP_STREAM_CLOSE, аудиодрайвер может использовать простой механизм подсчета ссылок для отслеживания количества пинов, требующих SCO-канал потока. Звуковой драйвер открывает и закрывает канал потоковой передачи SCO, когда количество ссылок изменяется от 0 до 1.

На IOCTL_BTHHFP_STREAM_OPEN драйвер HFP запрашивает канал SCO, если он еще не открыт, и завершает запрос с результатами запроса SCO. В IOCTL_BTHHFP_STREAM_CLOSE драйвер HFP запрашивает отключение канала SCO, если он открыт.

Удаленное подключение и отключение SCO

При разрыве удалённого соединения SCO, если потоковый канал закрыт, драйвер HFP ничего не делает. Если канал потока открыт, драйвер HFP запускает таймер повторного подключения. Когда срок действия таймера истекает, если SCO по-прежнему отключен и потоковый канал по-прежнему открыт, драйвер запрашивает канал SCO. Обратите внимание, что передача звуковых данных по воздуху не происходит, когда SCO отключено, следовательно, в течение этого периода будет пробел в звуке. Если запрос SCO завершается сбоем, драйвер HFP сигнализирует звуковому драйверу об изменении состояния канала потоковой передачи, выполнив любой вызов IOCTL_BTHHFP_STREAM_GET_STATUS_UPDATE. Это должно быть редким, так как удаленное отключение SCO обычно связано с устройством HF, запрашивающим передачу аудиосигнала вызова в звуковой шлюз. Звуковой драйвер должен учитывать это условие ошибки среднего потока.

Эта процедура позволяет приложению VoIP получать обратный вызов передачи звука из API CallButtons и аккуратно освободить свои аудиоресурсы на конечной точке HFP, вместо того чтобы вызывать ошибки потоковой передачи.

При удаленном подключении SCO, если канал потоков открыт, драйвер просто принимает подключение. Если канал потока закрыт, драйвер HFP принимает подключение и запускает таймер отключения. Когда истекает срок действия таймера отключения, если функция SCO по-прежнему подключена и канал потоков по-прежнему закрыт, драйвер прерывает подключение SCO.

Эта процедура позволяет приложению VoIP получать обратный вызов передачи звука от API CallButtons и настраивать аудиоресурсы на конечной точке HFP, при этом избегая преждевременного отклонения или закрытия подключения SCO.