다음을 통해 공유


Bluetooth LE(저에너지) 오디오

이 문서에서는 Windows 11 버전 22H2(KB5026446)에 도입된 Bluetooth LE Audio의 개요를 제공합니다.

소개

Bluetooth LE Audio를 사용하면 등시 전송을 통해 유니캐스트를 스트리밍하거나 Bluetooth LE 디바이스에 오디오를 브로드캐스트할 수 있습니다. Bluetooth 코어 사양 버전 5.3부터는 호스트 플랫폼이 Bluetooth 컨트롤러와 상호 연결된 데이터를 보내고 받을 수 있는 표준 HCI(호스트 컨트롤러 인터페이스)가 없습니다. 이 문서에서는 플랫폼이 공급업체별 솔루션을 사용하여 Bluetooth LE 오디오 스트리밍을 사용하도록 허용하도록 Windows Bluetooth 공급업체 VSAP(특정 오디오 경로)를 정의합니다. VSAP 소프트웨어 인터페이스는 WINDOWS ACX( 오디오 클래스 확장 ) 및 이 문서에 정의된 더 많은 인터페이스 속성을 사용합니다.

용어 및 필수 구성 요소

이 표에 정의된 용어 외에도 이 문서에서는 Windows 오디오 클래스 확장에서 정의한 용어도 참조합니다.

기간 정의
LE 오디오 'Bluetooth LE Audio'의 약어
클래식 오디오 HFP(핸즈프리 프로필) 및 고급 오디오 배포 프로필(A2DP)을 사용하는 Bluetooth 오디오 스트리밍
오디오 디바이스 Windows 관점에서 단일 오디오 엔드포인트를 함께 구성하는 단일 원격 Bluetooth LE 오디오 디바이스 또는 Bluetooth LE 오디오 디바이스 세트입니다.
BAP 기본 오디오 프로필은 장치가 BLUEtooth LE(저에너지) 통신을 사용하여 오디오를 배포하고 사용하는 방법을 정의합니다.
TMAP 전화 통신 및 미디어 오디오 프로필은 하위 수준 오디오 서비스 및 프로필의 상호 운용 가능한 구성을 지정합니다.
ASCS 오디오 스트림 제어 서비스는 Bluetooth LE 오디오 디바이스가 유니캐스트 오디오 스트림을 구성하고 설정하는 표준 방법을 정의합니다.
PACS (의료 영상 저장 및 전송 시스템) 게시된 오디오 기능 서비스는 Bluetooth LE Audio 디바이스가 지원되는 오디오 코덱 기능을 보고하는 표준 방법을 정의합니다.
CIS 연결된 등시 스트림 전송은 Bluetooth LE 디바이스 간에 유니캐스트 오디오 데이터를 보내고 받는 데 사용됩니다.
BIS 브로드캐스트 등시 스트림 전송은 연결 없는 오디오 데이터 전송에 사용됩니다.
ACX 모든 오디오 드라이버가 Windows에서 Bluetooth LE Audio를 지원하는 데 필요한 드라이버 모델인 오디오 클래스 확장의 경우 짧습니다.
스트리밍 회로 해당 스트리밍 경로에 대해 공급업체별 오디오 드라이버 스택에서 만든 하나 이상의 ACXCIRCUIT 개체입니다.
프로필 회로 Windows의 Bluetooth LE 오디오 프로필 구현에서 만든 ACXCIRCUIT 개체입니다. 이 ACXCIRCUIT 은 스트리밍 회로가 아닙니다.

이 문서에서는 Bluetooth Core 사양에 정의된 이전에 정의된 용어 및 다음 HCI 명령에 대해 잘 알고 있다고 가정합니다.

  • 로컬 컨트롤러 명령
    • HCI_Read_Local_Supported_Codecs(v2)
    • HCI_Read_Local_Supported_Codec_Capabilities
    • HCI_LE_Setup_ISO_Data_Path
    • HCI_LE_Remove_ISO_Data_Path
    • HCI_Configure_Data_Path
  • 유니캐스트 스트리밍 명령
    • HCI_LE_Set_CIG_Parameters
    • HCI_LE_Create_CIS
    • HCI_LE_Remove_CIG
  • 브로드캐스트 스트리밍 명령
    • HCI_LE_Create_BIG
    • HCI_LE_Terminate_BIG
    • HCI_LE_BIG_Create_Sync
    • HCI_LE_BIG_Terminate_Sync
    • HCI_LE_Set_Periodic_Advertising_Parameters
    • HCI_LE_Set_Periodic_Advertising_Data
    • HCI_LE_Set_Periodic_Advertising_Enable
    • HCI_LE_Periodic_Advertising_Create_Sync
    • HCI_LE_Periodic_Advertising_Create_Sync_Cancel
    • HCI_LE_Periodic_Advertising_Terminate_Sync
    • HCI_LE_Set_Periodic_Advertising_Receive_Enable
    • HCI_LE_Periodic_Advertising_Report
    • HCI_LE_BIGInfo_Advertising_Report
    • HCI_LE_Read_Periodic_Advertiser_List_Size
    • HCI_LE_Add_Device_To_Periodic_Advertiser_List
    • HCI_LE_Remove_Device_From_Periodic_Advertiser_List
    • HCI_LE_Clear_Periodic_Advertiser_List
    • HCI_LE_Periodic_Advertising_Set_Info_Transfer
    • HCI_LE_Periodic_Advertising_Sync_Transfer
    • HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters
    • HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters

Bluetooth LE Audio VSAP를 사용하려면 오디오 드라이버가 ACX 프레임워크를 사용해야 합니다. Bluetooth LE Audio용 ACX를 채택하면 다음과 같은 몇 가지 이점이 있습니다.

  • 앞으로 Windows용 기본 오디오 드라이버 모델을 지원합니다.
  • 드라이버 간에 전용 DDI를 요구하지 않고 다중 스택 오디오 솔루션에 대한 ACX의 기본 지원을 사용합니다.
  • IHV 오디오 드라이버가 오디오 시스템에서 Bluetooth 스택으로 요청을 릴레이할 필요가 없습니다. 대신 ACX는 프로필 회로를 통해 Bluetooth 스택에 직접 요청을 보낼 수 있습니다.

건축학

정의

다음 구성 요소는 다양한 VSAP 아키텍처 변형에 포함됩니다.

Windows ACX 프레임워크

이 구성 요소를 사용하면 다중 스택 오디오 엔드포인트를 지원할 수 있습니다. Bluetooth LE Audio의 경우 오디오 엔드포인트를 구성하는 소프트웨어 구성 요소는 공급업체별 오디오 드라이버 스택 및 Windows Bluetooth LE 오디오 프로필입니다.

공급업체별 오디오 드라이버 스택

이 공급업체 특정 구성 요소는 공급업체에서 정의한 오디오 인터페이스를 통해 Bluetooth 컨트롤러와 Bluetooth LE 오디오 데이터를 주고받는 작업을 담당합니다. 수신 및 발신 오디오 데이터를 관리하기 위해 최소한 ACX 스트리밍 드라이버로 구성되어야 합니다. 다중 회로 ACX 오디오 엔드포인트의 필요한 부분인 경우 더 많은 ACX 드라이버가 포함될 수 있습니다. 이 구성 요소를 이 문서에서 IHV ACX 스트리밍 드라이버라고도 합니다.

Windows Bluetooth LE 오디오 프로필

이 구성 요소에는 BAP(기본 오디오 프로필), 볼륨 제어 프로필 및 마이크 컨트롤 프로필의 구현이 포함됩니다. 각 Bluetooth LE Audio 디바이스 또는 Windows에 페어링된 디바이스 집합에 대한 컨트롤 ACXCIRCUIT 을 만드는 작업을 담당합니다. 또한 원격 장치 및 Bluetooth 컨트롤러에서 오디오 형식을 보고하고 등시 채널 및 그룹의 상태를 관리합니다.

Windows Bluetooth 코어 스택

이 구성 요소는 Windows Bluetooth LE 오디오 프로필이 로컬 Bluetooth 컨트롤러에서 지원되는 코덱 기능을 쿼리하고 등시 채널 및 그룹의 상태를 관리할 수 있도록 하는 인터페이스를 제공합니다.

LC3 코덱

이 하위 구성 요소에서는 압축된 LC3 오디오와 PCM 오디오 간에 변환됩니다. 인코딩 및 디코딩 기능을 모두 지원해야 합니다. LC3 코덱은 공급업체별 VSAP(오디오 드라이버) 스택의 일부로 소프트웨어에서 구현할 수 있습니다. 또는 오디오 DSP 또는 Bluetooth 컨트롤러의 일부로 하드웨어에서 구현할 수 있습니다. 이 다이어그램은 Bluetooth SIG에서 지원하는 표준 코덱이므로 이름으로 LC3를 언급합니다. Windows에서 지원하는 향후 코덱 및 공급업체별 코덱도 비슷한 방식으로 아키텍처에 통합될 수 있습니다.

아키텍처 변형

Bluetooth LE Audio VSAP 아키텍처는 스트리밍을 위해 다양한 변형을 지원합니다.

  1. 오디오 오프로드 없이 사이드밴드 Bluetooth LE 오디오 스트리밍
  2. 오디오 오프로드를 지원하는 사이드밴드 Bluetooth LE 오디오 스트리밍
  3. 공급업체별 Inband Bluetooth LE 오디오 스트리밍

다음 다이어그램에서 음영 처리된 구성 요소는 IHV에서 제공되고 섀딩되지 않은 구성 요소는 OS에서 제공합니다.

오디오 오프로드가 없는 사이드밴드 Bluetooth LE 오디오 아키텍처

사이드밴드 아키텍처는 공급업체별 오디오 인터페이스를 사용하여 오디오 드라이버 스택이 Bluetooth 컨트롤러에 오디오 데이터를 보내고 받을 수 있도록 합니다. 이 데이터 경로는 유니캐스트 클라이언트와 원격 유니캐스트 서버 간의 메시지 신호와 같은 다른 Bluetooth 데이터에 사용되는 HCI 데이터 경로와는 별개입니다. 다음 다이어그램은 LC3 코덱이 Bluetooth 컨트롤러에서 호스트되는 사이드밴드 아키텍처를 모델링합니다. 소프트웨어 인코딩 및 디코딩을 위해 공급업체별 오디오 드라이버 스택의 일부로 LC3 코덱을 호스트하는 것도 유효합니다. 이 경우 Bluetooth 컨트롤러로 전송되는 오디오는 PCM 오디오 대신 LC3 오디오 프레임으로 포맷됩니다.

다음 다이어그램은 Bluetooth 컨트롤러에 LC3 코덱이 있는 사이드밴드 Bluetooth LE 오디오 아키텍처를 보여줍니다.

Bluetooth 컨트롤러에 있는 LC3 코덱이 있는 사이드밴드 Bluetooth LE 오디오 아키텍처 다이어그램.

다음 다이어그램은 오디오 드라이버 스택에 LC3 코덱이 있는 사이드밴드 Bluetooth LE 오디오 아키텍처를 보여줍니다.

오디오 드라이버 스택에 LC3 코덱이 있는 사이드밴드 Bluetooth LE 오디오 아키텍처 다이어그램.

오디오 오프로드가 있는 사이드밴드 Bluetooth LE 오디오 아키텍처

오디오 오프로드가 있는 사이드밴드 아키텍처에는 Bluetooth LE Audio 스트리밍 솔루션에 절전 기능을 제공하는 오디오 DSP 하드웨어 구성 요소가 포함되어 있습니다. 다음 다이어그램에서는 Bluetooth 컨트롤러의 LC3 코덱과 오디오 DSP의 코덱을 사용하여 가능한 아키텍처를 보여 줍니다.

다음 다이어그램은 Bluetooth 컨트롤러에 LC3 코덱이 있는 오디오 오프로드 아키텍처가 있는 사이드밴드 Bluetooth LE Audio를 보여줍니다.

Bluetooth 컨트롤러의 LC3 코덱을 특징으로 하는 오디오 오프로드 아키텍처가 있는 사이드밴드 Bluetooth LE 오디오 다이어그램.

다음 다이어그램에서는 오디오 DSP에서 LC3 코덱이 있는 오디오 오프로드 아키텍처를 사용하는 사이드밴드 Bluetooth LE Audio를 보여 줍니다.

오디오 DSP의 LC3 코덱을 특징으로 하는 오디오 오프로드 아키텍처가 있는 사이드밴드 Bluetooth LE 오디오 다이어그램.

공급업체별 Inband Bluetooth LE 오디오 아키텍처

VSAP 인밴드 아키텍처를 사용하면 사용자 지정 파이프라인이 공급업체별 오디오 드라이버 스택에서 Bluetooth 컨트롤러의 HCI로 Bluetooth LE 오디오 데이터를 보내고 받을 수 있습니다. 이 아키텍처에는 새 구성 요소인 "IHV ISO 병합 구성 요소"가 포함됩니다. 이 구성 요소는 ISO 데이터에 대한 흐름 제어를 관리합니다. 또한 HCI 명령을 보내야 하는 경우 Windows Bluetooth Core Stack과 HCI 명령 흐름 제어를 공유해야 합니다.

다음 다이어그램에서는 공급업체별 인밴드 Bluetooth LE 오디오 아키텍처를 보여 있습니다.

공급업체별 인밴드 Bluetooth LE 오디오 아키텍처 다이어그램.

상세 디자인

오디오 형식 요구 사항

KSAUDIO_PACKETSIZE_CONSTRAINTS2

IHV ACX 오디오 드라이버는 KSAUDIO_PACKETSIZE_CONSTRAINTS2 속성을 지원해야 합니다. 이 속성을 지원하면 Windows에 Bluetooth LE 오디오 디바이스를 추가하는 시간과 스트리밍을 위한 애플리케이션에서 오디오 디바이스를 사용할 수 있게 되는 시간이 줄어듭니다.

오디오 프레임 기간

Bluetooth LE 오디오 프로필을 사용하면 구현에서 프레임 기간이 7.5밀리초 또는 10밀리초인 오디오 스트리밍을 지원할 수 있습니다. Windows에는 두 프레임 기간을 모두 지원하기 위해 IHV에서 제공하는 코덱이 필요합니다. 이 요구 사항은 Bluetooth LE 오디오 액세서리 장치와의 상호 운용성 및 시스템에 연결된 다른 Bluetooth LE 디바이스와의 품질 공존을 보장합니다.

신호 처리 모드 정의

Bluetooth LE Audio는 다양한 사용자 시나리오를 지원하기 위해 다양한 스트리밍 형식을 지원합니다. BAP 및 TMAP 사양은 인증에 대해 지원되는 필수 형식을 정의합니다. Windows는 오디오 신호 처리 모드를 적용하여 시스템이 수행하는 시나리오에 사용할 형식의 상관 관계를 지정합니다. Bluetooth LE Audio를 지원하는 오디오 드라이버는 다음 표의 신호 처리 모드 및 형식에 대한 지원을 나타내야 합니다. 또한 Bluetooth LE Audio는 원시 신호 처리 모드를 지원하지 않으므로 오디오 드라이버는 이 모드에 대해 지원되는 형식을 보급하지 않습니다.

유니캐스트 렌더링 스트림 오디오 형식 및 신호 처리 모드

Bluetooth LE Audio를 사용하려면 다음 신호 처리 모드에 대해 유니캐스트 렌더링 오디오 형식을 선언해야 합니다.

  • 기본값(AUDIO_SIGNALPROCESSINGMODE_DEFAULT)
    • 이 모드는 음악 재생, 알림 및 비디오 게임 오디오와 같은 단방향 렌더링 시나리오에 사용됩니다.
  • 통신(AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS)
    • 이 모드는 음성 통화와 같은 양방향 시나리오에 사용됩니다.

다음 표는 각 사용 사례 및 신호 처리 모드에 대한 대칭 형식 목록입니다. 비대칭 형식 지원은 음성 시나리오에 대한 슈퍼 와이드밴드 스테레오에서 정의됩니다.

오디오 형식은 가장 선호되는 것에서 가장 선호도가 낮은 형식으로 정렬됩니다.

스테레오 디바이스 또는 조정된 디바이스 세트에 연결된 경우 시스템 소리, 음악 재생 및 비디오 게임 오디오

신호 처리 모드: 기본값

샘플링 빈도 채널 수 비트 깊이 프레임 기간 오디오 데이터 속도 BAP 코덱 구성 ID(BAP 사양 표 3.11)
48kHz 2 16 7.5ms 96kbps 48_3
48kHz 2 16 7.5ms 80kbps 48_1
48kHz 2 16 10ms 96kbps 48_4
48kHz 2 16 10ms 80kbps 48_2
32kHz 2 16 7.5ms 64kbps 32_1
32kHz 2 16 10ms 64kbps 32_2
24kHz 2 16 7.5ms 48kbps 24_1
24kHz 2 16 10ms 48kbps 24_2
조정된 세트의 단일 멤버(단일 이어버드 또는 보청기)에 연결된 경우 시스템 소리, 음악 재생 및 비디오 게임 오디오

신호 처리 모드: 기본값

샘플링 빈도 채널 수 비트 깊이 프레임 기간 오디오 데이터 속도 BAP 코덱 구성 ID(BAP 사양 표 3.11)
48kHz 1 16 7.5ms 96kbps 48_3
48kHz 1 16 7.5ms 80kbps 48_1
48kHz 1 16 10ms 96kbps 48_4
48kHz 1 16 10ms 80kbps 48_2
32kHz 1 16 7.5ms 64kbps 32_1
32kHz 1 16 10ms 64kbps 32_2
24kHz 1 16 7.5ms 48kbps 24_1
24kHz 1 16 10ms 48kbps 24_2
16kHz 1 16 7.5ms 32kbps 16_1
16kHz 1 16 10ms 32kbps 16_2
음성 채팅을 사용하여 음성 녹음기, VOIP 통화 또는 비디오 게임 오디오 렌더링

신호 처리 모드: 통신

샘플링 빈도 채널 수 비트 깊이 프레임 기간 오디오 데이터 속도 BAP 코덱 구성 ID(BAP 사양 표 3.11)
32kHz 1 16 7.5ms 64kbps 32_1
32kHz 1 16 10ms 64kbps 32_2
24kHz 1 16 7.5ms 48kbps 24_1
24kHz 1 16 10ms 48kbps 24_2
16kHz 1 16 7.5ms 32kbps 16_1
16kHz 1 16 10ms 32kbps 16_2
유니캐스트 캡처 스트림 오디오 형식 및 신호 처리 모드

Bluetooth LE Audio를 사용하려면 유니캐스트 캡처 오디오 형식을 기본(AUDIO_SIGNALPROCESSINGMODE_DEFAULT) 신호 처리 모드로 선언해야 합니다. 지원되는 캡처 형식 목록은 다음 표에 나와 있습니다.

오디오 형식은 가장 선호되는 것에서 가장 선호도가 낮은 형식으로 정렬됩니다.

음성 채팅을 사용하여 음성 녹음기, VOIP 통화 또는 비디오 게임 오디오 캡처

신호 처리 모드: 기본값

샘플링 빈도 채널 수 비트 깊이 프레임 기간 오디오 데이터 속도 BAP 코덱 구성 ID(BAP 사양 표 3.11)
32kHz 1 16 7.5ms 64kbps 32_1
32kHz 1 16 10ms 64kbps 32_2
24kHz 1 16 7.5ms 48kbps 24_1
24kHz 1 16 10ms 48kbps 24_2
16kHz 1 16 7.5ms 32kbps 16_1
16kHz 1 16 10ms 32kbps 16_2
오디오 신호 처리 모드 브로드캐스트

Windows Bluetooth LE 오디오를 사용하려면 브로드캐스트 원본(렌더링) 오디오 형식을 기본(AUDIO_SIGNALPROCESSINGMODE_DEFAULT) 신호 처리 모드로 선언해야 합니다.

Windows Bluetooth LE Audio에서는 기본(AUDIO_SIGNALPROCESSINGMODE_DEFAULT) 신호 처리 모드에 대해 브로드캐스트 싱크(캡처) 오디오 형식을 선언해야 합니다.

지원되는 필수 형식의 다음 전체 목록은 두 역할 모두에 대해 동일합니다.

시스템 소리, 음악 재생 및 비디오 게임 오디오를 위한 스테레오 브로드캐스트 스트림

신호 처리 모드: 기본값

샘플링 빈도 채널 수 비트 깊이 프레임 기간 오디오 데이터 속도 BAP 코덱 구성 ID(BAP 사양 표 3.11)
48kHz 2 16 7.5ms 96kbps 48_3
48kHz 2 16 7.5ms 80kbps 48_1
48kHz 2 16 10ms 96kbps 48_4
48kHz 2 16 10ms 80kbps 48_2
24kHz 2 16 7.5ms 48kbps 24_1
24kHz 2 16 10ms 48kbps 24_2
시스템 소리, 음악 재생 및 비디오 게임 오디오를 위한 Mono 브로드캐스트 스트림

신호 처리 모드: 기본값

샘플링 빈도 채널 수 비트 깊이 프레임 기간 오디오 데이터 속도 BAP 코덱 구성 ID(BAP 사양 표 3.11)
48kHz 1 16 7.5ms 96kbps 48_3
48kHz 1 16 7.5ms 80kbps 48_1
48kHz 1 16 10ms 96kbps 48_4
48kHz 1 16 10ms 80kbps 48_2
24kHz 1 16 7.5ms 48kbps 24_1
24kHz 1 16 10ms 48kbps 24_2
16kHz 1 16 7.5ms 32kbps 16_1
16kHz 1 16 10ms 32kbps 16_2

정의된 스트림 구성 및 토폴로지

유니캐스트 렌더링 전용 구성
기본 오디오 프로필 구성 1

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 1을 보여 주는 다이어그램

PC는 모노 스트림을 지원하는 단일 오디오 디바이스에 연결됩니다. 단일 디바이스는 독립 실행형 디바이스이거나 조정된 집합의 단일 연결된 멤버일 수 있습니다.

사용 사례 예제 Windows 오디오 설정 Bluetooth 컨트롤러 설정
미디어 재생 렌더링:
신호 처리 모드: 기본값
채널 수: 1
캡처: 없음
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 높은 안정성
오디오 장치에서 마이크가 없는 음성 통화 렌더링:
신호 처리 모드: 통신
채널 수: 1
캡처: 없음
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
비디오 게임 재생 렌더링:
신호 처리 모드: 기본값
채널 수: 1
캡처: 없음
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
기본 오디오 프로필 구성 4

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 4를 보여 주는 다이어그램

PC는 스테레오 스트림을 지원하는 단일 오디오 디바이스에 연결됩니다. 오디오 디바이스는 단일 CIS에서 두 개의 오디오 채널을 처리할 수 있습니다.

사용 사례 예제 Windows 오디오 설정 Bluetooth 컨트롤러 설정
미디어 재생 렌더링: 신호 처리 모드: 기본값
채널 수: 2
캡처: 없음
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 높은 신뢰성 오디오 채널 할당: 앞 왼쪽 및 앞 오른쪽
비디오 게임 재생 신호 처리 모드: 기본값
채널 수: 2
캡처: 없음
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
오디오 채널 할당: 프론트 왼쪽과 프론트 오른쪽
기본 오디오 프로필 구성 6(i)

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 6 I를 보여 주는 다이어그램

PC는 스테레오 스트림을 지원하는 단일 오디오 디바이스에 연결됩니다. 오디오 디바이스는 두 CIS 각각에서 하나의 오디오 채널만 처리할 수 있습니다.

사용 사례 예제 Windows 오디오 설정 Bluetooth 컨트롤러 설정
미디어 재생 신호 처리 모드: 기본값
채널 수: 2
캡처: 없음
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 높은 안정성
오디오 장치에서 마이크가 없는 음성 통화 신호 처리 모드: 통신
채널 수: 1
캡처: 없음
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
오디오 채널 할당: 왼쪽 전면 또는 오른쪽 전면
비디오 게임 재생 신호 처리 모드: 기본값
채널 수: 2
캡처: 없음
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
오디오 채널 할당: 프론트 왼쪽과 프론트 오른쪽
기본 오디오 프로필 구성 6(ii)

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 6 II를 보여 주는 다이어그램

PC는 조정된 오디오 장치 세트에 연결됩니다. 이 집합은 각 멤버가 단일 채널을 처리하는 두 개의 오디오 채널을 처리할 수 있습니다.

사용 사례 예제 Windows 오디오 설정 Bluetooth 컨트롤러 설정
미디어 재생 신호 처리 모드: 기본값
채널 수: 2
캡처: 없음
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 높은 안정성
어느 장치에서나 마이크가 없는 음성 통화 신호 처리 모드: 통신
채널 수: 1
캡처: 없음
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
비디오 게임 재생 신호 처리 모드: 기본값
채널 수: 2
캡처: 없음
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
유니캐스트 양방향 구성

양방향 구성은 Bluetooth LE Audio 프로필이 애플리케이션이 캡처를 만들고 원격 디바이스 또는 디바이스 집합에 스트림을 렌더링하려는 것을 감지할 때 사용됩니다. 애플리케이션은 스트림을 별도로 캡처 및 렌더링합니다. 따라서 IHV 오디오 드라이버 및 Bluetooth 컨트롤러는 프로비전 후 양방향 CIS의 단일 방향으로 오디오가 흐를 수 있도록 허용해야 합니다. 이 프로비저닝은 HCI 명령 데이터 경로 구성 및 LE 설치 ISO 데이터 경로를 사용합니다.

기본 오디오 프로필 구성 3

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 3을 보여 주는 다이어그램

PC는 단일 CIS에 양방향 모노 스트림이 설정된 단일 오디오 디바이스에 연결됩니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
음성 통화 렌더링:
신호 처리 모드: 통신
채널 수: 1
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
음성 채팅을 사용하여 비디오 게임 재생 렌더링:
신호 처리 모드: 통신
채널 수: 1
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
기본 오디오 프로필 구성 8(i)

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 8 I를 보여 주는 다이어그램

PC는 스테레오 렌더링 스트림 및 모노 캡처 스트림을 지원하는 단일 오디오 디바이스에 연결됩니다. 디바이스는 지정된 방향에 대해 단일 CIS에서 하나의 오디오 채널을 처리할 수 있습니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
음성 통화 렌더링:
신호 처리 모드: 통신
채널 수: 1 또는 2
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
음성 채팅을 사용하여 비디오 게임 재생 렌더링:
신호 처리 모드: 통신
채널 수: 2
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
기본 오디오 프로필 구성 8(ii)

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 8 II를 보여 주는 다이어그램

PC는 조정된 오디오 장치 세트에 연결됩니다. 각 집합 멤버는 하나의 렌더링 오디오 채널을 받습니다. 단일 집합 멤버에는 설정된 캡처 스트림이 있습니다. 캡처 스트림이 있는 집합 멤버는 캡처 스트림도 지원하는 PC에 연결하는 첫 번째 집합 멤버입니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
음성 통화 렌더링:
신호 처리 모드: 통신
채널 수: 1 또는 2
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
음성 채팅을 사용하여 비디오 게임 재생 렌더링:
신호 처리 모드: 통신
채널 수: 2
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
유니캐스트 캡처 전용 구성
기본 오디오 프로필 구성 2

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 2를 보여 주는 다이어그램

PC는 모노 캡처 스트림을 지원하는 단일 오디오 디바이스에 연결됩니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
디바이스에 스피커가 없는 음성 통화 번역하다: 없음
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수: 1
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
기본 오디오 프로필 구성 9(i)

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

기본 오디오 프로필 구성 9 I를 보여 주는 다이어그램

PC는 스테레오 오디오 데이터 전송을 지원하는 단일 오디오 디바이스에 연결됩니다. 디바이스는 단일 CIS에서 하나의 오디오 채널을 인코딩할 수 있습니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
다중 채널 마이크 캡처 번역하다: 없음
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간
기본 오디오 프로필 구성 9(ii)

PC는 모노 캡처 스트림을 지원하는 단일 오디오 디바이스에 연결됩니다.

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.1에 정의되어 있습니다.

PC가 단일 오디오 디바이스에 연결된 기본 오디오 프로필 구성 9(ii)을 보여 주는 다이어그램

PC는 오디오 디바이스 집합에 연결됩니다. 각 집합 멤버는 한 채널의 오디오를 PC로 보냅니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
다중 채널 마이크 캡처 번역하다: 없음
포착:
신호 처리 모드: 기본값
채널 수: 1
CIS 수량: 2
CIG 수: 1
BAP QoS 설정: 짧은 대기 시간

원격 디바이스 또는 디바이스 집합이 양방향 오디오를 지원하는 경우 캡처 전용 스트림에 대한 구성은 양방향과 동일합니다. 이 구성을 사용하면 스트림을 다시 만들 필요 없이 캡처 전용 시나리오에서 양방향 시나리오로 전환할 수 있습니다.

브로드캐스트 원본 구성
기본 오디오 프로필 구성 12

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.2에 정의되어 있습니다.

모노의 단일 오디오 디바이스에 PC가 연결된 기본 오디오 프로필 구성 12를 보여 주는 다이어그램.

PC는 단일 모노 오디오 채널을 브로드캐스트합니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
시스템 소리, 음악 재생 렌더링:
신호 처리 모드: 기본값
채널 수: 1
BIS 수: 1
빅 카운트: 1
BAP QoS 설정: 높은 안정성
비디오 게임 오디오 렌더링:
신호 처리 모드: 기본값
채널 수: 1
BIS 수: 1
빅 카운트: 1
BAP QoS 설정: 짧은 대기 시간
기본 오디오 프로필 구성 13

다음 오디오 구성은 Bluetooth BAP 사양의 표 4.2에 정의되어 있습니다.

스테레오로 단일 오디오 디바이스에 PC가 연결된 기본 오디오 프로필 구성 13을 보여 주는 다이어그램

PC는 자체 BIS에서 전송되는 각 채널로 스테레오 오디오를 브로드캐스트합니다.

사용 사례 Windows 오디오 설정 Bluetooth 컨트롤러 설정
시스템 소리, 음악 재생 렌더링:
신호 처리 모드: 기본값
채널 수: 2
BIS 수: 1
빅 카운트: 1
BAP QoS 설정: 높은 안정성
비디오 게임 오디오 렌더링:
신호 처리 모드: 기본값
채널 수: 1
BIS 수: 1
빅 카운트: 1
BAP QoS 설정: 짧은 대기 시간

데이터 구조체

Microsoft에서 정의한 Bluetooth LE 오디오 인터페이스 속성

스트림 만들기 속성

다음 속성은 ACXOBJECTBAGDPI를 통해 공급업체별 오디오 드라이버 스택과 Bluetooth LE 오디오 프로필 간에 공유됩니다. 이러한 속성은 스트림 만들기 시나리오에 표시된 것처럼 스트림 엔드포인트 만들기 및 구성에 대한 결정을 알려줍니다.

BluetoothLEAudio_CodecCapabilities

오디오 드라이버는 오디오 드라이버 또는 오디오 DSP에서 지원되는 오디오 스트리밍 기능에 대한 지원을 나타내도록 이 속성을 설정합니다. 속성 값은 DDI AcxObjectBagAddBlob 을 사용하여 설정되며 값 형식은 PACS 사양에 정의된 PAC 레코드와 동일합니다.

Windows Bluetooth LE 오디오 프로필은 사용 가능한 코덱 구성 및 스트림 컴퍼지션을 결정하기 위해 속성을 읽습니다.

분야 옥텟
기능 수 0
코덱 ID[i] 1-6
코덱 특정 기능 길이[i] 7
코덱 특정 기능 8... n
메타데이터 길이(m) n + 1
메타데이터 n+2... m

필드 값은 PACS 사양의 테이블 3.2 및 3.4에 정의됩니다.

Bluetooth_DatapathID

오디오 드라이버는 명령 HCI_LE_Setup_ISO_Data_Path 및 HCI_Configure_Data_Path 매개 변수로 사용되는 데이터 경로 ID를 나타내도록 이 속성을 설정합니다. 속성 값은 AcxObjectBagAddUI8 DDI를 사용하여 설정됩니다.

Bluetooth LE Audio 프로필에서 이 속성을 읽고 사용하는 것은 HCI_Configure_Data_Path 및 HCI_LE_Setup_ISO_Data_Path 명령의 매개 변수입니다. 이 ID는 객체 모음과 연결된 ACXSTREAM에 대해 생성된 모든 동기 스트림에 적용됩니다. 각 스트림 연결에 대해 다른 데이터 경로 ID를 할당하려면 오디오 드라이버에서 KSPROPERTY_BtLeAudio_DATAPATH_ID 사용합니다.

분야 옥텟
데이터 경로 ID 0

오디오 드라이버가 이 속성을 설정하지 않으면 OS는 HCI 명령에 대한 매개 변수로 값 1을 사용합니다.

Bluetooth_DatapathConfiguration

오디오 드라이버는 HCI_Configure_Data_Path 명령을 통해 Bluetooth 컨트롤러에 공급업체별 구성을 제공하도록 이 속성을 설정합니다. Bluetooth 컨트롤러가 HCI 명령에 허용하는 가장 큰 페이로드인 255바이트보다 크지 않아야 합니다. 속성 값은 AcxObjectBagAddBlob DDI를 사용하여 설정됩니다. 이 구성은 오디오 드라이버에서 설정한 모든 데이터 경로 ID에 적용됩니다. 각 데이터 경로 ID에 대해 다른 데이터 경로 구성을 할당하려면 오디오 드라이버에서 KSPROPERTY_BtLeAudio_DATAPATH_CONFIG 사용합니다.

Bluetooth_RequiresHciTransportInD0ForStreaming

오디오 드라이버는 오디오 스트림이 활성화된 동안 Bluetooth 컨트롤러가 저전력 상태로 전환되지 않음을 나타내도록 이 속성을 설정합니다. 속성 값은 AcxObjectBagAddUI8 DDI를 사용하여 설정됩니다.

분야 옥텟
ActiveTransportRequired(1로 설정해야 함) 0
블루투스LE오디오_코덱구성

이 속성은 코덱 구성이 오디오 디바이스로 구성된 후 DDI AcxObjectBagAddBlob 을 사용하여 Bluetooth LE Audio 프로필에 의해 설정되어야 합니다. 값의 구조는 다음과 같습니다.

분야 옥텟
설정 수 0
스트림 연결 핸들[i] 1-2
코딩 형식[i] 3
회사 ID[i] 4-5
공급업체별 코덱 ID[i] 6-7
코덱 특정 구성 길이[i] 8
코덱 특정 구성[i] 9... n

필드 값은 Bluetooth 오디오 스트림 제어 서비스 사양의 표 4.3에서 파생됩니다.

공급업체별 오디오 드라이버 스택은 LC3 코덱이 ACX 스트리밍 드라이버 또는 오디오 DSP에 있는 경우 이 속성을 읽어야 합니다.

BluetoothLEAudio_StreamConnectionHandles

이 속성은 Bluetooth LE 오디오 프로필에 의해 설정되어 BIG 또는 CIG에 대해 생성된 BIS 또는 CIS 핸들 목록의 오디오 드라이버에 알려야 합니다. 핸들의 순서는 Bluetooth 컨트롤러에서 HCI 명령 LE_Set_CIG_Parameters 또는 HCI 이벤트 LE_Create_BIG_Complete 반환된 순서와 일치합니다. 값의 구조는 다음과 같습니다.

분야 Size 옥텟
연결 핸들 개수 1 0
연결 핸들[i] 2 1-n
Bluetooth LE Audio KS 속성

KS 속성을 사용하면 스트림을 만든 후 IHV ACX 오디오 드라이버가 오디오 스트림 설정을 설정하거나 업데이트할 수 있습니다. 이 시나리오는 오디오 드라이버가 스트림 만들기 절차에서 Bluetooth 프로필 회로에서 설정한 속성에 따라 구성 설정을 지정하는 데 유용합니다.

정의

#define STATIC_KSPROPSETID_BtLeAudio\
    0x1159b79, 0xea6, 0x4923, 0x80, 0xf5, 0x32, 0x58, 0xd1, 0xfd, 0x91, 0x56
DEFINE_GUIDSTRUCT("01159B79-0EA6-4923-80F5-3258D1FD9156", KSPROPSETID_BtLeAudio);
#define KSPROPSETID_BtLeAudio DEFINE_GUIDNAMED(KSPROPSETID_BtLeAudio)

typedef enum {
    KSPROPERTY_BtLeAudio_DATAPATH_ID,
    KSPROPERTY_BtLeAudio_DATAPATH_CONFIG,
} ksproperty_btleaudio;
KSPROPERTY_BtLeAudio_DATAPATH_ID

이 KSProperty를 사용하면 IHV ACX 오디오 드라이버가 스트림 만들기 콜백이 호출된 후 Bluetooth_DatapathID 설정된 값을 설정하거나 업데이트할 수 있습니다. 또한 이 속성을 사용하면 IHV 오디오 드라이버가 BluetoothLEAudio_CodecConfiguration 각 코덱 구성 항목에 대해 다른 데이터 경로 ID를 할당할 수 있습니다. 이 속성의 값은 모든 코덱 구성에 사용되는 데이터 경로 ID를 나타내기 위해 단일 바이트 값으로 설정하거나 n이 BluetoothLEAudio_CodecConfiguration 속성에 설정된 Configuration Count 값과 같은 n바이트여야 합니다. 값에 여러 데이터 경로 ID가 포함된 경우 속성 BluetoothLEAudio_CodecConfiguration 순서대로 코덱 구성에 ID 순서를 사용해야 합니다.

KSPROPERTY_BtLeAudio_DATAPATH_CONFIG

이 KSProperty를 사용하면 IHV ACX 오디오 드라이버가 Bluetooth_DatapathConfiguration 정의된 대로 데이터 경로 구성을 설정하거나 업데이트할 수 있습니다. KSProperty는 오디오 드라이버가 시작 오디오 스트림 콜백을 호출하기 전에 Bluetooth 프로필로 전송해야 합니다. 이 속성은 단일 방향으로 모든 데이터 경로에 대 한 단일 구성을 설정 하거나 BluetoothLEAudio_CodecConfiguration 설정 된 각 코덱 구성 항목에 대 한 특정 데이터 경로 구성을 설정 하는 데 사용할 수 있습니다. 값에 여러 데이터 경로 구성이 포함된 경우 속성 BluetoothLEAudio_CodecConfiguration 순서대로 코덱 구성 항목에 구성 순서를 사용해야 합니다. 코덱 구성 수는 KSPROPERTY_BtLeAudio_DATAPATH_ID 또는 Bluetooth_DatapathID 설정된 데이터 경로 ID 수와 같아야 합니다.

분야 Size 가치
설정 수 1 바이트 BluetoothLEAudio_CodecConfiguration 1 또는 코덱 구성 수 집합
구성 크기[i] 1 바이트 255를 초과하지 않음
Configuration[i] 구성 크기[i]  

인터페이스

오디오 엔드포인트 템플릿 바인딩 ID

오디오 드라이버의 ACX 회로 팩터리에서 쌍을 이루는 Bluetooth 디바이스에 대한 ACX 회로가 만들어지는 시기를 파악하는 데 사용됩니다.

다음 구성 요소 ID는 Bluetooth LE 오디오 회로를 만드는 데 사용됩니다.

// {5C52FDB5-722A-4AB7-A342-70163B7E9B5C}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_RENDER_COMPONENT_ID,
0x5c52fdb5, 0x722a, 0x4ab7, 0xa3, 0x42, 0x70, 0x16, 0x3b, 0x7e, 0x9b, 0x5c);

// {1DFF2EE3-AE89-441C-BDE3-24F885C55DF8}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_CAPTURE_COMPONENT_ID,
0x1dff2ee3, 0xae89, 0x441c, 0xbd, 0xe3, 0x24, 0xf8, 0x85, 0xc5, 0x5d, 0xf8);

Bluetooth LE 오디오 지원 인터페이스

오디오 드라이버 스택에서 Bluetooth LE 오디오 스트리밍에 사용할 수 있음을 나타내는 데 사용됩니다. Windows Bluetooth 오디오 서비스는 이 인터페이스를 감시하고, Bluetooth LE 오디오 지원을 활성화하기 전에 이것이 게시될 때까지 기다립니다.

다음 인터페이스 ID는 Bluetooth LE Audio 지원 인터페이스를 게시하는 데 사용됩니다.

// {BA02FA1B-0FD0-4A0F-A748-4FAE2E2D2F67}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
0xba02fa1b, 0x0fd0, 0x4a0f, 0xa7, 0x48, 0x4f, 0xae, 0x2e, 0x2d, 0x2f, 0x67);

일반 시퀀스

유니캐스트 및 브로드캐스트 LE 오디오 시나리오 모두에 대해 다음 시퀀스가 실행됩니다.

오디오 드라이버 초기화

IHV ACX 스트리밍 드라이버가 Bluetooth LE Audio 스트리밍을 지원하는지 확인하고 로드하면 ACXFACTORYCIRCUIT 개체를 만들고 오디오 엔드포인트 템플릿 바인딩 ID에 정의된 ID를 사용하여 ACX로 Bluetooth 템플릿 바인딩을 등록하여 기술에 대한 지원을 표시해야 합니다.

Bluetooth LE Audio 드라이버 초기화 시퀀스를 보여 주는 순서도입니다.

유니캐스트 오디오 시퀀스

엔드포인트 만들기
  1. LE 오디오 디바이스가 시스템과 페어링되면 Bluetooth LE 오디오 프로필은 다음과 같습니다.

    1. 원격 디바이스의 게시된 오디오 기능을 읽습니다.
    2. HCI_Read_Local_Support_Codecs[v2] 및 HCI_Read_Local_Supported_Codec_Capabilities 명령을 전송하여 컨트롤러가 지원하는 기능을 검색합니다.
    3. Bluetooth 컨트롤러 및 원격 오디오 디바이스에서 지원하는 코덱 기능을 기반으로 지원되는 형식으로 ACXCIRCUIT 을 만듭니다. 코덱 지원이 오디오 DSP 또는 오디오 드라이버에 있기 때문에 컨트롤러가 코덱을 지원하지 않는 경우 지원되는 형식은 원격 오디오 디바이스에서 지원하는 형식으로 설정됩니다.
  2. ACXCIRCUIT을 만든 후 ACX는 IHV ACX 스트리밍 드라이버의 ACX 회로 팩터리에 스트림 처리를 위한 ACXCIRCUIT을 만들도록 요청합니다.

  3. 회로 만들기 요청이 수신되면 IHV ACX 스트리밍 드라이버는 다음과 같습니다.

    1. ACXCIRCUIT, ACXPIN, ACXOBJECTBAGACXSTREAMBRIDGE 개체를 만듭니다.
    2. LC3 또는 공급업체별 코덱이 오디오 드라이버 또는 DSP에서 호스팅되는 경우 IHV ACX 스트리밍 드라이버는 ACXOBJECTBAGBluetoothLEAudio_CodecCapabilities 속성을 설정합니다.
    3. IHV ACX 스트리밍 드라이버는 현재 알려진 경우 ACXOBJECTBAG에서 Bluetooth_DatapathID 또는 Bluetooth_DatapathConfiguration 설정할 수 있습니다.
  4. 두 회로를 모두 만든 후 ACX는 IHV ACX 드라이버의 브리지 핀에서 EvtAcxPinConnected 콜백을 호출합니다.

  5. EvtAcxPinConnected 콜백이 호출되면 IHV ACX 스트리밍 드라이버는 다음과 같습니다.

    1. AcxTarget...을 사용하여 프로필 회로의 브리지 핀을 검색합니다. 프로필 회로에서 지원하는 형식을 검색하는 API입니다.
    2. 프로필 회로에서 설정한 ACXDATAFORMAT목록을 반복합니다. Bluetooth 오디오 코덱이 오디오 드라이버 또는 오디오 DSP에서 호스트되는 경우 IHV 오디오 드라이버는 코덱 및 프로필 회로에서 지원하는 형식으로 ACXDATAFORMAT를 업데이트합니다. 그렇지 않으면 모든 형식이 IHV ACX 스트리밍 드라이버의 호스트 핀에 복사됩니다.
    3. 스트리밍을 오프로드하기 위해 오디오 엔진을 만든 경우 브리지 핀에서 업데이트된 형식 목록을 설정합니다.
  6. 형식이 업데이트되면 ACX는 두 인터페이스를 모두 사용하도록 설정하고 오디오 엔드포인트를 만듭니다.

    Bluetooth LE Audio 엔드포인트 만들기 프로세스를 보여 주는 순서도입니다.

스트림 만들기
  1. 애플리케이션이 오디오 스트림을 만들도록 요청하면 ACX는 IHV ACX 스트리밍 드라이버부터 시작하여 각 회로에 대해 등록된 EvtCircuitCreateStream 콜백을 호출합니다.

  2. EvtCircuitCreateStream 콜백이 호출되면 IHV ACX 스트리밍 드라이버는 다음과 같습니다.

    1. ACXSTREAMBRIDGE에 연결된 ACXOBJECTBAG에서 Bluetooth_DatapathId 및 Bluetooth_DataPathConfiguration 속성을 설정하거나 업데이트합니다.
    2. 스트림 상태 전환 및 RT 스트림 처리를 위해 콜백이 설정된 ACXSTREAM 을 만듭니다.
    3. 오디오 파이프라인이 오프로드 스트리밍을 지원하는 경우 스트림에 오디오 엔진 요소를 만듭니다.
    4. 해당 스트림 브리지에 ACXSTREAM 을 추가합니다. Bluetooth LE Audio 프로필의 EvtCircuitCreateStream 콜백을 호출합니다.
  3. EvtAcxCircuitCreateStream 콜백이 호출되면 Bluetooth LE 오디오 프로필은 다음과 같습니다.

    1. 향후 스트림 전환 콜백을 위해 IHV ACX 스트리밍 드라이버가 설정한 ACXOBJECTBAG 에서 속성을 로컬로 저장합니다.
    2. BAP 사양에 정의된 대로 코덱 구성 작업을 수행합니다. 작업에 대한 매개 변수는 EvtAcxCircuitCreateStream 콜백에 지정된 ACXDATAFORMATACXOBJECTBAG의 다른 스트림 매개 변수 또는 Bluetooth 컨트롤러에서 지원하는 코덱 기능에서 파생됩니다.
    3. HCI LE Set CIG 매개 변수 명령을 전송하여 스트림 리소스를 할당합니다.
    4. Bluetooth 컨트롤러에서 반환된 CIS 연결 핸들 목록을 사용하여 BluetoothLEAudio_StreamConnectionHandles 속성을 설정합니다.
    5. ACXOBJECTBAGBluetoothLEAudio_CodecConfiguration 속성을 원격 오디오 디바이스를 구성하는 데 사용되는 값으로 설정합니다.
  4. IHV ACX 스트리밍 드라이버가 프로필에서 설정한 개체 모음 값에 따라 데이터 경로 ID 또는 데이터 경로 구성을 업데이트해야 하는 경우 KSPROPERTY 집합 작업을 호출하여 프로필 회로에 저장된 값을 업데이트할 수 있습니다.

    1. 스트림 상태 전환에 대해 콜백이 설정된 ACXSTREAM 을 만듭니다.

    Bluetooth LE 오디오 스트림 생성 프로세스를 보여 주는 순서도입니다.

스트림 상태 전환

ACX는 오디오 흐름에 따라 스트림 상태 전환의 회로 순서를 결정하고 상태가 더 활성 또는 덜 활성 상태로 전환되고 있는지 여부를 결정합니다.

  • 덜 활성화된 상태에서 더 활성 상태로 가는 렌더링 스트림의 경우 프로필 회로는 먼저 이벤트를 수신한 다음 스트리밍 회로를 수신합니다.
  • 더 활성 상태에서 덜 활성 상태로 가는 렌더링 스트림의 경우 스트리밍 회로는 먼저 이벤트를 수신한 다음 프로필 회로를 수신합니다. 
  • 덜 활성 상태에서 더 활성 상태로 가는 캡처 스트림의 경우 스트리밍 회로는 먼저 이벤트를 수신한 다음 프로필 회로를 수신합니다. 
  • 더 활성 상태에서 덜 활성 상태로 전환되는 캡처 스트림의 경우, 이벤트는 먼저 프로필 회로가 수신하고, 그 후에 스트리밍 회로가 수신합니다.

스트림 준비

EvtAcxStreamPrepareHardware 콜백이 호출되면 Bluetooth LE Audio 프로필은 ASCS 구성 QoS 작업을 전송하여 필요한 경우 원격 디바이스와 설정을 동기화합니다. 양방향 스트림의 다른 방향에 대해 콜백이 호출되었을 때 ASCS 구성 QoS 작업이 이미 완료되었을 수 있습니다.

프로필 회로에 대한 Bluetooth LE 오디오 스트림 준비를 보여 주는 순서도입니다.

EvtAcxStreamPrepareHardware 콜백이 호출되면 IHV ACX 스트리밍 드라이버는 필요한 스트리밍 리소스를 할당하고 오디오 파이프라인을 획득된 상태로 초기화합니다.

스트리밍 회로에 대한 Bluetooth LE 오디오 스트림 준비를 보여 주는 순서도입니다.

스트림 시작

EvtAcxStreamRun 콜백이 호출되면 Bluetooth LE 오디오 프로필은 다음과 같습니다.

  1. 변경된 경우 HCI_Configure_Data_Path 명령을 사용하여 아래 설명된 대로 ACX 스트리밍 드라이버의 구성 인수를 적용합니다. Windows Bluetooth Core Stack은 각 Data_Path_Direction 및 Data_Path_ID 쌍에 대한 Vendor_Specific_Config 버퍼를 캐시합니다. HCI_Configure_Data_Path 명령은 Vendor_Specific_Config Data_Path_Direction 및 Data_Path_ID 쌍에 대해 변경되는 경우에만 전송됩니다.
    1. Data_Path_Direction EvtAcxStreamRun 콜백을 실행하는 스트리밍 회로 콜백의 AudioDirection입니다.
    2. Data_Path_ID 다음 원본 중 하나에서 가장 최근에 할당된 값으로 채워집니다.
      1. ACXSTREAMBRIDGE에 연결된 ACXOBJECTBAG의 Bluetooth_DatapathID EvtCircuitCreateStream 콜백 중에 Windows Bluetooth LE 오디오 프로필에 전달됩니다.
      2. KSPROPERTY_BtLeAudio_DATAPATH_ID 데이터입니다.
    3. Vendor_Specific_Config 데이터는 다음 원본 중 하나에서 가장 최근에 할당된 값으로 채워집니다.
      1. ACXSTREAMBRIDGE에 연결된 ACXOBJECTBAG의 Bluetooth_DatapathConfiguration EvtCircuitCreateStream 콜백 중에 Windows Bluetooth LE 오디오 프로필 회로에 전달됩니다.
      2. KSPROPERTY_BtLeAudio_DATAPATH_CONFIG 데이터입니다.
  2. ASCS 사용 작업을 원격 디바이스로 보냅니다.
  3. HCI_LE_Create_CIS 명령을 사용하여 아직 만들어지지 않은 경우 CIS를 만듭니다.
  4. 데이터 경로가 아직 구성되지 않은 경우 Bluetooth LE 오디오 프로필은 다음과 같습니다.
    1. HCI_LE_Setup_ISO_Data_Path 명령을 사용하여 ISO 데이터 경로 설정
      1. IHV ACX 스트리밍 드라이버가 속성 BluetoothLEAudio_CodecCapabilities 설정하는 경우 HCI_LE_Setup_ISO_Data_Path Codec_ID 필드의 값은 Bluetooth 할당 번호에 정의된 대로 투명(0x3)으로 설정됩니다. 그렇지 않으면 값은 스트림 생성 프로시저의 구성 코덱 작업에 사용되는 코덱 ID와 같아야 합니다.
  5. 오디오 스트림이 캡처 스트림인 경우 Bluetooth LE 오디오 프로필은 BAP 수신기 시작 준비 작업을 수행합니다.

프로필 회로에 대한 Bluetooth LE 오디오 스트림 시작 프로세스를 보여 주는 순서도입니다.

EvtAcxStreamRun 콜백이 호출되면 IHV ACX 스트리밍 드라이버는 Windows 오디오 시스템(렌더링) 또는 Bluetooth 컨트롤러(캡처)에서 들어오는 오디오 데이터를 처리하기 시작합니다.

스트리밍 회로에 대한 Bluetooth LE 오디오 스트림 시작 프로세스를 보여 주는 순서도입니다.

스트림 일시 중지

EvtAcxStreamPause 콜백이 호출되면 Bluetooth LE 오디오 프로필은 다음과 같습니다.

  1. BAP 유니캐스트 스트림 사용 안 함 프로시저를 수행합니다.
  2. HCI_LE_Remove_ISO_Data_Path 명령을 사용하여 ISO 데이터 경로를 제거합니다.
  3. 오디오 스트림이 유니캐스트 캡처 스트림인 경우 ASCS 수신기 중지 준비 프로시저를 수행합니다.
  4. 해당 CIS에 사용 중인 다른 스트림이 없는 경우 CIS 연결을 끊습니다.

프로필 회로에 대한 Bluetooth LE 오디오 스트림 일시 중지 프로세스를 보여 주는 순서도입니다.

EvtAcxStreamPause 콜백이 호출되면 IHV ACX 스트리밍 드라이버가 오디오 처리 파이프라인을 일시 중지합니다.

스트리밍 회로에 대한 Bluetooth LE 오디오 스트림 일시 중지 프로세스를 보여 주는 순서도입니다.

릴리스 스트림

EvtAcxStreamReleaseHardware 콜백이 호출되면 Bluetooth LE 오디오 프로필은 다음과 같습니다.

  1. 원격 Bluetooth LE 오디오 디바이스에 ASCS 릴리스 작업을 보냅니다.
  2. 모든 CIS의 연결이 끊어지면 CIG를 제거합니다.

프로필 회로에 대한 Bluetooth LE 오디오 스트림 릴리스 프로세스를 보여 주는 순서도입니다.

EvtAcxStreamReleaseHardware 콜백이 호출되면 IHV ACX 스트리밍 드라이버는 오디오 파이프라인 리소스를 해제합니다.

스트리밍 회로에 대한 Bluetooth LE 오디오 스트림 릴리스 프로세스를 보여 주는 순서도입니다.

엔드포인트 연결 끊기

원격 유니캐스트 디바이스에 PC에 대한 LE-ACL 연결이 없거나 PACS에서 사용할 수 있는 오디오 컨텍스트를 통해 스트리밍이 불가능하다고 보고하는 경우, Windows Bluetooth LE 오디오 프로필은 엔드포인트의 연결 상태를 업데이트합니다. 엔드포인트의 연결이 끊어지면 Windows 오디오 서비스가 모든 활성 스트림을 엔드포인트로 무효화합니다. 이로 인해 스트림 일시 중지 및 릴리스 시퀀스가 발생합니다.

볼륨 및 음소거

IHV ACX 스트리밍 회로는 스트리밍 드라이버에 오디오 엔진이 필요한 경우에만 볼륨 및 음소거 요소를 포함해야 합니다. 오디오 엔진을 사용하는 경우 다음과 같이 구성 플래그를 설정해야 합니다.

ACX_AUDIOENGINE_CONFIG audioEngineCfg;
ACX_AUDIOENGINE_CONFIG_INIT(&audioEngineCfg);
…

audioEngineCfg.Flags |= AcxAudioEngineConfigVolumeSecondary; // Use this control only if endpoint doesn't have one.

audioEngineCfg.MuteElement = muteElement;

audioEngineCfg.Flags |= AcxAudioEngineConfigMuteSecondary; // Use this control only if endpoint doesn't have one.

audioEngineCfg.PeakMeterElement = peakmeterElement;

audioEngineCfg.Flags |= AcxAudioEngineConfigPeakMeterSecondary; // Use this control only if endpoint doesn't have one.

Bluetooth LE Audio 엔드포인트가 유니캐스트 오디오 엔드포인트에 대한 볼륨 및 음소거 변경을 위해 Bluetooth SIG에서 정의한 볼륨 및 마이크 제어 프로필을 사용할 수 있도록 하기 위해서는 이 작업이 필요합니다.

원격 Bluetooth LE 오디오 디바이스가 볼륨 또는 마이크 제어 서비스를 지원하지 않거나 브로드캐스트 오디오에 대한 엔드포인트를 만든 경우 오디오 엔진의 볼륨 및 음소거 요소는 오디오 시스템의 변경 요청을 처리하는 대체 역할을 합니다. Windows 오디오 시스템은 볼륨 및 음소거 변경 내용을 처리합니다. 오디오 엔진이 없고 원격 디바이스가 볼륨을 지원하지 않거나 마이크 서비스 또는 오디오 엔드포인트가 브로드캐스트 오디오용인 경우

엔드포인트 제거

프로필 회로 또는 스트리밍 회로가 제거되면 Bluetooth LE 오디오 엔드포인트가 시스템에서 제거됩니다. 원격 유니캐스트 디바이스의 페어링이 Windows에서 제거되거나 Bluetooth 라디오를 사용하지 않도록 설정하면 프로필 회로를 제거할 수 있습니다.

  1. Windows Bluetooth LE 오디오 프로필이 회로를 제거하면 ACX는 엔드포인트 인터페이스를 사용하지 않도록 설정하여 엔드포인트를 제거해야 함을 Windows 오디오 서비스에 알릴 수 있습니다.
  2. 인터페이스를 사용하지 않도록 설정하면 Windows 오디오 서비스가 활성 스트림을 Bluetooth LE 오디오 엔드포인트로 무효화합니다. 이 작업을 수행하면 스트림 일시 중지 및 릴리스 콜백이 스트리밍 회로에서 호출됩니다.
  3. 엔드포인트 제거를 완료하기 위해 ACX는 IHV ACX 스트리밍 드라이버의 회로를 무효화하여 WDF가 회로의 정리 콜백을 호출합니다.
  4. 정리 콜백이 호출되면 IHV ACX 스트리밍 드라이버가 회로를 해제합니다.

Bluetooth LE 오디오 엔드포인트 제거 프로세스를 보여 주는 순서도입니다.

Bluetooth LE 및 클래식 오디오 공존

Windows는 두 기술을 모두 지원하는 페어링된 Bluetooth 오디오 디바이스에 대해 클래식 오디오 또는 LE 오디오만 활성화되도록 해야 합니다. LE 오디오가 활성화된 경우 원격 디바이스에 대한 A2DP 및 HFP용 사이드밴드 DDI가 비활성화되고 LE 오디오 엔드포인트에 대한 프로필 회로가 만들어집니다. 클래식 오디오가 활성화된 경우 원격 디바이스에 대한 A2DP 및 HFP용 사이드밴드 DDI가 활성화되고 LE 오디오 엔드포인트에 대한 프로필 회로가 만들어지지 않습니다.

전원 관리

Bluetooth LE Audio에는 WDF에서 이미 정의한 것 이외의 전원 관리 요구 사항 또는 흐름이 없습니다.

음성 시나리오를 위한 슈퍼 와이드밴드 스테레오

오늘날의 Bluetooth 오디오 환경은 편리하지만 특히 유선 오디오 환경에 비해 제한 사항이 있습니다. 사용자 관련 결과와 함께 한 가지 주요 제한 사항은 마이크가 활성 상태일 때마다 모노 오디오를 삭제하는 것입니다. 이렇게 하면 Teams의 공간 오디오 및 기타 VoIP 앱의 작동이 차단되고 음성 채팅과 관련된 게임 환경이 크게 저하됩니다.

Bluetooth LE Audio는 마이크를 사용하는 동안 스테레오 재생에 대한 지원을 추가하여 오디오 충실도 향상 및 대기 시간 단축으로 격차를 좁힙니다.

렌더링/캡처 형식 쌍

IHV 솔루션은 스테레오 렌더링 형식과 양방향 스트리밍에 동시에 사용할 수 있는 모노 캡처 형식으로 구성된 렌더링/캡처 형식 쌍 목록을 제공하여 모노 캡처로 스테레오 렌더링에 대한 지원을 보급합니다. 스테레오 렌더링(또는 모노 캡처) 형식은 Sampling_Frequency 쌍(예: 16/24/32/48kHz) 및 특정 오디오 코덱과 연결된 Audio_Channel_Count(예: 1/2 ch)로 정의되며 LC3로 제한되지 않습니다.

예를 들어 IHV 솔루션이 16kHz 모노 캡처를 사용하는 16kHz 스테레오 렌더링과 24kHz 또는 32kHz 모노 캡처를 사용하여 48kHz 스테레오 렌더링을 모두 지원한다고 가정합니다. 해당 렌더링/캡처 형식 쌍은 다음과 같습니다.

입력 렌더링 형식 캡처 형식
1 Render(16kHz, 2 ch) Capture(16kHz, 1 ch)
2 Render(48kHz, 2 ch) 캡처(24kHz, 1 ch)
3 Render(48kHz, 2 ch) 캡처(32kHz, 1 ch)

표 3: 샘플 렌더링/캡처 형식 쌍

조정된 집합 멤버는 언제든지 조인하거나 연결할 수 있으므로 IHV 솔루션은 형식 쌍의 각 항목에 대해 동일한 샘플링 빈도에서 모노 캡처를 사용하여 모노 렌더링을 지원해야 합니다. 즉, 표 3의 예제를 고려할 때 명시적으로 선언되지 않은 경우에도 아래의 모든 형식 쌍도 암시적으로 지원되어야 합니다.

입력 렌더링 형식 캡처 형식
1 Render(16kHz, 1 ch) Capture(16kHz, 1 ch)
2 Render(48kHz, 1 ch) 캡처(24kHz, 1 ch)
3 Render(48kHz, 1 ch) 캡처(32kHz, 1 ch)

표 4: 표 3에 대한 암시적 렌더링/캡처 형식 쌍

표 3과 표 4의 주요 차이점은 후자의 각 렌더링 형식에 대한 Audio_Channel_Count 1("모노 렌더링"의 경우)으로 설정된다는 것입니다. 다른 모든 항목은 동일하게 유지됩니다.

필수 렌더링/캡처 형식 쌍

표 5는 모든 IHV 솔루션이 지원해야 하는 오디오 형식 목록을 정의합니다.

입력 (Render_format, Capture_format)
1 { Render(48kHz, 2 ch), Capture(32kHz,1 ch) }
2 { Render(32kHz, 2 ch), Capture(32kHz,1 ch) }
3 { Render(24kHz, 2 ch), Capture(24kHz,1 ch) }
4 { Render(16kHz, 2 ch), Capture(16kHz,1 ch) }

표 5 필수 렌더링/캡처 형식 쌍

기능 광고

Bluetooth 컨트롤러가 관련된 오디오 코덱(기본값: LC3)을 지원하는지 여부에 따라 IHV 솔루션은 지원하는 렌더링/캡처 형식 쌍 목록을 다양한 방법으로 보급합니다. 특히:

  • 코덱이 Bluetooth 컨트롤러에 있는 경우 컨트롤러와 IHV ACX 스트리밍 드라이버 모두 형식 쌍 목록을 독립적으로 보급해야 합니다. 두 목록이 서로 일치하지 않는 경우 Windows는 교차하고 공통 부분을 유지해야 합니다.

  • 코덱이 Bluetooth 컨트롤러에 없는 경우(예: 오디오 DSP에 있음) 형식 쌍 목록을 보급하려면 IHV ACX 스트리밍 드라이버만 필요합니다. Bluetooth 컨트롤러

HCI_Read_Local_Supported_Codec_Capabilities 대한 응답에서 Codec_Capability[i]은 메타데이터를 지원하지 않으므로 Bluetooth 컨트롤러는 Windows에서 기존 HCI 인터페이스를 통해 쉽게 전달할 수 없는 렌더링/캡처 형식 쌍 목록과 같은 더 많은 코덱 기능을 쿼리할 수 있도록 Microsoft 관련 코덱 ID 제품군(표 7 참조)을 지원해야 합니다.

매개 변수 크기(8진수) Description
Codec_ID 5 Octet 0: 0xFF(공급업체별)

8진수 1~2: 0x0006(Microsoft)

8진수 3~4진수: 공급업체 정의 코덱 ID

8진수 4의 가장 중요한 비트가 0으로 설정된 경우 8진수 3은 0xFF 제외하고 SIG 승인 코딩 형식(2024년 5월 31일 현재 0x00부터 0x07까지)을 포함합니다.

가장 중요한 8진수 4 비트가 1로 설정된 경우 octet 3은 아직 정의되지 않았으며 나중에 사용하기 위해 Windows에서 예약된 코딩 형식을 포함합니다.

표 7 Microsoft 관련 코덱 ID

이러한 Microsoft 관련 코덱 ID의 범위는 다음으로 제한됩니다.

  • HCI_Read_Local_Supported_Codecs [v2]
  • HCI_Read_Local_Supported_Codec_Capabilities

계약에 따라 Windows는 다른 유형의 HCI 명령에 대해 이러한 Microsoft 관련 코덱 ID를 사용하지 않습니다.

HCI_Read_Local_Supported_Codecs [v2]

컨트롤러는 Vendor_Specific_Codec_ID 및 Vendor_Specific_Codec_Transport 통해 Microsoft 관련 코덱 ID에 대한 지원을 보급해야 합니다.

분야 Description
Vendor_Specific_Codec_ID[k] 8진수 0-1: 회사 ID(0x0006)
자세한 내용은 표 7의 Octet 1~2 를 참조하세요.

8진수 2~3진수: 공급업체에서 정의한 코덱 ID(예: LC3의 경우 0x0006)
자세한 내용은 표 7의 Octet 3~4 를 참조하세요.
Vendor_Specific_Codec_Transport[k] LE_CIS(0x02)가 지원되어야 합니다.

표 8 HCI_Read_Local_Supported_Codec [v2] 응답 값

HCI_Read_Local_Supported_Codec_Capabilities

렌더링/캡처 형식 쌍 목록을 포함하여 모든 Windows 관련 코덱 기능을 쿼리하기 위해 Windows는 다음 인수를 사용하여 HCI_Read_Local_Supported_Codec_Capabilities 호출합니다.

매개 변수 크기(8진수) Description
Codec_ID(Microsoft 관련 코덱 ID) 5 Octet 0: 0xFF(공급업체별)

8진수 1~2: 회사 ID(0x0006)
자세한 내용은 표 8의 Octet 1~2 를 참조하세요.

8진수 3~4진수: 공급업체에서 정의한 코덱 ID(예: LC3의 경우 0x0006)
자세한 내용은 표 8의 Octet 3~4 를 참조하세요.
Logical_Transport_Type 1 0x2(LE CIS)
방향 1 0x00(입력, 예: 호스트-컨트롤러)

표 9 HCI_Read_Local_Supported_Codec_Capabilities 명령 인수

이러한 명령을 받으면 컨트롤러는 공급업체에서 정의한 코덱 ID로 지정된 코덱에 대한 모든 Windows 관련 기능을 반환해야 합니다. 예를 들어 공급업체 정의 코덱 ID가 0x0006 설정된 경우 컨트롤러는 Windows에 필요한 모든 LC3 관련 기능을 반환해야 합니다.

명령에 대한 응답은 Bluetooth Core 사양에 정의된 것과 동일한 최상위 구조를 유지합니다.

매개 변수 크기(8진수) Description
상태 1 0x00(성공); 0xFF 0x01(오류 코드)
Num_Codec_Capabilities 1 반환된 총 기능 수입니다.
Codec_Capability_Length[i] 1 Codec_Capability[i] 필드의 길이입니다.
Codec_Capability [i] 상황에 따라 다름 Codec_Capability_Length[i] 코덱별 기능 데이터의 옥텟입니다.

표 10 HCI_Read_Local_Supported_Codec_Capabilities 응답 구조

그러나 Codec_Capability[i] 의 페이로드는 SIG에서 정의한 페이로드와 다르며 Windows에 맞게 조정됩니다.

현재 Windows에서 정의한 유일한 코덱 기능은 Bidirectional_Multichannel_Streaming 아래에 설명되어 있습니다.

Bidirectional_Multichannel_Streaming

Bidirectional_Multichannel_Streaming 보급함으로써 컨트롤러는 m ≥1, n ≥ 1 및 m n 2인 n 채널 캡처를 사용하여 동시 m + > 채널 렌더링을 지원한다는 것을 확인합니다. (모노 캡처를 사용한 스테레오 렌더링은 m = 2 및 n = 1이 있는 Bidirectional_Multichannel_Streaming 유효합니다.)

이 표에서는 Bidirectional_Multichannel_Streaming 형식에 대해 설명합니다.

매개 변수 크기(8진수) 비트 Description
형식 1 0x00 (Bidirectional_Multichannel_Streaming)
Channel_Counts 1 비트 0~4: (m – 1), 여기서 m은 렌더링 채널의 수입니다. (모노 캡처를 사용한 스테레오 렌더링의 경우 값이 2 - 1 = 1이어야 합니다.)
Channel_Counts 1 비트 5~7: (n – 1), 여기서 n은 캡처 채널 수입니다. (모노 캡처가 있는 스테레오 렌더링의 경우 값이 1 - 1 = 0이어야 합니다.)
Render_Sampling_Frequencies 1 비트 0: 16kHz
비트 1: 24kHz
비트 2: 32kHz
비트 3: 48kHz
비트 4: RFU
비트 5: RFU
비트 6: RFU
비트 7: RFU
이 목록의 모든 샘플링 빈도는 Channel_Count 비트 0-4로 지정된 채널 수와 동일합니다.

모든 RFU 비트는 예약되어 있으며 0으로 설정해야 합니다.
Capture_Sampling_Frequencies_-List[i], 여기서 0 ≤ i ≤ 7 i + 1 비트 0: 16kHz
비트 1: 24kHz
비트 2: 32kHz
비트 3: 48kHz
비트 4: RFU
비트 5: RFU
비트 6: RFU
비트 7: RFU
이 목록의 모든 샘플링 빈도는 Channel_Count 비트 5-7로 지정된 채널 개수와 동일합니다.

각 Capture_Sampling_Frequencies_List 인스턴스의 크기는 18진수이며 최대 8개의 인스턴스가 있을 수 있습니다(Render_Sampling_Frequencies 모든 비트가 1로 설정된 경우).

모든 RFU 비트는 예약되어 있으며 0으로 설정해야 합니다.

표 11 Bidirectional_Multichannel_Streaming 형식(최대 길이: 11바이트)

Channel_Counts

렌더링/캡처에 대한 비트 개수는 임의로 선택됩니다. 렌더링에 5비트가 할당되고(모든 SIG 정의 오디오 위치 포함), 캡처를 위해 3비트(HCI 페이로드 크기를 최소화하기 위해)가 할당됩니다.

예를 들어 테이블 3의 Channel_Counts 렌더링/캡처 채널 수(예: mn)가 각각 2와 1이므로 0b0000'0001입니다.

  Capture Render
비트 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 1

표 3의 표 12 Channel_Counts

기본적으로 Microsoft 특정 코덱 ID와 Channel_Counts 동일한 쌍의 모든 기능을 함께 그룹화하고 단일 Bidirectional_Multichannel_Streaming 레코드로 표현해야 합니다.

Render_Sampling_Frequencies

Render_Sampling_Frequencies 필드는 연결된 Bidirectional_Multichannel_Streaming 구조체의 컨텍스트에서 사용할 수 있는 모든 렌더링 빈도를 지정합니다.

예를 들어 테이블 3의 Render_Sampling_Frequencies 0b0000'1001입니다. 즉, 16kHz와 48kHz를 둘 다 두 채널 렌더링의 샘플링 빈도로 사용할 수 있습니다.

kHz RFU RFU RFU RFU 48 32 24 16
비트 7 6 5 4 3 2 1 0
0 0 0 0 1 0 0 1

표 3의 표 13 Render_Sampling_Frequencies

Capture_Sampling_Frequencies_List[i]

Render_Sampling_Frequencies 각 "1" 비트에 대해 가장 중요도가 가장 낮은 비트부터 가장 중요한 비트까지 컨트롤러는 해당 렌더링 비트가 나타내는 빈도와 호환되는 모든 캡처 빈도를 지정하는 고유한 비트 마스크(Capture_Sampling_Frequencies_List[i])를 제공해야 합니다. 컨트롤러는 Render_Sampling_Frequencies " 0" 비트에 대해 Capture_Sampling_Frequencies 비트 마스크를 제공하지 않습니다.

예를 들어 표 3의 캡처 비트 마스크는 다음과 같습니다.

// The order matters!
{
    // Capture_Sampling_Frequencies_List[0] for 16kHz dual-channel rendering.
    0b0000'0001, // 16 kHz single-channel capture

    // Do not create a dummy Capture_Sampling_Frequencies_List entry, for example, 0b0000'0000,
    // for 24kHz dual-channel rendering, which is not supported at all.

    // Do not create a dummy Capture_Sampling_Frequencies_List entry, for example, 0b0000'0000,
    // for 32kHz dual-channel rendering, which is not supported at all.

    // Capture_Sampling_Frequencies_List[1] for 48kHz dual-channel rendering.
    0b0000'0110 // Either 24 or 32 kHz single-channel capture
}

특히:

Render_-Sampling_-Frequencies 나는 Capture_-Sampling_-빈도[i] Description
0b0000'1001
   ⇤ order ↤
0 0b0000'0001 Render_Sampling_Frequencies 첫 번째 가장 중요한 "1" 비트(비트 0)는 16kHz에 해당합니다.

Capture_Sampling_Frequencies_List[0]의 비트 0을 사용하도록 설정하여 16kHz 캡처를 해당 렌더링 빈도와 페어링할 수 있음을 나타냅니다.
0b0000'1 001
   ⇤ order ↤
1 0b0000'0110 Render_Sampling_Frequencies 두 번째로 유의하지 않은 "1" 비트(비트 3)는 48kHz에 해당합니다.

Capture_Sampling_Frequencies_List[1]의 비트 1과 2를 사용하도록 설정하여 24kHz 및 32kHz 캡처를 해당 렌더링 빈도와 페어링할 수 있음을 나타냅니다.

표 14 Render_Sampling_Frequencies 대한 Capture_Sampling_Frequencies_List[i]를 빌드하는 예제

IHV ACX 스트리밍 드라이버

모노 캡처를 사용하여 스테레오 렌더링을 지원하기 위해 IHV ACX 스트리밍 드라이버는 디바이스 속성인 BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities를 3.11.2에 설명된 렌더링/캡처 형식 쌍을 GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE 디바이스 인터페이스 클래스의 인스턴스로 설정합니다.

디바이스 인터페이스 클래스 인스턴스를 만든 직후에 속성을 사용할 수 있어야 하며 속성 값은 디바이스 인터페이스 클래스 인스턴스의 수명 동안 일정하게 유지됩니다.

BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities의 속성 키는 다음과 같이 정의됩니다.

DEFINE_DEVPROPKEY(DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
    0xd27ba3a4, 0x1bfe, 0x4374, 0x88, 0x7d, 0xe8, 0xb3, 0xa6, 0xac, 0xe, 0xe9, 2); // DEVPROP_TYPE_BINARY (BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY[])

키와 연결된 속성 값 형식(DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities)은 다음과 같이 정의됩니다.

typedef struct _BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY
{
    BTH_LE_AUDIO_CODEC_ID CodecId;
    BOOL IsCodecPresent;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT RenderChannelCount;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT CaptureChannelCount;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY RenderSamplingFrequencies;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY CaptureSamplingFrequenciesList[
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_BIT_LENGTH
    ];
} BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY;

Where:

typedef struct _BTH_LE_AUDIO_CODEC_ID
{
    UINT8 CodingFormat;
    UINT16 CompanyId;
    UINT16 VendorCodecId;
} BTH_LE_AUDIO_CODEC_ID;

typedef UINT8 BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT;

typedef enum _BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY :
    UINT8 // Bit flags
{
    // 16 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ = 0x1,

    // 24 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ = 0x2,

    // 32 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ = 0x4,

    // 48 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ = 0x8,

    // A dummy value for indicating a sampling frequency is "not applicable" in the
    // respective context.
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_NONE = 0,

    // All valid sampling frequencies combined.
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_ALL =
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ |
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ |
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ |
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ,
} BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY;

DEFINE_ENUM_FLAG_OPERATORS(BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY);

#define BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_BIT_LENGTH \
    (sizeof(BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY) * 8)

BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY 구조는 Bidirectional_Multichannel_Streaming 설명한 것과 유사한 규칙을 따릅니다.

  • ACX 스트리밍 드라이버는 관심 코덱이 개념적으로 ACX 스트리밍 드라이버의 일부인지 여부를 나타내기 위해 추가 플래그 IsCodecPresent를 설정해야 합니다. 예를 들어 코덱이 오디오 DSP에 있는 경우 IsCodecPresent를 TRUE로 설정해야 합니다. 코덱이 Bluetooth 컨트롤러에 있는 경우 플래그를 FALSE로 설정해야 합니다.

  • n 채널 캡처가 있는 m 채널 렌더링의 경우 RenderChannelCount 및 CaptureChannelCount의 값은 각각 m과 n입니다. 즉, RenderChannelCount 및 CaptureChannelCount는 실제 렌더링 및 캡처 채널 수를 나타냅니다.

  • 인덱스를 지정하면 i-th 가장 유의미한 RenderSamplingFrequencies 비트와 CaptureSamplingFrequenciesList의 i-th 항목 간에 일대일 매핑이 있습니다. RenderSamplingFrequencies의 i번째 비트가 0이면 CaptureSamplingFrequenciesList[i]를 0으로 설정합니다.

다음 샘플 코드는 GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE 디바이스 인터페이스를 만드는 방법을 보여 하며 BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities 디바이스 인터페이스 속성을 설정합니다.

PAGED_CODE_SEG
NTSTATUS
AdvertiseBluetoothLEAudioSupport(
    WDFDEVICE Device
    )
{
    // Create a device interface with the class,
    // GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE, for the specified WDF device.
    DECLARE_CONST_UNICODE_STRING(
        bluetoothLEAudioSupportInterface, L"BluetoothLEAudioSupport");
    RETURN_NTSTATUS_IF_FAILED(WdfDeviceCreateDeviceInterface(
        Device,
        &GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
        (PUNICODE_STRING)&bluetoothLEAudioSupportInterface));

#pragma region associate BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities with GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE.
    // Advertise bidirectional multichannel streaming support by setting the device
    // interface property, 
    // BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
    // to the newly created device interface.

    // See Table 7 "Microsoft-specific codec ID" in Microsoft Bluetooth LE Audio
    // IHV Specification for reference.
    constexpr BTH_LE_AUDIO_CODEC_ID microsoftLC3CodecId
    {
        0xff, // Vendor-specific
        0x6,  // Microsoft
        0x6,  // LC3
    };

    constexpr BTH_LE_AUDIO_CODEC_ID microsoftCVSDCodecId
    {
        0xff, // Vendor-specific
        0x6,  // Microsoft
        0x2,  // CVSD
    };

    // For readability purpose only
    constexpr auto SamplingFrequency_None = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_NONE;
    constexpr auto SamplingFrequency_16000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ;
    constexpr auto SamplingFrequency_24000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ;
    constexpr auto SamplingFrequency_32000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ;
    constexpr auto SamplingFrequency_48000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ;
    constexpr auto SamplingFrequency_All = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_ALL;

    // Bidirectional multichannel streaming capabilities
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY capabilities[]
    {
        // List of formats supported for 2-channel render with 1-channel capture using
        // the LC3 codec:
        //
        //      Render           Capture
        //   (Freq, #Chan)    (Freq, #Chan)
        //   =============    =============
        //    (16kHz, 2) <---> (16kHz, 1)
        //    ----------       ----------
        //    (24kHz, 2) <---> (16kHz, 1)
        //    (24kHz, 2) <---> (24kHz, 1)
        //    ----------       ----------
        //    (32kHz, 2) <---> (16kHz, 1)
        //    (32kHz, 2) <---> (24kHz, 1)
        //    (32kHz, 2) <---> (32kHz, 1)
        //    ----------       ----------
        //    (48kHz, 2) <---> (16kHz, 1)
        //    (48kHz, 2) <---> (24kHz, 1)
        //    (48kHz, 2) <---> (32kHz, 1)
        //    (48kHz, 2) <---> (48kHz, 1)
        //
        {
            // CodecId
            microsoftLC3CodecId,
            // IsCodecPresent,
            FALSE, // The LC3 codec is in the Bluetooth Controller.
            // RenderChannelCount
            2,
            // CaptureChannelCount
            1,
            // RenderSamplingFrequencies
            SamplingFrequency_All,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 16kHz, 2-channel render
            SamplingFrequency_16000Hz,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 24kHz, 2-channel render
            SamplingFrequency_16000Hz | SamplingFrequency_24000Hz,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 32kHz, 2-channel render
            SamplingFrequency_16000Hz |
                SamplingFrequency_24000Hz |
                SamplingFrequency_32000Hz,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 48kHz, 2-channel render
            SamplingFrequency_All,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
        },
        // List of formats supported for 4-channel render with 2-channel capture using
        // the CVSD codec:
        //
        //      Render           Capture
        //   (Freq, #Chan)    (Freq, #Chan)
        //   =============    =============
        //    (16kHz, 4) <---> (16kHz, 2)
        //    ----------       ----------
        //    (32kHz, 4) <---> (16kHz, 2)
        //    (32kHz, 4) <---> (32kHz, 2)
        //
        {
            // CodecId
            microsoftCVSDCodecId,
            // IsCodecPresent,
            TRUE, // The CVSD codec is in the audio DSP.
            // RenderChannelCount
            4,
            // CaptureChannelCount
            2,
            // RenderSamplingFrequencies
            SamplingFrequency_16000Hz | SamplingFrequency_32000Hz,
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 16kHz, 4-channel render
            SamplingFrequency_16000Hz,
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 24kHz, 4-channel render
            SamplingFrequency_None, // N/A
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 32kHz, 4-channel render
            SamplingFrequency_16000Hz | SamplingFrequency_32000Hz,
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 48kHz, 4-channel render
            SamplingFrequency_None, // N/A
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
        }
    };

    // Call IoSetDeviceInterfacePropertyData to associate the capabilities associated
    // with the DEVPKEY.
    WDFSTRING wdfSymbolicLinkName;
    RETURN_NTSTATUS_IF_FAILED(WdfStringCreate(
        nullptr, WDF_NO_OBJECT_ATTRIBUTES, &wdfSymbolicLinkName));
    auto deleteWdfStringOnExt = scope_exit([wdfSymbolicLinkName]() -> void
    {
        WdfObjectDelete(wdfSymbolicLinkName);
    });

    RETURN_NTSTATUS_IF_FAILED(WdfDeviceRetrieveDeviceInterfaceString(
        Device,
        &GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
        &bluetoothLEAudioSupportInterface,
        wdfSymbolicLinkName));
    
    UNICODE_STRING symbolicLinkName;
    WdfStringGetUnicodeString(wdfSymbolicLinkName, &symbolicLinkName);

    RETURN_NTSTATUS_IF_FAILED(IoSetDeviceInterfacePropertyData(
        &symbolicLinkName,
        &DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
        LOCALE_NEUTRAL,
        PLUGPLAY_PROPERTY_PERSISTENT,
        DEVPROP_TYPE_BINARY,
        sizeof(capabilities), capabilities));
#pragma endregion

    return STATUS_SUCCESS;
}