AIDL 和 HIDL 音訊 HAL 比較

自 Android 14 開始,合作夥伴與 SoC 供應商 建議將目前的 HIDL HAL 實作項目替換為 AIDL HAL 。

協助順利從 HIDL 音訊 HAL 轉換 與 AIDL 音訊 HAL 相關的不同,本頁將特別說明部分主要差異。 本頁面也會顯示 AIDL 介面與 HIDL 介面之間的對應關係 音訊 HAL。

AIDL 和 HIDL 音訊 HAL 實作的差異

HIDL 結構和 AIDL 結構的主要差異如下: 如下:

  • AIDL 音訊核心 HAL 中, 導入 IConfig 介面,以取代整個系統 參數。架構會讀取 這些參數,而不是供應商設定檔。 例如,向使用者顯示的環場格式清單 是由 IConfig.getSurroundSoundConfig 方法與核心 HAL 相同

    AIDL 音效效果 HAL 中 HIDL 效果 HAL 中 XML 檔案中定義的 effectProxy 邏輯已移至 音訊架構音訊架構會查詢 系統使用 IFactory.queryEffects,而且使用 IFactory.queryProcessing

  • 為避免在音訊裝置類型使用「device」一詞,為了避免混淆, 在 AIDL 音訊 HAL 中,HIDL 音訊 HAL 中的 IDevice 已重新命名為 IModule

  • AIDL 音訊 HAL 已取代 IPrimaryDevice。目前音訊的最新資訊 模式和畫面旋轉都會傳送至每 IModule 執行個體。參數 與藍牙同步連線 (BT SCO) 和免持功能有關 設定檔 (HFP) 是由專屬的 IBluetooth 處理 存取 API專屬的 ITelephony 介面可提供電話專屬 控制項您可以從 IModule 介面的主要執行個體。請參閱 Core HAL功能相關功能 瞭解詳情

  • 已從 AIDL 音訊 HAL 中移除 IDevicesFactory,以免發生備援功能。HAL 模組 (即 IModule 介面執行個體) 現已直接註冊 方法是使用執行個體名稱做為執行個體名稱,例如 bluetoothr_submix。唯一的例外狀況是 primary 模組 會在執行個體名稱 default 下註冊。

AIDL 和 HIDL 音訊 HAL 對應

以下各節中的表格顯示 HIDL 與 AIDL 之間的對應關係 音訊 HAL 介面。詳情請見 音訊 HAL README 檔案 ,進一步瞭解目錄結構。

核心 HAL

所有 HIDL 介面都位於 android.hardware.audio@N.M 套件中,其中 N.M 代表 Major.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.getPresentationPosition」和「IStreamIn.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 的一部分 以及影格大小 (以位元組為單位)緩衝區空間 (以位元組為單位) 也就是將這兩個數字相乘

音效連線

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>
分成兩種不同方法:
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 中,廠商擴充功能是使用 getParametersIDeviceIStream 介面中的 setParameters 方法。這些 方法接受任意字串。 在 AIDL API 中,有相對應的方法,例如 getVendorParameterssetVendorParameters,取得任意 Parcelable 例項 在 ParcelableHolders 內封裝。

其他變更

其他一般變更如下:

  1. 為提高 HAL API 的可測試性,在 AIDL 版中 導入 VTS 測試目前採用的偵錯選項 透過 ModuleDebug Parcelable這些選項會指示 HAL 執行以下動作: 模擬特定功能 (例如外接裝置的連線)、 否則就需要手動介入和使用外部測試 。

  2. 當系統屬性值時,需要重新啟動 HAL 服務 sys.audio.restart.hal已設為 1。重新啟動程序是透過 audioserver.rc。 實作 HAL 時,請使用 audioserver.rc 檔案。在 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

效果工廠

HIDL API 介面
(android.hardware.audio.effect@X.X)
AIDL API 介面
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors 包含空值 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 前往IEffect.command的路徑地圖,
IEffect.setParameter,或 以舊版 HIDL 的類型為
IEffect.getParameter Command 鍵
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 已從 Effects AIDL HAL 中淘汰
EFFECT_CMD_SET_PARAM_COMMIT 已從 Effects 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