從 Android 14 開始,我們鼓勵合作夥伴和 SoC 供應商以 AIDL HAL 實作項目取代目前的 HIDL HAL 實作項目。
為方便從 HIDL Audio HAL 順利轉換至 AIDL Audio HAL,本頁面將重點說明兩者之間的主要差異。本頁面也會顯示 Audio HAL 的 AIDL 和 HIDL 介面之間的對應關係。
AIDL 和 HIDL 音訊 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查詢所有效果處理程序。為避免與音訊裝置類型使用的「裝置」一詞混淆,HIDL Audio HAL 中的
IDevice會在 AIDL Audio HAL 中重新命名為IModule。AIDL Audio HAL 會取代
IPrimaryDevice。架構會將目前的音訊模式和螢幕旋轉更新傳送至每個IModule執行個體。專屬IBluetooth介面會處理與藍牙同步連線導向 (BT SCO) 和免持聽筒設定檔 (HFP) 相關的參數。專屬ITelephony介面提供電話專用控制項。您可以從IModule介面的主要執行個體擷取這兩個介面的執行個體。詳情請參閱「核心 HAL」和「功能相關功能」的比較表。AIDL Audio HAL 中已移除
IDevicesFactory,以免造成多餘的程式碼。HAL 模組 (即IModule介面執行個體) 現在會使用模組執行個體名稱 (例如bluetooth或r_submix) 直接向服務管理員註冊。唯一的例外是primary模組,該模組會以執行個體名稱default註冊。
AIDL 和 HIDL 音訊 HAL 對應
以下各節的表格顯示 HIDL 和 AIDL Audio HAL 介面之間的對應關係。如要進一步瞭解目錄結構,請參閱音訊 HAL。
核心 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.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 |
StreamDescriptor.Command.pause .start |
IStream.start IStream.stop (MMAP 串流) |
StreamDescriptor.Command.start 或 .burst
.pause (輸入) 和/或 .flush (輸出) |
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.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension |
IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.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.initCheckIDevice.close |
HAL 模組會在成功初始化時,透過 ServiceManager 發布自身。此時即視為永久狀態,無法關閉。 |
IDevice.supportsAudioPatches
IStreamOut.supportsPauseAndResume
IStreamOut.supportsDrain |
必須支援修補程式、暫停、繼續和排空。 |
IStreamOut.getRenderPosition
IStreamOut.getNextWriteTimestamp |
已過時。 |
供應商額外資訊
在 HIDL API 中,供應商擴充功能是使用 IDevice 和 IStream 介面的 getParameters 或 setParameters 方法實作。這些方法接受任意字串。在 AIDL API 中,有對應的方法 (例如 getVendorParameters 或 setVendorParameters),這些方法會透過 ParcelableHolders 內的封裝,採用任意 Parcelable 執行個體。
其他變更
其他一般異動如下:
為提升 HAL API 的可測試性,我們在 AIDL 版本中導入 VTS 測試使用的偵錯選項,這些選項可透過
ModuleDebug可封送物件取得。這些選項會指示 HAL 模擬特定功能 (例如連線至外部裝置),否則需要手動介入並使用外部測試設備。當架構或 VTS 測試將
sys.audio.restart.hal系統屬性設為1時,HAL 服務必須重新啟動。audioserver.rc檔案會處理重新啟動作業。實作 HAL 時,請使用audioserver.rc檔案中列出的適當 HAL 服務名稱。在 Android 14 中,系統會專為 HAL 的 AIDL 版本新增名稱vendor.audio-hal-aidl。
Effects 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 |
IFactory.queryEffects,並提供空值 UUID 參數 |
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 |