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


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

В этой статье описывается, как аудиосистема определяет и обрабатывает сведения о состоянии подключения для устройства bluetooth hands-free profile (HFP).

Звуковой драйвер должен поддерживать 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. Обработчики этих свойств должны отправлять IOCTL REQUESTCONNECT и REQUESTDISCONNECT соответственно драйверу HFP. Эти ioCTL выполняются быстро, и звуковой драйвер должен быть готов к реагированию на возвращенные результаты.

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

Потоковый канал

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

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

Аудиодрайвер реализует обработчики состояния контактов 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.