车载音频服务使用核心音频动态音频政策来方便车载用例。
为每位乘客单独播放音频(称为多区域音频),其中每个区域都允许同时播放声音。
动态音频区域配置。
乘客主区域音频投射。
乘客音频镜像。
在每个用例中,车载音频服务都使用动态音频政策自动将音频路由到指定的输出设备。
多区域音频
多区域音频支持多个用户同时与 AAOS 互动。一组输出设备与一个区域关联,每个区域都维护音频焦点和音量级别。乘客可以收听他们的音频,而驾驶员在主区域(通常是主舱)收听另一个来源。
多区域音频架构
图 1. 车载音频服务架构。
车载音频区域是音频输出、音频焦点和其他音频设置的抽象概念,所有这些都可以独立管理。出于路由目的,每个区域都定义为一组音频输出总线设备,如音频政策配置中所排列的那样。每个音频区域定义的设备都不同。在图 1 中,总线设备 1 到 5 属于区域零,总线设备 6 到 8 属于区域一,总线设备 9 到 11 属于区域二。
车载音频配置
通常,输出设备分配给一个音频区域。每个音频区域都在 car_audio_configuration.xml
中定义。以下代码段显示了图 1 的车载音频配置
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneId="0">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGoups>
<group>
<device address="bus_1">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_2">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_6">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_7">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
...
...
</zones>
</carAudioConfiguration>
occupantZoneId
是由 CarOccupantZoneManager
管理的车载服务定义。它在汽车中用于定义汽车中用户到特定座位位置的映射。CarOccupantZoneService
还定义了从乘员区域到显示屏、其他外围设备以及用户在登录显示屏后用户的映射。音频区域具有
音频区域 ID 和乘员区域 ID。
- 将音频区域映射到乘员区域(座位、显示屏和其他外围设备)
- 映射哪个用户 ID 在登录时分配给音频区域
音频配置列表。 每个音频配置都有一组音量组。每个音量组都有一组音频总线设备。
当音量改变时,组中的所有音频设备都以相同的方式控制。
每个音频设备都分配有一个音频属性列表。此信息用于构建具有不同分配音频属性的音频政策混音。
此配置允许将不同的音频属性用法路由到每个区域中的不同输出设备。根据用例,可以同时播放不同的声音。例如,您可以选择配置主舱(主区域)在所有扬声器上播放媒体声音,但导航声音仅在最靠近驾驶员的扬声器上播放。通过同时播放声音,主舱继续收听媒体,而导航则传递给驾驶员。
多区域音频乘客登录工作流程
下面的顺序图显示了在乘客登录各自的显示屏时启用音频路由的流程
图 2。
在此序列中,用户登录通过乘员区域服务传播到车载音频服务。
车载音频服务(对于特定音频区域)使用
AudioPolicy#removeUserIdDeviceAffinity
API 来移除用户设备亲和性。此 API 接受用户 ID。在本例中,是上一个区域的用户。AudioPolicy#setUserIdDeviceAffinity
API 将新用户分配到区域,该区域接受用户 ID 和特定区域配置的所有设备。
动态区域配置
在 Android 14 中,引入了动态区域配置,以允许 OEM 为乘客配置不同的设备集。此用例允许后座乘客在后座头枕扬声器和后座耳机外围设备之间切换。
在这种情况下,需要两个配置。每个配置分别用于后座头枕和耳机外围设备。特定用户的音频仅路由到一个配置。
图 3. 动态区域配置工作流程。
图 3 说明了动态区域配置工作流程的架构。音频区域 1 包含两个配置,Config 0
和 Config 1
,它们分别与输出设备扬声器和头枕关联。
登录后,用户会自动分配默认配置。当用户选择更改配置时(通常通过系统界面),车载音频服务会执行两个配置之间的切换。通过这种方式,输出设备在 Z1 扬声器和 Z1 头枕之间切换。
下面的代码段显示了此动态区域配置的设置。
<carAudioConfiguration version="3">
<zones>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="Zone 1 Config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_100">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
<zoneConfig name="Zone 1 Config 1">
<volumeGroups>
<group>
<device address="bus_101">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
</zones>
为了方便管理音频配置,车载音频管理器公开了 API 来管理配置
- 查询区域可用的配置。
- 查询区域当前设置的配置。
- 切换到不同的配置。
如图 4 所示,系统界面应用或服务可以使用这些 API 来管理音频区域的配置。查询 API 向乘客公开这两个配置。用户可以通过点按所需配置的命令来选择不同的配置。
图 4. 动态区域配置工作流程。
主区域乘客音频投射
主区域乘客音频投射是 Android 14 中引入的一项功能,允许乘客在主区域中投射他们的媒体音频。通过这种方式,乘客的媒体音频可以投射到主舱,而驾驶员仍保持完全控制。
下图显示了主区域乘客媒体音频投射的简化架构版本。
图 5. 动态区域配置工作流程。
图像显示驾驶员的媒体输出设备与乘客共享,这种情况仅在乘客处于投射到主区域模式时才会发生。动态音频政策也用于管理驾驶员的音频路由,但不会对驾驶员的设备亲和性应用任何更改。对于乘客,输出设备列表按如下方式更改
- 乘客的媒体输出设备从设备列表中移除
- 驾驶员的媒体输出设备添加到设备列表中
- 乘客音频区域的其余输出设备保留在设备列表中
此新设备列表通过 AudioPolicy#setUserIdDeviceAffinity
API 分配给乘客。传递给 API 的参数是设备列表和乘客用户 ID。当音频系统的音频政策服务查询要为与乘客关联的媒体轨道选择哪个音频混音时,将选择与主区域关联的媒体音频混音。
主区域音频投射的关键要求是主区域的媒体输出设备与其他音频属性用法隔离。否则,在构建音频混音期间,其他音频属性将添加到混音中。当音频系统执行混音选择时,附加到混音的所有声音都会被选中在主舱中播放。
乘客区域音频镜像
音频镜像功能使乘客能够共享音频。镜像功能复制每个音频区域中的音频数据,以便所有乘客都可以收听相同的音频。在这种情况下,音频焦点与参与音频镜像的乘客共享。
音频镜像路由
启用音频镜像至少需要两名乘客。因此,只有两个乘客音频区域的音频配置将需要一个镜像输出设备。使用上述定义,可以启动两个并发镜像会话。
下图显示了两个乘客之间多区域音频镜像的简化图。来自两位乘客的音频都路由到音频镜像设备 bus_1000
。音频 HAL 将信号复制到源区域。
图 6. 动态区域配置工作流程。
此路由仅在乘客处于镜像模式时启用。否则,音频区域的相应设备将分配给乘客。当首次为乘客启用镜像时,AudioPolicy#setUserIdDeviceAffinity
API 会修改路由
- 乘客的媒体输出设备从设备列表中移除。
- 镜像输出设备添加到设备列表中。
- 乘客音频区域的其余输出设备保留在设备列表中。
使用设备列表,调用 API 时会传递更新的设备列表和乘客的用户 ID。下图提供了音频镜像工作流程的顺序图。
图 7. 音频镜像工作流程。
在图 7 中,用于管理音频镜像的车载音频管理器 API 从媒体系统服务调用。具体而言,为用户 1 和用户 2 启用音频镜像的 API,CarAudioManager#enableMirrorForAudioZones
。
车载音频服务配置用户乘客的音频路由,如上所述。车载音频服务还向音频 HAL 发送信号,以配置并将来自镜像设备的音频复制到相应的区域。
在上图中,车载音频服务发送 mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
其中,
bus_1000
是源总线,bus_10
和 bus_20
是目标总线。
顺序图中未显示的是通过 AudioManager#setParameters
API 发送的信号,该信号通过音频服务到达 HAL。
禁用音频镜像后,将发送以下信号:mirroring_src=bus_1000;mirroring=off
。当未启用音频镜像时,HAL 可以使用此信号来禁用音频复制。要定义音频镜像设备,车载音频配置文件包含一个名为 mirroringDevices
的部分,如下面的代码段所示。
在此代码段中,定义了两个镜像设备 bus_1000
和 bus_2000
,以便四名乘客可以使用音频镜像。
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>