自 Android 14 起,我們建議合作夥伴和 SoC 供應商將目前的 HIDL HAL 實作替換為 AIDL HAL 實作。
為協助您順利從 HIDL Audio HAL 轉換至 AIDL Audio 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 Audio HAL 中的
IDevice
已在 AIDL Audio HAL 中重新命名為IModule
。IPrimaryDevice
已在 AIDL Audio HAL 中取代。系統會將目前的音訊模式和螢幕旋轉功能更新內容傳送至每個IModule
例項。與藍牙同步連線導向 (BT SCO) 和免持聽筒設定檔 (HFP) 相關的參數,是由專屬IBluetooth
介面處理。專屬的ITelephony
介面提供電話專用控制項。這兩種介面的例項可從IModule
介面的主要例項擷取。詳情請參閱 核心 HAL 和功能相關功能的比較表。IDevicesFactory
已從 AIDL Audio HAL 中移除,以免重複。HAL 模組 (即IModule
介面執行個體) 現在會直接向服務管理員註冊,並使用執行個體名稱做為名稱,例如bluetooth
或r_submix
。唯一的例外狀況是primary
模組,它會在執行個體名稱default
下註冊。
AIDL 和 HIDL 音訊 HAL 對應
下文各節中的表格會顯示 HIDL 和 AIDL Audio HAL 介面之間的對應關係。如要進一步瞭解目錄結構,請參閱 Audio 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.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 中,供應商擴充功能是使用 IDevice
和 IStream
介面的 getParameters
或 setParameters
方法實作。這些方法可接受任意字串。AIDL API 中也有對應的方法,例如 getVendorParameters
或 setVendorParameters
,這些方法會透過 ParcelableHolders
中的封裝,取得任意的 Parcelable
例項。
其他變更
其他一般變更如下:
為改善 HAL API 的測試能力,我們在 AIDL 版本中推出了 VTS 測試使用的偵錯選項,可透過
ModuleDebug
包裝函式取得。這些選項會指示 HAL 模擬特定功能 (例如連接外部裝置),否則就需要手動介入並使用外部測試設備。當系統屬性
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.M
是 Major.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 |
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 |