【AAOS】【源码分析】CarAudioService(二)-- 功能介绍
汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、导航指导、语音命令等的无缝融合。
汽车音频主要包括音量控制、音频路由、音频焦点、多区音频等功能。主要功能如下:
-
音量控制: 通过将音频设备分组到音量组(Volume Groups),CarAudioService 实现对特定设备组的音量和静音控制。所有属于同一音量组的设备将同步调整音量。
-
音频路由(Audio Routing):是指系统如何决定将音频流从一个或多个音频源(如音乐播放器、应用、游戏等)发送到哪些音频输出设备的过程。音频路由对于确保音频数据能够正确、高效地传输到目标设备至关重要。
-
音频焦点管理(Audio Focus): 该服务通过注册音频策略焦点监听器来管理应用程序的音频焦点请求。它使用交互矩阵(Interaction Matrix)来定义不同音频使用场景(如导航、媒体播放、电话等)之间的交互方式,包括并行、独占或拒绝等策略。
-
音频区域管理(Audio Zones): CarAudioService 支持将车辆的音频设备划分为不同的区域(zones),每个区域可以独立控制音频输出。例如,前排和后排座位可以播放不同的音频内容。
整体实现
AAOS 主要使用 AudioAttributes.AttributeUsages 进行路由、音量调整和焦点管理。AttributeUsages用于表示播放声音流的“原因”。因此,所有声音流和音频焦点请求都应为其音频播放指定AttributeUsages。如果在构建 AudioAttributes 对象时未明确设置,则用法将默认为 USAGE_UNKNOWN。虽然目前会对此用法采取与 USAGE_MEDIA 一样的处理,但不应依赖此行为进行媒体播放。
系统用途(System Usages)
Android 11 中引入了系统用法。这些用法的行为与之前确立的用法类似,不同之处在于它们需要使用系统 API 以及 android.permission.MODIFY_AUDIO_ROUTING。在 Android Automotive 操作系统(AAOS)中,System Usages(系统用途)指的是一组预定义的音频使用场景,这些场景用于管理和路由车载音频。当前系统用法如下:
| No. | 值 | 描述 |
|---|---|---|
| 1 | USAGE_CALL_ASSISTANT | 用于语音助手在处理电话(蜂窝网络或 VoIP)通话时的音频交互。 |
| 2 | USAGE_EMERGENCY | 用于紧急情况的音频,例如车辆碰撞警报或其他需要立即引起注意的紧急通知。 |
| 3 | USAGE_SAFETY | 用于安全相关的音频提示,例如安全带未系提示音或车道偏离警告。 |
| 4 | USAGE_VEHICLE_STATUS | 用于车辆状态的音频通知,例如车门未关好的提醒或油量不足的提示。 |
| 5 | USAGE_ANNOUNCEMENT | 用于一般性的公告或广播音频,例如全车广播的通知或信息发布。 |
| 6 | USAGE_SPEAKER_CLEANUP | 用于扬声器清理过程中的音频播放,例如播放特定频率的声音以清除扬声器中的异物。 |
若要通过系统用法构造 AudioAttributes,请使用 AudioAttributes.Builder#setSystemUsage,而不是 setUsage。如果要通过非系统用法调用此方法,就会导致系统抛出 IllegalArgumentException。此外,如果同时在构建器上设置了系统用法和非系统用法,则在构建时将会抛出 IllegalArgumentException。
音频上下文(Audio contexts)
为了简化 AAOS 音频的配置,类似用法均已归入 CarAudioContext。这些音频上下文会在整个 CarAudioService 中使用,以定义路由、音量组和音频焦点管理。音频上下文与属性用途的映射关系如下:
| No. | CarAudioContext | 关联的 AttributeUsages |
|---|---|---|
| 1 | MUSIC | USAGE_UNKNOWN, USAGE_GAME, USAGE_MEDIA |
| 2 | NAVIGATION | USAGE_ASSISTANCE_NAVIGATION_GUIDANCE |
| 3 | VOICE_COMMAND | USAGE_ASSISTANT, USAGE_ASSISTANCE_ACCESSIBILITY |
| 4 | CALL_RING | USAGE_NOTIFICATION_RINGTONE |
| 5 | CALL | USAGE_VOICE_COMMUNICATION, USAGE_CALL_ASSISTANT, USAGE_VOICE_COMMUNICATION_SIGNALLING |
| 6 | ALARM | USAGE_ALARM |
| 7 | NOTIFICATION | USAGE_NOTIFICATION, USAGE_NOTIFICATION_EVENT |
| 8 | SYSTEM_SOUND | USAGE_ASSISTANCE_SONIFICATION |
| 9 | EMERGENCY | USAGE_EMERGENCY |
| 10 | SAFETY | USAGE_SAFETY |
| 11 | VEHICLE_STATUS | USAGE_VEHICLE_STATUS |
| 12 | ANNOUNCEMENT | USAGE_ANNOUNCEMENT |
音频 HAL
车载音频实现依赖标准 Android 音频 HAL,其中包括以下内容:
IDevice.hal:负责创建输入声音流和输出声音流、处理主音量和静音操作,以及使用:createAudioPatch:在设备之间创建外部-外部音频通路。IDevice.setAudioPortConfig():为各个物理声音流提供音量。
IStream.hal:连同输入变体和输出变体一起管理进出硬件的样本音频流。
车载设备类型
以下设备类型与车载平台相关:
| No. | 设备类型 | 说明 |
|---|---|---|
| 1 | AUDIO_DEVICE_OUT_BUS | Android 的主要输出(Android 的所有音频均通过这种方式提供给车辆)。用作消除各个上下文的信息流歧义的地址。 |
| 2 | AUDIO_DEVICE_OUT_TELEPHONY_TX | 用于传输路由到手机无线装置的音频。 |
| 3 | AUDIO_DEVICE_IN_BUS | 用于尚未进行分类的输入。 |
| 4 | AUDIO_DEVICE_IN_FM_TUNER | 仅用于广播无线装置输入。 |
| 5 | AUDIO_DEVICE_IN_TV_TUNER | 用于电视设备(如果存在)。 |
| 6 | AUDIO_DEVICE_IN_LINE | 用于 AUX 输入耳机插孔。 |
| 7 | AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 通过蓝牙接收到的音乐。 |
| 8 | AUDIO_DEVICE_IN_TELEPHONY_RX | 用于从移动网络电台接收到的与通话相关联的音频。 |
配置音频设备
Android 可见的音频设备必须在 /audio_policy_configuration.xml 中进行定义,其中包括以下组件:
- 模块名称:支持“primary”(用于汽车用例)、“A2DP”、“remote_submix”和“USB”。模块名称和相应音频驱动程序应编译到
audio.primary.$(variant).so中。 - devicePorts:包含可从此模块访问的所有输入和输出设备(包括永久连接的设备和可移除设备)的设备描述符列表。
- 对于每种输出设备,您可以定义增益控制(包含以 millibel 为单位的 min/max/default/step 值,其中 1 millibel = 1/100 dB = 1/1000 bel)。
- 即使有多个设备的设备类型为
AUDIO_DEVICE_OUT_BUS,也可以使用 devicePort 实例上的地址属性查找设备。
- mixPorts:包含由音频 HAL 提供的所有输出声音流和输入声音流的列表。每个 mixPort 实例都可被视为传输到 Android AudioService 的物理声音流。
- routes:定义输入和输出设备之间或声音流和设备之间可能存在的连接的列表。
以下audioPolicyConfiguration的示例定义了音频设备组件:
相关文章:
【AAOS】【源码分析】CarAudioService(二)-- 功能介绍
汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、…...
mapbox基础,加载F4Map二维地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...
Android:Android Studio右侧Gradle没有assembleRelease等选项
旧版as是“Do not build Gradle task list during Gradle sync” 操作这个选项。 参考这篇文章:Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包_gradle 没有task-CSDN博客 在as2024版本中,打开Setting…...
DRAM CRC:让DDR5内存数据更靠谱
DRAM(动态随机存取存储器)是电脑内存的核心部件,负责存储和传输数据。如果数据在传输中出错,后果可能很严重,比如程序崩溃或者数据损坏。为了解决这个问题,DDR5内存引入了一个新功能,叫DRAM CRC(循环冗余校验)。简单来说,它是用来检查读写数据有没有问题的工具。 下面…...
RAI Toolbox详解
RAI Toolbox详解 摘要 RAI Toolbox是一个综合性的工具集,旨在帮助开发者和AI系统利益相关者更负责任地开发和监控AI系统,并做出更好的数据驱动决策。本文将详细介绍RAI Toolbox的功能、使用场景以及与类似AI项目的对比,帮助读者全面了解RAI…...
心率测量-arduino+matlab
参考:【教程】教你玩转Stduino之手指心跳检测模块 - 知乎 (zhihu.com) 1 原理 心跳检测模块,由一个红外线发射LED和红外接收器构成。手指心跳监测模块能够测量脉搏,是这样工作的:当手指放在发射器与接收器之间,红外发射…...
H3C的MSTP+VRRP高可靠性组网技术(MSTP单域)
以下内容纯为博主分享自己的想法和理解,如有错误轻喷 MSTP多生成树协议可以基于不同实例实现不同VLAN之间的负载分担 VRRP虚拟路由器冗余协议可以提高网关的可靠性防止单点故障的可能 在以前这两种协议通常一起搭配组网,来提高网络的可靠性和稳定性&a…...
字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口&am…...
Centos7下安装hive详细步骤
在Centos 7系统上安装Hive的步骤如下: 下载Hive:首先,在Apache Hive的官方网站上下载最新版本的Hive压缩包,地址为:https://hive.apache.org/downloads.html。选择合适的版本并下载。 解压Hive压缩包:将下…...
Verilog学习-1.模块的结构
module aoi(a,b,c,d,f);/*模块名为aoi,端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...
Linux驱动-块设备驱动
Linux驱动-块设备驱动 一,块设备驱动简介二,无请求队列情况(EMMC和SD卡等)三,请求队列情况(磁盘等带有I/O调度的设备)四,两者在驱动上区别 一,块设备驱动简介 块设备驱动…...
ffmpeg函数简介(封装格式相关)
文章目录 🌟 前置说明:FFmpeg 中 AVFormatContext 是什么?🧩 1. avformat_alloc_context功能:场景: 🧩 2. avformat_open_input功能:说明:返回值: ǹ…...
Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决
1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...
[随笔] nn.Embedding的前向传播与反向传播
nn.Embedding的前向传播与反向传播 nn.Embedding的前向计算过程 embedding module 的前向过程其实是一个索引(查表)的过程 表的形式是一个 matrix(embedding.weight, learnable parameters) matrix.shape: (v, h) v:…...
搜广推校招面经七十一
滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法,尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好,从而推荐他们可能喜欢的内容。 1.1. 直观理解&…...
【算法学习】链表篇:链表的常用技巧和操作总结
算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在各种数据结构中,链表是最常用的几个之一,熟练使用链表和链表相关的算法,可以让我们在处理很多问题上都更加…...
View UI (iview)表格拖拽排序
在使用 iView UI 的 Table 组件进行拖拽排序时,可以通过以下步骤获取最新的排序数据: 1. 启用拖拽功能 在 Table 组件上设置 draggable 属性,并绑定拖拽结束事件 on-row-drop。 <template><Table:columns"columns":dat…...
OpenNMT 部署和集成指南
OpenNMT(Open Neural Machine Translation)是一个开源的神经机器翻译(NMT)系统,由 Systran 和 Harvard NLP Group 在 2016 年联合推出。它的目标是为研究人员和企业开发者提供一个高质量、灵活且易于扩展的机器翻译框架…...
2台8卡L20服务器集群推理方案
1、整体流程梳理 #mermaid-svg-0aNtsWUnOH7ewXpN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0aNtsWUnOH7ewXpN .error-icon{fill:#552222;}#mermaid-svg-0aNtsWUnOH7ewXpN .error-text{fill:#552222;stroke:#55…...
HarmonyOS:使用geoLocationManager (位置服务)获取位置信息
一、简介 位置服务提供GNSS定位、网络定位(蜂窝基站、WLAN、蓝牙定位技术)、地理编码、逆地理编码、国家码和地理围栏等基本功能。 使用位置服务时请打开设备“位置”开关。如果“位置”开关关闭并且代码未设置捕获异常,可能导致应用异常。 …...
系统分析师(二)--操作系统
概述 进程管理 选项A:该进程中打开的文件 进程中打开的文件是由整个进程来管理的,同一进程下的各个线程都可以对这些打开的文件进行访问和操作,所以进程中打开的文件是可以被这些线程共享的。 选项B:该进程的代码段 进程的代码…...
安科瑞测频仪表:新能源调频困局的破局者
安科瑞顾强 在“双碳”目标推动下,风电、光伏等新能源正加速成为电力供应的核心力量。然而,新能源发电的间歇性与波动性,如同一把“双刃剑”,在提供清洁电力的同时,也给电网稳定运行带来了前所未有的挑战。国家能源局…...
富士相机照片 RAF 格式如何快速批量转为 JPG 格式教程
富士(Fujifilm)相机拍摄的 RAW 格式文件(RAF)因其高质量和丰富的图像信息而受到摄影师的喜爱。然而,RAF 文件通常体积较大且不易于分享或直接使用。为了方便处理,许多人选择将其转换为更通用的 JPG 格式。在…...
Linux 入门指令(1)
(1)ls指令 ls -l可以缩写成 ll 同时一个ls可以加多个后缀 比如 ll -at (2)pwd指令 (3)cd指令 cd .是当前目录 (4)touch指令 (5)mkdir指令 (6)rmdir和rm…...
Redis缓存数据库一致性
前言: 在系统开发中经常使用关系型数据库,为了提升关系型数据库的读性能,一般会使用redis加一层缓存,缓存和数据库是分离的两次操作,本文用来分析如何操作能保证缓存和数据库的数据一致性。 一、读场景 二、写场景 …...
Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin
Android Coil 3 Fetcher大批量Bitmap拼接成1张扁平宽图,Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><u…...
文件相关:treecpmv命令扩展详解
拷贝和移动文件 序号命令对应英文作用01tree [目录名]tree以树状图列出文件目录结构02cp 源文件 目标文件copy复制文件或者目录03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名 一、 tree命令 (1)定义 tree 命令可以以树状…...
S32K144的m_data_2地址不够存,重新在LD文件中配置地址区域
在开发平台软件的时候代码中超出了64K的内存,单纯在ld文件中,增加m_data_2的存储长度,原先是0x00007000,我将长度修改为0x00008000,起始地址还是0x20000000,软件编译没有报错堆栈超出,但是软件下载到单片机中之后,144不…...
基于 SysTick 定时器实现任务轮询调度器
文章目录 前言一、SysTick 定时器介绍二、SysTick 驱动设计1. 初始化方法2. SysTick 中断函数3. 时间类 API 三、任务调度器设计1. 任务结构体2. 任务初始化3. 主调度器4. 调度器更新 四、任务函数实现五、总结1. 优缺点分析2. 扩展建议 前言 在嵌入式系统中,对于资…...
【STM32】综合练习——智能风扇系统
目录 0 前言 1 硬件准备 2 功能介绍 3 前置配置 3.1 时钟配置 3.2 文件配置 4 功能实现 4.1 按键功能 4.2 屏幕功能 4.3 调速功能 4.4 倒计时功能 4.5 摇头功能 4.6 测距待机功能 0 前言 由于时间关系,暂停详细更新,本文章中,…...
