车载音频配置

在 Android 10 中,car_audio_configuration.xml 取代了 car_volumes_groups.xmlIAudioControl.getBusForContextvendor 分区中通常包含的音频政策文件代表了电路板的音频硬件配置。car_audio_configuration.xml 中引用的所有设备都必须在 audio_policy_configuration.xml 中定义。

下图 1 说明了车载音频服务架构的高级概览,其中车载音频服务读取车载音频配置文件来设置设备的音频。

Car audio architecture overview

图 1. 车载音频架构概览。

将车载音频配置文件放置在设备上的 vendor\etc\system\etc\ 中,车载音频服务首先在 vendor\etc\ 中搜索该文件。车载音频服务读取 car_audio_configuration.xml 以确定音频配置。

车载音频区域

  • 每个音频区域都包含唯一的音频区域 ID。
  • 每个音频区域都可以映射到一个乘坐者区域。
  • 每个区域中的音频操作彼此独立

    • 音频焦点
    • 音频路由
    • 音频闪避
  • 车载音量组

    • 包含音量组的所有音频设备都通过相同的增益变化一起控制。组中所有设备的音频增益配置应相同。

    • 音频上下文到音频设备的映射。使用此功能构建将音频用途映射到输出设备的音频混合。

    • 所有音频上下文都应在一个区域内表示。这允许为所有音频属性用途准确设置音频路由。

音频上下文

为了简化 AAOS 音频的配置,类似的用途已分组到 CarAudioContexts 中。这些音频上下文在整个 CarAudioService 中用于定义路由、音量组、音频焦点和闪避管理。AAOS 中的静态音频上下文如下所示。

下表描述了音频上下文和用途之间的映射。突出显示的行是为新的系统用途提供的。

CarAudioContext 关联的 AttributeUsages
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

启用 AAOS 路由

要使用基于 AAOS 的路由,您必须将 audioUseDynamicRouting 标志设置为 true

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

false 时,路由和大部分 CarAudioService 都将被禁用,并且 AAOS 将回退到 AudioService 的默认行为。

主区域

默认情况下,所有音频都路由到主区域。只有一个主区域存在,该区域在配置中通过属性 isPrimary="true" 指示。主区域会自动分配 Audiomanager.PRIMARY_AUDIO_ZONE

示例配置(版本 2)

例如,一辆车可能有两个区域,一个主区域和一个后座娱乐系统。在这种情况下,您可以设计一个可能的 car_audio_configuration.xml 版本 2,如下所示

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </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>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <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>
    </zones>
</audioZoneConfiguration>

在此示例中,主区域将一些音频上下文分离到不同的设备。这使 HAL 能够应用不同的后期处理效果,并通过使用车辆的硬件来混合每个设备上的输出。这些设备已排列成多个音量组:媒体、导航、通话、闹钟和系统声音。如果系统配置为 useFixedVolume,则每个组的音量级别将传递到 HAL,以应用于这些设备的输出。

对于主区域,我们建议系统声音与其他声音分开。这允许以更高的优先级处理车辆声音。车载音频服务已经在焦点和闪避管理方面对车辆声音进行了这些区分。例如,紧急声音焦点请求的优先级高于另一个焦点请求。

为了保持简单,在辅助区域示例中,所有音频上下文都路由到一个设备和一个音量组。

乘坐者区域音频配置

在 Android 11 中,car_audio_configuration.xml 引入了两个新字段:audioZoneIdoccupantZoneId。您可以使用 audioZoneId 来控制音频区域管理。您可以使用 occupantZoneId 来配置基于用户 ID 的路由。

重新审视上面的音频配置,但利用了乘坐者区域 ID 和音频区域 ID 映射的新字段,可以在不定义音量组的情况下将新配置设置为如下所示。

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

上面的配置定义了主区域到乘坐者区域 0 的映射,以及 audioZoneId 1 到 occupantZoneId 1 的映射。通常,可以配置乘坐者区域和音频区域之间的任何映射。但是,映射必须是一对一的。下面列出了定义这两个新字段的规则。

  • 主区域的 audioZoneId 始终为 PRIMARY_AUDIO_ZONE ID。如果定义了 isPrimary="true",则不需要 audioZoneId

  • audioZoneIdoccupantZoneId 编号不能重复。

  • audioZoneIdoccupantZoneId 只能具有一对一的映射。

Android 14 车载音频配置

在 Android 14 中,AAOS 引入了 OEM 插件服务,这使您可以更主动地管理车载音频服务监督的音频行为。除了新的插件服务外,以下更改已添加到车载音频配置文件中

  • OEM 定义的车载音频上下文
  • 非主区域动态配置

OEM 定义的车载音频上下文

为了实现灵活的音频配置,在 Android 14 中,车载音频服务允许对音频用途进行与上面定义的静态音频上下文不同的分组。此 OEM 定义的上下文可以在 car_audio_configuration.xml 版本 3 文件中定义。

而是使用当前定义的静态音频上下文。OEM 定义的车载音频上下文的一般格式如下所示。

OEM 上下文各自需要一个 name 以及分配给该上下文的音频属性用途列表。在上面的示例中,定义了两个上下文

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • media 上下文包含 AUDIO_USAGE_MEDIAAUDIO_USAGE_UNKNOWN
  • game 上下文包含 AUDIO_USAGE_GAME

上下文必须在 car_audio_configuration.xml 文件的顶部定义。定义 OEM 上下文后,车载音频配置的其余部分可以像以前一样进行。以下规则适用于车载音频上下文

  • OEM 上下文定义是可选的。而是使用静态音频上下文

  • 不要重复上下文名称。

  • 不要将音频属性用途分配给多个上下文。

  • AudioAttributes 中定义的所有音频用途都应用于构建上下文。

严格来说,音频用途的 android.audio.policy.configuration.V7_0.AudioUsage 字符串表示形式必须用于 OEM 音频上下文定义。将来,较新的音频属性用途将分配给最合适的上下文,以减少从一个 Android 版本迁移到另一个 Android 版本时的错误。

虽然引入 OEM 定义的上下文是为了进一步扩展 OEM 插件音频服务,但它仍然可以在没有 OEM 插件服务的情况下使用。音频行为类似于静态音频服务

  • 音频焦点交互。音频属性用于确定音频焦点交互矩阵设置的最佳匹配行为。有关详情,请参阅音频焦点

  • 音频音量控制音频属性用于确定最佳匹配

    • 基于 OEM 定义的上下文的音量组。
    • 从配置的静态音量列表中获得的优先级。
  • 音频闪避行为

    • 当前音频焦点的音频属性用途用于映射到车载音频配置文件中定义的输出音频设备信息。

    • 音频属性用于根据静态音频闪避矩阵,将相应的静态上下文映射到闪避。

动态音频区域配置

在 Android 14 中,为了适应动态音频区域配置,用于定义音频区域的车载音频配置架构也已更新到版本 3。新架构要求为每个区域设置配置。

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

要了解更多信息,请参阅 device/generic/car/emulator/audio/car_audio_configuration.xml 中定义的版本 3 文件。从 Android 14 开始,主区域只能有一个 (1) 配置。非主区域可以有多个配置。以下规则适用于车载音频配置

  • 主音频区域只能有一个配置。

  • 非主音频区域可以有多个配置。

  • 对于每个音频区域和音频区域配置,名称都必须是唯一的。

  • 在一个音频区域内,音频配置可能有所不同

    • 音量组设置无需相同。
    • 音频上下文分配无需相同。
  • 音频输出设备名称在区域或配置之间应是唯一的。设备名称在音频配置或区域中应出现一次。

  • 属于同一音量组的音频设备应具有相同的音频增益配置。

  • 所有音频上下文(OEM 或静态)都必须为每个音频配置分配。

向前兼容性

尽管新版本的 car_audio_configuration.xml 在每次更新中都引入了新功能,但您仍然可以在较新版本的 AAOS 中使用旧文件。更新到新版本 Android 的 OEM 可以重复使用 car_audio_configuration.xml 文件。

要使用需要 car_audio_configuration.xml 中包含的新功能,必须更新版本。尝试使用文件版本不支持的信息的旧版本文件会在启动车载服务时抛出 IllegalStateException。异常消息包含有关使用哪些信息以及需要哪些最低版本的相关信息。