车载音频实现依赖标准 Android 音频 HAL,其中包括以下内容:

IDevice (hardware/interfaces/audio/2.0/IDevice.hal)。负责创建输入流和输出流、处理主音量和静音操作,以及使用:

createAudioPatch 在设备之间创建 external-external 补丁程序。

IDevice.setAudioPortConfig() 为各个物理音频流提供音量。

IStream (hardware/interfaces/audio/2.0/IStream.hal)。连同输入变体和输出变体一起管理进出硬件的样本音频流。

车载设备类型

以下设备类型与车载平台相关:

设备类型

说明

AUDIO_DEVICE_OUT_BUS

Android 的主要输出(Android 的所有音频均通过这种方式提供给车辆)。用作消除各个上下文的信息流歧义的地址。

AUDIO_DEVICE_OUT_TELEPHONY_TX

用于传输路由到手机无线装置的音频。

AUDIO_DEVICE_IN_BUS

用于尚未进行分类的输入。

AUDIO_DEVICE_IN_FM_TUNER

仅用于广播无线装置输入。

AUDIO_DEVICE_IN_TV_TUNER

用于电视设备(如果存在)。

AUDIO_DEVICE_IN_LINE

用于 AUX 输入耳机插孔。

AUDIO_DEVICE_IN_BLUETOOTH_A2DP

通过蓝牙接收到的音乐。

AUDIO_DEVICE_IN_TELEPHONY_RX

用于从手机无线装置接收到的与通话相关联的音频。

路由音频源

您应使用 AudioRecord 或相关 Android 机制捕获大多数音频源。接下来,可为数据分配 AudioAttributes 并通过 AndroidTrack 播放数据,只需依赖默认的 Android 路由逻辑或通过对 AudioRecord 或 AudioTrack 对象显式调用 setPreferredDevice() 即可。

对于与外部混音器之间有专用硬件连接的来源或具有极为严苛的延迟要求的来源,您可以使用 createAudioPatch() 和 releaseAudioPatch() 来启用和停用外部设备之间的路由(在样本传输过程中无需使用 AudioFlinger)。

配置音频设备

Android 可见的音频设备必须在 /audio_policy_configuration.xml 中进行定义,其中包括以下组件:

module name。支持“primary”(用于汽车用例)、“A2DP”、“remote_submix”和“USB”。模块名称和相应音频驱动程序应编译到 audio.primary.$(variant).so 中。

devicePorts。包含可从此模块访问的所有输入和输出设备(包括永久连接的设备和可移除设备)的设备描述符列表。

对于每种输出设备,您可以定义增益控制(包含以 millibel 为单位的 min/max/default/step 值,其中 1 millibel = 1/100 dB = 1/1000 bel)。

devicePort 实例中的地址属性可用于查找设备(即使多个设备的设备类型均为 AUDIO_DEVICE_OUT_BUS)。

mixPorts。包含由音频 HAL 提供的所有输出流和输入流的列表。每个 mixPort 实例都可被视为传输到 Android AudioService 的物理音频流。

routes。定义输入和输出设备之间或音频流和设备之间可能存在的连接的列表。

以下示例定义了输出设备 bus0_phone_out,其中所有 Android 音频流都通过 mixer_bus0_phone_out 完成混音。路由将 mixer_bus0_phone_out 的输出流传递到 device bus0_phone_out。

bus0_phone_out

bus0_phone_out

role="source"

flags="AUDIO_OUTPUT_FLAG_PRIMARY">

samplingRates="48000"

channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>

role="sink"

type="AUDIO_DEVICE_OUT_BUS"

address="BUS00_PHONE">

samplingRates="48000"

channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>

minValueMB="-8400"

maxValueMB="4000"

defaultValueMB="0"

stepValueMB="100"/>

sources="mixport_bus0_phone_out"/>

指定 devicePorts

车载平台应该为每个输入到 Android 和从 Android 输出的物理音频流指定 devicePort 实例。对于输出音频流,每个 devicePort 实例的类型都应该为 AUDIO_DEVICE_OUT_BUS,并采用整数(即总线 0、总线 1 等)编址。mixPort 实例与 devicePort 实例的数量之比应为 1:1,并应允许指定可以路由到每条总线的数据格式。

车载实现可以使用多个输入设备类型,包括 FM_TUNER(保留以用于广播无线装置输入)、MIC 设备(用于处理麦克风输入)和 TYPE_AUX_LINE(用于表示模拟线路输入)。所有其他输入流都会分配到 AUDIO_DEVICE_IN_BUS 并在通过 AudioManager.getDeviceList() 调用枚举设备时被发现。各个来源可根据 AudioDeviceInfo.getProductName() 进行区分。

您还可以将外部设备定义为端口,然后通过音频 HAL 的 IDevice::createAudioPatch 方法(通过新的 CarAudioManager 入口点提供)使用这些端口与外部硬件互动。

如果存在基于总线的音频驱动程序,必须将 audioUseDynamicRouting 标志设置为 true:

true

如需了解详情,请参阅 device/generic/car/emulator/audio/overlay/packages/services/Car/service/res/values/config.xml。

android hal 音频分析,实现车载音频 HAL  |  Android 开源项目  |  Android Open Source Project...相关推荐

  1. 【开源项目----Android OPenGLES渲染YUV视频文件】

    [开源项目----Android OPenGLES渲染YUV视频文件] OpenGLES对YUV渲染相关文章参考

  2. Android GNSS 模块分析(四)HAL 层

    紧接着上一篇(Android GNSS 模块分析(三)JNI 层),继续来分析下 Android GNSS HAL 层的功能,本篇准备先介绍下 HIDL 层的封装.至于后面的 HAL 层的功能,由于使 ...

  3. android hal 定时器,汽车监控定时器  |  Android 开源项目  |  Android Open Source Project...

    使用汽车监控定时器帮助调试 VHAL.汽车监控定时器可监控进程的运行状况并终止运行状况不佳的进程.如需通过汽车监控定时器监控某个进程,必须向汽车监控定时器注册该进程.当汽车监控定时器终止运行状况不佳的 ...

  4. hal系统命令 android,转换 HAL 模块  |  Android 开源项目  |  Android Open Source Project...

    您可以通过转换 hardware/libhardware/include/hardware 中的头文件,将已有的 HAL 模块更新为 HIDL HAL 模块. 使用 c2hal .hal 文件,请使用 ...

  5. android的wifi直连,WLAN 直连  |  Android 开源项目  |  Android Open Source Project

    WLAN 直连功能又称"WLAN 点对点",它允许支持设备直接使用 WLAN 直连协议发现其他设备并与之互连(无需连接到互联网或移动网络).此功能是基于 Wi-Fi 联盟 (WFA ...

  6. Android Hawk数据库的源码解析,Github开源项目,基于SharedPreferences的的存储框架

    今天看了朋友一个项目用到了Hawk,然后写了这边文章 一.了解一下概念 Android Hawk数据库github开源项目 Hawk是一个非常便捷的数据库.操作数据库只需一行代码,能存任何数据类型. ...

  7. android壁纸软件代码,Flutter开源项目——Android免费壁纸应用

    简介 free_wallpaper是一款基于flutter的免费Android壁纸应用 项目明细 开发环境: android studio 3.5 Flutter 1.12.13+hotfix.7 • ...

  8. Android开发者必须深入学习的10个应用开源项目

    Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧和创造力.学习开源代码是掌握技术的一个 ...

  9. android10分区镜像,分区和映像  |  Android 开源项目  |  Android Open Source Project

    分区 Android 设备包含若干个分区,这些分区在启动过程中发挥不同的作用.为了支持 A/B 更新,设备需要为 boot.system.vendor 和 radio 分区分别单独配置一个槽位. bo ...

最新文章

  1. [C#]判断是否是合法的IP4,IP6地址
  2. synchronized关键字以及实例锁 类锁
  3. 创业公司如何做数据分析(四)ELK日志系统
  4. 怎样玩转千万级别的数据
  5. 使用ffmpeg 的 filter 给图片添加水印
  6. Ubicomp2018年论文列表
  7. linux 如何产生so文件,printf()函数 【转】Linux下gcc编译生成动态链接库*.so文件并调用它(2)...
  8. java类加载及new对象的过程
  9. win11安装报错0xc1900101怎么办 Windows11安装报错0xc1900101的解决方法
  10. CSS3渐变——gradient
  11. 微软再次强调:爱开发 爱 Linux!
  12. go home(2)-supprise
  13. 谢旭升《操作系统教程》课后习题解答
  14. SpringSecurity之权限管理
  15. 你要的《高性能MySQL》.pdf
  16. 视频教程-Visio应用视频教程(上)-Office/WPS
  17. %date:~0,4%和 %time:~0,2%字符截取操作用法
  18. 赖世雄老师---名词性从句
  19. 【汇智学堂】基于Socket实现的网络版梅花易数一撮金游戏
  20. 携创教育:2022学历改革解读系列|提升学历、迫在眉睫

热门文章

  1. 设计精美的引导着陆页html模板源码下载
  2. 首屏时间从12.67s到1.06s,我是如何做到的?
  3. 关于java二维数组长度(length)的知识
  4. 微电子新手入门之ADS常用操作——ADS的port与layout不能相连
  5. 女朋友过生日,我花了20分钟给她写了一个代理服务器
  6. 舒舍说:女生第一次租房要注意哪些问题?
  7. tp6属性绑定到父模型相关知识点
  8. IDEA如何配置 默认Maven 镜像仓库地址
  9. 应用架构B/S与C/S优劣比较(一)
  10. js 下获取子元素的方法