【AAOS】【源码分析】CarAudioService(二)-- 功能介绍

汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、导航指导、语音命令等的无缝融合。

汽车音频主要包括音量控制、音频路由、音频焦点、多区音频等功能。主要功能如下:

  1. 音量控制: 通过将音频设备分组到音量组(Volume Groups),CarAudioService 实现对特定设备组的音量和静音控制。所有属于同一音量组的设备将同步调整音量。

  2. 音频路由(Audio Routing):是指系统如何决定将音频流从一个或多个音频源(如音乐播放器、应用、游戏等)发送到哪些音频输出设备的过程。音频路由对于确保音频数据能够正确、高效地传输到目标设备至关重要。

  3. 音频焦点管理(Audio Focus): 该服务通过注册音频策略焦点监听器来管理应用程序的音频焦点请求。它使用交互矩阵(Interaction Matrix)来定义不同音频使用场景(如导航、媒体播放、电话等)之间的交互方式,包括并行、独占或拒绝等策略。

  4. 音频区域管理(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
1MUSIC

USAGE_UNKNOWN, USAGE_GAME, USAGE_MEDIA

2NAVIGATION

USAGE_ASSISTANCE_NAVIGATION_GUIDANCE

3VOICE_COMMAND

USAGE_ASSISTANT, USAGE_ASSISTANCE_ACCESSIBILITY

4CALL_RING

USAGE_NOTIFICATION_RINGTONE

5CALL

USAGE_VOICE_COMMUNICATION, USAGE_CALL_ASSISTANT, 

USAGE_VOICE_COMMUNICATION_SIGNALLING

6ALARM

USAGE_ALARM

7NOTIFICATION

USAGE_NOTIFICATION, USAGE_NOTIFICATION_EVENT

8SYSTEM_SOUND

USAGE_ASSISTANCE_SONIFICATION

9EMERGENCY

USAGE_EMERGENCY

10SAFETY

USAGE_SAFETY

11VEHICLE_STATUS

USAGE_VEHICLE_STATUS

12ANNOUNCEMENT

USAGE_ANNOUNCEMENT

 音频 HAL

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

  • IDevice.hal:负责创建输入声音流和输出声音流、处理主音量和静音操作,以及使用:
    • createAudioPatch:在设备之间创建外部-外部音频通路。
    • IDevice.setAudioPortConfig():为各个物理声音流提供音量。
  • IStream.hal:连同输入变体和输出变体一起管理进出硬件的样本音频流。

车载设备类型

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

No.设备类型说明
1AUDIO_DEVICE_OUT_BUSAndroid 的主要输出(Android 的所有音频均通过这种方式提供给车辆)。用作消除各个上下文的信息流歧义的地址。
2AUDIO_DEVICE_OUT_TELEPHONY_TX用于传输路由到手机无线装置的音频。
3AUDIO_DEVICE_IN_BUS用于尚未进行分类的输入。
4AUDIO_DEVICE_IN_FM_TUNER仅用于广播无线装置输入。
5AUDIO_DEVICE_IN_TV_TUNER用于电视设备(如果存在)。
6AUDIO_DEVICE_IN_LINE用于 AUX 输入耳机插孔。
7AUDIO_DEVICE_IN_BLUETOOTH_A2DP通过蓝牙接收到的音乐。
8AUDIO_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的示例定义了音频设备组件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker安装软件汇总(持续更新)

1、简介 本文介绍一些常用的软件通过docker安装并启动,持续更新。 2、docker安装软件 2.1、zookeeper & kafka # 1、拉取zookeeper镜像 git pull wurstmeister/zookeeper # 2、启动zookeeper容器 docker run -d --restartalways --log-driver json-file --lo…

MySQL的左连接、右连接、内连接、外连接

一、前言 MySQL中的左连接、右连接、内连接和全外连接是用于多表关联查询的核心操作。 二、内连接(INNER JOIN) 定义:返回两个表中完全匹配的行,即只保留两个表连接字段值相等的行。示例场景:查询所有有选课记录的学…

前端面试宝典---数据类型

基本数据类型 对于基本类型在创建时无需使用 new 关键字 Bigint在实际开发不常用,如果对于精度要求高可以使用第三方库,如decimal.js 基本数据类型介绍 undefined:当变量被声明但未赋值,或者函数没有返回值时,就会呈现…

Lua 函数使用的完整指南

在 Lua 中,函数是一等公民(First-Class Citizen),这意味着函数可以像其他值一样被赋值、传递和操作。以下是 Lua 函数定义的完整指南,涵盖基础语法、高级特性、设计模式及性能优化。 在Lua 中,函数定义的完…

使用StockTV API对接印度金融市场数据全指南:K线、实时行情与IPO新股

一、印度金融市场数据特点 印度作为全球增长最快的主要经济体之一,其金融市场具有以下显著特征: 双交易所体系:国家证券交易所(NSE)和孟买证券交易所(BSE)高流动性品种:Nifty 50指数成分股、银行股等独特交易机制:T2…

2021-10-26 C++繁忙通信兵

缘由繁忙的通讯兵,可以解决一下吗-编程语言-CSDN问答 void 繁忙通信兵() {//缘由https://ask.csdn.net/questions/7544401?spm1005.2025.3001.5141int a 200, s1 8, s2 5, s3 45, p 0, n 0, c 0;std::cin >> n;while (a > n){a - s1 s2;if (a &l…

【Linux】进程控制:创建、终止、等待与替换全解析

文章目录 前言一、重谈进程创建二、进程终止2.1 正常终止的退出码机制2.2 异常终止的信号机制2.3 进程常见的退出方法 三、进程等待:避免僵尸进程的关键3.1 进程等待的必要性3.2 进程等待的两个系统调用接口3.2.1 wait()3.2.2 waitpid()区别 四、进程程序替换4.1 进…

基于Redis实现短信防轰炸的Java解决方案

基于Redis实现短信防轰炸的Java解决方案 前言 在当今互联网应用中,短信验证码已成为身份验证的重要手段。然而,这也带来了"短信轰炸"的安全风险 - 恶意用户利用程序自动化发送大量短信请求,导致用户被骚扰和企业短信成本激增。本…

【后端开发】Spring MVC-常见使用、Cookie、Session

文章目录 代码总结初始化--RestController、RequestMapping传递参数单参数多参数 传递对象后端参数重命名(后端参数映射)--RequestParam必传参数设置非必传参数 传递数组传递集合传递JSON数据JSON语法JSON格式转换JSON优点传递JSON对象 获取URL中参数--P…

青少年编程考试 CCF GESP Python七级认证真题 2025年3月

Python 七级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B C A B B A A B C A B B A B A 1 单选题(每题 2 分,共 30 分) 第 1 题 下列哪个选项是python中的关键字? A. function B. class C. method D. object…

Vue 框架组件间通信方式

组件间通信方式 不管是 vue2 还是 vue3,组件通信方式很重要,以下是常见的几种通信方式: props:可以实现父子组件、子父组件、甚至兄弟组件通信自定义事件:可以实现子父组件通信全局事件总线 $bus:可以实现…

SpringBoot学生成绩管理系统设计与实现

概述 幽络源本次分享的基于SpringBoot的学生成绩管理系统项目,采用主流的Java技术栈开发,实现了从学生信息管理到成绩统计分析的全流程数字化管理。 主要内容 管理员功能模块 ​​学生信息管理​​:维护学生基本信息档案,支持…

青少年编程与数学 02-016 Python数据结构与算法 01课题、算法

青少年编程与数学 02-016 Python数据结构与算法 01课题、算法 一、算法的定义二、算法的设计方法1. 分治法2. 动态规划法3. 贪心算法4. 回溯法5. 迭代法6. 递归法7. 枚举法8. 分支定界法 三、算法的描述方法1. **自然语言描述**2. **流程图描述**3. **伪代码描述**4. **程序设计…

Java 实现冒泡排序:[通俗易懂的排序算法系列之二]

引言 大家好!欢迎来到我的排序算法系列第二篇。今天,我们将学习另一种非常基础且广为人知的排序算法——冒泡排序 (Bubble Sort)。 冒泡排序的名字非常形象,它模拟了水中气泡上升的过程:较小(或较大)的元素会像气泡一样,通过不断交换,逐渐“浮”到数组的一端。 什么是…

struct结构体、union联合体和枚举

目录 一、结构体的声明和使用 1.1 结构体正常声明和创建 1.2 结构体特殊声明 1.3 结构体的自引用 二、结构体内存对齐 2.1 对齐规则 2.2 #pragma修改 三、结构体传参 四、结构体位段 4.1 位段内存分配 4.2 位段内存应用 五、结构体中的柔性数组概念 六、union联合…

大模型本地部署系列(2) Ollama部署DeepSeek-R1

成功运行截图 部署步骤 我们进入到ollama的官网: Ollama​ollama.com/​编辑 找到上方的Models ,然后点击 此时会跳转到模型列表页面: 点击 deepseek-r1 链接进去,此时我们会看到下拉框中有各个版本的大模型,越往后…

绘制动态甘特图(以流水车间调度为例)

import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np from matplotlib import cm# 中文字体配置(必须放在所有绘图语句之前) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

PyTorch实现线性回归的基础写法与封装API写法

目录 1. 基础写法 1.1导包 2.2加载读取数据 2.3原始数据可视化(画图显示) 2.4线性回归的(基础)分解写法 2.5定义训练过程 2.PyTorch实现 线性回归的封装写法(实际项目中的常用写法) 2.1创建线性回归模型 2.2定义损失函数 2.3定义优化器 2.4定义训练过程 1…

python 常用的6个爬虫第三方库

Python中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析为树形…

基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)

基于BP神经网络的杂草智能识别系统 项目介绍 本项目是一个基于PyQt5和BP神经网络的杂草智能识别系统。系统通过图像处理和神经网络技术, 能够识别8种不同的杂草类别。用户可以通过上传图片,系统会自动识别图片中的杂草类别,并显示识别结果和…