自 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
介面執行個體) 現在會直接向服務管理員註冊,並使用執行個體名稱做為其名稱,例如bluetooth
或r_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.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
parcelable 取得。這些選項可指示 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 |
包含空值 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 |