蓝牙音乐SRC侧的安卓实现

随着电子产品的普及,越来越多的年轻人热衷于使用蓝牙技术来播放歌曲(相当多的手机品牌取消了耳机插孔),本篇文章就和大家聊聊蓝牙音乐SRC端在安卓系统中的实现原理。

安卓系统参考版本:Android-9

蓝牙SRC侧播放蓝牙音乐,音频数据都是从安卓音频系统发送过来的,蓝牙协议栈接收到音频数据处理再发送到SNK端进行播放,整体的流程大概如下图所示:

红色框图标注的部分就是我们今天探讨的内容,在对蓝牙音乐SRC介绍之前,我们得简单了解下安卓中音频系统。安卓的audio系统播放音频都是将数据发送到对应的输出设备进行播放,蓝牙自然也是其中一种音频输出设备,类似的输出设备还有如下这些,源码路径:/system/media/audio/include/system/audio.h

这些音频输出设备通过HAL框架以一个个单独的模块存在于安卓系统中,音频系统服务层audioserver在初始化过程中通过HAL技术加载配置文件支持的模块。这里以蓝牙a2dp为例具体分析下加载模块的时序图:

这样音频服务就和蓝牙协议栈bluedroid建立联系,蓝牙音乐播放的音频数据就可以通过该路径源源不断的送入蓝牙协议栈中进一步处理。

蓝牙提供的音频系统的动态链接库为:audio.a2dp.default.so
源码路径:/system/bt/audio_a2dp_hw/

音频系统初始化阶段只会加载打开 audio.a2dp.default.so 获取到a2dp模块接口,至于打开输出流只有在A2DP协议连接成功后才会执行。

从以上时序图可以看到 audio.a2dp.default.so 运行在音频服务的进程中,那其又如何与蓝牙服务进程 com.android.bluetooth 交互呢?

跨进程通信有多种方式,audioserver 和 com.android.bluetooth 在蓝牙音乐数据传输场景下通过 socket 完成跨进程通信。

蓝牙协议栈创建如下两种socket与audioserver进行通信:

  1. /data/misc/bluedroid/.a2dp_ctrl :控制socket,传递A2DP的控制信号
  2. /data/misc/bluedroid/.a2dp_data :数据socket,传递A2DP的音频数据

Bluedroid 通过数据 socket 接收到 audio 发送过来的音频数据后,根据A2DP连接时双方协商确定的编码方式对数据进行编码操作,最终将编码后的数据通过l2cap链路发送到SNK端。具体时序图如下:

对音频数据进行编码的具体操作则在各编码方式对应的处理函数中完成,源码路径参考:system\bt\stack\a2dp\a2dp_xxx_encoder.cc\a2dp_xxx_encode_frames(),xxx对应A2DP连接使用的编码方式(SBC、AAC、aptX、LDAC等)。

数据最终在bta层 bta_av_data_path() 处理函数中通过 p_scb->p_cos->data() 回调从 btif_a2dp_source_cb.tx_audio_queue 队列中取出,数据随后经过进一步封装发送给SNK端,SNK再反向解码出音频流播放。

蓝牙音乐SRC侧的安卓实现大体上如此,感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!

更多互联互通技术,欢迎关注微信公众号:Connectivity

蓝牙音乐SRC侧的安卓实现相关推荐

  1. 蓝牙音乐之AVRCP在安卓系统中的实现

    蓝牙音乐之AVRCP在安卓系统中的实现 从<蓝牙音乐之AVRCP>协议分析中可知,音视频远端控制协议被分成两部分:CT + TG,因此安卓源码也相应的分为 avrcp + avrcpcon ...

  2. ktm390蓝牙连接安卓_蓝牙音乐AudioTrack Session ID的获取

    当今这个音视频无处不在的时代,音频跟踪会话ID(AudioTrack Session ID)是个很重要的参数,可以用来实现音频相关的一些特效.接下来的内容我们就探究如何在安卓蓝牙系统中获取该id. 熟 ...

  3. android 获取蓝牙设备id_安卓蓝牙系统中如何获取蓝牙音乐的音频跟踪会话ID

    原标题:安卓蓝牙系统中如何获取蓝牙音乐的音频跟踪会话ID 蓝牙音乐AudioTrack Session ID的获取 当今这个音视频无处不在的时代,音频跟踪会话ID(AudioTrack Session ...

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

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

  5. android蓝牙音乐之AVRCP介绍和使用

    引言 最近做的车载蓝牙音乐开发,遇到很多问题,记录一下.也是到处东拼西凑的,勉强看看吧. AVRCP:Audio/Video Remote Control Profile,音视频远端控制协议,所以该协 ...

  6. 获取sessionid_蓝牙音乐AudioTrack Session ID的获取

    当今这个音视频无处不在的时代,音频跟踪会话ID(AudioTrack Session ID)是个很重要的参数,可以用来实现音频相关的一些特效.接下来的内容我们就探究如何在安卓蓝牙系统中获取该id. 熟 ...

  7. Android蓝牙电话(SCO)和蓝牙音乐(A2DP)总结(四)

    蓝牙电话从USB声卡输出,还需要看硬件怎么设计的?举例四款高通芯片. 1.高通MSM8953和SDM450蓝牙电话(SCO)和蓝牙音乐(A2DP),这两个片子硬件设计是一样 <1>.蓝牙电 ...

  8. android停止蓝牙音乐服务,蓝牙音乐播放状态一直为暂停态

    安卓源码避坑指南7--蓝牙音乐播放状态一直为暂停态 蓝牙音乐的播放状态是蓝牙音乐等相关应用重点关心的变量,应用根据该状态值(播放.暂停)实时更新界面图标显示.本期就和大家简单分享下蓝牙音乐播放状态上报 ...

  9. Android 7.1 高德导航和蓝牙音乐卡顿问题 蓝牙电话和高德语音播报混音问题

    此文章主要解决三个问题 1.高德导航的时候打电话会出现混音问题. 2.蓝牙音乐在播放的时候导航界面语音播报蓝牙音乐会暂停,播报结束会恢复播放不能同时输出问题. 3.蓝牙音乐在播放的时候和导航界面的语音 ...

最新文章

  1. 树莓派SSH 连接不上:socket error Event:32 Error:10053
  2. “我哥毕业1年,做Python挣了50W!”网友:吹得太少...
  3. JAVA--位移运算符详细分析【转载】
  4. python类和对象的定义_python类与对象基本语法
  5. 一看就会一做就废系列:说说 RECOVER UNTIL CANCEL
  6. 【jQuery学习】—jQuery对象的串联
  7. 汇编语言与计算机体系结构
  8. linux 内核恐慌,linux – CentOS 6.5 mdadm Raid 1 – raid数据检查期间的内核恐慌
  9. Kafka之与Spring集成
  10. CImage类的使用
  11. 蜗牛星际改内存_蜗牛星际再次升级为800多元的变种蜗牛:G5400+B365的双千兆网口做NAS香吗...
  12. 2018年手机ODM行业分析
  13. Cadence Allegro修改静态铜皮为动态铜皮图文教程及视频演示
  14. 擦干眼泪,掩饰悲伤,只因明天我想要坚强
  15. kibana服务器性能要求,kibana 性能监控 apm
  16. gmm的java实现_4. EM算法-高斯混合模型GMM详细代码实现
  17. 在PPT中显示时间以提醒演讲者控制时间
  18. 计算机毕业设计springboot+vue基本微信小程序的云宠物小程序-宠物领养
  19. 【06.11.27】【世界电影史上影片电影合集】【讯雷下载】
  20. nuxt中图片预加载

热门文章

  1. 第一行代码-第二版(郭霖著)笔记七(Content Provider)
  2. 原来在Android中请求权限也可以有这么棒的用户体验(转自郭霖)
  3. 我用python代码表白,泡到了大学小师妹
  4. python12306抢票_Python 版 12306 抢票神器
  5. 获取必应每日壁纸(api)
  6. 初出茅庐——利用Python的Turtle库绘制玫瑰花
  7. PBOC规范研究之十 ---标准动态数据认证(转)
  8. 正则表达式给查找到的内容加引号
  9. 描述linux shell中单引号,linux shell中单引号、双引号、反引号、反斜杠的区别
  10. Android UI线程