音量管理功能包含在 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 介于 0
到 N-1
之间,其中 N
是音频区中音量组的数量。这样,音频组 ID 在不同的音频区之间并不是唯一的。这些标识符用于与音频组关联的 CarAudioManager
API。任何接收 groupId
但不含 zoneId
的 API 都将默认为主音频区。
多音频区音量管理
每个音频区都应该有一个或多个音量组,且每个音量组仅与 1 个音频区关联。此关系是在 car_audio_configuration.xml
中定义的。如需了解详情,请参阅上文定义音量组中的示例。
对于每个音频区的当前音量级别,系统会为与该音频区关联的用户保留下来。这些设置是特定于音频区的。也就是说,如果用户先登录与主音频区关联的显示器,然后又登录与辅助音频区关联的区域,那么系统为第一个音频区加载和保留的音量级别将不同于辅助音频区。
处理音量键事件
Android 定义了一些用于控制音量的键码,包括:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
默认情况下,Android 会将音量键事件路由到应用。Automotive 实现应强制这些键事件被 CarAudioService
处理,以便该服务可以根据情况适当地调用 setGroupVolume
或 setMasterMute
。如要强制实现此行为,请将 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 无法控制 OS 之外的声音。在 Android 11 中,HAL 做出闪避决定的主要依据是两个输出设备是否都拥有活跃的声音流。
何时闪避
虽然是由各个 OEM 来决定 HAL 如何处理闪避,但我们仍建议遵循以下准则。
当两个应用/服务并发持有音频焦点时,通常会在 Android 中播放多个声音流。如需了解 Android 何时可以授予并发焦点,请参阅限制类型中的交互矩阵。随着车载音频插件的推出,这还取决于您的 AudioFocus 管理。
在应用任何增益之前,Android 都会将所有声音流先混音在一起。因此,所有在与其他声音流同时播放时应进行闪避的声音流都应路由到单独的输出设备,以便 HAL 能在混音之前应用闪避。
推荐的闪避行为
以下是推荐采取闪避行为的可能并发交互。
互动 | 操作 |
---|---|
EMERGENCY
| 闪避或静音除 SAFETY 之外的所有声音
|
SAFETY |
闪避除 EMERGENCY 之外的所有声音 |
NAVIGATION |
闪避除 SAFETY 和 EMERGENCY 之外的所有声音 |
CALL |
闪避除 SAFETY 、EMERGENCY 和 NAVIGATION 之外的所有声音 |
VOICE |
闪避 CALL_RING |
VEHICLE_SOUNDS |
您可以决定当前在放声音的重要性,以及在放声音是否会让其他声音闪避。 |
MUSIC 和 ANNOUNCEMENT |
针对所有声音进行闪避。例外情况是作为 SYSTEM_SOUND 播放的触控交互音。
|
闪避时需注意的事项
某些应用和服务(例如导航或助理)可能会使用多个播放器来执行操作。当某个数据流停止通过输出设备传输时,要避免过于激进地取消闪避,以确保在导航或助理应用开始下一次播放时,媒体不会先恢复到最大音量,然后再被闪避。
如果车辆拥有多个隔离效果足够好的声场,您可以将音频路由到汽车的不同区域,而不是进行闪避。例如,导航指示可以传送到驾驶员头枕扬声器,同时在整个车厢内继续以正常音量播放音乐。
对保障安全至关重要的声音
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()
:用于接收音量更改通知。
汽车音量组事件
音量更新和静音切换的汽车用例具有上下文基础,可定义某些应用的操作,例如音量设置。来自汽车音频堆栈的当前音量和静音回调提供有限的上下文信息。为了更好地满足汽车用例和未来可扩展性的要求,我们在 Android 14 中添加了 CarVolumeGroupEvent。每个事件都包含三种关键类型的信息:
CarVolumeGroupInfo
列表EventTypes
(位映射)ExtraInfos
列表
CarVolumeGroupInfo
事件回调的接收方可以随时访问受影响汽车音量组信息列表。这意味着,应用无需向车载音频框架发出任何其他调用,即可获取最新状态。它可以直接使用收到的 CarVolumeGroupInfos
来更新界面或内部状态。为了让应用更轻松地进行该操作,汽车音量组中发生更改的方面也会作为 EventTypes
的一部分提供,如下所述。
EventTypes
定义 CarVolumeGroupInfo
的哪个方面发生了更改。应用可以使用它来识别更改并执行所需的操作。例如,EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED
表示相应的 CarVolumeGroups
最大音量增益指数已更改,并且可以通过 CarVolumeGroupInfo.getMaxVolumeGainIndex()
进行查询。
下表显示了 EventType
与 CarVolumeGroupInfo
之间的关系。
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
处理来自用户的音量更改请求。原因:当已启用静音模式时,用户无法感知声音。允许更改音量可能会导致声音爆炸,并危及用户安全。
原因:音量应用可以注册回调并自动触发取消静音 (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)),而无需用户干预,前提是这是 OEM 的预期行为。
当用户静音处于已停用状态时,如果 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。
动态音量配置
对于此功能,我们考虑了以下主要用例:
车辆生命周期结束 (EOL) 配置。
汽车制造商更倾向于根据车辆音频系统设置在 EOL 时更新音量配置。通常,这是在不更新 Android SW 映像的情况下进行的旁加载。
汽车制造商可能需要在服务时间表期间更新音量配置。
运行时配置。汽车音频系统支持外部放大器配置,这些 ECU 可能包含在启动期间查询的音量范围配置。
按需配置。旨在满足用户对按需音频功能日益增长的需求,用户可以订阅一段时间的增强信号处理功能。新的音量范围配置在订阅期间有效。
设计
动态音量配置分为三个阶段:
发现。供应商 AudioControl HAL 实现通过供应商拥有的自定义 IPC 机制发现新的音量范围更新。
发现后,系统会通过
AudioControl::IModuleChangeCallback
生成回调。更新。 汽车音频堆栈会使用新的音量范围更新音量组状态。
在更新音量范围之后,会尽力保持相同的音量。不过,如果指数超出范围,则当前音量指数会设为安全值。例如,供应商在回调期间提供的默认音量。
回调。
在音量组范围更新之后,汽车音频堆栈会触发一个回调给通过
CarVolumeGroupEventCallback
注册的应用。CarVolumeGroupEvent
携带更新后的CarVolumeGroupInfo
、事件类型(发生了什么变化)和额外信息(为什么发生变化)。
图 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. 动态音量配置的序列图。
关键方面
如需优化此功能,请考虑以下几点。
作为回调的一部分提供的 AudioPorts 必须与 Automotive 总线定义匹配:
- 设备端口。
IN_DEVICE
、OUT_DEVICE
- 连接。
BUS
- 地址。在音频 HAL 定义中已定义
- 增益模式。
JOINT
- 设备端口。
供应商必须在音频 HAL 政策中定义音量范围定义的超集,并使用回调针对车载变体对其进行自定义。如需了解详情,请参阅
IModuleChangeCallbac
AIDL 定义。如果有多个音频总线属于同一音量组,则每个音频总线必须具有相同的音量范围定义。否则,车载音频框架会拒绝新的音量范围定义。