背景需求
首先看一个有着实际需求情形的列子:比如有个足球吧里,屏幕上正在播放一场国际足球赛,这个吧里有英国人,西班牙人,中国人,德国人等等,大家都在一个屏幕上看球赛,这个时候,球吧可以为每个人提供一副耳机,英国人可以戴上一种耳机收听英语频道的足球解说,西班牙人可以戴上另外一种耳机收听西班牙语的解说,中国人可以戴上耳机听中文解说,德国人可以戴上耳机听德语解说,这里我们想到这是LE AUDIO广播的一个典型的应用场景,那么我们如何来定义这个LE AUDIO的广播源,以便让广播接收端知道这些信息呢?
BASE_3">BASE
为了简化以上案例,我们定义两种语言的解说:西班牙语和英语。我们知道Broadcast source通过广播AUX_SYNC_IND包里的BASE(Broadcast Audio Stream Endpoint)来告诉Broadcast Sinks广播源的音频流的信息。那么我们可以如下图来定义这个LE AUDIO的广播源:
从上面图片我们看的,BASE的表述类似于一个二叉树的数据结构:一个广播源有一个BIG(Group),这个Group下有2个subgroup,然后每个subgroup下面又分为左右通道不同的两个BIS,那么我们要把以上三个层级的数据记录在蓝牙的AUX_SYNC_IND数据包里,是通过树的前序遍历方式进行保存的,整个数据的排列组织如下面表格:
字节数 | 参数 | 值 |
---|---|---|
1 | Length | 0x5D==93,表示后面跟着的Advertising Data有93个字节 |
2 | Type | 0x16,表示Service Data |
3-4 | Uuid : Basic Audio Announcement | 0x1851 , 16bit UUID |
5-7 | Presentation Delay | 40 ms ,3个字节表示,单位是微秒 |
8 | Num_Subgroups | 0x02: 2 个subgroup |
9 | Num_BIS[0] | 0x02: subgroup[0]包含2 条BIS 流 |
10-14 | Codec_ID[0] | Octet 0: 0x0000000006 = LC3 Coding_Format |
15 | Codec_Specific_Configuration_Length[0] | 0x0A : 表示Codec_Specific_Configuration for Subgroup[0]的长度有10个字节 |
16-25 | Codec_Specific_Configuration[0] | 采用LTV结构为subgroup[0]定义如下:: LTV 1: Sampling_Frequency: 48000 Hz LTV 2: Frame_Duration: 10 ms LTV 3: Octets_Per_Codec_Frame: 100 octets |
26 | Metadata_Length[0] | 0x09: Subgroup[0] Metadata的长度为9个字节 |
27-35 | Metadata[0] | 采用LTV结构为subgroup[0]定义如下: LTV 1: Streaming_Audio_Contexts: Media LTV 2: Language: Spanish,西班牙语 |
36 | BIS_index[0[0]] | 0x01:BIS_index[0][0]流的编号为0x01 |
37 | Codec_Specific_Configuration_Length[0[0]] | Codec_Specific_Configuration for BIS_index 1的长度为 0x06 个字节 |
38-43 | Codec_Specific_Configuration[0[0]] | 采用LTV结构为BIS_Index 1定义如下: LTV 1 = Audio_Channel_Allocation: FL(Front Left),西班牙语音频流的左前声道 |
44 | BIS_index[0[1]] | 0x02:BIS_index[0][1]流的编号为0x02 |
45 | Codec_Specific_Configuration_Length[0[1]] | Codec_Specific_Configuration for BIS_index 2的长度为 0x06 个字节 |
46-51 | Codec_Specific_Configuration[0[1]] | 采用LTV结构为BIS_Index 2定义如下: LTV 1 = Audio_Channel_Allocation: FR(Front Right),西班牙语音频流的右前声道 |
52 | Num_BIS[1] | 0x02: Subgroup[1]有2条BIS音频流 |
53-57 | Codec_ID[1] | 0x0000000006 = LC3 Coding_Format |
58 | Codec_Specific_Configuration_Length[1] | 0x0A : 表示Codec_Specific_Configuration for Subgroup[1]的长度有10个字节 |
59-68 | Codec_Specific_Configuration[1] | 采用LTV结构为subgroup[1]定义如下:: LTV 1: Sampling_Frequency: 48000 Hz LTV 2: Frame_Duration: 10 ms LTV 3: Octets_Per_Codec_Frame: 100 octets |
69 | Metadata_Length[1] | 0x09: Subgroup[1] Metadata的长度为9个字节 |
70-78 | Metadata[1] | 采用LTV结构为subgroup[0]定义如下: LTV 1: Streaming_Audio_Contexts: Media LTV 2: Language: English,英语 |
79 | BIS_index[1[0]] | 0x03:BIS_index[1][0]流的编号为0x03 |
80 | Codec_Specific_Configuration_Length[1[0]] | Codec_Specific_Configuration for BIS_index 3的长度为 0x06 个字节 |
81-86 | Codec_Specific_Configuration[1[0]] | 采用LTV结构为BIS_Index 3定义如下: LTV 1 = Audio_Channel_Allocation: FL(Front Left),英语音频流的左前声道 |
87 | BIS_index[1[1]] | 0x04: BIS_index[1][1]流的编号为0x04 |
88 | Codec_Specific_Configuration_Length[1[1]] | Codec_Specific_Configuration for BIS_index 4的长度为 0x06 个字节 |
89-94 | Codec_Specific_Configuration[1[1]] | 采用LTV结构为BIS_Index 4定义如下: LTV 1 = Audio_Channel_Allocation: FR(Front Right),英牙语音频流的右前声道 |
类似实际空口例子: