声明: 内容来自:www.bluetooth.com, 加个人理解,仅用于学习交流,如果您发现不对的地方,请不吝赐教。
启动单播音频流
在此之前先思考两个问题,
思考1:一对耳机,连上其中一只,如何自动连上另外一只?
思考2:一对耳机,如何保证音量一致?
没错,这就需要用到CSIS & CSIP
CSIS & CSIP
由于A2DP专为流式传输到单个设备而设计,因此当今市场上向多个设备发送音频的每个蓝牙解决方案都使用某种专有方法使它们协同工作,无论它们是一对耳机、助听器还是扬声器。LE audio 需要定义一个标准方法来执行此操作,以便可以一起使用任何产品组合。问题不仅在于确保他们可以一起控制音量,还在于确保如果您更改提供音频流的设备。
对于一对耳机,协调执行四个主要功能:
- 它识别协调集的成员,即左右耳耳机
- 它用于对两个设备应用音量控制和静音
- 它用于确保它们都接收来自同一音频源的音频流
- 它允许设备锁定对耳机的访问,防止其他设备访问它们。
连上其中一只耳机,第一步当然是find primary service,CSIS的UUID为0x1846
CSIS的characteristics:
说明:
- Set Identity Resolving Key(SIRK): 同一个协调集必须共享一个Set Identity Resolving Key(SIRK), SIRK用于生成一个随机可解析的Resolvable Set Identifier(RSI), RSI可以被广播出去
RSI:用于识别设备属于哪个协调集,它存在ADV中
-
Coordinated Set Size: 协调集有多少个成员
-
Set Member Rank: 每个成员都有一个唯一值
-
Set Member Lock:协调集允许client以独占方式访问server,以最大限度地减少多个client同时访问同一协调集合的多个server时可能出现的竞争情况。如下图,在SC1在执行操作之前,先把SM1和SM2 lock,在SC1释放lock之前,SC2也想lock SM1,当然,这时SC2只会收到error response, SC2可以设置一个通知,待lock被释放之后,SM1再通知SC2.
当连接上其中一只耳机,就要自动发现并连接上另一只耳机,步骤如下:
- 连上协调集中的其中一只耳机,得到SIRK
- 搜索空中的ADV
- 从ADV中得到RSI,通过SIRK解析这个RSI,如果解析成功说明是同一个协调,然后就可以主动去连接它
overview
要实现最基本的UMS或UMR功能,需要实现哪些server,上图:
没错,最基本的要实现PACS和ASCS
find primary service
ASCS的UUID为0x184E,PACS的UUID为0x1850
PACS
PACS(Published Audio Capabilities Service),用于暴露UMS的播放能力
PACS characteristic如下:
Audio capability discovery
Sink PAC和Source PAC都包含PAC record数组,里面包含了Codec_Specific_Capabilities,如下图,包含了4个PAC record,每个都是不同capability
LC3 的 Codec_Specific_Capabilities的要求在 BAP 第 4.3.1 节中定义,由五个 LTV 结构组成。
Supported_Sampling_Frequencies LTV
Supported_Sampling_Frequencies (Type = 0x01),它是一个覆盖 8 kHz 到 384 kHz 范围的采样频率位域。通过将相应位设置为 1 来指示对每个值的支持。此 LTV 是强制性的。 (请注意,此结构可用于任何编解码器。LC3 仅指定 8、16、24、32、44.1 和 48 kHz 采样频率)。
Supported_Frame_Durations LTV
Supported_Frame_Durations (Type = 0x02),它提供了 LC3 编解码器支持的两个帧持续时间的信息——7.5ms 和 10ms。当设置为 1 时,位 0 和 1 表示支持 LC3 的 7.5ms 和 10ms 帧这两个选项。如果同时支持 7.5 ms 和 10 ms,则可以使用第 4 位和第 5 位来指示是否首选其中之一。只能设置第 4 位和第 5 位之一。此 LTV 也是强制性的。
Supported_Audio_Channel_Counts LTV
Supported_Audio_Channel_Counts (Type = 0x03),这是另一个位域,它指示可以包含在 CIS 或 BIS 中的音频通道的数量。 Channel Count是多路复用音频通道的数量,位 0 到 7 表示支持的通道数,值为 1 表示支持的选项。必须至少设置一位,否则表示无法设置音频通道。如果不支持多路复用,则 Channel Count 为 1,可以省略此 LTV 结构。
Supported_Octets_Per_Codec_Frame LTV
第四个 LTV 结构是 Supported_Octets_Per_Codec_Frame (Type = 0x04),此结构由两对两个八位字节组成,下对(八位字节 0 和 1)指定每个编解码器帧的最小八位字节数,上对指定每个编解码器帧的最大八位字节数。两者都可以设置为相同的值,其中仅支持特定数量的八位字节。它定义了所选采样率支持的比特率范围。此 LTV 也是强制性的。
Supported_Max_Codec_Frames_Per_SDU LTV
Supported_Max_Codec_Frames_Per_SDU (Type = 0x05),它是一个单个八位字节,说明可以打包到单个 SDU 中的编解码器帧的最大数量。如果每个 SDU 只有一帧,则可以省略。
unicast audio capability support requirement
采样率有8、16、24、32、44.1、48kHz,Codec都是LC3,
frame duration支持7.5ms和10ms,Supported_Octets_Per_Codec_Frame是指每个frame duration时长的PCM数据经过LC3编码之后的数据大小。
44.1 kHz 采样率与 7.5 ms/10 ms frame duration存在偏差,而后者可以通过Supported_Frame_Durations LTV 结构来获取。对于 44.1 kHz/7.5ms,实际frame duration = 360(samples per frame)/ 44100(samples per second)= 8.16327 ms;对于 44.1 kHz/10 ms,实际frame duration = 480(samples per frame)/ 44100(samples per second)= 10.88435 ms。
ASCS
作用:用于发现、配置、建立和控制ASE及其关联的unicast音频流。
- Sink ASE——表示Sink ASEs,server作为Audio Sink,一个server上可以有多个Sink ASE characteristic
- Source ASE——表示Source ASEs,server作为Audio Source,一个server上可以有多个Source ASE characteristicASE characteristic用于向client公开server上各个ASE的状态、配置参数和元数据
- ASE Control Point——用于client为server公开的各个ASE配置codec param、CIS configuration param和元数据,通过ASE_ID区分不同的ASE
source ASE state machine:
sink ASE state machine:
ASE Control Point opcode:
建立unicast audio stream
Step 1: Codec configuration
对某一个ASE config codec,参数要符合PAC record里面的
如下是ASE ID是1,codec capability是48_2,参数符合前面的Table 3.5
如果成功,会收到success的notification
ASE state变成Codec configured状态,UMR会返回能接受Presentation delay范围等参数,如下图:
Step 2: QoS configuration
QoS configuration用于设置CIG的相关参数,flow如下:
set CIG parameter,可以看到,SDU interval是10ms,RTN(重传个数)是2
再Config Qos,这是同样UMR也会set相同的CIG parameter,这里设置presentation delay是40ms
之后,ASE state变成QoS configured
Step 3: Enabling an ASE
Enable flow如下:
Enable带的参数只有Streaming_Audio_Contexts,这里是Media,表示这是媒体声音,如下:
如果Enable success,之后就要建立CIS,flow如下:
如下图,因为是两只耳机,所以需要建立两条CIS,每条CIS都会和各自的ACL绑定
如果Controller建立CIS完成,就会上报HCI_LE_CIS_Established event给Host,如下:
CIS建完之后,Host要与Controller建立data path,Controller才能从host收/发 SDU data,以下是UMS的HCI log,所以Data_Path_Direction是Input(Host to Controller)
data path建完之后,这是ASE state也要切到streaming状态,flow如下图,如有用到source ASE,才要下Receiver Start Ready,否则不需要
HCI log 如下:
至此,就可以尽情享受音乐了。