車輛音訊設定

在 Android 10 中,car_audio_configuration.xml 取代了 car_volumes_groups.xmlIAudioControl.getBusForContext。音訊政策檔案通常位於供應商分割區,代表主機板的音訊硬體設定。car_audio_configuration.xml 中參照的所有裝置都必須在 audio_policy_configuration.xml 中定義。

圖 1 概略說明車輛音訊服務架構,其中車輛音訊服務會讀取車輛音訊設定檔,為裝置設定音訊。

車輛音訊架構總覽

圖 1. 車輛音訊架構總覽。

將車輛音訊設定檔放在裝置的 vendor/etc/system/etc/ 中,車輛音訊服務會先在 vendor/etc/ 中搜尋檔案。車輛音訊服務會讀取 car_audio_configuration.xml,判斷音訊設定。

車輛音訊區域:

  • 每個音訊區域都包含專屬的音訊區域 ID。
  • 每個音訊區域都可以對應到居住者區域。
  • 每個區域的音訊動作彼此獨立:

    • 音訊焦點
    • 音訊路由
    • 降低其他應用程式音量
  • 車輛音量群組:

    • 含有音量群組的所有音訊裝置會一起受到控制,增益變化相同。群組中所有裝置的音訊增益設定應相同。

    • 音訊情境與音訊裝置的對應關係。您可以使用這個類別建構音訊混音,將音訊用途對應至輸出裝置。

    • 所有音訊情境都應在一個區域內呈現。這樣一來,系統就能為所有音訊屬性用途準確設定音訊路徑。

音訊情境

為簡化 AAOS 音訊設定,我們將類似的用途歸類為 CarAudioContextsCarAudioService 會使用這些音訊環境定義路徑、音量群組、音訊焦點和閃避管理。下表列出 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

啟用 Android Auto OS 路由

如要使用以 AAOS 為基礎的轉送功能,請將 audioUseDynamicRouting 標記設為 true

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

false 時,系統會停用路徑和大部分的 CarAudioService,而 AAOS 會回復為 AudioService 的預設行為。

可設定的音訊政策引擎

為進一步擴展 Android 14 中的車輛音訊管理功能,AAOS 導入了透過可設定音訊政策引擎 (CAP) 管理音訊的功能。這樣一來,您就能更靈活地控制音訊路徑和音量管理,並定義以下項目:

您可以使用 useCoreAudioVolumeuseCoreAudioRouting 啟用可設定的音訊政策 (CAP) 引擎,詳情請參閱「可設定的音訊政策引擎」。

主要區域

根據預設,所有音訊都會傳送到主要區域。只能有一個主要區域,設定中會以 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,並套用至這些裝置的輸出內容。

對於主要區域,建議系統音效與其他音效分開。這樣一來,系統就會優先處理車輛音效。 車輛音訊服務已根據焦點和閃避管理,區分車輛聲音。舉例來說,緊急音效焦點要求會比其他焦點要求優先處理。

在次要區域範例中,所有音訊情境都會路由至單一裝置和一個音量群組。

CAP 引擎的磁碟區群組定義

如要透過 CAP 引擎管理音量 (如「可設定的音訊政策引擎」一文所述),音量群組定義也必須包含名稱:


<group name="media">
  <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 name="navigation">
  <device address="bus1_navigation_out">
    <context context="navigation"/>
  </device>
  <device address="bus2_voice_command_out">
    <context context="voice_command"/>
  </device>
</group>

這個磁碟區群組名稱必須與 CAP 引擎中定義的磁碟區名稱相符。此外,useFixedVolume 也必須設為 false。詳情請參閱「音訊設定 AAOS 旗標」。

乘員區域音訊設定

在 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 外掛程式服務,可讓您管理由車輛音訊服務監管的音訊行為。除了新的外掛程式服務,車輛音訊設定檔也新增了下列變更:

  • 原始設備製造商定義的車輛音訊情境
  • 非主要區域的動態設定

原始設備製造商定義的車輛音訊情境

如要啟用彈性音訊設定,在 Android 14 中,車用音訊服務可讓音訊用途以不同於靜態 Audio contexts 的方式分組。這個 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 context contains only AUDIO_USAGE_GAME

內容必須定義於 car_audio_configuration.xml 檔案頂端。定義 OEM 內容後,其餘車輛音訊設定程序與先前相同。車輛音訊情境適用下列規則:

  • OEM 內容定義為選用項目。改為使用靜態 Audio context

  • 請勿重複使用內容名稱。

  • 請勿將音訊屬性用法指派給多個情境。

  • 應使用 AudioAttributes 中定義的所有音訊用途,建構內容。

嚴格來說,OEM 音訊內容定義必須使用音訊用量的字串表示法。android.audio.policy.configuration.V7_0.AudioUsage日後,系統會將較新的音訊屬性用法指派給最合適的環境,以減少從一個 Android 版本遷移至另一個版本時發生的錯誤。

雖然導入 OEM 定義的內容是為了進一步擴充 OEM 外掛程式音訊服務,但即使沒有 OEM 外掛程式服務,仍可使用這項功能。音訊行為與靜態音訊服務類似:

  • 音訊焦點互動。音訊屬性可用於根據音訊焦點互動矩陣設定,判斷最佳比對行為。詳情請參閱「音訊焦點」。

  • 音量控制音訊屬性可用於判斷最佳比對結果:

    • 音量群組,根據 OEM 定義的環境而定。
    • 從設定的靜態磁碟區清單取得優先順序。
  • 降低其他應用程式音量行為:

    • 系統會使用目前音訊焦點的音訊屬性,對應至車輛音訊設定檔中定義的輸出音訊裝置資訊。

    • 音訊屬性會根據靜態音訊閃避矩陣,將相應的靜態環境對應至閃避。

CAP 引擎產品策略

如果裝置必須使用 CAP 引擎進行音量或路徑管理,OEM 定義的內容必須符合 CAP 引擎產品策略定義。如果沒有,您可以使用 OEM 定義的內容,不必使用 CAP 引擎。

如要瞭解詳情,請參閱 AAOS 中的 CAP 引擎產品產品策略

動態音訊區域設定

在 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 開始,主要區域只能有一項設定。非主要區域可以有多個設定。車輛音訊設定須遵守下列規則:

  • 主要音訊區域只能有一項設定。

  • 非主要音訊區域可以有多種設定。

  • 每個音訊區域和音訊區域設定的名稱不得重複。

  • 音訊區域內的音訊設定可能有所不同:

    • 音量群組設定不一定要相同。
    • 音訊情境指派不必相同。
  • 音訊輸出裝置名稱在區域或設定中不得重複。音訊設定或區域中,裝置名稱只能出現一次。

  • 屬於同一音量群組的音訊裝置應具有相同的音訊增益設定。

  • 必須為每個音訊設定指派所有音訊環境 (OEM 或靜態)。

前瞻相容性

雖然新版 car_audio_configuration.xml 會在每次更新中推出新功能,但您仍可在新版 AAOS 中使用舊版檔案。如果原始設備製造商 (OEM) 要更新至新版 Android,可以重複使用 car_audio_configuration.xml 檔案。

如要使用需要 car_audio_configuration.xml 中新資訊的新功能,就必須更新版本。如果嘗試使用舊版檔案,但該檔案版本不支援其中的資訊,啟動車輛服務時會擲回 IllegalStateException。例外狀況訊息會包含相關資訊,說明使用的資訊和最低版本需求。