蓝牙音频传输协议(A2DP)-绝对音量笔记

2023-12-23 09:20

本文主要是介绍蓝牙音频传输协议(A2DP)-绝对音量笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、A2DP中的角色介绍
  • 二、绝对音量机制原理
    • 1.判断对端设备是否支持绝对音量
    • 2.音量等级介绍
    • 3.绝对音量交互流程
  • 三、绝对音量机制应用-BES2500IU原生代码示例
  • 总结

前言

绝对音量是什么意思?

绝对音量(Absolute volume)是指在蓝牙音频传输中,设备之间通过协议来协商音量控制的方式。传统上,音量控制是由音频源设备(如手机、电脑等)来控制,音频接收设备(如耳机、扬声器等)只是根据音频源设备发送的音量指令来调整音量大小。但是,这种方式存在一些问题,例如不同的设备音量范围不同,无法实现设备之间的统一音量控制等。

为了解决这些问题,蓝牙SIG(Bluetooth Special Interest Group)提出了绝对音量协议,通过该协议,音频源设备和音频接收设备可以互相通信,协商并同步音量控制,从而实现设备之间的统一音量控制。绝对音量协议可以确保不同设备的音量控制方式相同,使得用户可以在不同设备之间无缝切换,同时也提高了音频传输的质量和稳定性


一、A2DP中的角色介绍

在A2DP(Advanced Audio Distribution Profile)协议中,有两个重要的角色:CT端和TG端,分别代表连接的主设备和从设备。

CT端(Source):CT端是指连接蓝牙音频源设备(如手机、电脑等)的主设备。CT端主要负责音频数据的传输和控制,包括音频数据的编码、传输和解码等。

TG端(Sink):TG端是指连接蓝牙音频接收设备(如耳机、扬声器等)的从设备。TG端主要负责音频数据的接收和播放,包括音频数据的解码和输出等。
在这里插入图片描述

在A2DP协议中,CT端和TG端通过蓝牙进行连接,并通过协议进行音频数据的传输和控制。CT端可以向TG端发送音频数据和控制指令,如音量控制、播放控制等。TG端则接收音频数据并进行解码和播放。通过A2DP协议,用户可以通过蓝牙连接手机、电脑等音频源设备和耳机、扬声器等音频接收设备,实现无线音频传输和控制。

二、绝对音量机制原理

1.判断对端设备是否支持绝对音量

以手机为例:
1.手机端先看AVDTP协议是否支持,从空中包看
如下图:与耳机建立连接时,手机端会通过SDP服务查询当前耳机是否支持绝对音量功能
在这里插入图片描述
Category 2: 官方解释是用于定义视频监视器或音频放大器的基本操作。
简单来讲,设备的基本操作,包括设备的开关、音量控制、亮度调节等都是由它决定是否支持
在这里插入图片描述

在这里插入图片描述
2.手机端看有无指令(set Absolute volume)交互来判断是否支持,从空中包看

注:不支持绝对音量设备 不会有指令下发
在这里插入图片描述

2.音量等级介绍

绝对音量用一个八位字节表示。顶部位(第7位)是为将来添加(RFD)保留的。
在这里插入图片描述

绝对音量的值以最大值的百分比指定。0x0表示0%。0x7F对应100%。对应蓝牙等级设置会以x%通知给到TG端设备。但是在实际的项目运用中,例如手机和耳机设备,一般都是只支持16or15个音量等级,这里就会涉及到一个音量换算的问题,原理都是把127个音量等级划分成对应的16阶or15阶音量百分比,以耳机项目示例(这里是将音量等级划分成16阶):
这里是将音量等级划分成16阶

3.绝对音量交互流程

SetAbsoluteVolume:SetAbsoluteVolume指令用于设置蓝牙设备的绝对音量。在A2DP协议中,传统的音量控制是由音频源设备(如手机、电脑等)来控制,音频接收设备(如耳机、扬声器等)只是根据音频源设备发送的音量指令来调整音量大小。而通过SetAbsoluteVolume指令,音频源设备可以向音频接收设备发送音量值,并要求设备将其设置为绝对音量。这样就可以实现设备之间的统一音量控制。

RegisterNotification:RegisterNotification指令用于注册事件通知。在A2DP协议中,音频源设备和音频接收设备可以通过RegisterNotification指令来注册一些事件,如音量变化、播放状态变化等。当这些事件发生时,音频接收设备会向音频源设备发送通知消息,以便音频源设备可以及时地做出相应的处理。

CT端与TG端消息交互如下:
在这里插入图片描述

三、绝对音量机制应用-BES2500IU原生代码示例

a.收到AVRCP CMD — EVENT_VOLUME_CHANGED
在这里插入图片描述
b.耳机端更新音量等级参数
在这里插入图片描述
根据CT端下发音量等级参数换算成对应的15阶或16阶耳机本地音量等级
在这里插入图片描述
c.根据本地音量等级 耳机更新本地音量衰减参数
在这里插入图片描述
HFP和A2DP使用不同音量衰减参数
在这里插入图片描述

在这里插入图片描述

总结

具体的绝对音量指令对应的功能显示,大家可以使用ellisys或者frontline等hci_log分析工具自行对应查看。对没有提及到的一些feature,有兴趣的兄弟可以去A2DP协议中自行查找,这一篇文章只是我在项目中碰到的绝对音量问题时的一些理解,希望对大家会有一些帮助,也欢迎大家指出问题。
————————————————
版权声明:本文为CSDN博主「无敌幸运七」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42176891/article/details/127284000

这篇关于蓝牙音频传输协议(A2DP)-绝对音量笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527534

相关文章

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi