虚拟音频驱动程序

虚拟音频驱动程序可在 Fuchsia 系统上提供灵活可配置的音频设备,用于测试、验证和开发。它们允许自动化测试套件和开发者工具在无需实体音频硬件的情况下,对整个音频子系统进行测试。

虚拟音频设备在运行时通过 fuchsia.virtualaudio FIDL 协议动态创建、配置和控制。

架构和驱动程序版本

Fuchsia 在源代码树中提供了两种虚拟音频驱动程序实现:现代 virtual-audio 驱动程序和 virtual-audio-legacy 驱动程序。

功能 现代驱动程序 (virtual-audio) 旧版驱动程序 (virtual-audio-legacy)
驱动程序框架 驱动程序框架 v2 (DFv2) DFv1 / 旧版 DDK
源路径 //src/media/audio/drivers/virtual-audio/ //src/media/audio/drivers/virtual-audio-legacy/
软件包 / 组件 fuchsia-pkg://fuchsia.com/virtual-audio#meta/virtual-audio-driver.cm fuchsia-pkg://fuchsia.com/virtual-audio-legacy#meta/virtual-audio-legacy-driver.cm
支持的音频协议 fuchsia.hardware.audio.Composite 弃用了 StreamConfigDaiCodec
数据端点 环形缓冲区、DAI 和数据包流 流环形缓冲区、DAI 环形缓冲区
信号处理 fuchsia.hardware.audio.signalprocessing 增益和插头状态控制
Devfs / 节点位置 /dev/sys/platform/virtual-audio /dev/sys/platform/virtual-audio-legacy
主要客户 音频设备注册表、现代流水线音频测试、DFv2 驱动程序测试 audio_coreaudio-driver-ctl,针对已弃用协议的测试

现代虚拟音频驱动程序 (virtual-audio)

现代虚拟音频驱动程序在驱动程序框架 v2 中实现了 fuchsia.hardware.audio.Composite 协议。

主要功能包括: * 复合拓扑:在单个虚拟设备中公开环形缓冲区端点、DAI 互连和数据包流端点的组合。 * 信号处理:实现 fuchsia.hardware.audio.signalprocessing API,允许测试配置自定义处理拓扑、增益级、静音和均衡器元素。 * 时钟网域配置:支持配置单调或外部时钟网域,以及动态时钟速率调整,以测试漂移补偿和位置通知。 * 音频设备注册表集成:充当音频设备注册表服务的主要模拟和测试驱动程序。

旧版虚拟音频驱动程序 (virtual-audio-legacy)

旧版虚拟音频驱动程序使用旧版 DDK (DFv1) 实现,并提供实现已弃用的音频协议的虚拟设备:

  • StreamConfig:公开 fuchsia.hardware.audio.StreamConfigConnector 以创建虚拟音频输入和输出流(/dev/class/audio-input/dev/class/audio-output)。
  • DAI:公开 fuchsia.hardware.audio.DaiConnector (/dev/class/dai),支持多个并发客户端连接。
  • 编解码器:公开 fuchsia.hardware.audio.CodecConnector (/dev/class/codec)。

保留此驱动程序是为了验证旧版音频组件(例如 audio_coreaudio-driver-ctl),并验证已弃用的 FIDL 协议之间的向后兼容性。

控制和配置 API

虚拟音频设备通过 //sdk/fidl/fuchsia.virtualaudio 中定义的两种主要 FIDL 协议进行控制:

  1. fuchsia.virtualaudio.Control

    • GetDefaultConfiguration:检索给定设备类型(CompositeStreamConfigDaiCodec)的默认模板 Configuration
    • AddDevice:使用指定的 Configuration 创建并激活虚拟设备实例,并绑定 fuchsia.virtualaudio.Device 控制渠道。
    • Enable / Disable:在系统上全局启用或停用虚拟音频设备创建。
  2. fuchsia.virtualaudio.Device

    • 管理有效虚拟设备实例的生命周期。
    • 接收有关格式更改、缓冲区分配和位置更新的通知。
    • 允许测试动态模拟硬件事件,例如热插拔、拔出或调整时钟速率。
    • 关闭 Device 频道会自动关闭并从系统中移除相应的虚拟设备。

可配置的设备属性

在通过 Control.AddDevice 激活虚拟设备之前,客户端可以自定义 Configuration 表中的属性,包括:

  • 设备元数据device_namemanufacturer_nameproduct_nameunique_id
  • 格式支持:支持的采样格式(例如 PCM 线性 16/24/32 位、浮点 32 位)、声道数和帧速率范围。
  • 缓冲区属性:最小和最大环形缓冲区大小、FIFO 深度和外部延迟指标。
  • 时钟设置:时钟网域规范和速率调整参数。
  • 插头属性:硬接线与可拆卸状态、初始插头状态和插头时间。

测试工作流

驱动程序测试集成

测试套件(例如 audio_driver_basic_testsaudio_driver_admin_tests)可以使用虚拟音频驱动程序来运行自包含的设备测试,而无需物理硬件或系统映像中预安装的平台总线节点。

测试可以: * 连接到 devfs (/dev/sys/platform/virtual-audio) 中预先存在的虚拟音频控制器节点,或者 * 在测试环境设置期间通过驱动程序运行程序动态注册临时虚拟音频驱动程序,并在完成后取消注册。

黄金枚举注意事项

由于虚拟音频设备可以由在目标平台上运行的测试套件动态创建,因此板驱动程序主机枚举测试(例如 driver-host-enumeration-test-*)会在其 golden.json 定义中将虚拟音频驱动程序指定为可选(以 ? 为前缀):

{
    "drivers": [
        "?fuchsia-pkg://fuchsia.com/virtual-audio#meta/virtual-audio-driver.cm"
    ]
}

这样可确保枚举测试在以下情况下都能成功完成:虚拟音频不存在的最小/干净启动时,以及虚拟音频组件动态活跃的测试运行期间。