从 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。
- AIDL 音频 HAL 中的 - IPrimaryDevice已被替换。系统会将当前音频模式和屏幕旋转方向的更新发送到每个- 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 | ITelephonyIBluetooth | 
| IStreamIStreamInIStreamOut | StreamDescriptorIStreamInIStreamCommonIStreamOut | 
| audio_policy_configuration.xmlaudio_policy_engine_configuration.xml | IConfigIModule | 
| 可配置的音频政策文件 | 在 Android 14 中使用 HIDL 实现。 | 
音频端口、动态配置文件、路由和补丁
在该表中,XML 文件的元素用尖括号表示。
| HIDL API 接口方法和配置文件元素 | AIDL API 接口方法 | 
|---|---|
| <attachedDevices><defaultOutputDevice><mixPorts><devicePorts> | IModule.getAudioPorts | 
| IDevice.getAudioPortIDevice.setConnectedState | IModule.connectExternalDeviceIModule.disconnectExternalDevice | 
| IStream.getSupportedProfiles | IModule.connectExternalDevice | 
| < routes> | IModule.getAudioRoutes | 
| IDevice.createAudioPatchIDevice.updateAudioPatchIDevice.releaseAudioPatchIStream.getDevicesIStream.setDevicesIDevice.openInputStream中的设备规格IDevice.openOutputStream | IModule.setAudioPatchIModule.setAudioPortConfigIModule.resetAudioPatch | 
音频端口配置和流
| HIDL API 接口方法 | AIDL API 接口方法 | 
|---|---|
| IStream.getAudioPropertiesIStream.setAudioPropertiesIStreamIn.getAudioSource | IModule.getAudioPortConfigsIModule.setAudioPortConfig | 
| IDevice.openInputStreamIDevice.openOutputStreamIStreamIn.prepareForReadingIStreamOut.prepareForWritingIStream.createMmapBuffer | IModule.openInputStreamIModule.openOutputStream | 
| IStream.close | IStreamCommon.close | 
| IStreamIn.updateSinkMetadataIStreamOut.updateSourceMetadata | IStreamIn.updateMetadataIStreamOut.updateMetadata | 
| IStream.standby | StreamDescriptor.Command.standby | 
| IStream.pauseIStream.resumeIStream.startIStream.stop | StreamDescriptor.Command.pause.start.start.drain | 
| IStreamOut.drainIStreamOut.flush | StreamDescriptor.Command.drain.flush | 
| IStreamOut.setCallbackIStreamOut.clearCallback | IModule.openOutputStreamIStreamCommon.close | 
| IStreamOut.getPresentationPosition和IStreamIn.getCapturePositionIStreamOut.getLatencyIStream.getMmapPositionIStreamIn.getInputFramesLost | StreamDescriptor.Reply.observableStreamDescriptor.Reply.latencyMsStreamDescriptor.Reply.hardwareStreamDescriptor.Reply.xrunFrames | 
| IDevice.getInputBufferSizeIStreamOut.getLatencyIStream.getBufferSizeIStream.getFrameSizeIStream.getFrameCount | IModule.setAudioPatch、标称延迟时间和最小缓冲区大小是 HAL 返回的AudioPatch结构的一部分。
      以帧为单位的实际缓冲区空间是StreamDescriptor结构的一部分(该结构同样还包括以字节为单位的帧大小)。缓冲区大小(以字节为单位)可通过乘以这两个数字计算得出。 | 
音效连接
| HIDL API 接口方法 | AIDL API 接口方法 | 
|---|---|
| IDevice.addDeviceEffectIDevice.removeDeviceEffect | IModule.addDeviceEffectIModule.removeDeviceEffect | 
| IStream.addEffectIStream.removeEffect | IStreamCommon.addEffectIStreamCommon.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.getSupportedAudioModesIConfig.getEngineConfig | 
| <volumes>,或<volumeGroups>、<ProductStrategies> | IConfig.getEngineConfig | 
| <surroundSound> | IConfig.getSurroundSoundConfig | 
- 
  已从配置文件中移除 speaker_drc_enabled,因为此配置项不会在系统内使用。所有设备都必须启用 DRC。 <ahref="#fnref1" rev="footnote"> </ahref="#fnref1">
与功能相关的功能
| HIDL API 接口方法 | AIDL API 接口 | 
|---|---|
| IDevice.setMasterVolumeIDevice.getMasterVolumeIDevice.setMicMuteIDevice.getMicMuteIDevice.setMasterMuteIDevice.getMasterMute | IModule.\* | 
| IPrimaryDevice.getTtyModeIPrimaryDevice.setTtyModeIPrimaryDevice.getHacEnabledIPrimaryDevice.setHacEnabledIPrimaryDevice.setVoiceVolume | ITelephony.TelecomConfig.\* | 
| IPrimaryDevice.setBtScoHeadsetDebugNameIPrimaryDevice.getBtScoNrecEnabledIPrimaryDevice.setBtScoNrecEnabledIPrimaryDevice.getBtScoWidebandEnabledIPrimaryDevice.setBtScoWidebandEnabled,IPrimaryDevice.getBtHfpEnabledIPrimaryDevice.setBtHfpEnabledIPrimaryDevice.setBtHfpSampleRateIPrimaryDevice.setBtHfpVolume | IBluetooth.ScoConfig.\*IBluetooth.HfpConfig.\* | 
| IPrimaryDevice.setModeIPrimaryDevice.updateRotation | ITelephony.switchAudioModeIModule.updateAudioModeIModule.updateScreenRotation | 
| IDevice.setScreenStateIDevice.getMicrophones | IModule.updateScreenStateIModule.getMicrophones | 
| IDevice.getHwAvSyncIStream.setHwAvSync | IModule.generateHwAvSyncIdIStreamCommon.updateHwAvSyncId | 
| IStreamIn.setGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | IStreamIn.setHwGainIStreamIn.setMicrophoneDirectionIStreamIn.setMicrophoneFieldDimension | 
| IStreamOut.getDualMonoModeIStreamOut.setDualMonoModeIStreamOut.getPlaybackRateParametersIStreamOut.setPlaybackRateParametersIStreamOut.selectPresentationIStreamOut.getAudioDescriptionMixLevelIStreamOut.setAudioDescriptionMixLevelIStreamOut.setLatencyModeIStreamOut.getRecommendedLatencyModes | IStreamOut.\* | 
| IStreamOut.setEventCallbackIStreamOut.setLatencyModeCallback | IModule.openOutputStream(回调合并到IStreamOutEventCallback中) | 
| IDevice.get/setParametersIStream.get/setParameters | IModule.get/setVendorParametersIStreamCommon.get/setVendorParameters | 
已过时的方法
| HIDL API 接口方法 | 注释 | 
|---|---|
| IDevice.initCheckIDevice.close | 只有在初始化成功时,HAL 模块才会使用 ServiceManager自行发布。届时,系统会将其视为永久性操作,无法关闭。 | 
| IDevice.supportsAudioPatchesIStreamOut.supportsPauseAndResumeIStreamOut.supportsDrain | 必须支持补丁、暂停、恢复和排空。 | 
| IStreamOut.getRenderPositionIStreamOut.getNextWriteTimestamp | 已过时。 | 
供应商扩展
在 HIDL API 中,供应商扩展是使用 IDevice 和 IStream 接口中的 getParameters 或 setParameters 方法实现的。这些方法接受任意字符串。在 AIDL API 中,有相应的方法(例如 getVendorParameters 或 setVendorParameters),它们可以通过在 ParcelableHolders 中使用封装方法获取任意 Parcelable 实例。
其他更改
其他一般更改如下:
- 为了提高 HAL API 的可测试性,我们在 AIDL 版本中引入了 VTS 测试使用的调试选项,并通过 - ModuleDebugparcelable 提供。这些选项会指示 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.queryProcessingIFactory.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_CONFIGEFFECT_CMD_SET_PARAMEFFECT_CMD_SET_DEVICEEFFECT_CMD_SET_VOLUMEEFFECT_CMD_SET_AUDIO_MODEEFFECT_CMD_SET_CONFIG_REVERSEEFFECT_CMD_SET_INPUT_DEVICEEFFECT_CMD_SET_FEATURE_CONFIGEFFECT_CMD_SET_AUDIO_SOURCE | IEffect.setParameter | 
| EFFECT_CMD_GET_PARAMEFFECT_CMD_GET_CONFIGEFFECT_CMD_GET_CONFIG_REVERSEEFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGSEFFECT_CMD_GET_FEATURE_CONFIGVISUALIZER_CMD_MEASUREEFFECT_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.aidlParameter.aidl | 
具体效果定义
| HIDL API 接口 (android.hardware.audio.effect@X.X) | AIDL API 接口 (android.hardware.audio.effect) | 
|---|---|
| I$EffectType$.hal | $EffectType$.aidl | 
