音量管理

ボリューム管理は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>

初期化中に、ボリューム グループは関連するデバイスのゲイン値をチェックし、次のようにグループを構成します。

  • 刻み幅。ボリューム グループによって制御されるすべてのデバイスで同じである必要があります。
  • 最小ゲイン。グループ内のデバイスの中で最小の最小ゲイン。
  • 最大ゲイン。グループ内のデバイスの中で最も高い最大ゲイン。
  • デフォルトのゲイン。グループ内のデバイスの中で最も高いデフォルト ゲイン。

これらの値の構成方法を考慮すると、ボリューム グループに関連付けられたデバイスでサポートされている範囲外にボリューム グループのゲインを設定する可能性があります。この場合、そのデバイスのゲインは、ボリューム グループの値が範囲を下回っているか上回っているかに基づいて、デバイスの最小ゲイン値または最大ゲイン値に設定されます。

ボリュームグループ識別子

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

マルチゾーンのボリューム管理

各オーディオ ゾーンには 1 つ以上のボリューム グループがあることが想定されており、各ボリューム グループは 1 つのオーディオ ゾーンにのみ関連付けられます。この関係はcar_audio_configuration.xmlの一部として定義されます。詳細については、 「ボリューム グループの定義」の上記の例を参照してください。

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

ボリュームキーイベントの処理

Android では、音量制御用に次のようないくつかのキーコードが定義されています。

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

デフォルトでは、Android はボリューム キー イベントをアプリにルーティングします。自動車の実装では、これらの主要なイベントが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の適切なレンダリングを提供します。

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

<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()使用してボリューム変更の通知を受け取ります。

車ボリュームグループイベント

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

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

車のボリュームグループ情報

イベント コールバックの受信者は、影響を受ける自動車のボリューム グループ情報のリストにすぐにアクセスできます。これは、アプリが最新の状態を取得するためにカーオーディオ フレームワークに対して追加の呼び出しを行う必要がないことを意味します。受信したCarVolumeGroupInfosを使用してto update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of

イベントタイプ

CarVolumeGroupInfo のどの側面が変更されたかを定義します。アプリはこれを使用して変更を特定し、必要なアクションを実行できます。たとえば、 EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED 、それぞれのCarVolumeGroups' maximum volume gain index has changed and can be queried by示します。

次の表は、 EventTypeCarVolumeGroupInfoの関係を示しています。

イベントタイプ車のボリュームグループ情報
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
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に対してはいかなるプロセスも強制しません。 ExtraInfosに基づいてプロセスを決定するかどうかは、ユーザーの裁量に任されています。たとえば、 EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKEDにより減衰がアクティブになっている場合、ユーザーが音量を変更できないように、最初に音量バー UI をフェードアウトすることも選択できます。他の人は、ダッキングがアクティブであることを示すトーストを表示し、ユーザーが音量を変更できるようにすることもできます。

カーオーディオ フレームワークは、AudioControl HAL IAudioGainCallbackに依存して、推奨されるExtraInfosを提供します。詳細については、 「オーディオ ゲイン コールバック」を参照してください。

CarVolumeGroupEventカー オーディオ フレームワークの将来のニーズに合わせて拡張します。新しい機能はCarVolumeGroupEventを通じてのみサポートする予定です。アプリ開発者は、グループの音量とミュートの変更を処理するためにCarVolumeGroupEventを使用することを強くお勧めします。

車のボリュームグループイベントコールバック

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

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

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

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

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

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

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

HAL API

オーディオコントロール @2.0 AIDL

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

API目的
IAudioControl#registerGainCallback IAudioGainCallbackのインスタンスを AudioControl HAL に登録します。
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 に更新します。

  • ユーザーはボリューム アプリを使用してボリューム インデックスを 30 に変更します。

  • このインデックスはボリューム ゲインに変換され、Audio HAL に送信されます。

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

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

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

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

使用例: サスペンドを終了した後の最初のオーディオ再生

  • サスペンド前のボリューム インデックスは、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 、Event-type (何が変更されたか)、および Extra-info (変更された理由) が含まれます。

画像

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

HAL API

オーディオコントロール @ 3.0 AIDL

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

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

順序

ダイナミックボリューム構成のシーケンス図を以下に示します。

画像

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

重要な側面

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

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

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

  • 複数のオーディオ バスが同じボリューム グループに属する場合、それぞれのバスが同一のボリューム範囲定義を持つ必要があります。そうしないと、カー オーディオ フレームワークが新しい音量範囲の定義を拒否します。