音量管理

音量管理は CarAudioService に含まれています。音量管理は、ソフトウェアではなくハードウェア アンプによって HAL より下に適用されることを想定して、固定音量を使用します。CarAudioService は出力デバイスを音量グループに整理し、音量グループに関連付けられたすべてのデバイスに同じゲインを適用します。

固定音量

AAOS の実装では、ソフトウェア ミキサーの代わりにハードウェア アンプを使用して音量を制御します。副作用を回避するには、config_useFixedVolume フラグを true に設定します(必要に応じてオーバーレイします)。

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

config_useFixedVolume フラグが設定されていない(または false に設定されている)場合、アプリは AudioManager.setStreamVolume() を呼び出して、ソフトウェア ミキサーのストリーム タイプごとに音量を変更できます。他のアプリにも影響が及ぶ可能性があり、ソフトウェア ミキサーで音量を減衰させると、ハードウェア アンプで受信される信号で使用可能な有効ビット数が少なくなる可能性があるため、これは常に望ましいとは限りません。

音量グループ

音量グループは、オーディオ ゾーン内にあるデバイスの集合について、音量を管理します。音量グループごとに個別に音量を調整できます。結果として得られるゲインは、関連するデバイスで設定され、車両のアンプによって適用されます。音量設定はユーザーに対して保持され、ユーザーがログインすると読み込まれます。

音量グループを定義する

CarAudioService は、car_audio_configuration.xml で定義された音量グループを使用します。

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

各音量グループには、アドレスが関連付けられた出力デバイスを 1 つ以上含める必要があります。アドレスは、audio_policy_configuration.xml で定義された出力デバイスに対応している必要があります。

音量グループのゲインを構成する

各音量グループには、最小、最大、デフォルトのゲイン値と、音量グループに関連付けられたデバイスの audio_policy_configuration.xml で構成された値に基づくステップサイズがあります。

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

初期化の際、音量グループは関連するデバイスのゲイン値を確認し、グループを次のように構成します。

  • ステップサイズ: 音量グループによって制御されるすべてのデバイスで同じである必要があります。
  • 最小ゲイン: グループ内のデバイスの最小ゲインのうち最小のもの。
  • 最大ゲイン: グループ内のデバイスの最大ゲインのうち最大のもの。
  • デフォルト ゲイン: グループ内のデバイスのデフォルト ゲインの中で最大のもの。

これらの値の構成方法を考慮すると、音量グループに関連付けられたデバイスでサポートされている範囲を超えて音量グループのゲインを設定できます。この場合、そのデバイスのゲインは、音量グループの値が範囲より下か上かに基づいて、デバイスの最小または最大ゲイン値に設定されます。

音量グループ ID

音量グループは、XML ファイルで定義された順序で実行時に識別されます。ID の範囲は、オーディオ ゾーン内の 0 から N-1 です。N は、そのゾーン内の音量グループの数です。このように、音量グループ ID はゾーン間で一意ではありません。これらの ID は、音量グループに関連付けられた CarAudioManager API に使用されます。zoneId なしで groupId を使用する API は、デフォルトでプライマリ オーディオ ゾーンになります。

マルチゾーン音量管理

各オーディオ ゾーンには音量グループが 1 つ以上必要であり、各音量グループは 1 つのオーディオ ゾーンにのみ関連付けられます。この関係は、car_audio_configuration.xml の一部として定義されます。詳細については、上記の音量グループを定義するの例をご覧ください。

各ゾーンの現在の音量レベルは、そのゾーンに関連付けられているユーザーに対して保持されます。これらの設定はゾーン固有です。つまり、ユーザーがプライマリ ゾーンに関連付けられたディスプレイでログインし、その後セカンダリ オーディオ ゾーンに関連付けられたゾーンにログインした場合、最初のゾーンで読み込まれて維持される音量レベルは、セカンダリ ゾーンの音量レベルとは異なります。

音量キーイベントを処理する

Android では、音量調節用のいくつかのキーコードを定義しています。次に例を示します。

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

デフォルトでは、Android は音量キーイベントをアプリにルーティングします。Automotive の実装では、これらのキーイベントを CarAudioService で強制的に処理し、必要に応じて setGroupVolume または setMasterMute を呼び出す必要があります。この動作を強制するには、config_handleVolumeKeysInWindowManager フラグを true に設定します。

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

音量キーイベントには現在、どのゾーンを対象としているかを区別する方法がなく、すべてがプライマリ オーディオ ゾーンに関連付けられていると想定されます。音量キーイベントを受け取ると、CarAudioService はアクティブなプレーヤーのオーディオ コンテキストを取得してから、最も優先度の高いオーディオ コンテキストに関連付けられた出力デバイスを含む音量グループを調整することで、調整する音量グループを決定します。優先度は、CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY で定義された固定の順序に基づいて決定されます。

フェードとバランス

どちらのバージョンの AudioControl HAL にも、車両にフェードとバランスを設定するための API が含まれています。CarAudioManager 用の対応するシステム API は、AudioControl HAL に値を渡します。これらの API には android.car.permission.CAR_CONTROL_AUDIO_VOLUME が必要です。AudioControl API は次のとおりです。

  • setBalanceTowardRight(float value) は、スピーカーの音量を車両の右側(+)または左側(-)に切り替えます。

    • 0.0 が中央に配置されています
    • +1.0 で結構です
    • -1.0 は完全に左
    • -1 ~ 1 の範囲外の値はエラー
  • setFadeTowardFront(float value) は、スピーカーの音量を車両の前方(+)または後方(-)に切り替えます。

    • 0.0 が中央に配置されています
    • +1.0 は完全にフォワードです
    • -1.0 は完全に後ろ向き
    • -1 ~ 1 の範囲外の値はエラー

これらの値をどのように適用し、ユーザーに値をどのように表示するかを決定します。メディアに限定して適用することも、Android のすべてのサウンドに一律に適用することもできます。また Android 11 では、出力デバイスへのオーディオ エフェクトの適用がサポートされました。これにより、これらの API を使用せずに、適切な出力デバイスのオーディオ エフェクトを通じてフェードとバランスを管理することもできます。

オーディオ ダッキング

オーディオ ダッキングは、車両で 1 つのストリームのゲインを下げることで、同時に再生されている別のストリームを明瞭に聞こえるようにする際に発生します。AAOS では、オーディオ ダッキングは HAL によって実装されます。Android は OS 以外のサウンドを制御できません。Android 11 では、HAL がダッキングの判断に使用できる主な情報は、2 つの出力デバイスの両方にアクティブなストリームがあるかどうかです。

ダッキングするタイミング

HAL によるダッキングの処理方法は個々の OEM が決定しますが、次のガイドラインに従うことをおすすめします。

  • Android で複数のストリームが再生されるのは、2 つのアプリやサービスが音声フォーカスを同時に保持している場合が一般的です。Android が同時フォーカスを付与するタイミングについては、制限タイプのインタラクション マトリックスをご覧ください。カーオーディオ プラグインの導入に伴い、これは AudioFocus 管理にも依存します。

  • Android で混合されるストリームは、ゲインが適用される前に混合されます。そのため、別のストリームと同時に再生されたときにダッキングする必要があるストリームは、別の出力デバイスにルーティングして、ミキシングする前に HAL がダッキングを適用できるようにする必要があります。

ダッキングが推奨される同時インタラクションは次のとおりです。

インタラクション アクション
EMERGENCY SAFETY を除くすべてをダッキングまたはミュートする
SAFETY EMERGENCY を除くすべてをダッキングする
NAVIGATION SAFETYEMERGENCY を除くすべてをダッキングする
CALL SAFETYEMERGENCYNAVIGATION を除くすべてをダッキングする
VOICE CALL_RING をダッキングする
VEHICLE_SOUNDS アクティブなサウンドの重要性と、他のサウンドをダッキングするかどうかを決定します。
MUSICANNOUNCEMENT 何にでもダッキング。例外として、SYSTEM_SOUND として再生されるタップ操作音は除きます。

ダッキングする際の考慮事項

ナビゲーションやアシスタントなどの一部のアプリやサービスでは、複数のプレーヤーを使用してアクションを実行する場合があります。ナビゲーションまたはアシスタント アプリが起動してから次の再生が行われる前にメディアがフル音量に戻らないよう 3、出力デバイスへのデータ ストリームのフローが停止した場合の積極的なアンダッキングは避けてください。

十分に隔離された複数のサウンド ステージを備えた車両では、ダッキングではなく、車のさまざまなエリアにオーディオをルーティングできます。たとえば、車内全体に音楽を通常の音量で再生し続けながら、ナビゲーションの指示をドライバーのヘッドレスト スピーカーにルーティングできます。

安全上重要なサウンド

Android 11 では、HAL 音声フォーカス API が導入されました。HAL は、安全性が重視されるサウンドが他のサウンドよりも優先されるようにします。HAL が USAGE_EMERGENCY の音声フォーカスを保持している場合、Android のアプリやサービスがサウンドを再生しないという保証はありません。HAL は、安全性が重視されるサウンドを再生するために、Android からのどのストリームをミックスまたはミュートするかを決定します。

音量設定 UI を構成する

AAOS では、音量設定 UI が音量グループ構成から切り離されています。 これらは、音量グループのゲインを構成するで説明されているようにオーバーレイできます。これにより、音量グループの構成が変更されても変更が不要になります。

車の設定 UI では、packages/apps/Car/Settings/res/xml/car_volume_items.xml には、定義された各 AudioAttributes.USAGE に関連付けられた UI 要素(タイトルとアイコン リソース)が含まれます。このファイルは、各 VolumeGroup に含まれる最初に認識された用途に関連付けられたリソースを使用して、定義された VolumeGroups の適切なレンダリングを可能にします。

たとえば次の例では、voice_communicationvoice_communication_signalling を含むように VolumeGroup を定義しています。車両設定 UI のデフォルトの実装では、voice_communication に関連付けられたリソースを使用して VolumeGroup をレンダリングします。これがファイル内の最初の matc であるためです。

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

上の構成で使用される属性と値は packages/apps/Car/Settings/res/values/attrs.xml で宣言されています。音量設定 UI は、次の VolumeGroup ベースの CarAudioManager API を使用します。

  • getVolumeGroupCount(): 描画するコントロールの数を確認します。
  • getGroupMinVolume()getGroupMaxVolume(): 下限値と上限値を取得します。
  • getGroupVolume(): 現在の音量を取得します。
  • registerVolumeChangeObserver(): 音量の変更が通知されます。

車の音量グループ イベント

自動車向けの音量更新とミュート切り替えのユースケースには、音量設定など、特定のアプリのアクションを定義するコンテキストの基盤があります。カーオーディオ スタックからの現在の音量とミュートのコールバックは、限定的なコンテキスト情報を提供します。自動車のユースケースと将来のスケーラビリティを向上させるために、Android 14 に CarVolumeGroupEvent が追加されました。各イベントには、次の 3 種類の重要な情報が含まれます。

  • CarVolumeGroupInfo のリスト
  • EventTypes(ビットマップ)
  • ExtraInfos のリスト

CarVolumeGroupInfo

イベント コールバックのレシーバは、影響を受ける車両の音量グループ情報のリストにすぐにアクセスできます。つまり、アプリは最新の状態を取得するためにカーオーディオ フレームワークに追加の呼び出しを行う必要はありません。受け取った CarVolumeGroupInfos を使用するだけで、UI や内部状態を更新できます。アプリの利便性を高めるため、以下で説明するように、車の音量グループで変更されたアスペクトも EventTypes の一部として提供されています。

イベントタイプ

変更された CarVolumeGroupInfo のアスペクトを定義します。アプリはこれを使用して変更を特定し、必要なアクションを実行できます。たとえば、EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED は、それぞれの CarVolumeGroups 最大ボリューム ゲイン インデックスが変更され、CarVolumeGroupInfo.getMaxVolumeGainIndex() によるクエリが可能であることを示します。

次の表に、EventTypeCarVolumeGroupInfo の関係を示します。

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeReceiveIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeReceiveIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeTuneIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

追加情報

CarVolumeGroup が変更された理由に関する追加情報を提供します。アプリはこの情報を使用して、行動を起こすようユーザーに警告する、または通知する追加のコンテキストを提供できます。たとえば、EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL は熱過負荷によるアクティブな一時的な減衰を示します。音量を上げようとすると、アプリでユーザーに通知できます。

ExtraInfos については、Google がなんらかの措置を講じることはありません。ExtraInfos に基づいてプロセスを決定するかどうかは、お客様の裁量に任されています。たとえば、EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED による減衰が有効な場合、最初に音量バーの UI をフェードして、ユーザーが音量を変更できないようにすることもできます。また、ダッキングが有効になっているトーストを表示して、ユーザーが音量を変更できるようにする場合もあります。

カーオーディオ フレームワークは、推奨の ExtraInfos を提供するために AudioControl HAL IAudioGainCallback に依存します。詳しくは、音声ゲイン コールバックをご覧ください。

CarVolumeGroupEvent は、カーオーディオ フレームワークの将来のニーズに合わせてスケーリングされます。新機能は CarVolumeGroupEvent を通じてのみサポートされます。アプリ デベロッパーは、CarVolumeGroupEvent を使用してグループの音量を処理し、変更をミュートすることを強くおすすめします。

車の音量グループ イベントのコールバック

Android 14 では、特権アプリとプラットフォーム アプリが CarVolumeGroupEvents を登録して通知を受けるための新しいコールバックが用意されています。

  • コールバックを登録するには、CarAudioManager#registerCarVolumeGroupEventCallback() を使用します。

  • コールバックの登録を解除するには、CarAudioManager#unregisterCarVolumeGroupEventCallback() を使用します。

アプリが新しい CarVolumeGroupEventCallback と以前の CarVolumeCallback に登録されている場合は、イベント CarVolumeGroupEventCallbacks が優先されます。カーオーディオ スタックが CarVolumeCallback をトリガーしなくなりました。これにより、同じイベントで同一のアプリに対してトリガーが重複するのを防ぐことができます。

グループの音量を管理し、変更をミュートするには、CarVolumeGroupEventCallback を使用することを強くおすすめします。

オーディオ ゲイン コールバック

Android 13 以降では、AudioControl HAL は非同期コールバックをトリガーして、カーオーディオ システムの変更による音量レベルの更新を管理できます。

HAL API

AudioControl @2.0 AIDL

AudioControl AIDL HAL のバージョン 2.0 では、次の API が追加されています。

API 目的
IAudioControl#registerGainCallback AudioControl HAL に IAudioGainCallback のインスタンスを登録します。
IAudioGainCallback#onAudioDeviceGainsChanged オーディオ ゲイン構成の変更を通知する非同期コールバック。

AudioControl HAL コールバックには、理由のリストと、以下で構成されるそれぞれの AudioGainConfigInfo が含まれます。

  • ゾーン ID
  • デバイスのポートアドレス
  • ボリューム インデックス > インデックスは、制限付きインデックスまたは更新インデックスのいずれかです。

理由は大きく次のように分類できます。

  • 制限の理由。音量とミュートの動作の一時的な変更。
  • 更新理由。ボリューム動作の永続的な変更。

制限のタイプ

AudioControl HAL AIDL V3 の時点で、サポートされている制限のタイプは次のとおりです。

  • ミュート
  • ブロック
  • 制限事項
  • 減衰
有効な制限 ユーザー トリガーの音量変更 ユーザーによるミュートの切り替え
ミュート ❌(ミュートを解除)

✔(ミュート)
ブロック
制限事項 ❌(制限を超過している)

✔(制限未満)
減衰

制限の優先度は、[ミュート] > [ブロック] > [制限] > [減衰] の順で決まります。

ミュートの制限

ミュート制限は次のとおりです。

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

カーオーディオ フレームワークは、次の 2 つのミュート状態を内部的に維持します。

  • ユーザーのミュート。CarAudioManager またはキーイベントを介したユーザーからのリクエストに基づいて切り替えられます。

  • HAL ミュート。AudioGain コールバックを介して受け取ったミュート制限に基づいて切り替えられます。

設定アプリなどのリスナーの場合、音量グループ全体のミュート(CarVolumeGroupInfo.isMuted())状態は、上記のいずれかのミュートが有効になっているかどうかに基づきます。

HAL ミュートが有効になっている場合、制限中はすべての受信音量変更リクエストとグループミュート解除リクエストが無視されます。

インタラクションのケース: HAL ミュートがアクティブで、ユーザーがミュート切り替えをリクエストしている

HAL ミュートが有効で、ユーザー ミュートが無効の場合:

  • 音量グループ全体のミュート状態が true に変更されます。
  • ユーザーからのミュートを有効にするリクエストは処理されます。
    • 理由: ユーザーのプライバシーを保護するため、ユーザーのミュート リクエストは常に尊重する必要があります。

HAL ミュートが有効で、ユーザー ミュートが有効になっている場合:

  • 音量グループ全体のミュート状態が true に変更されます。

  • ユーザーからのミュートの無効化リクエストはNOT処理されます。キャッシュに保存されたユーザーのミュート状態は有効なままになります。

    • 理由: ユーザーのミュート解除リクエストは、有効な制限がない場合のみ有効となります。

    • 理由: キャッシュに保存されたユーザーのミュートを解除すると、意図しない音声の爆発が発生し、ユーザーの安全が危険にさらされる可能性があります。これは特に、イグニッション サイクル全体でミュート状態が有効になっていて、ユーザーが音レベルの知覚に気づきにくくなる場合に当てはまります。

インタラクションの場合: HAL ミュートの有効 / 無効を切り替えるが、ユーザー ミュートに変更はない

HAL ミュートを切り替えると、音量グループ全体のミュート状態が変更されます。ただし、ユーザーのミュート状態を直接更新することはありません。ユーザーのミュートが無効で、有効にする HAL ミュート コールバックを受信した場合:

  • 音量グループ全体のミュート状態が true に変更されます。
  • ユーザーからの音量変更リクエストは、HAL ミュートが有効になっているときにNOT処理されます。

    • 理由: ミュートが有効になっているときにユーザーが音を感知できません。音量の変更を許可すると、音が爆発したり、ユーザーの安全が損なわれたりする恐れがあります。

    • 理由: 音量アプリは、OEM の想定動作であれば、コールバックを登録して、ユーザーの介入なしに自動的にミュート解除(CarAudioManager.setVolumeGroupMute(...,/* Mute=*/ true,..))をトリガーできます。

ユーザー ミュートが無効であるのに HAL ミュートが無効である場合:

  • 音量グループのミュート状態が false に変更されます。

    理由: ミュート状態をスティッキーにしてユーザーにミュート解除をリクエストすると、ミュート状態が頻繁に切り替わるときに不必要にユーザーの操作が中断される可能性があります。

  • ユーザーからのボリューム変更のリクエストは通常どおり処理されます。

ブロック

ブロック制限は次のとおりです。

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE

ブロック制限が有効な場合、ユーザーから以下に対するリクエストが行われます。

  • ボリュームの変更は処理されません
  • ミュートの切り替えが処理されました。

制限事項

制限事項は次のとおりです。

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

制限による制限が有効になっている場合、ユーザーから以下に対するリクエストが行われます。

  • 音量を変更する:

    • 制限内の処理は
    • この上限を超える処理は行われない
  • ミュートの切り替えが処理されました。

減衰

減衰の制限は次のとおりです。

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

減衰の制限が有効な場合、ユーザーから以下に対するリクエストが行われます。

  • ボリュームの変更が処理されます。新しい現在の音量レベルは、以前の音量ではなく、減衰した音量に設定されます。今後のボリュームの変更は、このレベルから行われます。

  • ミュートの切り替えが処理されました。

インデックスへの更新

Reasons.EXTERNAL_AMP_VOL_FEEDBACK は非同期ボリューム インデックスの更新とみなされます。

このため、AudioControl HAL は音量グループの現在のインデックスを指定されたインデックスにアップデートできます。これは主に、カーオーディオ フレームワークの音量変更リクエストに対するオーディオ システムからのフィードバックとして使用されます。また、インデックスの更新は、インデックスを同期するための CarVolumeGroupEvent コールバックとしてアプリに送信されます。

ユースケース: ユーザーがボリューム インデックスを 30 に更新する

  • ユーザーが Volume アプリを使用して、音量インデックスを 30 に変更します。

  • このインデックスは音量ゲインに変換され、オーディオ HAL に送信されます。

  • Audio HAL のベンダー実装は、新しい音量ゲインを受け取り、オーディオ システム(外部アンプなど)を更新します。

  • オーディオ システムが、音量レベルはインデックス 15 にのみ更新されると応答する(Android が不明な理由のため)。

  • AudioControl HAL トリガーのベンダー実装:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • カーオーディオ サービスは、永続性と音量アプリへのコールバックに使用されるコールバックから新しいインデックスを使用します。ユーザーがリクエストしたインデックスは 30 です。ただし、オーディオ システムの非同期フィードバックはインデックスを 15 に更新します。

ユースケース: suspend 終了後の最初の音声再生

  • 一時停止前のボリューム インデックスは、高レベル 95(範囲: [0 ~ 99])に設定されています。

  • Android が一時停止状態になります。

  • Android が停止した場合(再開など):

    • ベンダー Audio HAL/AudioControl HAL は、30 の安全なインデックスをオーディオ システムにローカルで適用します。

    • ベンダー AudioControl HAL は、安全なインデックスのコールバックもトリガーします。

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • カーオーディオ サービスは、永続性に使用されるコールバックからの新しいインデックスと、インデックスを同期する音量アプリへの独自のコールバックを使用します。一時停止前のボリューム インデックスは 95 です。ただし、再開後、このインデックスは AudioControl HAL の実装者によって安全な音量レベル 30 に設定されています。

動的ボリュームの構成

この機能では、次の主なユースケースを想定しています。

  1. 車両の生産終了(EOL)設定。

    • 自動車メーカーは、車両オーディオ システムのセットアップに基づいて EOL に音量構成を更新することを望んでいます。通常、これは Android SW イメージを更新しないサイドロードです。

    • 自動車メーカーは、サービス スケジュール中にボリューム構成の更新が必要になる場合があります。

  2. ランタイム構成。自動車用オーディオ システムは外部アンプ構成をサポートしており、これらの ECU は起動時にクエリされる音量範囲構成をホストできます。

  3. オンデマンド構成。ユーザーが一定期間拡張シグナル処理に登録する、需要ベースのオーディオ機能に対するニーズの高まりに対応するために提供されます。新しいボリューム範囲の構成は、サブスクリプションの期間に適用されます。

デザイン

動的ボリュームの構成は次の 3 段階で行われます。

  • 見つけやすさ。ベンダーの AudioControl HAL 実装は、ベンダーが所有するカスタム IPC メカニズムを通じて新しい音量範囲の更新を検出します。

    検出されると、AudioControl::IModuleChangeCallback を介してコールバックが生成されます。

  • 更新:カーオーディオ スタックは、新しい音量範囲で音量グループの状態を更新します。

    音量範囲の更新後も同じ音量が維持されるようになっています。ただし、インデックスが範囲外になった場合、現在のボリューム インデックスは安全な値に設定されます。たとえば、コールバック中にベンダーが指定するデフォルト レベルです。

  • コールバック。

    • 音量グループ範囲の更新後、カーオーディオ スタックは CarVolumeGroupEventCallback を通じて登録されたアプリへのコールバックをトリガーします。

    • CarVolumeGroupEvent には、更新された CarVolumeGroupInfo、イベントタイプ(変更された内容)、追加情報(変更された理由)が含まれます。

画像

図 1. 動的ボリュームの構成。

HAL API

AudioControl @ 3.0 AIDL

AudioControl AIDL HAL のバージョン 3.0 では、次の API が導入されています。

API
IAudioControl#setModuleChangeCallback AudioControl HAL で IModuleChangeCallback のインスタンスを設定します。
IAudioControl#clearModuleChangeCallback 前に AudioControl HAL で設定された IModuleChangeCallback のインスタンスをクリアします。
IModuleChangeCallback#onAudioPortsChanged AudioPorts の変更を通知するコールバック

シークエンス

動的ボリューム構成のシーケンス図を以下に示します。

画像

図 2. 動的ボリューム構成のシーケンス図。

重要点

この機能を最適化するには、次の点を考慮してください。

  • コールバックの一部として提供される AudioPorts は、Automotive BUS の定義と一致している必要があります

    • デバイスのポートIN_DEVICEOUT_DEVICE
    • 接続。 BUS
    • 住所。オーディオ HAL 定義で定義
    • ゲインモード。 JOINT
  • ベンダーはオーディオ HAL ポリシーで音量範囲定義のスーパーセットを定義し、コールバックを使用して車両バリアント向けにカスタマイズする必要があります。詳細については、IModuleChangeCallbac AIDL 定義をご覧ください。

  • 同じ音量グループに属するオーディオ BUS が複数ある場合は、それぞれの音量範囲の定義が同じである必要があります。そうしないと、カーオーディオ フレームワークで新しい音量範囲の定義が拒否されます。