다음을 통해 공유


HFP 디바이스 시작

이 문서에서는 Bluetooth HFP(핸즈프리 프로필) 디바이스가 오디오 시스템에 도착하는 프로세스를 설명합니다.

오디오 시스템에 도착하는 페어링된 각 HFP 디바이스에 대해 Windows HFP 드라이버는 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 클래스에 디바이스 인터페이스를 등록합니다. 오디오 드라이버는 디바이스 인터페이스 알림을 사용하여 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 인터페이스의 모든 인스턴스에 대한 정보를 유지합니다. 오디오 드라이버는 AVStrMiniDevicePostStart 드라이버 루틴(또는 동등한 Portcls 루틴) 내에서 IoRegisterPlugPlayNotification을 호출하여 콜백을 등록하여 현재 설치된 HFP 디바이스를 검색하고 새 HFP 디바이스에 대한 알림을 받습니다.

오디오 드라이버가 IoRegisterPlugPlayNotification을 호출하면 다음 매개 변수를 사용하여 호출됩니다.

  • EventCategory는 EventCategoryDeviceInterfaceChange로 설정됩니다.
  • EventCategoryFlags는 일반적으로 기존 인터페이스에 대한 즉각적인 알림을 받기 위해 PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 설정됩니다. 그러나 일부 대체 오디오 드라이버 디자인은 다른 방법을 통해 기존 인터페이스를 찾을 수 있습니다.
  • EventCategoryData는 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 설정됩니다.
  • DriverObject는 오디오 드라이버의 DriverObject로 설정됩니다.
  • CallbackRoutine은 알림을 받을 오디오 드라이버의 루틴으로 설정됩니다.

다음 섹션에서는 오디오 드라이버가 쌍을 이루는 HFP 디바이스의 등록된 각 instance 대해 수행할 수 있는 작업을 간략하게 설명합니다.

인터페이스 인스턴스 처리

GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 클래스에 등록된 각 인터페이스 instance 오디오 드라이버는 통신에 다음 프로토콜을 사용해야 합니다.

  • Windows에서 오디오 드라이버가 IoRegisterPlugPlayNotification이라고 할 때 등록된 오디오 드라이버의 콜백 루틴을 호출할 때 Windows는 DEVICE_INTERFACE_CHANGE_NOTIFICATION 사용하여 HFP 인터페이스에 대한 기호 링크를 전달합니다. SymbolicLinkName.
  • 오디오 드라이버가 IoGetDeviceObjectPointer를 호출할 때 드라이버는 기호 링크를 사용하여 HFP 디바이스에 대한 HFP FileObject 및 DeviceObject를 가져옵니다.
  • 오디오 드라이버가 HFP 드라이버에 IOCTL을 보내면 드라이버는 HFP 디바이스에 HFP FileObject 및 DeviceObject를 사용합니다.

정적 정보 검색

오디오 드라이버는 HFP 드라이버에서 정적 정보를 검색할 수 있습니다. 예를 들어 HFP 드라이버는 ksnodetype, 컨테이너 ID 및 쌍을 이루는 HFP 디바이스의 식별 이름을 제공할 수 있습니다. 오디오 드라이버는 이 정보를 사용하여 쌍을 이루는 HFP 디바이스를 나타내는 KS 필터 또는 필터를 만들고 초기화할 수 있습니다. 오디오 드라이버는 IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR 사용하여 이 정보를 가져옵니다.

오디오 드라이버는 페어링된 HFP 디바이스의 Bluetooth 주소를 검색할 수도 있습니다. 페어링된 각 HFP 디바이스에는 고유 식별자 문자열로 유용할 수 있는 고유한 Bluetooth 주소가 있습니다. 자세한 내용은 HF 디바이스의 Bluetooth 주소 가져오기를 참조하세요.

오디오별 필터 팩터리 컨텍스트 만들기, 초기화

오디오 관련 필터 팩터리 컨텍스트를 만들고 초기화하려면 오디오 드라이버가 HFP DeviceObject 및 HFP FileObject를 필터 팩터리 컨텍스트에 저장한 다음 IsConnected 필드를 false로 초기화해야 합니다.

KS 필터 팩터리 만들기

GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 인터페이스 클래스의 각 디바이스 instance 오디오 드라이버는 하나 이상의 필터 팩터리를 만들고 사용하도록 설정합니다.

오디오 드라이버가 AVStream 드라이버인 경우 오디오 드라이버는 KsCreateFilterFactory를 호출하여 새 필터 팩터리를 추가하고 KsFilterFactorySetDeviceClassesState를 호출하여 팩터리를 사용하도록 설정합니다. 오디오 드라이버가 PortCls 드라이버인 경우 PcRegisterSubdevice를 호출하여 KS 필터 팩터리를 간접적으로 만들고 사용하도록 설정합니다. 많은 PortCls 오디오 드라이버 디자인의 경우 지정된 쌍을 이루는 HFP 디바이스에 대해 등록된 두 개의 하위 디바이스가 있습니다.

각 필터 팩터리(또는 PortCls 오디오 드라이버의 경우 각 필터 팩터리 쌍)는 페어링된 단일 HFP 디바이스의 오디오 기능을 나타냅니다. 오디오 드라이버는 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 인터페이스의 고유한 인스턴스로 표시되는 쌍을 이루는 각 HFP 디바이스에 대해 별도의 필터 팩터리를 만듭니다. 페어링된 각 HFP 디바이스에 대해 오디오 드라이버는 KsCreateFilterFactory의 RefString 매개 변수 또는 PcRegisterSubdevice의 Name 매개 변수에 고유한 문자열을 사용해야 합니다. 드라이버 개발자는 쌍을 이루는 HFP 디바이스의 Bluetooth 주소 문자열을 고유한 문자열로 사용하는 것이 유용할 수 있습니다. 고유 문자열을 검색하는 방법에 대한 자세한 내용은 HF 디바이스의 Bluetooth 주소 가져오기 를 참조하세요.

가능한 페어링된 HFP 디바이스의 특정 최대 수는 없으므로 오디오 드라이버는 특정 제한 사항을 하드 코딩하지 않아야 합니다. 대신 오디오 드라이버는 여러 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 인터페이스의 동적 도착 및 제거를 올바르게 처리해야 합니다.

그러나 실제로 PortCls 드라이버는 PcAddAdapterDevice를 호출할 때 최대 하위 디바이스 수를 지정해야 합니다. PcAddAdapterDevice는 잠재적인 각 하위 디바이스에 대한 추가 메모리를 미리 할당합니다. 오디오 드라이버 개발자는 많은 쌍을 이루는 디바이스를 수용할 수 있을 만큼 높은 숫자를 선택해야 하지만 동시에 리소스 낭비를 초래하지 않는 숫자를 선택해야 합니다. 예를 들어 두 개의 HFP 디바이스만 지원하는 것은 부적절할 수 있으며 2,000개를 지원하면 리소스가 과도하게 확장될 수 있습니다. 그러나 16개를 지원하는 것은 합리적일 수 있습니다.

런타임에 오디오 드라이버가 다른 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 인터페이스에 대한 알림을 받았지만 이미 최대 하위 디바이스 수를 등록한 경우 오디오 드라이버는 일부 알고리즘을 호출하여 하위 디바이스가 등록을 취소하여 새 HFP 디바이스를 위한 공간을 확보할 수 있는 쌍을 이루는 HFP 디바이스를 선택할 수 있습니다. 예를 들어 오디오 드라이버는 가장 오래된 연결이 있는 HFP 디바이스를 추적할 수 있습니다. 더 간단하지만 사용자에게 친숙한 오디오 드라이버는 최대값에 도달한 후 추가 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 인터페이스를 무시하기만 하면 됩니다.

IOCTL을 상태 연결 가져오기 보내기

오디오 드라이버는 연결에서 발생한 변경 내용에 대한 정보를 가져오기 위해 IOCTL에 상태 연결 가져오기를 보냅니다.

IOCTL을 상태 가져오기 볼륨 보내기

오디오 드라이버는 GET 볼륨 상태 IOCTL을 전송하여 헤드셋의 볼륨 상태 발생한 볼륨 수준의 변경 내용에 대한 정보를 가져옵니다.