カーオーディオの設定

Android 10 では、car_volumes_groups.xml および IAudioControl.getBusForContextcar_audio_configuration.xml に置き換わりました。オーディオ ポリシー ファイルは、通常ベンダー パーティションに含まれ、ボードのオーディオ ハードウェア構成を表します。car_audio_configuration.xml で参照されるデバイスはすべて audio_policy_configuration.xml で定義されている必要があります。

図 1 は、カーオーディオ サービスがカーオーディオ構成ファイルを読み取りデバイスのオーディオを設定する、カーオーディオ サービス アーキテクチャの概要を示しています。

カーオーディオ アーキテクチャの概要

図 1. カーオーディオ アーキテクチャの概要。

カーオーディオ構成ファイルをデバイスの vendor\etc\ または system\etc\ に配置します。カーオーディオ サービスが最初にファイルを検索するのは vendor\etc\ です。カーオーディオ サービスは、car_audio_configuration.xml を読み込んでオーディオ構成を決定します。

カーオーディオ ゾーン

  • 各オーディオ ゾーンには一意のオーディオ ゾーン ID が含まれます。
  • 各オーディオ ゾーンは乗員ゾーンにマッピングされます。
  • 各ゾーンのオーディオ アクションは互いに独立しています。

    • 音声フォーカス
    • オーディオ ルーティング
    • オーディオ ダッキング
  • カー音量グループ

    • 音量グループを含むすべてのオーディオ デバイスは、同じゲイン変更で一緒に制御されます。グループ内のすべてのデバイスのオーディオ ゲイン構成は同じでなければなりません。

    • オーディオ コンテキストからオーディオ デバイスへのマッピング。オーディオの用途を出力デバイスにマッピングするオーディオ ミックスを構築するために使用します。

    • すべてのオーディオ コンテキストがゾーン内で示される必要があります。これにより、すべてのオーディオ属性の用途に対してオーディオ ルーティングを正確に設定できます。

オーディオ コンテキスト

AAOS オーディオの構成を簡素化するために、類似した用途は CarAudioContexts にグループ化されました。こうしたオーディオ コンテキストは、ルーティング、音量グループ、音声フォーカス、ダッキング管理を定義するために CarAudioService 全体で使用されます。AAOS の静的なオーディオ コンテキストを以下に示します。

この表は、オーディオ コンテキストと用途のマッピングを示しています。ハイライトされている行は、新しいシステムの用途のために提供されています。

CarAudioContext 関連付けられた AttributeUsage
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" により構成で指定されるプライマリ ゾーンは 1 つのみです。プライマリ ゾーンは自動的に Audiomanager.PRIMARY_AUDIO_ZONE に割り当てられます。

サンプル構成(バージョン 2)

たとえば、車両に 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.xmlaudioZoneIdoccupantZoneId という 2 つの新しいフィールドが導入されました。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 へのマッピングを定義しています。一般に、乗員ゾーンとオーディオ ゾーンの間のマッピングは構成できますが、1 対 1 のマッピングである必要があります。2 つの新しいフィールドを定義したルールを以下に示します。

  • プライマリ ゾーンの audioZoneId は常に PRIMARY_AUDIO_ZONE ID です。isPrimary="true" が定義された場合 audioZoneId は不要です。

  • audioZoneIdoccupantZoneId の数字は繰り返せません。

  • audioZoneIdoccupantZoneId は 1 対 1 のマッピングのみ可能です。

Android 14 カーオーディオ構成

Android 14 では、カーオーディオ サービスによって管理されるオーディオ動作をより積極的に管理できる OEM プラグイン サービスが導入されました。新しいプラグイン サービスに伴い、カーオーディオ構成ファイルに以下の変更が追加されました。

  • OEM が定義するカーオーディオ コンテキスト
  • 非プライマリ ゾーンの動的構成

OEM 定義カーオーディオ コンテキスト

柔軟なオーディオ構成を可能にするため、Android 14 では、カーオーディオ サービスによって、上記で定義した静的なオーディオ コンテキストとは異なる方法でオーディオの用途をグループ化できます。この OEM 定義コンテキストは、car_audio_configuration.xml バージョン 3 ファイルで定義できます。

代わりに、現在定義されている静的なオーディオ コンテキストが使用されます。OEM 定義カーオーディオ コンテキストの一般的な形式は次のとおりです。

OEM コンテキストは、コンテキストに割り当てられたオーディオ属性の用途のリストとともに name をそれぞれ必要とします。上記の例では、2 つのコンテキストが定義されます。

<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 で定義されるオーディオ用途はすべて、コンテキストの構築に使用する必要があります。

厳密に言えば、OEM のオーディオ コンテキスト定義には、オーディオ用途の android.audio.policy.configuration.V7_0.AudioUsage 文字列表現を使用する必要があります。将来的には、ある 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 つの構成のみ含められます。非プライマリ ゾーンには複数の構成を含められます。カーオーディオ構成には以下のルールが適用されます。

  • プライマリ オーディオ ゾーンが持てる構成は 1 つのみです。

  • 非プライマリ オーディオ ゾーンは複数の構成を持てます。

  • 各オーディオ ゾーンとオーディオ ゾーン構成の名前は一意である必要があります。

  • オーディオ ゾーン内では、オーディオ構成が異なる場合があります。

    • 音量グループ設定は同一である必要はありません。
    • オーディオ コンテキストの割り当ては同一である必要はありません。
  • オーディオ出力デバイス名は、ゾーンや構成間で一意でなければなりません。デバイス名は、オーディオ構成やゾーンに一度だけ現れる必要があります。

  • 同じ音量グループに属するオーディオ デバイスのオーディオ ゲイン構成は同じである必要があります。

  • すべてのオーディオ コンテキスト(OEM または静的)は各オーディオ構成に割り当てられる必要があります。

上位互換性

car_audio_configuration.xml の新しいバージョンでは、アップデートごとに新機能が導入されていますが、AAOS の新しいバージョンでは古いファイルを引き続き使用できます。Android の新しいバージョンにアップデートする OEM は、car_audio_configuration.xml ファイルを再利用できます。

car_audio_configuration.xml に含まれる新しい情報を必要とする新機能を使用するには、バージョンをアップデートする必要があります。古いバージョンのファイルを使用する場合、そのファイル バージョンでサポートされていない情報が含まれていると、カーサービスの開始時に IllegalStateException がスローされます。例外メッセージには、使用された情報や最小バージョン要件についての関連情報が含まれています。