AIDL 和 HIDL 音訊 HAL 比較

自 Android 14 起,我們建議合作夥伴和 SoC 供應商將目前的 HIDL HAL 實作替換為 AIDL HAL 實作。

為協助順利從 HIDL 音訊 HAL 轉換至 AIDL 音訊 HAL,本頁會醒目顯示部分主要差異。本頁面也會顯示 Audio HAL 的 AIDL 和 HIDL 介面之間的對應關係。

AIDL 和 HIDL Audio HAL 實作方式的差異

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

  • AIDL Audio Core HAL 中,IConfig 介面會取代 HIDL HAL 中 XML 檔案中的系統層級參數。此架構會從 Core HAL 讀取這些參數,而非從供應商設定檔讀取。舉例來說,Core HAL 中的 IConfig.getSurroundSoundConfig 方法會提供使用者控制項顯示的環場音效格式清單。

    AIDL 音效 HAL 中,HIDL 音效 HAL 的 XML 檔案中定義的 effectProxy 邏輯會移至音訊架構。音訊架構會使用 IFactory.queryEffects 查詢系統中的所有效果例項,以及使用 IFactory.queryProcessing 查詢所有效果處理作業。

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

  • IPrimaryDevice 已在 AIDL Audio HAL 中取代。系統會將目前的音訊模式和螢幕旋轉功能更新內容傳送至每個 IModule 例項。與藍牙同步連線導向 (BT SCO) 和免持聽筒設定檔 (HFP) 相關的參數,是由專屬 IBluetooth 介面處理。專屬的 ITelephony 介面提供電話專用控制項。您可以從 IModule 介面的主要執行個體擷取這兩個介面的執行個體。詳情請參閱 核心 HAL功能相關功能的比較表。

  • IDevicesFactory 已從 AIDL Audio HAL 中移除,以免重複。HAL 模組 (即 IModule 介面執行個體) 現在會直接向服務管理員註冊,並使用執行個體名稱做為其名稱,例如 bluetoothr_submix。唯一的例外狀況是 primary 模組,它會在執行個體名稱 default 下註冊。

AIDL 和 HIDL 音訊 HAL 對應

下文各節中的表格會顯示 HIDL 和 AIDL Audio HAL 介面之間的對應關係。如要進一步瞭解目錄結構,請參閱音訊 HAL README 檔案

核心 HAL

所有 HIDL 介面都位於 android.hardware.audio@N.M 套件中,其中 N.M 代表 Major.Minor 版本。所有 AIDL 介面都位於 android.hardware.audio.core 套件中。

HIDL API 介面和設定檔 AIDL API 介面
IDevicesFactory IModule 已向 ServiceManager 註冊。
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 結構的一部分,並與以位元組為單位的訊框大小一起顯示。您可以將這兩個數字相乘,計算出緩衝區大小 (以位元組為單位)。

音效連線

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 中,供應商擴充功能是使用 IDeviceIStream 介面的 getParameterssetParameters 方法實作。這些方法可接受任意字串。在 AIDL API 中,有相對應的方法,例如 getVendorParameterssetVendorParameters,這些方法可在 ParcelableHolders 中使用封裝功能使用任意 Parcelable 執行個體。

其他變更

其他一般變更如下:

  1. 為提高 HAL API 的可測試性,我們在 AIDL 版本中推出了 VTS 測試所用的偵錯選項,且可透過 ModuleDebug parcelable 取得。這些選項可指示 HAL 模擬特定功能 (例如外部裝置的連線),否則就需要手動介入或使用外部測試設備。

  2. 當系統屬性 sys.audio.restart.hal 的值設為 1 時,必須重新啟動 HAL 服務。重新啟動是透過 audioserver.rc 完成。在實作 HAL 時,請使用 audioserver.rc 檔案中列出的適當 HAL 服務名稱。在 Android 14 中,我們特別為 HAL 的 AIDL 版本新增了 vendor.audio-hal-aidl 名稱。

特效 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

Effect Factory

HIDL API 介面
(android.hardware.audio.effect@X.X)
AIDL API 介面
(android.hardware.audio.effect)
IEffectsFactory.getAllDescriptors 包含空值 UUID 參數的 IFactory.queryEffects
IEffectsFactory.getDescriptor IFactory.queryEffects 搭配 UUID 參數
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 已在 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