ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

安卓源码避坑指南10—蓝牙音乐播放状态和歌曲信息不更新

2021-12-07 12:02:45  阅读:340  来源: 互联网

标签:10 Transaction 16 通知 安卓 changed Label 源码 事件


蓝牙音乐播放状态和歌曲信息不更新

在这里插入图片描述

安卓版本android-9 (P版本)

问题现象:歌曲信息和蓝牙音乐的播放状态不更新,蓝牙音乐界面感觉卡死(其实是界面信息不更新,音频数据正常)

歌曲信息和播放状态的更新都是通过avrcp协议的通知事件进行更新的,一般而言avrcp的通知事件只要TG端有变化就会通过changed事件告知CT,具体通知指令如下:
播放状态
在这里插入图片描述

歌曲信息
在这里插入图片描述

难道是对端手机异常不再主动通知changed事件了?-_- 带着这个怀疑赶紧分析了logcat,发现在某一次的通知TG端回复changed事件后,CT端没有注册新的通知事件到手机,导致后续的changed事件手机都没法通知到设备端。
在这里插入图片描述

没有重新注册新的通知事件的原因是没有可用的事务标签号,Avrcp协议中对 Transaction Labels 定义如下:
在这里插入图片描述

从协议可知 Transaction Labels 最多支持16条,可同时注册或者等待响应的事件应该限制为15条,而bluedroid中也有如上最多16条的限制,那为何还会资源不足呢?

#define MAX_TRANSACTIONS_PER_SESSION 16

分析代码 handle_avk_rc_metamsg_rsp() 函数中的逻辑,发现其中对于 AVRC_PDU_REGISTER_NOTIFICATION 的changed事件处理逻辑是先注册新的通知事件到TG,最后才会释放前一次使用的Transaction Label,这样必须得有一个可用的Transaction Label在资源池中监听才不会停止。

那在极端状态下(当前16条Transaction Label都在使用中),某一个通知的changed事件回复,在注册新的通知事件时就会没有Transaction Label可用,从而监听就突然停掉,相关信息再也不会更新。

解决方案
对于 AVRC_PDU_REGISTER_NOTIFICATION 事件在changed时先释放 Transaction Label,如此能保证 transaction资源池中至少有一个 ID 是可用的。感兴趣的同学欢迎私信留言一起讨论,共同学习,一起进步!

更多互联互通技术,欢迎关注微信公众号:Connectivity
在这里插入图片描述

标签:10,Transaction,16,通知,安卓,changed,Label,源码,事件
来源: https://blog.csdn.net/weixin_44260005/article/details/121753660

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有