没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
17页
Android 蓝牙 A2dp 听歌卡音?audio数据到a2dp通道流程解析----A2dp流控原理(Acl Flow Control),一文搞懂蓝牙卡音问题处理
资源推荐
资源详情
资源评论
具体内容请查看本人博客
!!!!!!
一、" 卡音问题#环境因素
先确认问题概率。(低概率则可能为干扰引起,着重关注高概率必现卡顿问题)
确认是否是共存场景问题。($%&' 共存, 共存等)
确认 &'()% 是否正常。(*+ 错误导致卡顿问题)
$,%,(-'"(.$,%, 天线和芯片是一起的/指标满足要求。
二、传统蓝牙 01, 流控(2()
((((((((流控制用于在主机和主机控制器之间,避免传送到主机控制器的未应答远程设备的
"13(数据溢出主机控制器数据缓冲区。主机(蓝牙协议栈)负责管理主机控制器(蓝牙芯
片)的数据缓冲区。流控分为两种:
)蓝牙协议栈到蓝牙芯片的流控
)蓝牙芯片到蓝牙协议栈的流控
下面我们来一一介绍下:
(蓝牙协议栈到蓝牙芯片的流控
从 到 1 的数据流控分为两种: 45#(6(%(1 和 6#&5#
&(6(%(1。通过 01,$%17(命令来切换,
但是 45#((2( 对于 &)86) 芯片来说是默认的,所以你可以不下这个命
令。但是我们既然讲到这个命令,还是看下这个命令的格式,如下图:
这个命令看截图已经很清晰了,一笔带过就好了,我们重点来说下协议栈到蓝牙芯片的流
控原理(只说传统蓝牙的 45#(2():
((((((((在初始化时,主机将发送 )&9:;<(指令。通过该指令返回的两参数可以确定从
主机发往主机控制器的 01,("13(和 ;1-(数据分组.不包括报头/的最大长度。
((((((((另有两返回参数表示主机控制器可以缓存等待传输的 01,("13(和 ;1-(数据分组数。在
至少有一个连接或处于本地回送的情况下=主机控制器利用 *9(->(1(45(事
件控制从主机发来的数据流。
((((((((事件分组包括一个连接句柄列表=(以及自从前一个事件返回后已经完成的 01,(数据分组
的相应数目(如果对于一个特定的连接句柄,没有事件返回发生,就从连接建立的时间算
起 )。发送完成是指数据分组的传输、清除和回送至主机。
((((((((根据该事件返回的信息和 )(&9:(;<(命令返回的参数(该参数决定可以存储在主
机控制器中的 01,("13(和 ;1-(数据分组的总数目)主机决定哪个连接句柄的 01,(数据分组
应该发送。
((((((((在 01,(每次发送数据分组后,它就假设在主机控制器上所对应链路类型的存储空间减
少一个 01,(分组的量,当主机收到一个新的能提供关于有多少 01,(数据分组已经完成的
*9(->(1(45(事件后,它就可以得到从上一次事件返回后缓冲器数量的减
少信息,并可以计算当前的缓冲器的使用量。
((((((((当主机控制器在其缓存中存放有 01,(数据分组时=它必须向主机周期性持续发送 *9
->(1(45(事件=(直到最终所有 "13(数据分组都已发送完毕或溢出。
((((((( ( 事件发送频率由厂商指定。注意:如果 ;1-(流控制失效=则 *9(->1
45(就不能在 ;1-(连接句柄中进行报告。
看概念可能我们不会那么清晰,我们就以一个举一个列子,根据 的 2 来说明下
吧:
协议栈初始化的时候会采用 )&9:;< 来读取 = 的个数,以及 = 的每包
<如图,那此步骤分为切开两个小节:
? 蓝牙芯片回应协议栈 ( 的 @ 携带 = 的个数,以及 = 的每包
< 等信息,截图如下:
&9(1(底层会有 个 &)86) 的 "13(9:,用于缓存数据。每次蓝牙 后
会初始化, 主动询问 可以缓存多少包数据。
A 同时, 也会主动告知 ,自己可以缓存 ! 包 "13 数据和 ! 包 ;1- 数据。
B&38(的 也会主动询问 可以缓存的 38 数据的数量
当协议栈发送给蓝牙芯片 "13 数据, 的 9:(<#(注意此部分是维护在协议栈中),
而且只有通过 > 能看到剩余的 (9:(<(我试过 C 以及 $5 都不会显
示,是因为 % 的软件工具有算法会自动显示)
如图:在初始化的时候我们读到的 (9:(< 是 !,所以我们发送了一个 数据,此
部分变为 D
当蓝牙协议栈收到蓝牙芯片回送的 *9(>((5(@ 后,协议栈更新 (9:
< 数量,增加 ,变为 !。
(音频流传输路径: 侧每 !(从 9 的 9> 中拿 (,之后进行 ,然后将
的数据入队,之后我们 5("+6'4(会将队列里的数据写进 31"4 的 9: 里,如果
1( 中 *-14(*9(>((5 )回的慢 , 31"4 的 9: 就无 法 发 送 到
,从而造成 侧的 E99 内部 @2,进而 &' 侧就会清除 E99 中的数据,从而造
成了声音不连续。所以此题需要看是否环境中有干扰造成 *-14 回复慢。
F(卡音原因是 %$(那边回 &' 侧的 *-14(较慢,造成 &' 侧数据 @2,所以从 01, 的
@ 音频会出现卡音
F(*-14 是指蓝牙 0-;' 发送给 %$ 一包数据后,%$( 数据到 (设备完成时,%$
回复给 0-;' 的包:8@(01,*9->145,此包回复后,0-;' 继续给
%$ 发送数据)
从固件中查看 (@ 回复:
发现是由于对方每隔 ! 回复我们一包 "1G,其他时间 6H' 在重传数据包,对方无响应,
造成数据不能正常发送,进而 &' 这边塞包,形成卡顿。
三、将播放音乐此条 "13 链路调整为高优先级,保证播放音乐可以发多个数据包
、首先蓝牙芯片重启
? 对应的 01,(
(A 对应的 "(源码
蓝牙新品重启
@(&'76@).H*H;86"'')(&'717431&I(/(J
K((I(%9(("13((I
L((@./M(断开所有的 "13 链路
D
!((I(1((5=(((9(((((I
((./M
(开始重启新品,重启完成,调用 函数处理
((995.9.1-*')-338)7-6H38/=
(((((((((((((((((((((((((((((((((((((5E99=(/M
N
(@(.@I(9/(J
K((1081G.9( (%H'H)8;H118;;/M
剩余16页未读,继续阅读
知识分享小达人
- 粉丝: 1845
- 资源: 71
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页