从 Android 14 开始,我们鼓励合作伙伴和 SoC 供应商将当前 HIDL HAL 实现替换为 AIDL HAL 实现。
为了方便从 HIDL 音频 HAL 顺利过渡到 AIDL 音频 HAL,本页面上重点介绍了一些关键差异。该页面还显示了音频 HAL 的 AIDL 接口和 HIDL 接口之间的映射。
AIDL 实现与 HIDL 音频 HAL 实现之间的区别
HIDL 结构和 AIDL 结构之间的主要区别如下:
在 AIDL 音频核心 HAL 中,引入了
IConfig
接口以替代 HIDL HAL 中的 XML 文件中的系统级参数。框架从 Core HAL(而不是供应商配置文件)读取这些参数。例如,为了便于用户控制而呈现的环绕格式列表由 Core HAL 中的IConfig.getSurroundSoundConfig
方法提供。在 AIDL 音效 HAL 中,HIDL 音效 HAL 中的 XML 文件中定义的
effectProxy
逻辑已移至音频框架。音频框架使用IFactory.queryEffects
查询系统中的所有效果实例,使用IFactory.queryProcessing
查询所有效果处理。为避免使用“设备”这一术语来描述音频设备类型可能产生的混淆,为避免这种情况,HIDL 音频 HAL 中的
IDevice
在 AIDL 音频 HAL 中重命名为IModule
。IPrimaryDevice
已替换为 AIDL 音频 HAL。系统会将当前音频模式和屏幕旋转方向的更新发送到每个IModule
实例。与蓝牙同步连接导向 (BT SCO) 和免触摸配置文件 (HFP) 相关的参数由专用IBluetooth
接口处理。专用ITelephony
接口提供特定于电话的控件。这两个接口的实例均可从IModule
接口的主实例中检索。如需了解详情,请参阅核心 HAL 和功能相关功能的比较表。IDevicesFactory
已从 AIDL 音频 HAL 中移除,以避免冗余。HAL 模块(即IModule
接口实例)现在使用其名称作为实例名称(例如bluetooth
或r_submix
)直接进行 Service Manager 注册。唯一的例外情况是primary
模块,该实例在实例名称default
下注册。
AIDL 和 HIDL 音频 HAL 映射
以下部分中的表显示了 HIDL 与 AIDL 音频 HAL 接口之间的映射。如需详细了解目录结构,请参阅音频 HAL 自述文件。
Core 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 中,供应商扩展是使用 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 中,专门为 AIDL 版本的 HAL 添加了名称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
|
N/A | 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 |
由内置 Binder 事务 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 |