设备类型限制

在 Android 音频中,audio_devices_t 用于表示音频设备类型。它在音频源代码中被广泛用作位字段,用于过滤或选择一个或多个指定的设备。在 Android 11 之前,音频输入/输出设备类型数量限制为 30 个,没有备用插槽来添加新的音频设备类型。我们已取消音频设备类型数量的限制,以便可以添加新的音频设备类型。

为了取消音频设备类型数量的限制,音频设备类型现在是枚举值,而不是位掩码。

所有现有的音频设备类型都保持不变。AUDIO_DEVICE_BIT_IN 仍然用于区分输入或输出设备。当添加新的音频设备类型时,它们是现有值之间间隙中的枚举值。

OEM 不应将 audio_devices_t 用作位掩码,因为当添加新的枚举音频设备类型时,这可能会导致意外结果。

示例和来源

在 Android 11 之前,音频设备类型作为位掩码有两种典型用法。

  • 使用 audio_devices_t 值来表示多个音频设备。
  • 检查 audio_devices_t 值是否包含来自指定类别的音频设备类型。

为了表示多个音频设备类型,使用了 /libaudiofoundation/include/media/AudioContainers.h 中的名为 DeviceTypeSet 的类,它是 audio_devices_tstd::set 容器。该类在供应商可用的 libaudiofoundation 库中声明。为了在 C 代码中表示多个音频设备类型,可以使用 audio_devices_t 的数组或列表。

为了检查单个设备类型是否属于指定类别,请使用 /system/media/audio/include/system/audio.h 中的辅助函数 audio_is_.*_device。对于多个音频设备类型的情况,请使用 libaudiofoundation 中的辅助函数。例如,使用 AudioContainers.h 中的 areAllOfSameDeviceType (DeviceTypeSet, std::function) 来检查给定的所有音频设备类型是否属于同一类型。

实现

OEM 需要从音频 HAL 实现中删除音频设备类型位字段表示形式。

  1. 删除位字段上设备的所有存储。

    audio_devices_t 不应该用于表示多种音频设备类型。请改用列表或矢量。

  2. 停止使用位运算进行设备类型比较。

    在 Android 11 之前,音频设备类型可以用作位字段。在这种情况下,通常使用位运算进行设备类型比较。当添加新的、枚举的音频设备类型时,位运算可能会导致意外的结果。请改用辅助函数作为替代方案。如果只有一个音频设备类型,则使用直接比较来比较两个值。要检查音频设备类型是否属于指定类别,请使用 /system/media/audio/include/system/audio.h 中的辅助函数。例如,audio_is_output_device(audio_devices_t device)

  3. 停止使用音频设备类型组的预定义值。

    system/media/audio/include/system/audio-base-utils.h 中,有一些音频设备类型组的预定义值,例如 AUDIO_DEVICE_OUT_ALL。所有这些值都已保留,但可能会被弃用,因为当添加新的枚举音频设备类型时,它们将不再正确。在 audio-base-utils.h 中定义了新的音频设备类型组,它们是音频设备类型数组,例如 AUDIO_DEVICE_OUT_ALL_ARRAY

  4. 实施 create_audio_patch()release_audio_patch() 方法进行路由,而不是 set_parameters

    set_parameters 方法使用音频设备类型作为位字段,因此如果添加新的枚举音频设备类型,可能会出现意外的结果。

    目前,需要两种音频补丁

    • 混音到设备补丁,用于播放
    • 设备到混音补丁,用于录音

    在后续更新中,设备到设备可能需要额外的补丁。

    创建音频补丁时,如果未指定补丁句柄,则音频 HAL 需要生成一个唯一的补丁句柄,用于标识音频补丁。否则,音频 HAL 应使用给定的音频补丁句柄来更新音频补丁。

    如果使用旧版音频 HAL 和 AOSP HIDL 封装容器,则旧版音频 HAL 应将主要 HAL 版本设置为 3.0。

    要启用音频补丁功能,音频 HAL 应将主要 HAL 版本设置为 3.0 或更高版本。有关更多信息,请参阅 default HIDL implementation 中的 Device::supportsAudioPatches(),该信息也可以在 Cuttlefish 的音频 HAL 上找到。

自定义

无法关闭此功能,也无法恢复框架中使添加音频设备类型成为可能的音频设备重构。

所有添加的音频设备类型都允许用单个位集表示设备类型,因此当前的 HAL 实现仍然有效。

如果添加了新的音频设备类型,并且 OEM 想要使用它们,则必须升级其音频 HAL 实现并迁移到 HIDL 版本 6.0 或更高版本。必须将主要 HAL 版本升级到 3.0 并实施 create_audio_patchrelease_audio_patch 方法,因为当添加新的音频设备类型时,使用 set_parameters 路由流可能会导致意外的结果。

验证

OEM 需要做的工作是更新其 HAL 实现。音频 HAL 的 VTS 可用于验证实现是否按预期工作。所有测试都可以在 VTS files 中找到。