AIDL と HIDL オーディオ HAL の比較

Android 14 より、パートナーと SoC ベンダーは現在の HIDL HAL 実装を AIDL HAL 実装に変更することが推奨されます。

HIDL オーディオ HAL から AIDL オーディオ HAL にスムーズに移行できるように、このページでは主な相違点をまとめています。また、このページではオーディオ HAL の AIDL インターフェースと HIDL インターフェース間のマッピングについても説明しています。

AIDL と HIDL オーディオ HAL 実装の違い

HIDL 構造と AIDL 構造の主な違いは次のとおりです。

  • AIDL オーディオコア HAL では、IConfig インターフェースが HIDL HAL の XML ファイルにあるシステム全体のパラメータに置き換わるものとして導入されています。フレームワークはベンダー構成ファイルではなくコア HAL からこれらのパラメータを読み込みます。例を挙げると、ユーザー制御に表示されるサラウンド形式のリストはコア HAL の IConfig.getSurroundSoundConfig メソッドで指定されます。

    AIDL オーディオ エフェクト HAL では、HIDL エフェクト HAL の XML ファイルで定義されている effectProxy ロジックがオーディオ フレームワークに移行します。オーディオ フレームワークは IFactory.queryEffects を使ってシステムのすべてのエフェクト インスタンスをクエリし、IFactory.queryProcessing を使ってすべてのエフェクト処理をクエリします。

  • オーディオ デバイスタイプのデバイスという用語の使用により混乱を招かないように、HIDL オーディオ HAL の IDevice は AIDL オーディオ HAL では IModule に名前が変更されます。

  • IPrimaryDevice は AIDL オーディオ HAL では置き換わります。現在のオーディオ モードと画面の回転に関するアップデートはすべての IModule インスタンスに送信されます。Bluetooth 同期接続指向(BT SCO)とハンズフリー プロファイル(HFP)に関連するパラメータは専用の IBluetooth インターフェースで処理されます。専用の ITelephony インターフェースではテレフォニー固有の制御ができます。この両方のインターフェースのインスタンスは、IModule インターフェースのプライマリ インスタンスから取得できます。詳細はコア HAL の比較表と、機能関連の特徴をご覧ください。

  • IDevicesFactory は冗長を避けるため、AIDL オーディオ HAL では削除されます。HAL モジュール(IModule インターフェース インスタンス)は bluetoothr_submix などの名前をインスタンス名に使用して、直接サービス マネージャーに登録されます。唯一の例外は primary モジュールで、インスタンス名は default として登録されます。

AIDL と HIDL オーディオ HAL のマッピング

次のセクションの表は HIDL と AIDL オーディオ HAL インターフェース間のマッピングを示しています。ディレクトリ構造について詳細は、オーディオ HAL README ファイルをご覧ください。

コア HAL

すべての HIDL インターフェースは android.hardware.audio@N.M パッケージ内にあり、N.MMajor.Minor バージョンを意味します。すべての AIDL インターフェースは android.hardware.audio.core パッケージ内にあります。

HIDL API インターフェースと構成ファイル AIDL API インターフェース
IDevicesFactory ServiceManager での IModule の登録。
IDevice IModule
IPrimaryDevice ITelephony
IBluetooth
IStream
IStreamIn
IStreamOut
StreamDescriptor
IStreamIn
IStreamCommon
IStreamOut
audio_policy_configuration.xml
audio_policy_engine_configuration.xml
IConfig
IModule
設定可能なオーディオ ポリシー ファイル Android 14 の HIDL 実装を使用します。

オーディオ ポート、ダイナミック プロファイル、ルート、パッチ

この表では、XML ファイルの要素を山かっこで囲んでいます。

HIDL API インターフェース メソッドと構成ファイルの要素 AIDL API インターフェース メソッド
<attachedDevices>
<defaultOutputDevice>
<mixPorts>
<devicePorts>
IModule.getAudioPorts
IDevice.getAudioPort
IDevice.setConnectedState
IModule.getAudioPort
IModule.connectExternalDevice
IModule.disconnectExternalDevice
IStream.getSupportedProfiles IModule.connectExternalDevice
<routes> IModule.getAudioRoutes
IDevice.createAudioPatch
IDevice.updateAudioPatch
IDevice.releaseAudioPatch
IStream.getDevices
IStream.setDevices
IDevice.openInputStream のデバイスの仕様
IDevice.openOutputStream
IModule.setAudioPatch
IModule.setAudioPortConfig
IModule.resetAudioPatch

オーディオ ポート構成とストリーム

HIDL API インターフェース メソッド AIDL API インターフェース メソッド
IStream.getAudioProperties
IStream.setAudioProperties
IStreamIn.getAudioSource
IModule.getAudioPortConfigs
IModule.setAudioPortConfig
IDevice.openInputStream
IDevice.openOutputStream
IStreamIn.prepareForReading
IStreamOut.prepareForWriting
IStream.createMmapBuffer
IModule.openInputStream
IModule.openOutputStream
IStream.close IStreamCommon.close
IStreamIn.updateSinkMetadata
IStreamOut.updateSourceMetadata
IStreamIn.updateMetadata
IStreamOut.updateMetadata
IStream.standby StreamDescriptor.Command.standby
IStream.pause
IStream.resume
IStream.start
IStream.stop
StreamDescriptor.Command.pause
.start
.start
.drain
IStreamOut.drain
IStreamOut.flush
StreamDescriptor.Command.drain
.flush
IStreamOut.setCallback
IStreamOut.clearCallback
IModule.openOutputStream
IStreamCommon.close
IStreamOut.getPresentationPositionIStreamIn.getCapturePosition
IStreamOut.getLatency
IStream.getMmapPosition
IStreamIn.getInputFramesLost
StreamDescriptor.Reply.observable
StreamDescriptor.Reply.latencyMs
StreamDescriptor.Reply.hardware
StreamDescriptor.Reply.xrunFrames
IDevice.getInputBufferSize
IStreamOut.getLatency
IStream.getBufferSize
IStream.getFrameSize
IStream.getFrameCount
IModule.setAudioPatch、軽微なレイテンシ、最小バッファサイズは HAL によって返される AudioPatch 構造の一部です。実際のバッファサイズ(フレーム数)は StreamDescriptor 構造の一部です。フレームサイズ(バイト数)も同様です。バッファサイズ(バイト数)はこれら 2 つの数字を乗算して計算できます。

オーディオ エフェクト接続

HIDL API インターフェース メソッド AIDL API インターフェース メソッド
IDevice.addDeviceEffect
IDevice.removeDeviceEffect
IModule.addDeviceEffect
IModule.removeDeviceEffect
IStream.addEffect
IStream.removeEffect
IStreamCommon.addEffect
IStreamCommon.removeEffect

システム全体の設定

これまでオーディオ ポリシー XML 構成ファイル(audio_policy_configuration.xmlaudio_policy_engine_configuration.xml)で定義されていたシステム全体の設定は、IConfig で行う必要があります。ただし、AIDL への移行をスムーズに行えるように、ベンダーは引き続きこれまでシステム全体の設定に使用してきたものと同じ XML ファイルを使用することもできます。IConfig のリファレンス実装には、AIDL データタイプを使用して XML ファイルからの情報を示すために必要なコードが含まれており、XML から AIDL への変換をサポートします。

HIDL 構成ファイルの要素 AIDL API インターフェース メソッド
<globalConfiguration>
<speaker_drc_enabled>1

<call_screen_mode_supported>
<engine_library>
2 つの異なるメソッドに分割:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig
<volumes> または
<volumeGroups><ProductStrategies>
IConfig.getEngineConfig
<surroundSound> IConfig.getSurroundSoundConfig

  1. speaker_drc_enabled は構成ファイルから削除されます。この構成アイテムはシステム内で使用されないためです。すべてのデバイスで DRC を有効にする必要があります。<ahref="#fnref1" rev="footnote"> </ahref="#fnref1">

機能関連の特徴

HIDL API インターフェース メソッド AIDL API インターフェース
IDevice.setMasterVolume
IDevice.getMasterVolume
IDevice.setMicMute
IDevice.getMicMute
IDevice.setMasterMute
IDevice.getMasterMute
IModule.\*
IPrimaryDevice.getTtyMode
IPrimaryDevice.setTtyMode
IPrimaryDevice.getHacEnabled
IPrimaryDevice.setHacEnabled
IPrimaryDevice.setVoiceVolume
ITelephony.TelecomConfig.\*
IPrimaryDevice.setBtScoHeadsetDebugName
IPrimaryDevice.getBtScoNrecEnabled
IPrimaryDevice.setBtScoNrecEnabled
IPrimaryDevice.getBtScoWidebandEnabled
IPrimaryDevice.setBtScoWidebandEnabled,
IPrimaryDevice.getBtHfpEnabled
IPrimaryDevice.setBtHfpEnabled
IPrimaryDevice.setBtHfpSampleRate
IPrimaryDevice.setBtHfpVolume
IBluetooth.ScoConfig.\*
IBluetooth.HfpConfig.\*
IPrimaryDevice.setMode
IPrimaryDevice.updateRotation
ITelephony.switchAudioMode
IModule.updateAudioMode
IModule.updateScreenRotation
IDevice.setScreenState
IDevice.getMicrophones
IModule.updateScreenState
IModule.getMicrophones
IDevice.getHwAvSync
IStream.setHwAvSync
IModule.generateHwAvSyncId
IStreamCommon.updateHwAvSyncId
IStreamIn.setGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamIn.setHwGain
IStreamIn.setMicrophoneDirection
IStreamIn.setMicrophoneFieldDimension
IStreamOut.getDualMonoMode
IStreamOut.setDualMonoMode
IStreamOut.getPlaybackRateParameters
IStreamOut.setPlaybackRateParameters
IStreamOut.selectPresentation
IStreamOut.getAudioDescriptionMixLevel
IStreamOut.setAudioDescriptionMixLevel
IStreamOut.setLatencyMode
IStreamOut.getRecommendedLatencyModes
IStreamOut.\*
IStreamOut.setEventCallback
IStreamOut.setLatencyModeCallback
IModule.openOutputStream(コールバックは IStreamOutEventCallback に統合)
IDevice.get/setParameters
IStream.get/setParameters
IModule.get/setVendorParameters
IStreamCommon.get/setVendorParameters

廃止メソッド

HIDL API インターフェース メソッド コメント
IDevice.initCheck
IDevice.close
HAL モジュールは初期化が正常に終了すると、ServiceManager でのみ公開されます。その時点で恒久的とみなされ、閉じることはできません。
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain
パッチ、一時停止、再開、消耗に対するサポートは必須です。
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp
廃止。

ベンダー拡張

HIDL API では、IDeviceIStream インターフェースから getParameters または setParameters メソッドを使って、ベンダー拡張が実装されます。これらのメソッドでは任意の文字列を使用できます。AIDL API には、getVendorParameterssetVendorParameters などの対応するメソッドがあり、ParcelableHolders 内のカプセル化を使って、任意の Parcelable インスタンスを取得します。

その他の変更点

その他の一般的な変更には次のものがあります。

  1. HAL API のテストの容易性を高めるため、AIDL バージョンでは VTS テストで使用するデバッグ オプションを導入しています。これは ModuleDebug Parcelable から利用できます。これらのオプションは HAL に特定の機能(外部デバイスとの接続など)のエミュレートを指示します。オプションを使用しない場合、手動での操作と外部テスト機器が必要となります。

  2. HAL サービスはシステム プロパティの sys.audio.restart.hal の値を 1 に設定した場合、再起動する必要があります。再起動は audioserver.rc で行われます。HAL を実装する際に、audioserver.rc ファイルに記載された適切な HAL サービス名を使用してください。Android 14 では、vendor.audio-hal-aidl という名前が AIDL バージョンの HAL 用に追加されています。

エフェクト HAL

すべての HIDL インターフェースは android.hardware.audio.effect@N.M* パッケージ内にあり、N.MMajor.Minor バージョンを意味します。すべての AIDL インターフェースは android.hardware.audio.effect パッケージ内にあります。

HIDL API インターフェースと構成ファイル AIDL API インターフェース
IEffectsFactory IFactory
IEffect IEffect
audio_effects.xml IEffect

エフェクト Factory

HIDL API インターフェース
(android.hardware.audio.effect@X.X)
AIDL API インターフェース
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors null UUID パラメータを持つ IFactory.queryEffects
IEffectsFactory.getDescriptor UUID パラメータを持つ IFactory.queryEffects
IEffectsFactory.createEffect IFactory.createEffect
audio_effects.xml IFactory.queryProcessing
IFactory.queryEffects

エフェクト インターフェース

HIDL API インターフェース
(android.hardware.audio.effect@X.X)
AIDL API インターフェース
(android.hardware.audio.effect)
IEffect.init IEffect.open
IEffect.setConfig IEffect.setParameter
IEffect.enable IEffect.command(CommandId::START)
IEffect.disable IEffect.command(CommandId::STOP)
IEffect.reset IEffect.command(CommandId::RESET)
IEffect.getDescriptor IEffect.getDescriptor
IEffect.command 従来の HIDL コマンドのタイプに基づき、IEffect.command
IEffect.setParameter
IEffect.getParameter にマッピング
なし IEffect.getState
IEffect.setParameter IEffect.setParameter
IEffect.getParameter IEffect.getParameter

エフェクト コマンド

HIDL API インターフェース
(android.hardware.audio.effect@X.X)
AIDL API インターフェース
(android.hardware.audio.effect)
EFFECT_CMD_INIT IEffect.open
EFFECT_CMD_RESET CommandId.RESET
EFFECT_CMD_ENABLE IEffect.command(CommandId::START)
EFFECT_CMD_DISABLE IEffect.command(CommandId::STOP)
EFFECT_CMD_SET_PARAM_DEFERRED エフェクト AIDL HAL で非推奨
EFFECT_CMD_SET_PARAM_COMMIT エフェクト AIDL HAL で非推奨
EFFECT_CMD_SET_CONFIG
EFFECT_CMD_SET_PARAM
EFFECT_CMD_SET_DEVICE
EFFECT_CMD_SET_VOLUME
EFFECT_CMD_SET_AUDIO_MODE
EFFECT_CMD_SET_CONFIG_REVERSE
EFFECT_CMD_SET_INPUT_DEVICE
EFFECT_CMD_SET_FEATURE_CONFIG
EFFECT_CMD_SET_AUDIO_SOURCE
IEffect.setParameter
EFFECT_CMD_GET_PARAM
EFFECT_CMD_GET_CONFIG
EFFECT_CMD_GET_CONFIG_REVERSE
EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
EFFECT_CMD_GET_FEATURE_CONFIG
VISUALIZER_CMD_MEASURE
EFFECT_CMD_FIRST_PROPRIETARY
VISUALIZER_CMD_CAPTURE と同様)
IEffect.getParameter
EFFECT_CMD_OFFLOAD 非推奨。
AIDL ではオフロードと非オフロード モードの切り替えはフレームワークで処理されます。
EFFECT_CMD_DUMP 組み込みバインダ トランザクションの AIBinder_dump で処理。

一般的なエフェクト パラメータ定義

HIDL 定義
(android.hardware.audio.effect@X.X)
AIDL 定義
Types.hal Flags.aidl
Parameter.aidl

固有のエフェクト定義

HIDL API インターフェース
(android.hardware.audio.effect@X.X)
AIDL API インターフェース
(android.hardware.audio.effect)
I$EffectType$.hal $EffectType$.aidl