音量管理

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

固定卷

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>

每个音量组应包含一个或多个具有关联地址的输出设备。地址应与 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 介于 0N-1 之间,其中 N 是该区中音量组的数量。这样,音频组 ID 在不同的音频区之间并不是唯一的。这些标识符用于与音频组关联的 CarAudioManager API。任何采用 groupId 但不含 zoneId 的 API 都将默认为主音频区。

多音频区音量管理

每个音频区都应该有一个或多个音量组,且每个音量组仅与一个音频区关联。此关系是在 car_audio_configuration.xml 中定义的。如需了解详情,请参阅上文定义音量组中的示例。

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

处理音量键事件

Android 定义了一些用于控制音量的键码,包括:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_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 的范围,则是错误的

您可以决定这些值的应用方式以及如何向用户显示这些值。它们既可以严格应用到媒体,也可以全面应用到所有 Android 声音。Android 11 还引入了相应支持,可将音频效果应用到输出设备。这样一来,您还可以通过相应输出设备上的音频效果(而不是通过这些 API)来管理淡出和平衡。

降低其他应用音量

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

何时闪避

虽然是由各个 OEM 来决定 HAL 如何处理缩小,但我们仍建议遵循以下准则。

  • 当两个应用或服务同时持有音频焦点时,通常会在 Android 中播放多个声音流。如需了解 Android 何时可以授予并发焦点,请参阅限制类型中的交互矩阵。随着车载音频插件的引入,这还取决于您的 AudioFocus 管理。

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

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

互动 操作
EMERGENCY 闪避或静音除 SAFETY 之外的所有声音
SAFETY 闪避除 EMERGENCY 之外的所有声音
NAVIGATION 闪避除 SAFETYEMERGENCY 之外的所有声音
CALL 闪避除 SAFETYEMERGENCYNAVIGATION 之外的所有声音
VOICE CALL_RING
VEHICLE_SOUNDS 您可以确定活跃声音的重要性,以及这类声音是否应让其他声音闪避。
MUSICANNOUNCEMENT 所有声音都应闪避 和 。例外情况是,以 SYSTEM_SOUND 的形式播放的轻触交互提示音。

闪避时需考虑的注意事项

某些应用和服务(如导航或助理软件)可能会使用多个播放器来执行操作。避免在数据流停止通过输出设备传输时过于激进地取消闪避,以确保导航或助理应用在开始下一次播放时,媒体不会恢复到最大音量,然后再被闪避。

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

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

Android 11 引入了 HAL 音频焦点 API。HAL 可确保对保障安全至关重要的声音的优先级高于其他声音。如果 HAL 持有 USAGE_EMERGENCY 的音频焦点,也不能保证 Android 中的应用和服务不会播放声音。HAL 会确定应对来自 Android 的哪些声音流进行混音或静音,以播放对保障安全至关重要的声音。

配置音量设置界面

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

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

例如,以下示例将 VolumeGroup 定义为包含 voice_communicationvoice_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():用于接收音量更改通知。

车载音量组事件

音量更新和静音切换开关的汽车使用情形具有情境依据,这些依据可能会定义某些应用的操作,例如音量设置。汽车音频堆栈中的当前音量和静音回调提供的上下文信息有限。为了更好地支持汽车用例和未来的可伸缩性,Android 14 中添加了 CarVolumeGroupEvent。每个事件都包含三种关键类型的信息:

  • CarVolumeGroupInfo 的列表
  • EventTypes(位映射)
  • ExtraInfos 的列表

CarVolumeGroupInfo

事件回调的接收器可以随时访问受影响的车载音量组信息列表。这意味着,应用无需向汽车音频框架发出任何其他调用即可获取最新状态。它可以直接使用收到的 CarVolumeGroupInfos 更新界面或内部状态。为了让应用更轻松地使用,系统还会在 EventTypes 中提供汽车音量组中发生变化的方面,如下所述。

EventTypes

定义 CarVolumeGroupInfo 的哪个方面发生了变化。应用可以使用此事件来识别更改并执行所需的操作。例如,EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED 表示相应的 CarVolumeGroups 最大音量增益索引已更改,并且可以通过 CarVolumeGroupInfo.getMaxVolumeGainIndex() 进行查询。

下表显示了 EventTypeCarVolumeGroupInfo 之间的关系。

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

提供有关 CarVolumeGroup 发生变化的原因的更多信息。应用可以使用这些信息提供更多背景信息,以提醒用户采取行动或发送通知。例如,EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL 表示因热过载而导致的有效瞬时衰减。如果用户尝试调高音量,应用可以通知用户。

我们不会强制执行任何 ExtraInfos 流程。您可以根据 ExtraInfos 自行确定流程。例如,如果由于 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED 而启用了衰减,您还可以选择在开始时淡出音量条界面,以防止用户更改音量。其他应用可能会选择显示消息框来指明正在使用声音切换功能,并允许用户调节音量。

车载音频框架依赖于 AudioControl HAL IAudioGainCallback 来提供建议的 ExtraInfos。如需了解详情,请参阅音频增益回调

CarVolumeGroupEvent 可扩容以满足汽车音频框架的未来需求。我们打算通过 CarVolumeGroupEvent 支持新功能。我们强烈建议应用开发者使用 CarVolumeGroupEvent 来处理群组音量和静音更改。

车载音量组事件回调

Android 14 为特权应用和平台应用提供了新的回调,以便它们注册并接收 CarVolumeGroupEvents 通知。

  • 如需注册回调,请使用 CarAudioManager#registerCarVolumeGroupEventCallback()

  • 如需取消注册回调,请使用 CarAudioManager#unregisterCarVolumeGroupEventCallback()

如果应用使用新 CarVolumeGroupEventCallback 和旧版 CarVolumeCallback 进行注册,系统会优先处理事件 CarVolumeGroupEventCallbacks。汽车音频堆栈不再触发 CarVolumeCallback。这样可以防止针对同一应用的同一事件创建重复的触发器。

我们强烈建议您使用 CarVolumeGroupEventCallback 来管理组音量和静音更改。

音频增益回调

从 Android 13 开始,AudioControl HAL 可以触发异步回调,以管理因汽车音响系统更改而导致的音量级别更新。

HAL API

AudioControl @2.0 AIDL

2.0 版 AudioControl AIDL HAL 添加了以下 API:

API 用途
IAudioControl#registerGainCallback 向 AudioControl HAL 注册 IAudioGainCallback 的实例。
IAudioGainCallback#onAudioDeviceGainsChanged 用于通知音频增益配置更改的异步回调。

AudioControl HAL 回调包含原因列表和相应的 AudioGainConfigInfo,其中包括:

  • 可用区 ID
  • 设备端口地址
  • 卷索引 > 索引可以是受限索引或更新索引。

原因大致可分为以下几类:

  • 限制原因。音量和静音行为出现暂时性变化。
  • 更新原因。永久更改了音量行为。

限制类型

AudioControl HAL AIDL V3 开始,支持的限制类型如下:

  • 静音
  • 禁播
  • 限制
  • 衰减
有效限制 用户触发的音量变化 用户触发的静音切换开关
静音 ❌(取消静音)

✔(静音)
禁播
限制 ❌(超出上限)

✔(未超出上限)
衰减

限制的优先级依次为“静音”>“屏蔽”>“限制”>“衰减”。

静音限制

静音限制如下:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

车载音频框架在内部维护以下两种静音状态:

  • 用户禁言。根据用户的请求(通过 CarAudioManager 或按键事件)切换。

  • HAL 静音。根据通过 AudioGain 回调收到的静音限制进行切换。

对于“设置”应用等监听器,音量组的整体静音 (CarVolumeGroupInfo.isMuted()) 状态将取决于上述任一静音功能是否处于启用状态。

启用 HAL 静音后,在限制期间,系统会忽略所有传入的音量更改和取消静音组请求。

互动情形:HAL 静音处于启用状态,用户请求静音切换开关

当 HAL 静音处于启用状态且用户静音处于停用状态时:

  • 音量组的整体静音状态已更改为 true
  • 我们会处理用户请求启用静音功能的请求。
    • 原因:为保护用户隐私,应始终遵循用户的静音请求。

当 HAL 静音和用户静音处于启用状态时:

  • 音量组的整体静音状态已更改为 true

  • 系统会处理用户请求停用静音的请求。NOT缓存的用户静音状态保持启用状态。

    • 原因:只有在没有有效限制的情况下,我们才会处理用户的取消禁言请求。

    • 原因:取消静音缓存的用户静音功能可能会导致意外的声音爆炸,并危及用户安全。如果在点火周期内启用了静音状态,这尤其如此,因为这会降低用户对音量感知的意识。

互动情形:HAL 静音功能处于启用和停用状态,而用户静音功能没有任何变化

切换 HAL 静音开关会更改音量组的整体静音状态。不过,它不会直接更新用户的静音状态。当用户静音处于停用状态且收到用于启用 HAL 静音的回调时:

  • 音量组的整体静音状态已更改为 true
  • 在 HAL 静音处于启用状态时,系统会处理用户更改音量的请求。NOT

    • 原因:用户在启用静音模式时无法感知声音。允许调节音量可能会导致音爆,危及用户安全。

    • 原因:如果这是原始设备制造商 (OEM) 的预期行为,音量应用可以注册回调并自动触发取消静音 (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)),而无需用户干预。

当 HAL 静音处于停用状态且用户静音处于停用状态时:

  • 音量群组静音状态已更改为 false

    原因:使静音状态保持不变并要求用户取消静音,可能会在静音状态频繁切换时不必要地打断用户。

  • 系统会正常处理用户请求更改音量的请求。

禁播

屏蔽限制包括:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE

当屏蔽限制生效时,用户请求执行以下操作将会被拒绝:

  • 系统不会处理音量更改。
  • 系统会处理切换静音的操作。

限制

功能限制包括:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

限制生效后,用户无法执行以下操作:

  • 调节音量:

    • 在限制范围内
    • 系统不会处理上述限制
  • 系统会处理切换静音的操作。

衰减

衰减限制如下:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

当“衰减”限制生效时,用户对以下内容的请求将受到限制:

  • 系统会处理更改音量的请求。新的当前音量级别会设为减弱后的音量(而非原先的音量)。日后进行的音量更改将从此级别进行。

  • 已处理切换静音功能。

更新索引

以下操作被视为异步卷索引更新:Reasons.EXTERNAL_AMP_VOL_FEEDBACK

因此,AudioControl HAL 可以将音量组当前索引更新为指定索引。这主要用于作为音频系统对来自汽车音频框架的音量更改请求的反馈。索引更新还会作为 CarVolumeGroupEvent 回调与应用通信,以同步索引。

示例

用例:用户将音量指数更新为 30

  • 用户使用“音量”应用将音量指数更改为 30。

  • 此索引会转换为音量增益并发送到音频 HAL。

  • Audio HAL 的供应商实现会接收新的音量增益并更新音频系统(例如外部放大器)。

  • 音频系统响应说音量级别仅更新为指数 15(原因未知 Android)。

  • AudioControl HAL 触发器的供应商实现:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • 汽车音频服务会使用来自回调的新索引,该索引用于持久化和对音量应用的回调。用户请求的索引为 30。不过,音频系统异步反馈会将索引更新为 15。

用例:退出暂停状态后的首次音频播放

  • 休眠前的音量指数设为 95 的高音量(范围:[0-99])。

  • Android 进入挂起状态。

  • Android 退出暂停状态(例如恢复)后:

    • 供应商 Audio HAL/AudioControl HAL 在本地将安全索引 30 应用于音频系统。

    • 供应商 AudioControl HAL 还会触发安全索引的回调:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • 车载音频服务会使用用于持久化的回调中的新索引,以及其自身对同步索引的音量应用的回调。暂停前的音量指数为 95。不过,在恢复后,AudioControl HAL 实现程序会将此索引设置为安全音量级别 30。

动态音量配置

对于此功能,我们考虑了以下主要用例:

  1. 车辆生命周期结束 (EOL) 配置。

    • 汽车制造商更倾向于根据车载音响系统设置,在 EOL 时更新音量配置。通常,这是在不更新 Android SW 映像的情况下进行的旁加载。

    • 汽车制造商可能需要在服务时间表期间更新音量配置。

  2. 运行时配置。汽车音频系统支持外部放大器配置,这些 ECU 可能托管在启动期间查询的音量范围配置。

  3. 按需配置。此功能旨在满足用户对按需音频功能日益增长的需求,用户可以订阅增强型信号处理功能一段时间。新音量范围配置在订阅期间有效。

设计

动态音量配置分三个阶段完成:

  • 发现。供应商 AudioControl HAL 实现会通过供应商拥有的自定义 IPC 机制发现新的音量范围更新。

    发现后,系统会通过 AudioControl::IModuleChangeCallback 生成回调。

  • 更新。汽车音频堆栈会使用新的音量范围更新音量组状态。

    系统会尽量在更新音量范围后保持相同的音量。 不过,如果索引超出范围,当前音量索引会设为安全值。例如,供应商在回调期间提供的默认级别。

  • 回调

    • 更新音量组范围后,车载音频堆栈会触发对通过 CarVolumeGroupEventCallback 注册的应用的回调。

    • CarVolumeGroupEvent 携带更新后的 CarVolumeGroupInfo、Event-type(发生了什么变化)和 Extra-info(发生变化的原因)。

图片

图 1. 动态音量配置。

HAL API

AudioControl @ 3.0 AIDL

3.0 版 AudioControl AIDL HAL 引入了以下 API:

API
IAudioControl#setModuleChangeCallback 使用 AudioControl HAL 设置 IModuleChangeCallback 实例。
IAudioControl#clearModuleChangeCallback 清除之前使用 AudioControl HAL 设置的 IModuleChangeCallback 实例。
IModuleChangeCallback#onAudioPortsChanged 用于通知 AudioPorts 更改的回调

顺序

下方显示了动态音量配置的序列图。

图片

图 2. 动态音量配置的序列图。

关键方面

如需优化此功能,请考虑以下事项。

  • 在回调中提供的 AudioPort 必须与 Automotive BUS 定义相匹配:

    • 设备端口IN_DEVICEOUT_DEVICE
    • 连接BUS
    • 地址。在音频 HAL 定义中定义
    • 增益模式JOINT
  • 供应商必须在音频 HAL 政策中定义音量范围定义的超集,并使用回调为车辆变体进行自定义。如需了解详情,请参阅 IModuleChangeCallbac AIDL 定义。

  • 如果多个音频总线属于同一音量组,则每个总线必须具有相同的音量范围定义。否则,汽车音频框架会拒绝新的音量范围定义。