Biu~笔记:高通蓝牙ADK(34)-- Multi point的交替回连

       Bui~ (此处省略2000字真诚开场白)

在后面的ADK中都加入了multi point功能,也就是大家熟悉的一拖二功能,这个功能很适合带两个手机的人群。一台手机处理生活中的事情(和家人聊天),另一台则处理工作中的事情(和情人同事讨论),带着一个耳机就能听到两台手机放出来的声音,真是个伟大的发明,要是能一拖N就更好了,这样就能连别人的手机,必要时帮忙处理工作上的事,提高工作效率。୧(๑•̀◡•́๑)૭

但是目前的一拖二有个限制,就是他的回连时间短,且要等一个回连结束才回连下一个。这就不是很友好的体验了,要是耳机开机了,再从口袋掏出手机,再打开手机就发现已经连上了。(我应该先把蓝牙关了先-_-||,重来)
       
这就不是很友好的体验了,要是耳机开机了,再从口袋掏出手机,再打开手机发现蓝牙没开,再把蓝牙打开,就会发现又自己连上了(我应该用苹果手机,安卓开蓝牙会自己回连-_-||,重来)

 

这就不是很友好的体验了,要是耳机开机了,再从口袋掏出苹果手机,发现手机不在口袋,在某个地方充电,等我找到它时,回连就超时了,而我又不想多点一下手机去回连。这就很苦恼,所以加长回连时间是有必要的,但是加长了回连时间就会引出一个问题。因为默认要等一个回连结束才回连下一个,那么如果我第一个手机没开蓝牙,那就必须等到超时才会去连我的第二个手机。这就很烦,我机都掏出来了,你却找另一个。所以这就有了本篇博文介绍的交替回连功能。

如上图所示,交替回连就是将每次回连的时间减短,但回连次数增加,且回连设备交替进行。用这种方法既可以加长回连时间,又可以减少原来的等待时间。那么具体怎么实现呢?

首先我们要将每次回连时间减少,在handset_service_multipoint_config这个结构体中的acl_connect_attempt_limit和page_timeout就是配置回连时长,计算公式是(acl_connect_attempt_limit+1)*page_timeout,默认算的是15s,我们修改为5s一次。



因为我们修改了原有的超时设置,并让他在代码中失效了,所以需要我们添加一个总回连时长的设定, 就多加一个宏定义HANDSET_SERVICE_MAX_CONNECT_ATTEMPTS,那么整个回连时间就是HANDSET_SERVICE_MAX_CONNECT_ATTEMPTS * page_timeout秒。

接下来就是重点,我们在handsetServiceSm_HandleInternalConnectAclComplete这个函数里面的acl连接失败部分添加修改。因为第一次回连失败了,我们就需要在这里面进行回连切换。如果我们只有一个配对设备或已经连了一个设备,那就不需要交替回连了,只要一直去重连这个设备就好了。



但如果不是,我们就要将当前的设备用Focus_ExcludeDevice函数移出includelist列表里面,并且这个设备的数值保存到一个全局变量中,这样当下一个设备成功连接或失败的时候,他就可以用Focus_IncludeDevice函数把这个变量重新放进includelist列表里面。

为什么是操作includelist列表呢?因为在代码的后面有个状态机切换HandsetServiceMultipointSm_SetStateToGetNextDevice函数,这个状态切换,会遍历includelist列表,如果里面有设备,就会对这个设备进行回连。所以我们只需要在includelist列表将设备交替放进和移出,就能实现交替回连功能。当然剩下的就是超时控制等一些小问题,大家看看补丁应该就能明白了。

 

以上是本期博文的全部内容,如有疑问就别在博文下方评论留言了,有什么疑问或想了解的当面和我说(如果你知道我是谁的话ヽ( ̄▽ ̄)و),我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。

  

简单是长期努力的结果,而不是起点

                                                 —— 不是我说的

 

技术文档

类型标题档案
软件Patch
软件Patch

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

Sam Chiu

Sam Chiu

2 个月前
想知道,在一拖二的状态下,能否做到同时收到两个设备的声音?
zbgg

zbgg

8 个月前
大佬 你文中的两个函数是怎么实现的 Focus_ExcludeDevice Focus_IncludeDevice
1111

1111

2022年7月12日
感谢分享