自 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
介面執行個體) 現已直接註冊 方法是使用執行個體名稱做為執行個體名稱,例如bluetooth
或r_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.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.xml
和
audio_policy_engine_configuration.xml
) 必須透過 IConfig
提供。
不過,為簡化改用 AIDL,廠商仍能選擇使用
先前用來設定全系統設定的 XML 檔案
IConfig
的參考實作包含
代表使用 AIDL 資料類型的 XML 檔案資訊,
協助從 XML 轉換為 AIDL。
HIDL 設定檔元素 | AIDL API 介面方法 |
---|---|
<globalConfiguration>
<speaker_drc_enabled> <call_screen_mode_supported>
<engine_library> |
分成兩種不同方法:
ITelephony.getSupportedAudioModes
IConfig.getEngineConfig |
<volumes> ,或
<volumeGroups> (<ProductStrategies> )
|
IConfig.getEngineConfig |
<surroundSound> |
IConfig.getSurroundSoundConfig |
-
已從設定檔中移除「
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 中,廠商擴充功能是使用 getParameters
或
IDevice
和 IStream
介面中的 setParameters
方法。這些
方法接受任意字串。
在 AIDL API 中,有相對應的方法,例如 getVendorParameters
或 setVendorParameters
,取得任意 Parcelable
例項
在 ParcelableHolders
內封裝。
其他變更
其他一般變更如下:
為提高 HAL API 的可測試性,在 AIDL 版中 導入 VTS 測試目前採用的偵錯選項 透過
ModuleDebug
Parcelable這些選項會指示 HAL 執行以下動作: 模擬特定功能 (例如外接裝置的連線)、 否則就需要手動介入和使用外部測試 。當系統屬性值時,需要重新啟動 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.M
是 Major.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 |