Android automotive车载开发(1)-----Automotive audio

这篇具有很好参考价值的文章主要介绍了Android automotive车载开发(1)-----Automotive audio。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

车载音频

Android Automotive OS (AAOS) 是在核心 Android 音频堆栈的基础之上打造而成,以支持用作车辆信息娱乐系统的用例。AAOS 负责实现信息娱乐声音(即媒体、导航和通讯声音),但不直接负责具有严格可用性和计时要求的铃声和警告。虽然 AAOS 提供了信号和机制来帮助车辆管理音频,但最终还是由车辆来决定应为驾驶员和乘客播放什么声音,从而确保对保障安全至关重要的声音和监管声音能被确切听到,而不会中断。

当 Android 管理车辆的媒体体验时,应通过应用来代表外部媒体来源(例如电台调谐器),这类应用可以处理该来源的音频焦点和媒体键事件。

对于与汽车相关的音频支持,Android 11 进行了以下更改:

  • 根据关联的用户 ID 自动选择音频区
  • 新的系统用法可支持特定于汽车的声音
  • HAL 音频焦点支持
  • 非瞬态声音流的音频焦点延迟
  • 用于控制导航和通话之间交互的用户设置

Android 声音和声音流

汽车音频系统可以处理以下声音和声音流:

Android automotive车载开发(1)-----Automotive audio
图 1. 以声音流为中心的架构图
Android 管理来自 Android 应用的声音,同时控制这些应用,并根据其声音类型将声音路由到 HAL 中的输出设备:

  • 逻辑声音流:在核心音频命名法中称为“声源”,使用音频属性进行标记。
  • 物理声音流:在核心音频命名法中称为“设备”,在混音后没有上下文信息。

为了确保可靠性,外部声音(来自独立声源,例如安全带警告铃声)在 Android 外部(HAL 下方,甚至是在单独的硬件中)进行管理。系统实现者必须提供一个混音器,用于接受来自 Android 的一个或多个声音输入流,然后以合适的方式将这些声音流与车辆所需的外部声源组合起来。

HAL 实现和外部混音器负责确保对保障安全至关重要的外部声音能够被用户听到,而且负责在 Android 提供的声音流中进行混音,并将混音结果路由到合适的音响设备。

Android 声音

应用可以有一个或多个通过标准 Android API(如用于控制焦点的 AudioManager 或用于在线播放的 MediaPlayer)交互的播放器,以便发出一个或多个音频数据逻辑声音流。这些数据可能是单声道声音,也可能是 7.1 环绕声,但都会作为单个声源进行路由和处理。应用声音流与 AudioAttributes(可向系统提供有关应如何表达音频的提示)相关联。

逻辑声音流通过 AudioService 发送,并路由到一个(并且只有一个)可用的物理输出声音流,其中每个声音流都是混音器在 AudioFlinger 内的输出。音频属性在混合到物理声音流后将不再可用。

接下来,每个物理声音流都会传输到音频 HAL,以在硬件上呈现。在汽车应用中,呈现硬件可能是本地编解码器(类似于移动设备),也可能是车辆物理网络中的远程处理器。无论是哪种情况,音频 HAL 实现都需要提供实际样本数据并使其能被用户听见。

外部声音流

如果声音流因认证或计时原因而不应经由 Android,则可以直接发送到外部混音器。从 Android 11 开始,HAL 现在能够针对这些外部声音请求焦点,以通知 Android,使其能够采取适当措施(例如暂停媒体或阻止其他人获得焦点)。

如果外部声音流是应与 Android 正在生成的声音环境交互的媒体源(例如,当外部调谐器处于开启状态时,停止 MP3 播放),则那些外部声音流应由 Android 应用表示。此类应用将代表媒体来源(而非 HAL)请求音频焦点,并根据需要通过启动/停止外部声音源来响应焦点通知,以符合 Android 音频焦点政策规定。应用还负责处理媒体键事件,例如播放/暂停。如需控制此类外部设备,建议使用的一种机制是 HwAudioSource。

输出设备

在音频 HAL 级别,设备类型 AUDIO_DEVICE_OUT_BUS 提供用于车载音频系统的通用输出设备。总线设备支持可寻址端口(其中每个端口都是一个物理声音流的端点),并且应该是车辆内唯一受支持的输出设备类型。

系统实现可以针对所有 Android 声音使用一个总线端口,在这种情况下,Android 会将所有声音混合在一起,并将混音结果作为一个声音流进行传输。此外,HAL 可以分别为每个 CarAudioContext 提供一个总线端口,以允许并发传输任何声音类型。这样一来,HAL 实现就可以根据需要混合和闪避不同的声音。

音频上下文到输出设备的分配是通过 car_audio_configuration.xml 完成的。

麦克风输入

在捕获音频时,音频 HAL 会收到 openInputStream 调用,其中包含指示应如何处理麦克风输入的 AudioSource 参数。

VOICE_RECOGNITION 源(尤其是 Google 助理)需要一个符合以下条件的立体声麦克风流:具有回声消除效果(如果有),但不应用任何其他处理。波束成形应由 Google 助理来完成。

多声道麦克风输入

若要从具有两个以上声道(立体声)的设备捕获音频,请使用声道索引掩码,而不是定位索引掩码(例如 CHANNEL_IN_LEFT)。例如:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

如果 setChannelMask 和 setChannelIndexMask 均已设置,则 AudioRecord 仅使用由 setChannelMask 设置的值(最多两个声道)。

并发捕获

从 Android 10 开始,Android 框架支持并发捕获输入,但具有保护用户隐私的限制。作为这些限制的一部分,AUDIO_SOURCE_FM_TUNER 等虚拟来源会被忽略,因此可以与常规输入(例如麦克风)同时捕获。HwAudioSources 也不会被纳入并发捕获限制。

旨在与 AUDIO_DEVICE_IN_BUS 设备或辅助 AUDIO_DEVICE_IN_FM_TUNER 设备结合使用的应用必须依赖于以下功能:明确识别这些设备,以及使用 AudioRecord.setPreferredDevice() 绕过 Android 默认声源选择逻辑。

音频用法

AAOS 主要使用 AudioAttributes.AttributeUsages 进行路由、音量调整和焦点管理。用法用于表示播放声音流的“原因”。因此,所有声音流和音频焦点请求都应为其音频播放指定用法。如果在构建 AudioAttributes 对象时未明确设置,则用法将默认为 USAGE_UNKOWN。虽然目前会对此用法采取与 USAGE_MEDIA 一样的处理,但不应依赖此行为进行媒体播放。

系统用法

Android 11 中引入了系统用法。这些用法的行为与之前确立的用法类似,不同之处在于它们需要使用系统 API 以及 android.permission.MODIFY_AUDIO_ROUTING。新的系统用法如下:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

若要通过系统用法构造 AudioAttributes,请使用 AudioAttributes.Builder#setSystemUsage,而不是 setUsage。如果要通过非系统用法调用此方法,就会导致系统抛出 IllegalArgumentException。此外,如果同时在构建器上设置了系统用法和非系统用法,则在构建时将会抛出 IllegalArgumentException。

如需查看与 AudioAttributes 实例关联的用法,请调用 AudioAttributes#getSystemUsage。这将返回关联的用法或系统用法。

音频上下文

为了简化 AAOS 音频的配置,类似用法均已归入 CarAudioContext。这些音频上下文会在整个 CarAudioService 中使用,以定义路由、音量组和音频焦点管理。

Android 11 中的音频上下文包括:

CarAudioContext 关联的 AttributeUsages
MUSIC UNKNOWN, GAME, MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT, ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION, NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

音频上下文和用法之间的映射关系。突出显示的行用于新的系统用法。

多区音频

在汽车领域,围绕多个用户同时与平台互动并且每个用户都希望使用单独媒体的需求,出现了一系列新的用例。例如,后座上的乘客在后座显示屏上观看 YouTube 视频时,司机可以在驾驶舱中播放音乐。多区音频通过允许不同的音频源在车辆的不同音频区同时进行播放来实现此目的。

从 Android 10 开始提供的多区音频让原始设备制造商 (OEM) 能够将音频配置到单独的音频区。每个音频区由车辆内的一组设备组成,并且有各自的音量组、上下文路由配置以及焦点管理。通过这种方式,可以将主驾驶舱配置为一个音频区,而将后座显示屏的耳机插孔配置为第二个音频区。

这些音频区被定义为 car_audio_configuration.xml 的一部分。然后,CarAudioService 读取该配置,并帮助 AudioService 根据关联的音频区路由音频流。每个音频区仍会根据上下文和应用 UID 定义路由规则。创建播放器时,CarAudioService 会确定播放器与哪个音频区相关联,然后根据用法确定 AudioFlinger 应将音频路由到哪个设备。

每个音频区的焦点也是单独维护的。这使得不同音频区中的应用可以单独生成音频,而不会彼此干扰,同时让应用保持关注其所在音频区内焦点的变化。CarAudioService 内中的 CarZonesAudioFocus 负责管理每个音频区的焦点。

Android automotive车载开发(1)-----Automotive audio

音频 HAL

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

  • IDevice.hal:负责创建输入声音流和输出声音流、处理主音量和静音操作,以及使用:
    createAudioPatch:在设备之间创建外部-外部音频通路。
    IDevice.setAudioPortConfig():为各个物理声音流提供音量。
  • 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 用于从移动网络电台接收到的与通话相关联的音频。

配置音频设备

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:定义输入和输出设备之间或声音流和设备之间可能存在的连接的列表。

以下示例定义了输出设备 bus0_phone_out,其中所有 Android 音频流都通过 mixer_bus0_phone_out 完成混音。该路由会将 mixer_bus0_phone_out 的输出声音流传递到设备 bus0_phone_out。文章来源地址https://www.toymoban.com/news/detail-400191.html

<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_phone_out</item>
<defaultOutputDevice>bus0_phone_out</defaultOutputDevice>
            <mixPorts>
                <mixPort name="mixport_bus0_phone_out"
                         role="source"
                         flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_phone_out"
                            role="sink"
                            type="AUDIO_DEVICE_OUT_BUS"
                            address="BUS00_PHONE">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400"
                                maxValueMB="4000"
                                defaultValueMB="0"
                                stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_phone_out"
                       sources="mixport_bus0_phone_out"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>

到了这里,关于Android automotive车载开发(1)-----Automotive audio的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【论文阅读】Deep Instance Segmentation With Automotive Radar Detection Points

    基于汽车雷达检测点的深度 实例分割 一个区别: automotive radar  汽车雷达 : 分辨率低,点云稀疏,语义上模糊,不适合直接使用用于密集LiDAR点开发的方法  ; 返回的物体图像不如LIDAR精确,可以在雨,雪,雨夹雪,冰雹,雾,泥和尘土中返回; 在夜间和阴天条件下也比激

    2024年02月13日
    浏览(50)
  • Android Audio开发——录音(十七)

            AudioRecord 是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据,即 PCM 数据,PCM 数据不能被播放器直接播放,需要编码压缩成常见音频格式才能被播放器识别。而我们之前分析的原生 api 中的 AudioTrack 可以直接播放 PCM 数据。         AudioRecord

    2024年02月11日
    浏览(40)
  • Android Audio开发——概览(一)

            Audio 是 Android 系统中比较重要的一个模块,在 Android 中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。         Android 音频架构定义了音频功能的实现方式,并指出实现中所涉及的相关源代码。 应用框架         应用框架包含应用代码,该

    2024年02月10日
    浏览(42)
  • Android 车载应用开发之车载操作系统

    到 2030 年,全球电动汽车的销量将超过 7000 万辆,保有量将达到 3.8 亿辆,全球年度新车渗透率有望触及 60% 。这一数据来自国际能源署(IEA)发布的《全球电动汽车展望2023》。 市场趋势和政策努力的双加持下,新能源汽车来势凶猛,燃油车保有量逐年递减。此番景象让死去

    2024年02月22日
    浏览(49)
  • android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

    官网参考链接:https://developer.android.google.cn/develop/ui/views/appwidgets/overview App widgets are miniature application views that can be embedded in other applications (such as the home screen) and receive periodic updates。 通俗解释:一个能够定期刷新并且加到其他应用上的微型视图。 更多android framework干货内容请

    2024年02月09日
    浏览(52)
  • Android车载Launcher开发(1) - 显示Widget

    Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面。作为车机开机后用户接触到的第一个带有界面的系统级APP,和普通APP一样,它的界面也是在Activity上绘制出来的。

    2024年02月11日
    浏览(30)
  • Android 车载应用开发指南(3) - SystemUI 详解

    Android 车载应用开发指南系列文章 Android 车载应用开发指南(1)- 车载操作系统全解析 Android 车载应用开发指南(2)- 应用开发入门 Android 车载应用开发指南(3)- SystemUI 详解 SystemUI 全称 System User Interface ,直译过来就是 系统级用户交互界面 ,在 Android 系统中由 SystemUI 负责

    2024年02月19日
    浏览(41)
  • android车载开发,如何模拟器上实现多屏

    三个点,Display-addSecondary display   方案一 通过Presentation来实现,他是一个Dialog(context,display) 方案二 使用ActivityOptions设置activity显示在哪个屏幕上 launchDisplayId 方案三 adb shell am start -n 包名+Activity

    2024年02月12日
    浏览(47)
  • 车载Android应用开发与分析 - 初试 SystemUI Plugin

    在前面的视频、文章中我们介绍完了整个车载Android应用开发所需要的基础知识: 【视频文稿】车载Android应用开发与分析 - 走进车载操作系统 - 掘金 【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译 - 掘金 【视频文稿】车载Android应用开发与分析 - 开发系统应用 - 掘

    2024年02月02日
    浏览(38)
  • android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程

    直播免费视频课程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/ 在做双屏相关需求开发过程中,经常会有对两个屏幕都要求可以正确触摸的场景。但是目前我们模拟器默认创建的双屏其实是没有办法进行触摸的 静态修改方案 使用命令查看display2即副屏的信息情况 adb shell dumpsys d

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包