Virtual audio drivers provide flexibly configurable audio devices on Fuchsia systems for testing, validation, and development. They allow automated test suites and developer tools to exercise the full audio subsystem without requiring physical audio hardware.
Virtual audio devices are dynamically created, configured, and controlled at
runtime via the fuchsia.virtualaudio FIDL
protocols.
Architecture and driver versions
Fuchsia provides two virtual audio driver implementations in the source tree:
the modern virtual-audio driver and the virtual-audio-legacy driver.
| Feature | Modern Driver (virtual-audio) |
Legacy Driver (virtual-audio-legacy) |
|---|---|---|
| Driver Framework | Driver Framework v2 (DFv2) | DFv1 / Legacy DDK |
| Source Path | //src/media/audio/drivers/virtual-audio/ |
//src/media/audio/drivers/virtual-audio-legacy/ |
| Package / Component | fuchsia-pkg://fuchsia.com/virtual-audio#meta/virtual-audio-driver.cm |
fuchsia-pkg://fuchsia.com/virtual-audio-legacy#meta/virtual-audio-legacy-driver.cm |
| Supported Audio Protocol | fuchsia.hardware.audio.Composite |
Deprecated StreamConfig, Dai, and Codec |
| Data Endpoints | Ring buffers, DAIs, and Packet Streams | Stream ring buffers, DAI ring buffers |
| Signal Processing | fuchsia.hardware.audio.signalprocessing |
Gain and plug state controls |
| Devfs / Node Location | /dev/sys/platform/virtual-audio |
/dev/sys/platform/virtual-audio-legacy |
| Primary Clients | Audio Device Registry, modern pipeline audio tests, DFv2 driver tests | audio_core, audio-driver-ctl, tests for deprecated protocols |
Modern virtual audio driver (virtual-audio)
The modern virtual audio driver implements the fuchsia.hardware.audio.Composite
protocol in Driver Framework v2.
Key capabilities include:
* Composite topologies: Exposes combinations of ring buffer endpoints, DAI
interconnects, and packet stream endpoints within a single virtual device.
* Signal processing: Implements the fuchsia.hardware.audio.signalprocessing
APIs, allowing tests to configure custom processing topologies, gain stages,
mutes, and equalizer elements.
* Clock domain configuration: Supports configuring monotonic or external
clock domains, as well as dynamic clock rate adjustments to test drift
compensation and position notifications.
* Audio Device Registry integration: Serves as the primary mock and test
driver for the Audio Device Registry service.
Legacy virtual audio driver (virtual-audio-legacy)
The legacy virtual audio driver is implemented using the legacy DDK (DFv1) and provides virtual devices implementing deprecated audio protocols:
- StreamConfig: Exposes
fuchsia.hardware.audio.StreamConfigConnectorto create virtual audio input and output streams (/dev/class/audio-inputand/dev/class/audio-output). - DAI: Exposes
fuchsia.hardware.audio.DaiConnector(/dev/class/dai), supporting multiple concurrent client connections. - Codec: Exposes
fuchsia.hardware.audio.CodecConnector(/dev/class/codec).
This driver is retained to validate legacy audio components (such as audio_core
and audio-driver-ctl) and to verify backward compatibility across deprecated
FIDL protocols.
Control and configuration API
Virtual audio devices are controlled via two primary FIDL protocols defined in
//sdk/fidl/fuchsia.virtualaudio:
fuchsia.virtualaudio.Control:GetDefaultConfiguration: Retrieves the default templateConfigurationfor a given device type (Composite,StreamConfig,Dai, orCodec).AddDevice: Creates and activates a virtual device instance using a specifiedConfigurationand binds afuchsia.virtualaudio.Devicecontrol channel.Enable/Disable: Globally enables or disables virtual audio device creation on the system.
fuchsia.virtualaudio.Device:- Manages the lifecycle of an active virtual device instance.
- Receives notifications of format changes, buffer allocations, and position updates.
- Allows tests to dynamically simulate hardware events such as hotplugging, unplugging, or adjusting clock rates.
- Closing the
Devicechannel automatically shuts down and removes the corresponding virtual device from the system.
Configurable device properties
Before activating a virtual device via Control.AddDevice, clients can
customize properties in the Configuration table, including:
- Device metadata:
device_name,manufacturer_name,product_name, andunique_id. - Format support: Supported sample formats (e.g. PCM linear 16/24/32-bit, float 32-bit), channel counts, and frame rate ranges.
- Buffer properties: Minimum and maximum ring buffer sizes, FIFO depth, and external delay metrics.
- Clock settings: Clock domain specification and rate adjustment parameters.
- Plug properties: Hardwired vs. removable state, initial plug state, and plug time.
Testing workflows
Driver test integration
Test suites (such as audio_driver_basic_tests and audio_driver_admin_tests)
can use virtual audio drivers to run self-contained device tests without
requiring physical hardware or pre-installed platform bus nodes in system images.
Tests can either:
* Connect to pre-existing virtual audio controller nodes in devfs
(/dev/sys/platform/virtual-audio), or
* Dynamically register ephemeral virtual audio drivers with Driver Runner during
test fixture setup and unregister them upon completion.
Golden enumeration considerations
Because virtual audio devices can be created dynamically by test suites running
on a target, board driver host enumeration tests (such as
driver-host-enumeration-test-*) specify virtual audio drivers as optional
(prefixed with ?) in their golden.json definitions:
{
"drivers": [
"?fuchsia-pkg://fuchsia.com/virtual-audio#meta/virtual-audio-driver.cm"
]
}
This ensures that enumeration tests succeed both on minimal/clean boots where virtual audio is absent, and during test runs where virtual audio components are dynamically active.