一、引言:
有时候,我们在实际处理问题中会遇到这样的需求,播放一段音频或者播报一段语音希望同时从USB/蓝牙类设备和喇叭同时出声,按照Android的audiopolicy策略选择,这是不可行的,因为同一时间,audioflinger只会往一个hal层库里面写数据,而喇叭和USB/蓝牙都不是共用一个hal层的,这种情况下有些芯片厂商是怎么做的呢?最近,正好在公司遇到了这样一个需求,期望从USB的mic模组和HDMI同时出声,因为我们使用的是海思平台,通过分析代码,发现海思做了一个不错的通路来实现了这样的一个需求,该通路叫cast,本博文着重分析了海思的cast通路。

二、cast通路原理:
海思针对usb和a2dp类设备,与HDMI共存的问题上,添加了cast通路,这样可以保证在两种设备都存在的情况下,通过静音的调控实现HDMI与插入类设备同时出声或者仅插入类设备出声的实现。Cast通路只能存在于播放器或者apk在调用海思私有通路的场景下。海思平台的产品,驱动可以通过两个通路将数据发送给硬件逻辑层:

可以看到:
① 海思drv中可以使用adsp或者alsa将数据发送给硬件逻辑层,cast通路捞取的是adsp中的数据;
② Tvos上的sme播放器,4.4上面的hiplayer以及中间件厂商的dvbplayer都是走的图中右边私有通路方式,CMCC播放器或者第三方apk则是通过创建Android原生audiotrack的方式(图左)往驱动中送数据,这部分数据将无法通过cast通路获取;

三、cast通路实现:
再来看下Android中海思是如何创建cast通路的,cast通路的存在/销毁是在处理USB/蓝牙的热插拔事件中实现的:首先,cast相关操作是在hiaoservice中(这是一个binder服务),在热插拔中事件处理中会去调用hicardplayroute函数获取hiaoservice,然后hiaoservice就会去创建一个castthread,开启cast通路了:

结合代码和框图,可以得知:
① Cast通路中开辟了一个本地buffer,用于拷贝adsp中的数据;
② Cast通路还新建了一个audiotrack(Android原生通路),本地buffer的作用就是将adsp中的数据拷贝到audiotrack中;
③ 本地buffer往audiotrack中写数据的方式是通过回调函数,而不是调用write方法;
④ USB/蓝牙设备之所以能听到声音根本原因是该声音由cast通路从adsp中捞取的,USB和HDMI设备其实一直都是有数据的,只不过HDMI设备被静音了,所以听不到;
⑤ 控制HDMI和USB同时出声只需要设置如下属性:
setprop sys.audio.usbcardmutectl false

Android音频之多设备同时输出-cast通路分析相关推荐

  1. Android 音频源码分析——AudioTrack设备选择

    Android 音频源码分析--AndroidRecord录音(一) Android 音频源码分析--AndroidRecord录音(二) Android 音频源码分析--AndroidRecord音 ...

  2. 【转载】Android音频(7)——项目实战——耳麦插拔

    Android音频(7)--项目实战--耳麦插拔 7.4.3 声音路由切换实例分析 · 深入理解Android:卷1 · 看云 一.驱动程序上报耳麦拔插事件 1. 在有些Android版本中并不会在状 ...

  3. Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置

    前言 此音频架构梳理笔记.主要是因工作上需要在 Android8.1 以上版本中,增加 snd-aloop 虚拟声卡做前期准备工作, 本篇文章提纲挈领的把音频框架主线梳理清晰,通过这篇文章能够清晰如下 ...

  4. android音频调制通讯,android音频口通信(一)——2FSK信号调制

    转载请注明文章出处和作者! 作者:大熊(Xandy) 一.前言 之前一直都在博客园混(地址:http://www.cnblogs.com/xl19862005),最近才搬家至CSDN,由于前几个月刚换 ...

  5. 深入剖析Android音频之AudioPolicyService

    From AudioPolicyService是策略的制定者,比如什么时候打开音频接口设备.某种Stream类型的音频对应什么设备等等.而AudioFlinger则是策略的执行者,例如具体如何与音频设 ...

  6. Android音频框架笔记 - 下篇

    原址 六.HAL层 6-1.Audio HAL层,其实包括了audio.xxx.so 和 audiopolicy.so等.从前述的总框架图,也有写,代码库路径也有写. 具体运行时so对象图,对于aud ...

  7. Android音频框架笔记 - 上篇

    原址 一.音频数字化基础知识 见书,列出知识点如下: 声音 声波,声音频率.响度, 音调.音色. 音响设备中的声道 得翻翻初高中的课本了. 声音数字化过程 声源 -> mic -> ADC ...

  8. 深入剖析Android音频(四)AudioTrack

    原址 播放声音可以用MediaPlayer和AudioTrack,两者都提供了Java API供应用开发者使用.虽然都可以播放声音,但两者还是有很大的区别的.其中最大的区别是MediaPlayer可以 ...

  9. 深入剖析Android音频(三)AudioPolicyService

    原址 AudioPolicyService是策略的制定者,比如什么时候打开音频接口设备.某种Stream类型的音频对应什么设备等等.而AudioFlinger则是策略的执行者,例如具体如何与音频设备通 ...

  10. Android 音频系统:从 AudioTrack 到 AudioFlinger(全)

    Android 音频框架概述 Audio 是整个 Android 平台非常重要的一个组成部分,负责音频数据的采集和输出.音频流的控制.音频设备的管理.音量调节等,主要包括如下部分: Audio App ...

最新文章

  1. spring之继承配置
  2. python简单发音-Python如何实现文本转语音
  3. vue组件库(二):基于verdaccio工具npm私服搭建
  4. maven学习(中)- 私服nexus搭建
  5. 非归档模式下重做日志覆盖后的rman恢复
  6. cambridge mphil in management result
  7. STM32的ADC采集的引脚汇总
  8. 电脑cpu温度过高怎么办_网络资讯:电脑cpu占用过高处理办法
  9. php的list函数的使用,php list函数如何使用
  10. slf4j和log4j的使用
  11. 钉钉、微信产品大PK,基因已经决定了结果
  12. Android源码学习(一)系统源码初识
  13. VGG16和VGG19的理解
  14. 伊甸园日历游戏(vijos--1004)
  15. 小纸条:阿里云资源分享站
  16. Nicholas C. Zakas:我得到的最佳职业生涯建议
  17. 像素排列 p(Pentile)排列 RGB 排列
  18. 【JavaWEB】项目实战-黑马面面
  19. TensorFlow输出矩阵的乘法
  20. 2021.07.07 宇信科技

热门文章

  1. VS2015社区版MFC安装
  2. 单片机编程技巧—状态机编程
  3. PS如何做文字扫描效果(用于较清晰的扫描件)
  4. StandUp 定时休息软件
  5. L73.linux命令每日一练 -- 第十章 Linux网络管理命令 -- dig和host
  6. android 地址json文件,Android访问assets本地json文件的方法
  7. 【Delphi】如何在三轴加速器的频谱分析中使用FFT(快速傅里叶变换)算法
  8. 单片机数码管显示原理
  9. 遗传算法原理与matlab,有关路径优化遗传算法原理(结合matlab代码)
  10. FlashFXP 5.0.0官方中文破解版,附文件下载地址和破解码