HFP 디바이스 연결
이 문서에서는 오디오 시스템이 Bluetooth 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 다른 instance 호출하여 다음 상태 변경 사항을 수신합니다. 이전 상태 변경 요청이 아직 보류 중인 경우 이 두 번째 호출이 실패하고 오디오 드라이버가 연결 상태 업데이트하지 않고 상태 변경 정보에 대한 다른 요청을 하지 않습니다.
커널 스트리밍 고려 사항에서 설명한 대로 오디오 드라이버는 KSPROPERTY_ONESHOT_RECONNECT 및 KSPROPERTY_ONESHOT_DISCONNECT 지원해야 합니다. 이러한 속성에 대한 처리기는 각각 REQUESTCONNECT 및 REQUESTDISCONNECT IOCTL을 HFP 드라이버로 보내야 합니다. 이러한 IOCTL은 신속하게 완료되며 오디오 드라이버는 반환된 결과에 응답할 준비가 되어 있어야 합니다.
이 문서에서는 오디오 드라이버 개발자가 알고 있어야 하는 다른 Bluetooth 오디오 장치 연결 관련 요소에 대해서도 설명합니다.
스트림 채널
스트림 채널은 오디오 드라이버의 무선 대역폭 할당을 나타냅니다. 대부분의 경우 SCO 채널입니다. 그러나 SCO 채널 상태 관리하는 세부 정보 중 일부는 HFP 드라이버 내에서 전적으로 처리됩니다. 여기에는 예를 들어 HF가 AG로 오디오 전송을 시작하는 호출 시나리오로 인해 발생할 수 있는 원격 연결 끊기가 포함됩니다(이 경우 PC가 AG의 역할을 수행함).
오디오 필터 핀 상태
오디오 드라이버는 두 KS 핀에 대한 KS 핀 상태 처리기를 구현합니다. 이러한 핀 중 하나가 무선으로 데이터를 전송하려면 SCO 스트림 채널이 필요합니다. 이러한 핀 중 하나가 KSSTATE_ACQUIRE 전환되면 오디오 드라이버는 HFP 드라이버에 IOCTL_BTHHFP_STREAM_OPEN 전송하여 채널을 엽니다. 이 비동기 호출을 완료하는 데 몇 초 정도 걸릴 수 있습니다. 오디오 드라이버는 자체 시간 제한 메커니즘을 구현할 필요가 없으며 KSSTATE_ACQUIRE 전환을 완료하기 전에 IOCTL이 완료되기를 기다려야 합니다.
두 KS 핀이 모두 KSSTATE_STOP 전환되면 오디오 드라이버가 IOCTL_BTHHFP_STREAM_CLOSE HFP 드라이버로 전송하여 빠르게 완료됩니다.
IOCTL_BTHHFP_STREAM_OPEN 보내고 IOCTL_BTHHFP_STREAM_CLOSE 시기를 결정하기 위해 오디오 드라이버는 간단한 참조 계산 메커니즘을 사용하여 SCO 스트림 채널이 필요한 핀 수를 추적할 수 있습니다. 참조 횟수가 0에서 1로 변경되면 오디오 드라이버가 SCO 스트림 채널을 열고 닫습니다.
IOCTL_BTHHFP_STREAM_OPEN HFP 드라이버는 SCO 채널이 아직 열려 있지 않은 경우 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 애플리케이션이 CallButtons API에서 오디오 전송 콜백을 수신하고 스트리밍 오류를 유발하는 대신 HFP 엔드포인트에서 오디오 리소스를 깔끔하게 해제할 수 있습니다.
원격 SCO 연결에서 스트림 채널이 열려 있는 경우 드라이버는 연결을 수락합니다. 스트림 채널이 닫히면 HFP 드라이버가 연결을 수락하고 연결 끊기 타이머를 시작합니다. 연결 끊기 타이머가 만료되면 SCO가 여전히 연결되어 있고 스트림 채널이 여전히 닫혀 있으면 드라이버가 SCO 연결을 끊습니다.
이 절차를 통해 VoIP 애플리케이션은 SCO 연결을 조기에 거부하거나 닫지 않고 CallButtons API에서 오디오 전송 콜백을 수신하고 HFP 엔드포인트에서 오디오 리소스를 설정할 수 있습니다.