在 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_t
的 std::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 实现中删除音频设备类型位字段表示形式。
- 删除位字段上设备的所有存储。
audio_devices_t
不应该用于表示多种音频设备类型。请改用列表或矢量。 - 停止使用位运算进行设备类型比较。
在 Android 11 之前,音频设备类型可以用作位字段。在这种情况下,通常使用位运算进行设备类型比较。当添加新的、枚举的音频设备类型时,位运算可能会导致意外的结果。请改用辅助函数作为替代方案。如果只有一个音频设备类型,则使用直接比较来比较两个值。要检查音频设备类型是否属于指定类别,请使用
/system/media/audio/include/system/audio.h
中的辅助函数。例如,audio_is_output_device(audio_devices_t device)
。 - 停止使用音频设备类型组的预定义值。
在
system/media/audio/include/system/audio-base-utils.h
中,有一些音频设备类型组的预定义值,例如AUDIO_DEVICE_OUT_ALL
。所有这些值都已保留,但可能会被弃用,因为当添加新的枚举音频设备类型时,它们将不再正确。在audio-base-utils.h
中定义了新的音频设备类型组,它们是音频设备类型数组,例如AUDIO_DEVICE_OUT_ALL_ARRAY
。 - 实施
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_patch
和 release_audio_patch
方法,因为当添加新的音频设备类型时,使用 set_parameters
路由流可能会导致意外的结果。
验证
OEM 需要做的工作是更新其 HAL 实现。音频 HAL 的 VTS 可用于验证实现是否按预期工作。所有测试都可以在 VTS files 中找到。