先附上一个例子,再逐一解释。
<!--
Defines the audio configuration in a car, including
- Audio zones
- Context to audio bus mappings
- Volume groups
in the car environment.
-->
<carAudioConfiguration version="2">
<zones>
<zone name="primary zone" isPrimary="true" occupantZoneId="0">
<volumeGroups>
<group>
<device address="bus0_media_out">
<context context="music"/>
</device>
<device address="bus3_call_ring_out">
<context context="call_ring"/>
</device>
<device address="bus6_notification_out">
<context context="notification"/>
</device>
<device address="bus7_system_sound_out">
<context context="system_sound"/>
<context context="emergency"/>
<context context="safety"/>
<context context="vehicle_status"/>
<context context="announcement"/>
</device>
</group>
<group>
<device address="bus1_navigation_out">
<context context="navigation"/>
</device>
<device address="bus2_voice_command_out">
<context context="voice_command"/>
</device>
</group>
<group>
<device address="bus4_call_out">
<context context="call"/>
</device>
</group>
<group>
<device address="bus5_alarm_out">
<context context="alarm"/>
</device>
</group>
</volumeGroups>
</zone>
<zone name="rear seat zone 1" audioZoneId="1">
<volumeGroups>
<group>
<device address="bus100_audio_zone_1">
<context context="music"/>
<context context="navigation"/>
<context context="voice_command"/>
<context context="call_ring"/>
<context context="call"/>
<context context="alarm"/>
<context context="notification"/>
<context context="system_sound"/>
<context context="emergency"/>
<context context="safety"/>
<context context="vehicle_status"/>
<context context="announcement"/>
</device>
</group>
</volumeGroups>
</zone>
<zone name="rear seat zone 2" audioZoneId="2">
<volumeGroups>
<group>
<device address="bus200_audio_zone_2">
<context context="music"/>
<context context="navigation"/>
<context context="voice_command"/>
<context context="call_ring"/>
<context context="call"/>
<context context="alarm"/>
<context context="notification"/>
<context context="system_sound"/>
<context context="emergency"/>
<context context="safety"/>
<context context="vehicle_status"/>
<context context="announcement"/>
</device>
</group>
</volumeGroups>
</zone>
</zones>
</carAudioConfiguration>
概括来说,该文件描述了车里有哪些区域,每个区域划分了多少组,每个组包含了哪些设备,每个设备接收哪些类型的音频流。
zone:
表示一个区域,例如主驾、副驾、前排、后排、左测、右测或者车整体等都可以叫做一个区域。默认情况下,所有音频将路由到主可用区。如需更新应用以路由到其他可用区,可使用 CarAudioManager.setZoneIdForUid。
group:
表示一个volume group,该组内的音频流类型可以独立进行音量控制。例如:将后排作为一个zone,后排左侧的娱乐显示屏的警告音量和媒体音量,可以有不同的音量调节。这里配置了多少个group,系统设置中Sound选项就会有多少个音量调节滑动Bar。
device:
每一个实体输出设备,可以喇叭,可以是耳机孔。里面的每个设备都需要在audio_policy_configuration.xml中声明,对应devicePort。车上由于设备繁多,不像手机和TV,不同的输出设备都有与之对应的名称,所以统一使用AUDIO_OUT_DEVICE_BUS来描述,通过address来区分,也就有了bus0_media_out, bus1_navigation_out等名称。
context:
音频上下文,在创建播放器构建AudioAttributes时指定。对应不同的使用场景,如打电话,导航,铃声等,用于指示此设备接收哪些场景下的输出。
目前总共有12种上下文,每个zone都应该将12种上下文配置齐全,以找到正确的路由。
CarAudioContext | 关联的 AttributeUsages |
---|---|
音乐 | UNKNOWN GAME |
NAVIGATION | ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND | ASSISTANT |
CALL_RING | NOTIFICATION_RINGTONE |
CALL | VOICE_COMMUNICATION VOICE_COMMUNICATION_SIGNALING |
ALARM | ALARM |
NOTIFICATION | NOTIFICATION NOTIFICATION_* |
SYSTEM_SOUND | ASSISTANCE_SONIFICATION |
紧急 | EMERGENCY |
安全性 | SAFETY |
VEHICLE_STATUS | VEHICLE_STATUS |
公告 | ANNOUNCEMENT |