Android automotive车载开发(4)-----Volume management音量管理

音量管理

AAOS CarAudioService 内拥有自己的音量管理。该操作系统使用固定音量,并且音量应该通过硬件放大器(而不是软件)在HAL之下应用。此外,它还会将输出设备划分到不同的音量组,以便对与相应音量组关联的所有设备应用相同的增益。

使用固定音量

AAOS 实现应使用硬件放大器(而非软件混音器)来控制音量。为避免产生副作用,请将 config_useFixedVolume 标志设为 true(根据需要叠加):

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

如果 config_useFixedVolume 标志未设置或设为 false,应用可以调用 AudioManager.setStreamVolume(),并在软件混音器中按音频流类型更改音量。用户可能不希望出现这种情况,因为这会对其他应用带来潜在影响,而且使用硬件放大器接收信号时,软件混音器中的音量衰减会导致信号中的可用有效位减少。

音量组

音量组负责管理音频区中一系列设备的音量。在每个音量组中,音量均可单独控制,并且产生的增益会在关联的设备上进行配置,以通过相应车载放大器进行应用。音量设置将为用户保留,并在用户登录时加载。

定义音量组

CarAudioService 使用在 car_audio_configuration.xml 中定义的音量组:

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

car_audio_configruation.xml 实现示例。

每个音量组应包含一个或多个具有关联地址的输出设备。这些地址应与 audio_policy_configuration.xml 中定义的输出设备相对应。

配置音量组增益

每个音量组都有最小增益值、最大增益值和默认增益值以及步长。这些值是根据 audio_policy_configuration.xml 中为对应音量组所关联设备配置的值确定的。

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

在初始化期间,音量组将检查关联设备的增益值并对该组进行如下配置:

  • 步长:对于由同一音量组控制的所有设备,步长必须相同
  • 最小增益值:组内所有设备的最小增益值中的最小值
  • 最大增益值:组内所有设备的最大增益值中的最大值
  • 默认增益值:组内所有设备的默认增益值中的最大值

鉴于这些值的配置方式,可以将音量组的增益值设置为该音量组所关联设备支持范围之外的值。在这种情况下,对于音量组所关联的设备,系统会根据音量组的值是低于还高于此范围,将增益值设置为设备的最小增益值或最大增益值。

音量组标识符

系统在运行时会按 XML 文件中的定义顺序来识别音量组。音频区中的 ID 介于 0 到 N-1 之间,其中 N 是该区中音量组的数量。这样,音频组 ID 在不同的音频区之间并不是唯一的。这些标识符用于与音频组关联的 CarAudioManager API。任何采用 groupId 但不含zoneId的 API 都将默认为主音频区。

多音频区音量管理

每个音频区都应该有一个或多个音量组,且每个音量组仅与一个音频区关联。此关系是在 car_audio_configuration.xml 中定义的。请参见上文定义音量组中提供的示例。

对于每个音频区的当前音量级别,系统会为与该音频区关联的用户保留下来。这些设置是特定于音频区的。也就是说,如果用户先登录与主音频区关联的显示器,然后又登录与辅助音频区关联的区域,那么系统为第一个音频区加载和保留的音量级别将不同于辅助音频区。

处理音量键事件

Android 定义了一些用于控制音量的键码,包括 KEYCODE_VOLUME_UPKEYCODE_VOLUME_DOWNKEYCODE_VOLUME_MUTE。默认情况下,Android 会将音量键事件路由到应用。Automotive 实现应强制将这些键事件路由到 CarAudioService,以便该服务可以根据情况适当地调用 setGroupVolumesetMasterMute

如要强制实现此行为,请将 config_handleVolumeKeysInWindowManager 标志设为 true

<resources>
    <bool name="config_handleVolumeKeysInWindowManager">true</bool>
</resources>

由于音量键事件目前还无法区分要关联到哪个音频区,因此全都假定为与主音频区相关联。在收到音量键事件后,CarAudioService 会提取活跃播放器的音频上下文,由此确定包含与最高优先级音频上下文关联的输出设备的音量组,然后对此音频组进行调整。该优先级是根据 CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY 中定义的固定顺序来确定的。

淡变和平衡

两个版本的 AudioControl HAL 都包含用于在车辆中设置淡变和平衡的 API。用于 CarAudioManager 的对应系统 API 会将值向下传递到 AudioControl HAL。这些 API 需要 android.car.permission.CAR_CONTROL_AUDIO_VOLUME 权限。

AudioControl API 包括:

  • setBalanceTowardRight(float value):将音响设备音量调向汽车右侧 (+) 或左侧 (-)。0.0表示在中间,+1.0 表示完全调到右侧,-1.0 表示完全调到左侧,如果值未介于 -1 到 1 之间,则是错误的。
  • setFadeTowardFront(float value):将音响设备音量调向汽车前面 (+) 或后面 (-)。0.0 表示在中间,+1.0 表示完全调到前面,-1.0 表示完全调到后面,如果值未介于 -1 到 1 之间,则是错误的。

这些值的应用方式以及向用户呈现的方式由原始设备制造商 (OEM) 来决定。它们既可以严格应用到媒体,也可以全面应用到所有 Android 声音。

Android 11 还引入了相应支持,可将音频效果应用到输出设备。这样一来,您还可以通过相应输出设备上的音频效果(而不是通过这些 API)来管理淡变和平衡。

音频闪避

当车辆降低一个声音流的增益,以便让人能更清楚地听到同时播放的另一个声音流的声音时,就会出现“音频闪避”。在 AAOS 中,音频闪避将留给 HAL 来实现,因为在 Android 之外可能存在许多操作系统无法控制的声音。在 Android 11 中,HAL 做出闪避决定的主要依据是两个输出设备是否都拥有活跃的声音流。

何时闪避

虽然是由各个 OEM 来决定其 HAL 如何处理闪避,但我们仍建议遵循某些一般准则。当两个应用/服务同时持有音频焦点时,通常会在 Android 中播放多个声音流。考虑到这一点,请参阅交互矩阵,了解 Android 何时可以授予并发焦点,以及何时有可能同时播放两个不同的声音流。

请记住,在应用任何增益之前,Android 都会将所有声音流先混音在一起。因此,所有在与其他声音流同时播放时应进行闪避的声音流都应路由到单独的输出设备,以便 HAL 能在混音之前应用闪避。

推荐的闪避行为

建议您对下列可能发生的并发交互应用闪避:

  • EMERGENCY:闪避或静音除 SAFETY 之外的所有声音,以确保驾驶员能听到该声音
  • SAFETY:闪避除 EMERGENCY 之外的所有声音,以确保驾驶员能听到该声音
  • NAVIGATION:闪避除 SAFETY 和 EMERGENCY 之外的所有声音
  • CALL:闪避除 SAFETY、EMERGENCY 和 NAVIGATION 之外的所有声音
  • VOICE:闪避 CALL_RING
  • 由 OEM 来决定活跃 VEHICLE_SOUNDS 的重要性,以及这类声音是否应让其他声音闪避,以确保驾驶员能够听到该声音。
  • 所有声音都应闪避 MUSIC 和 ANNOUNCEMENT。不适用此闪避行为的主要例外情况是轻触交互提示音,该提示音目前以 SYSTEM_SOUND 的形式播放
闪避时需考虑的其他注意事项

某些应用/服务(如导航或助理软件)可能会使用多个播放器来完成其操作。OEM 应避免在声音流数据停止通过这些输出设备传递时太过激进地取消闪避,以确保导航或助理应用在开始下一次播放时,用户不会遇到媒体瞬间恢复到最大音量,然后再被闪避的情况。

如果车辆拥有多个隔绝效果足够好的声场,还可以选择将音频路由到汽车的不同区域,而不是进行闪避。例如,导航提示可以路由到驾驶员座位头枕处的音响设备,而音乐继续以正常音量在整个驾驶舱中播放。

对保障安全至关重要的声音

虽然 Android 11 引入了 HAL 音频焦点 API,但仍由 HAL 来负责确保对保障安全至关重要的声音的优先级高于其他声音。即使 HAL 持有 USAGE_EMERGENCY 的音频焦点,也不能保证 Android 中的应用和服务不会播放声音。在播放对保障安全至关重要的声音时,应当对来自 Android 的哪些声音流进行混音或静音均由 HAL 决定。

配置音量设置界面

AAOS 将音量设置界面从音量组配置(该配置可叠加,如“配置音量组”中所述)中分离出来。这种分离可确保将来音量组配置发生更改时,无需对音量设置界面进行任何更改。

在汽车设置界面中,packages/apps/Car/Settings/res/xml/car_volume_items.xml 文件包含与每个已定义的 AudioAttributes.USAGE 相关联的界面元素(标题和图标资源)。此文件通过使用与每个 VolumeGroup 中包含的首个识别出的用法相关联的资源,合理呈现已定义的 VolumeGroups。

例如,以下示例将 VolumeGroup 定义为同时包含 voice_communication 和 voice_communication_signalling。汽车设置界面的默认实现使用与 voice_communication 相关联的资源呈现 VolumeGroup,因为它是文件中的首个匹配项。

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

上述配置中使用的属性和值在packages/apps/Car/Settings/res/values/attrs.xml中声明。音量设置界面使用以下基于 VolumeGroup 的 CarAudioManager API:

  • getVolumeGroupCount():用于了解应绘制多少个控件。
  • getGroupMinVolume() 和 getGroupMaxVolume():用于获取音量上限和下限。
  • getGroupVolume():用于获取当前音量。
  • registerVolumeChangeObserver():用于获取音量更改通知。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: TC10是一份关于汽车以太网的唤醒和睡眠规范,该规范发布于2017年11月。在汽车以太网系统中,唤醒和睡眠功能对于有效的能源管理系统性能至关重要。 根据规范,唤醒和睡眠功能旨在控制汽车以太网系统的活动状态。当汽车以太网系统处于睡眠状态时,电力消耗较低,能够在不需要系统操作的时候节省能源。而当需要进行通信或处理任务时,必须唤醒系统并使其转换到工作状态。 规范中明确了唤醒和睡眠过程的详细步骤和要求。其中,唤醒过程包括了外部信号的检测和通知车载局域网(LAN),以及系统的逐步恢复和建立连接。睡眠过程则包括了提前准备、断开连接、降低功耗等步骤。 在规范中还提到了唤醒和睡眠过程中的时间要求。为了确保系统的稳定运行,唤醒和睡眠的时间应当符合规范要求,并且需要测试和验证来确保系统在各种条件下都能够正确响应。 TC10规范的发布对于汽车以太网系统的设计和实现具有重要的指导意义。它为汽车制造商和供应商提供了一套标准的唤醒和睡眠规范,确保系统在能源管理和性能方面符合行业要求。同时,它也为整个汽车行业的发展和创新打下了基础,推动了更高效、安全和环保的汽车以太网技术的应用。 ### 回答2: TC10是汽车以太网中的唤醒和休眠规范,于2017年11月发布。该规范定义了汽车以太网系统中的唤醒和休眠过程,以确保系统在需要时可以快速启动,同时也能有效地降低能源消耗。 在这个规范中,唤醒是指当车辆处于休眠状态时,以太网系统被激活并恢复正常工作。它可以通过触发特定的信号或事件来完成,例如车门启动、驾驶员上车、远程启动等。唤醒过程需要确保以太网系统能够迅速响应并正常运行,以使车辆其他相关系统能够正常运行。 而休眠是指当车辆处于非工作状态时,以太网系统进入休眠模式以节省能源。休眠模式下的以太网系统会降低功耗,并关闭不必要的功能,以保证最小的能源消耗。休眠状态可以通过特定的条件来触发,例如长时间无操作、车辆熄火等。休眠过程需要确保以太网系统能够完全停止工作,并保持最低的能源消耗。 TC10规范还涵盖了唤醒和休眠过程的具体细节,包括通信协议、控制信号、时间延迟要求等。这些细节确保了汽车以太网系统在唤醒和休眠过程中的稳定性和可靠性。通过遵循该规范,汽车制造商和相关供应商可以确保车辆的以太网系统具有高效的能源管理能力,进一步提升汽车整体性能和可持续发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丨一念丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值